Skip to content

When path of values are object with a lot of attribues the output becomes less readable #4

@stoivo

Description

@stoivo

Look at the current output

 1) ReconciliationMatchService call single match NAME_KID_AMOUNT match
     Failure/Error:
       expect(res)
         .to eq(create_hash(:NAME_KID_AMOUNT, {bt1 => [inv1]}))

       expected: {:NAME_KID_AMOUNT=>{#<BankTransaction id: 8156, unit_id: 18741, amount: -0.345022e4, currency: "XCD", kid: "fake kid", ref: nil, posting_date: "2024-06-07", created_at: "2024-06-07 09:42:48.891576000 +0000", updated_at: "2024-06-07 09:42:48.891576000 +0000", created_by_id: 1899, transaction_batch_id: nil, is_split: false, transaction_type: "D", invoiceno: nil, counterpart_name: "fake name", parent_id: nil, bank_ref: nil, closed_amount: 0.0, bank_account_id: 1067, bban: "90037768129", counterpart_bban: nil, journal_number: nil, origin_description: nil, meta_description: nil, manual_description: nil, iban: nil, description: " |  | ", fully_reconciled: false>=>[#<Invoice id: 8147, invoiceno: "INV-1", created_by_id: 1899, issue_date: "2024-06-07", payment_due_date: "2024-08-07", payable_amount: 0.345022e4, payable_amount_currency_id: 876, created_at: "2024-06-07 09:42:48.837561000 +0000", updated_at: "2024-06-07 09:42:48.837561000 +0000", supplier_identity_id: 19795, customer_identity_id: 19794, supplier_unit_id: 18744, customer_unit_id: 18741, kid: "fake kid", supplier_name: "fake name", customer_name: "Unit factory IGNCELVSOL", supplier_vat_number: nil, supplier_closed_amount: 0.0, customer_closed_amount: 0.0, invoice_type: "invoice", customer_address: nil, supplier_address: nil, supplier_car_id: nil, supplier_department_id: nil, supplier_project_id: nil, customer_number: nil, customer_scheme_identification: nil, customer_identification: nil, customer_website: nil, customer_city: nil, customer_zip: nil, customer_country_code: nil, customer_country_name: nil, customer_contact_name: nil, customer_contact_telephone: nil, customer_contact_email: nil, supplier_scheme_identification: nil, supplier_identification: nil, supplier_website: nil, supplier_city: nil, supplier_zip: nil, supplier_country_code: nil, supplier_country_name: nil, supplier_contact_name: nil, supplier_contact_telephone: nil, supplier_contact_email: nil, supplier_bank_account_id: nil, customer_address_2: nil, supplier_address_2: nil, tax_exclusive_amount: 0.0, customer_contact_telefax: nil, customer_contact_id: nil, customer_person_firstname: nil, customer_person_familyname: nil, supplier_contact_telefax: nil, supplier_contact_id: nil, supplier_person_firstname: nil, supplier_person_familyname: nil, comment_to_customer: nil, supplier_reference: nil, customer_vat_number: nil, supplier_contact_mobile: nil, supplier_bank_account_raw: nil, supplier_bank_account_scheme_identification: nil, customer_bank_account_raw: nil, customer_bank_account_scheme_identification: nil, customer_contact_mobile: nil, supplier_department_name: nil, supplier_department_code: nil, customer_department_name: nil, customer_department_code: nil, supplier_project_name: nil, supplier_project_code: nil, customer_project_name: nil, customer_project_code: nil, customer_project_id: nil, customer_department_id: nil, customer_car_id: nil, customer_car_name: nil, customer_car_code: nil, supplier_car_name: nil, supplier_car_code: nil, date_of_issue: nil, payable_rounding_amount: 0.0, supplier_iban: nil, supplier_swift: nil, punched_closing_reason_id: nil, supplier_payment_date: nil, customer_payment_date: nil, note: nil, tax_total: nil, tax_point_date: nil, tax_currency_code: nil, line_extension_amount: nil, tax_inclusive_amount: nil, allowance_total_amount: nil, charge_total_amount: nil, prepaid_amount: nil, order_reference_id: nil, accounting_cost: nil, customer_car_registration_id: nil, supplier_car_registration_id: nil, supplier_tax_registered: false, local_currency_tax_total: nil, supplier_country_subentity: nil, customer_country_subentity: nil, customer_address_3: nil, supplier_address_3: nil, despatch_document_reference_id: nil, receipt_document_reference_id: nil, originator_document_reference_id: nil, order_reference_sales_order_id: nil, project_reference_id: nil, supplier_bban: nil, supplier_fully_reconciled: false, customer_fully_reconciled: false>]}, :NAME_INVOICENO_AMOUNT=>{}, :KID_AMOUNT=>{}, :INVOICENO_AMOUNT=>{}, :NAME_KID=>{}, :NAME_INVOICENO=>{}, :NAME_AMOUNT=>{}, :KID=>{}, :INVOICENO=>{}, :NAME=>{}, :AMOUNT=>{}}
            got: {:NAME_KID_AMOUNT=>{#<BankTransaction id: 8156, unit_id: 18741, amount: -0.345022e4, currency: "XCD", kid: "fake kid", ref: nil, posting_date: "2024-06-07", created_at: "2024-06-07 09:42:48.891576000 +0000", updated_at: "2024-06-07 09:42:48.891576000 +0000", created_by_id: 1899, transaction_batch_id: nil, is_split: false, transaction_type: "D", invoiceno: nil, counterpart_name: "fake name", parent_id: nil, bank_ref: nil, closed_amount: 0.0, bank_account_id: 1067, bban: "90037768129", counterpart_bban: nil, journal_number: nil, origin_description: nil, meta_description: nil, manual_description: nil, iban: nil, description: " |  | ", fully_reconciled: false>=>[#<Purchase id: 8147, invoice_id: 8147, created_at: "2024-06-07 09:42:48.837561000 +0000", updated_at: "2024-06-07 09:42:48.837561000 +0000", created_by_id: 1899>]}, :NAME_INVOICENO_AMOUNT=>{}, :KID_AMOUNT=>{}, :INVOICENO_AMOUNT=>{}, :NAME_KID=>{}, :KID=>{}, :NAME_AMOUNT=>{}, :AMOUNT=>{}, :NAME_INVOICENO=>{}, :INVOICENO=>{}, :NAME=>{}}

       (compared using ==)

       Diff:
       �[36m@@ +0/-0/~1 @@
       �[0m�[33m  new value: NAME_KID_AMOUNT.#<BankTransaction id: 8156, unit_id: 18741, amount: -0.345022e4, currency: "XCD", kid: "fake kid", ref: nil, posting_date: "2024-06-07", created_at: "2024-06-07 09:42:48.891576000 +0000", updated_at: "2024-06-07 09:42:48.891576000 +0000", created_by_id: 1899, transaction_batch_id: nil, is_split: false, transaction_type: "D", invoiceno: nil, counterpart_name: "fake name", parent_id: nil, bank_ref: nil, closed_amount: 0.0, bank_account_id: 1067, bban: "90037768129", counterpart_bban: nil, journal_number: nil, origin_description: nil, meta_description: nil, manual_description: nil, iban: nil, description: " |  | ", fully_reconciled: false>[0] (#<Invoice id: 8147, invoiceno: "INV-1", created_by_id: 1899, issue_date: "2024-06-07", payment_due_date: "2024-08-07", payable_amount: 0.345022e4, payable_amount_currency_id: 876, created_at: "2024-06-07 09:42:48.837561000 +0000", updated_at: "2024-06-07 09:42:48.837561000 +0000", supplier_identity_id: 19795, customer_identity_id: 19794, supplier_unit_id: 18744, customer_unit_id: 18741, kid: "fake kid", supplier_name: "fake name", customer_name: "Unit factory IGNCELVSOL", supplier_vat_number: nil, supplier_closed_amount: 0.0, customer_closed_amount: 0.0, invoice_type: "invoice", customer_address: nil, supplier_address: nil, supplier_car_id: nil, supplier_department_id: nil, supplier_project_id: nil, customer_number: nil, customer_scheme_identification: nil, customer_identification: nil, customer_website: nil, customer_city: nil, customer_zip: nil, customer_country_code: nil, customer_country_name: nil, customer_contact_name: nil, customer_contact_telephone: nil, customer_contact_email: nil, supplier_scheme_identification: nil, supplier_identification: nil, supplier_website: nil, supplier_city: nil, supplier_zip: nil, supplier_country_code: nil, supplier_country_name: nil, supplier_contact_name: nil, supplier_contact_telephone: nil, supplier_contact_email: nil, supplier_bank_account_id: nil, customer_address_2: nil, supplier_address_2: nil, tax_exclusive_amount: 0.0, customer_contact_telefax: nil, customer_contact_id: nil, customer_person_firstname: nil, customer_person_familyname: nil, supplier_contact_telefax: nil, supplier_contact_id: nil, supplier_person_firstname: nil, supplier_person_familyname: nil, comment_to_customer: nil, supplier_reference: nil, customer_vat_number: nil, supplier_contact_mobile: nil, supplier_bank_account_raw: nil, supplier_bank_account_scheme_identification: nil, customer_bank_account_raw: nil, customer_bank_account_scheme_identification: nil, customer_contact_mobile: nil, supplier_department_name: nil, supplier_department_code: nil, customer_department_name: nil, customer_department_code: nil, supplier_project_name: nil, supplier_project_code: nil, customer_project_name: nil, customer_project_code: nil, customer_project_id: nil, customer_department_id: nil, customer_car_id: nil, customer_car_name: nil, customer_car_code: nil, supplier_car_name: nil, supplier_car_code: nil, date_of_issue: nil, payable_rounding_amount: 0.0, supplier_iban: nil, supplier_swift: nil, punched_closing_reason_id: nil, supplier_payment_date: nil, customer_payment_date: nil, note: nil, tax_total: nil, tax_point_date: nil, tax_currency_code: nil, line_extension_amount: nil, tax_inclusive_amount: nil, allowance_total_amount: nil, charge_total_amount: nil, prepaid_amount: nil, order_reference_id: nil, accounting_cost: nil, customer_car_registration_id: nil, supplier_car_registration_id: nil, supplier_tax_registered: false, local_currency_tax_total: nil, supplier_country_subentity: nil, customer_country_subentity: nil, customer_address_3: nil, supplier_address_3: nil, despatch_document_reference_id: nil, receipt_document_reference_id: nil, originator_document_reference_id: nil, order_reference_sales_order_id: nil, project_reference_id: nil, supplier_bban: nil, supplier_fully_reconciled: false, customer_fully_reconciled: false> -> #<Purchase id: 8147, invoice_id: 8147, created_at: "2024-06-07 09:42:48.837561000 +0000", updated_at: "2024-06-07 09:42:48.837561000 +0000", created_by_id: 1899>)
       �[0m
     # ./spec/services/reconciliation_match_service_spec.rb:53:in `block (4 levels) in <main>'

I don't know If this is a good solution but we could do something like this to split it on new lines to make it faster to scan for the eye.

Changes
  UNSTAGED CHANGES

--
 lib/specdiff/differ/hash.rb | 43 +++++++++++++++++++++++++++++++++----------
 1 file changed, 33 insertions(+), 10 deletions(-)

diff --git a/lib/specdiff/differ/hash.rb b/lib/specdiff/differ/hash.rb
index 16c50ed..df5c29c 100644
--- a/lib/specdiff/differ/hash.rb
+++ b/lib/specdiff/differ/hash.rb
@@ -140,7 +140,24 @@ class Specdiff::Differ::Hash
 
       from_inspected = ::Specdiff.diff_inspect(from)
       to_inspected = ::Specdiff.diff_inspect(to)
-      result << "  new value: #{path} (#{from_inspected} -> #{to_inspected})"
+
+      if path.include?("\n")
+        result << "  new value: \n    #{path.split("\n").join("\n    ")}"
+      else
+        result << "  new value: #{path}"
+      end
+
+      if (from_inspected.length + to_inspected.length) < 100
+        result << " (#{from_inspected} -> #{to_inspected})"
+      else
+        result << <<~TXT
+          (
+            #{from_inspected}
+          ->
+            #{to_inspected}
+          )
+        TXT
+      end
       result << NEWLINE
     end
 
@@ -162,23 +179,29 @@ class Specdiff::Differ::Hash
   PATH_SEPARATOR = ".".freeze
 
   def self._stringify_path(path)
-    result = +""
-
-    path.each do |component|
+    path_entries = path.map do |component|
       if component.is_a?(Numeric)
-        result.chomp!(PATH_SEPARATOR)
-        result << "[#{component}]"
+        "[#{component}]"
       elsif component.is_a?(Symbol)
         # by not inspecting symbols they look prettier than strings, but you
         # can still tell the difference in the printed output
-        result << component.to_s
+        component.to_s
       else
-        result << component.inspect
+        component.inspect
       end
+    end
 
-      result << PATH_SEPARATOR
+    single_line_result = path_entries.join(PATH_SEPARATOR)
+    if single_line_result.length < 100
+      return single_line_result
     end
 
-    result.chomp(PATH_SEPARATOR)
+    path_entries.each_with_index.sum("") do |entry, i|
+      if i == 0
+        "#{entry}\n"
+      else
+        "#{"  " * i}↘ #{entry}\n"
+      end
+    end
   end
 end

       Diff:
       @@ +0/-0/~1 @@
         new value: 
           NAME_KID_AMOUNT
             ↘ #<BankTransaction id: 8155, unit_id: 18735, amount: -0.345022e4, currency: "HTG", kid: "fake kid", ref: nil, posting_date: "2024-06-07", created_at: "2024-06-07 09:36:59.961283000 +0000", updated_at: "2024-06-07 09:36:59.961283000 +0000", created_by_id: 1899, transaction_batch_id: nil, is_split: false, transaction_type: "D", invoiceno: nil, counterpart_name: "fake name", parent_id: nil, bank_ref: nil, closed_amount: 0.0, bank_account_id: 1066, bban: "87769248445", counterpart_bban: nil, journal_number: nil, origin_description: nil, meta_description: nil, manual_description: nil, iban: nil, description: " |  | ", fully_reconciled: false>
               ↘ [0](
         #<Invoice id: 8146, invoiceno: "INV-1", created_by_id: 1899, issue_date: "2024-06-07", payment_due_date: "2024-08-07", payable_amount: 0.345022e4, payable_amount_currency_id: 875, created_at: "2024-06-07 09:36:59.907105000 +0000", updated_at: "2024-06-07 09:36:59.907105000 +0000", supplier_identity_id: 19786, customer_identity_id: 19785, supplier_unit_id: 18738, customer_unit_id: 18735, kid: "fake kid", supplier_name: "fake name", customer_name: "Unit factory NEIQNULXUE", supplier_vat_number: nil, supplier_closed_amount: 0.0, customer_closed_amount: 0.0, invoice_type: "invoice", customer_address: nil, supplier_address: nil, supplier_car_id: nil, supplier_department_id: nil, supplier_project_id: nil, customer_number: nil, customer_scheme_identification: nil, customer_identification: nil, customer_website: nil, customer_city: nil, customer_zip: nil, customer_country_code: nil, customer_country_name: nil, customer_contact_name: nil, customer_contact_telephone: nil, customer_contact_email: nil, supplier_scheme_identification: nil, supplier_identification: nil, supplier_website: nil, supplier_city: nil, supplier_zip: nil, supplier_country_code: nil, supplier_country_name: nil, supplier_contact_name: nil, supplier_contact_telephone: nil, supplier_contact_email: nil, supplier_bank_account_id: nil, customer_address_2: nil, supplier_address_2: nil, tax_exclusive_amount: 0.0, customer_contact_telefax: nil, customer_contact_id: nil, customer_person_firstname: nil, customer_person_familyname: nil, supplier_contact_telefax: nil, supplier_contact_id: nil, supplier_person_firstname: nil, supplier_person_familyname: nil, comment_to_customer: nil, supplier_reference: nil, customer_vat_number: nil, supplier_contact_mobile: nil, supplier_bank_account_raw: nil, supplier_bank_account_scheme_identification: nil, customer_bank_account_raw: nil, customer_bank_account_scheme_identification: nil, customer_contact_mobile: nil, supplier_department_name: nil, supplier_department_code: nil, customer_department_name: nil, customer_department_code: nil, supplier_project_name: nil, supplier_project_code: nil, customer_project_name: nil, customer_project_code: nil, customer_project_id: nil, customer_department_id: nil, customer_car_id: nil, customer_car_name: nil, customer_car_code: nil, supplier_car_name: nil, supplier_car_code: nil, date_of_issue: nil, payable_rounding_amount: 0.0, supplier_iban: nil, supplier_swift: nil, punched_closing_reason_id: nil, supplier_payment_date: nil, customer_payment_date: nil, note: nil, tax_total: nil, tax_point_date: nil, tax_currency_code: nil, line_extension_amount: nil, tax_inclusive_amount: nil, allowance_total_amount: nil, charge_total_amount: nil, prepaid_amount: nil, order_reference_id: nil, accounting_cost: nil, customer_car_registration_id: nil, supplier_car_registration_id: nil, supplier_tax_registered: false, local_currency_tax_total: nil, supplier_country_subentity: nil, customer_country_subentity: nil, customer_address_3: nil, supplier_address_3: nil, despatch_document_reference_id: nil, receipt_document_reference_id: nil, originator_document_reference_id: nil, order_reference_sales_order_id: nil, project_reference_id: nil, supplier_bban: nil, supplier_fully_reconciled: false, customer_fully_reconciled: false>
       ->
         #<Purchase id: 8146, invoice_id: 8146, created_at: "2024-06-07 09:36:59.907105000 +0000", updated_at: "2024-06-07 09:36:59.907105000 +0000", created_by_id: 1899>
       )
     # ./spec/services/reconciliation_match_service_spec.rb:53:in `block (4 levels) in <main>'

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions