super_diff 0.12.1 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +7 -19
- data/lib/super_diff/active_record/differs/active_record_relation.rb +2 -0
- data/lib/super_diff/active_record/differs.rb +3 -1
- data/lib/super_diff/active_record/inspection_tree_builders/active_record_model.rb +7 -5
- data/lib/super_diff/active_record/inspection_tree_builders/active_record_relation.rb +12 -10
- data/lib/super_diff/active_record/inspection_tree_builders.rb +4 -2
- data/lib/super_diff/active_record/monkey_patches.rb +4 -2
- data/lib/super_diff/active_record/object_inspection.rb +6 -4
- data/lib/super_diff/active_record/operation_tree_builders/active_record_model.rb +3 -1
- data/lib/super_diff/active_record/operation_tree_builders/active_record_relation.rb +3 -1
- data/lib/super_diff/active_record/operation_tree_builders.rb +4 -2
- data/lib/super_diff/active_record/operation_tree_flatteners/active_record_relation.rb +4 -2
- data/lib/super_diff/active_record/operation_tree_flatteners.rb +3 -1
- data/lib/super_diff/active_record/operation_trees/active_record_relation.rb +2 -0
- data/lib/super_diff/active_record/operation_trees.rb +3 -1
- data/lib/super_diff/active_record.rb +10 -8
- data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +2 -0
- data/lib/super_diff/active_support/differs.rb +3 -1
- data/lib/super_diff/active_support/inspection_tree_builders/hash_with_indifferent_access.rb +16 -14
- data/lib/super_diff/active_support/inspection_tree_builders/ordered_options.rb +16 -14
- data/lib/super_diff/active_support/inspection_tree_builders.rb +4 -2
- data/lib/super_diff/active_support/object_inspection.rb +6 -4
- data/lib/super_diff/active_support/operation_tree_builders/hash_with_indifferent_access.rb +6 -4
- data/lib/super_diff/active_support/operation_tree_builders.rb +3 -1
- data/lib/super_diff/active_support/operation_tree_flatteners/hash_with_indifferent_access.rb +4 -2
- data/lib/super_diff/active_support/operation_tree_flatteners.rb +3 -1
- data/lib/super_diff/active_support/operation_trees/hash_with_indifferent_access.rb +2 -0
- data/lib/super_diff/active_support/operation_trees.rb +3 -1
- data/lib/super_diff/active_support.rb +8 -6
- data/lib/super_diff/basic/diff_formatters/collection.rb +18 -18
- data/lib/super_diff/basic/diff_formatters/multiline_string.rb +2 -0
- data/lib/super_diff/basic/diff_formatters.rb +4 -2
- data/lib/super_diff/basic/differs/array.rb +2 -0
- data/lib/super_diff/basic/differs/custom_object.rb +3 -1
- data/lib/super_diff/basic/differs/date_like.rb +2 -0
- data/lib/super_diff/basic/differs/default_object.rb +3 -1
- data/lib/super_diff/basic/differs/hash.rb +2 -0
- data/lib/super_diff/basic/differs/multiline_string.rb +2 -0
- data/lib/super_diff/basic/differs/time_like.rb +2 -0
- data/lib/super_diff/basic/differs.rb +11 -9
- data/lib/super_diff/basic/inspection_tree_builders/array.rb +5 -3
- data/lib/super_diff/basic/inspection_tree_builders/custom_object.rb +5 -3
- data/lib/super_diff/basic/inspection_tree_builders/data_object.rb +42 -0
- data/lib/super_diff/basic/inspection_tree_builders/date_like.rb +7 -5
- data/lib/super_diff/basic/inspection_tree_builders/default_object.rb +7 -5
- data/lib/super_diff/basic/inspection_tree_builders/hash.rb +7 -5
- data/lib/super_diff/basic/inspection_tree_builders/primitive.rb +3 -1
- data/lib/super_diff/basic/inspection_tree_builders/range_object.rb +19 -0
- data/lib/super_diff/basic/inspection_tree_builders/time_like.rb +8 -8
- data/lib/super_diff/basic/inspection_tree_builders.rb +18 -8
- data/lib/super_diff/basic/operation_tree_builders/array.rb +6 -4
- data/lib/super_diff/basic/operation_tree_builders/custom_object.rb +3 -1
- data/lib/super_diff/basic/operation_tree_builders/data_object.rb +20 -0
- data/lib/super_diff/basic/operation_tree_builders/date_like.rb +2 -0
- data/lib/super_diff/basic/operation_tree_builders/default_object.rb +32 -31
- data/lib/super_diff/basic/operation_tree_builders/hash.rb +49 -46
- data/lib/super_diff/basic/operation_tree_builders/multiline_string.rb +5 -3
- data/lib/super_diff/basic/operation_tree_builders/time_like.rb +5 -3
- data/lib/super_diff/basic/operation_tree_builders.rb +15 -9
- data/lib/super_diff/basic/operation_tree_flatteners/array.rb +4 -2
- data/lib/super_diff/basic/operation_tree_flatteners/collection.rb +11 -11
- data/lib/super_diff/basic/operation_tree_flatteners/custom_object.rb +5 -3
- data/lib/super_diff/basic/operation_tree_flatteners/default_object.rb +6 -5
- data/lib/super_diff/basic/operation_tree_flatteners/hash.rb +5 -3
- data/lib/super_diff/basic/operation_tree_flatteners/multiline_string.rb +3 -1
- data/lib/super_diff/basic/operation_tree_flatteners.rb +8 -6
- data/lib/super_diff/basic/operation_trees/array.rb +2 -0
- data/lib/super_diff/basic/operation_trees/custom_object.rb +2 -0
- data/lib/super_diff/basic/operation_trees/default_object.rb +6 -4
- data/lib/super_diff/basic/operation_trees/hash.rb +2 -0
- data/lib/super_diff/basic/operation_trees/multiline_string.rb +3 -1
- data/lib/super_diff/basic/operation_trees.rb +9 -7
- data/lib/super_diff/basic.rb +12 -7
- data/lib/super_diff/core/abstract_differ.rb +2 -0
- data/lib/super_diff/core/abstract_inspection_tree_builder.rb +2 -0
- data/lib/super_diff/core/abstract_operation_tree.rb +4 -2
- data/lib/super_diff/core/abstract_operation_tree_builder.rb +15 -18
- data/lib/super_diff/core/abstract_operation_tree_flattener.rb +5 -3
- data/lib/super_diff/core/binary_operation.rb +3 -1
- data/lib/super_diff/core/colorized_document_extensions.rb +2 -0
- data/lib/super_diff/core/configuration.rb +23 -43
- data/lib/super_diff/core/differ_dispatcher.rb +4 -2
- data/lib/super_diff/core/gem_version.rb +2 -0
- data/lib/super_diff/core/helpers.rb +14 -12
- data/lib/super_diff/core/implementation_checks.rb +6 -2
- data/lib/super_diff/core/inspection_tree.rb +38 -38
- data/lib/super_diff/core/inspection_tree_builder_dispatcher.rb +5 -5
- data/lib/super_diff/core/inspection_tree_nodes/as_lines_when_rendering_to_lines.rb +3 -1
- data/lib/super_diff/core/inspection_tree_nodes/as_prefix_when_rendering_to_lines.rb +2 -0
- data/lib/super_diff/core/inspection_tree_nodes/as_prelude_when_rendering_to_lines.rb +2 -0
- data/lib/super_diff/core/inspection_tree_nodes/as_single_line.rb +2 -0
- data/lib/super_diff/core/inspection_tree_nodes/base.rb +9 -9
- data/lib/super_diff/core/inspection_tree_nodes/inspection.rb +2 -0
- data/lib/super_diff/core/inspection_tree_nodes/nesting.rb +2 -0
- data/lib/super_diff/core/inspection_tree_nodes/only_when.rb +5 -1
- data/lib/super_diff/core/inspection_tree_nodes/text.rb +2 -0
- data/lib/super_diff/core/inspection_tree_nodes/when_empty.rb +3 -1
- data/lib/super_diff/core/inspection_tree_nodes/when_non_empty.rb +3 -1
- data/lib/super_diff/core/inspection_tree_nodes/when_rendering_to_lines.rb +3 -1
- data/lib/super_diff/core/inspection_tree_nodes/when_rendering_to_string.rb +2 -0
- data/lib/super_diff/core/inspection_tree_nodes.rb +16 -14
- data/lib/super_diff/core/line.rb +9 -7
- data/lib/super_diff/core/no_differ_available_error.rb +7 -5
- data/lib/super_diff/core/no_inspection_tree_builder_available_error.rb +5 -3
- data/lib/super_diff/core/no_operation_tree_available_error.rb +4 -2
- data/lib/super_diff/core/no_operation_tree_builder_available_error.rb +7 -5
- data/lib/super_diff/core/operation_tree_builder_dispatcher.rb +3 -3
- data/lib/super_diff/core/operation_tree_finder.rb +8 -8
- data/lib/super_diff/core/prefix_for_next_inspection_tree_node.rb +2 -0
- data/lib/super_diff/core/prelude_for_next_inspection_tree_node.rb +2 -0
- data/lib/super_diff/core/recursion_guard.rb +6 -4
- data/lib/super_diff/core/tiered_lines.rb +2 -0
- data/lib/super_diff/core/tiered_lines_elider.rb +53 -54
- data/lib/super_diff/core/tiered_lines_formatter.rb +6 -4
- data/lib/super_diff/core/unary_operation.rb +2 -0
- data/lib/super_diff/core.rb +31 -29
- data/lib/super_diff/csi/bold_sequence.rb +2 -0
- data/lib/super_diff/csi/color.rb +4 -4
- data/lib/super_diff/csi/color_sequence_block.rb +3 -1
- data/lib/super_diff/csi/colorized_document.rb +7 -9
- data/lib/super_diff/csi/document.rb +15 -18
- data/lib/super_diff/csi/eight_bit_color.rb +32 -37
- data/lib/super_diff/csi/four_bit_color.rb +12 -9
- data/lib/super_diff/csi/reset_sequence.rb +2 -0
- data/lib/super_diff/csi/twenty_four_bit_color.rb +22 -21
- data/lib/super_diff/csi/uncolorized_document.rb +2 -0
- data/lib/super_diff/csi.rb +12 -42
- data/lib/super_diff/differs.rb +6 -4
- data/lib/super_diff/equality_matchers/array.rb +18 -16
- data/lib/super_diff/equality_matchers/base.rb +6 -4
- data/lib/super_diff/equality_matchers/default.rb +5 -3
- data/lib/super_diff/equality_matchers/defaults.rb +3 -1
- data/lib/super_diff/equality_matchers/hash.rb +18 -16
- data/lib/super_diff/equality_matchers/main.rb +3 -1
- data/lib/super_diff/equality_matchers/multiline_string.rb +18 -16
- data/lib/super_diff/equality_matchers/primitive.rb +15 -13
- data/lib/super_diff/equality_matchers/singleline_string.rb +16 -14
- data/lib/super_diff/equality_matchers.rb +11 -9
- data/lib/super_diff/errors.rb +4 -2
- data/lib/super_diff/object_inspection.rb +17 -15
- data/lib/super_diff/operation_tree_builders.rb +6 -4
- data/lib/super_diff/operation_tree_flatteners.rb +6 -4
- data/lib/super_diff/operation_trees.rb +6 -4
- data/lib/super_diff/operations.rb +4 -2
- data/lib/super_diff/rails.rb +4 -2
- data/lib/super_diff/rspec/augmented_matcher.rb +3 -1
- data/lib/super_diff/rspec/differ.rb +16 -7
- data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +2 -0
- data/lib/super_diff/rspec/differs/collection_including.rb +2 -0
- data/lib/super_diff/rspec/differs/hash_including.rb +2 -0
- data/lib/super_diff/rspec/differs/object_having_attributes.rb +2 -0
- data/lib/super_diff/rspec/differs.rb +6 -4
- data/lib/super_diff/rspec/inspection_tree_builders/collection_containing_exactly.rb +12 -10
- data/lib/super_diff/rspec/inspection_tree_builders/collection_including.rb +10 -8
- data/lib/super_diff/rspec/inspection_tree_builders/double.rb +20 -18
- data/lib/super_diff/rspec/inspection_tree_builders/generic_describable_matcher.rb +2 -0
- data/lib/super_diff/rspec/inspection_tree_builders/hash_including.rb +10 -8
- data/lib/super_diff/rspec/inspection_tree_builders/instance_of.rb +2 -0
- data/lib/super_diff/rspec/inspection_tree_builders/kind_of.rb +2 -0
- data/lib/super_diff/rspec/inspection_tree_builders/object_having_attributes.rb +12 -10
- data/lib/super_diff/rspec/inspection_tree_builders/primitive.rb +2 -0
- data/lib/super_diff/rspec/inspection_tree_builders/value_within.rb +6 -4
- data/lib/super_diff/rspec/inspection_tree_builders.rb +12 -10
- data/lib/super_diff/rspec/matcher_text_builders/base.rb +12 -12
- data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +19 -17
- data/lib/super_diff/rspec/matcher_text_builders/contain_exactly.rb +3 -1
- data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +7 -5
- data/lib/super_diff/rspec/matcher_text_builders/match.rb +6 -4
- data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +5 -3
- data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +20 -18
- data/lib/super_diff/rspec/matcher_text_builders.rb +9 -7
- data/lib/super_diff/rspec/matcher_text_template.rb +34 -39
- data/lib/super_diff/rspec/monkey_patches.rb +129 -56
- data/lib/super_diff/rspec/object_inspection.rb +7 -5
- data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +4 -4
- data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +2 -0
- data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +2 -0
- data/lib/super_diff/rspec/operation_tree_builders/object_having_attributes.rb +2 -0
- data/lib/super_diff/rspec/operation_tree_builders.rb +6 -4
- data/lib/super_diff/rspec-rails.rb +4 -2
- data/lib/super_diff/rspec.rb +27 -14
- data/lib/super_diff/version.rb +3 -1
- data/lib/super_diff.rb +24 -27
- data/super_diff.gemspec +20 -18
- metadata +15 -182
- data/spec/examples.txt +0 -704
- data/spec/integration/rails/active_record_spec.rb +0 -21
- data/spec/integration/rails/active_support_spec.rb +0 -19
- data/spec/integration/rails/engines_spec.rb +0 -25
- data/spec/integration/rails/hash_with_indifferent_access_spec.rb +0 -21
- data/spec/integration/rspec/be_falsey_matcher_spec.rb +0 -58
- data/spec/integration/rspec/be_matcher_spec.rb +0 -605
- data/spec/integration/rspec/be_nil_matcher_spec.rb +0 -57
- data/spec/integration/rspec/be_predicate_matcher_spec.rb +0 -615
- data/spec/integration/rspec/be_truthy_matcher_spec.rb +0 -62
- data/spec/integration/rspec/contain_exactly_matcher_spec.rb +0 -377
- data/spec/integration/rspec/eq_matcher_spec.rb +0 -1066
- data/spec/integration/rspec/generic_describable_matchers_spec.rb +0 -177
- data/spec/integration/rspec/have_attributes_matcher_spec.rb +0 -443
- data/spec/integration/rspec/have_predicate_matcher_spec.rb +0 -478
- data/spec/integration/rspec/include_matcher_spec.rb +0 -452
- data/spec/integration/rspec/magic_metadata_spec.rb +0 -51
- data/spec/integration/rspec/match_array_matcher_spec.rb +0 -424
- data/spec/integration/rspec/match_matcher_spec.rb +0 -1359
- data/spec/integration/rspec/raise_error_matcher_spec.rb +0 -1488
- data/spec/integration/rspec/respond_to_matcher_spec.rb +0 -999
- data/spec/integration/rspec/third_party_matcher_spec.rb +0 -245
- data/spec/integration/rspec/unhandled_errors_spec.rb +0 -150
- data/spec/internal/log/test.log +0 -0
- data/spec/spec_helper.rb +0 -90
- data/spec/support/colorizer.rb +0 -9
- data/spec/support/command_runner.rb +0 -253
- data/spec/support/helpers.rb +0 -21
- data/spec/support/integration/helpers.rb +0 -124
- data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +0 -104
- data/spec/support/integration/matchers.rb +0 -177
- data/spec/support/integration/test_programs/base.rb +0 -143
- data/spec/support/integration/test_programs/plain.rb +0 -19
- data/spec/support/integration/test_programs/rspec_active_record.rb +0 -20
- data/spec/support/integration/test_programs/rspec_active_support.rb +0 -20
- data/spec/support/integration/test_programs/rspec_rails.rb +0 -20
- data/spec/support/integration/test_programs/rspec_rails_engine.rb +0 -20
- data/spec/support/models/a.rb +0 -11
- data/spec/support/models/active_record/person.rb +0 -28
- data/spec/support/models/active_record/query.rb +0 -15
- data/spec/support/models/active_record/shipping_address.rb +0 -24
- data/spec/support/models/customer.rb +0 -22
- data/spec/support/models/empty_class.rb +0 -6
- data/spec/support/models/item.rb +0 -10
- data/spec/support/models/order.rb +0 -9
- data/spec/support/models/person.rb +0 -20
- data/spec/support/models/player.rb +0 -30
- data/spec/support/models/shipping_address.rb +0 -25
- data/spec/support/shared_examples/active_record.rb +0 -428
- data/spec/support/shared_examples/active_support.rb +0 -188
- data/spec/support/shared_examples/elided_diffs.rb +0 -938
- data/spec/support/shared_examples/hash_with_indifferent_access.rb +0 -749
- data/spec/support/shared_examples/key.rb +0 -123
- data/spec/support/unit/helpers.rb +0 -24
- data/spec/support/unit/matchers/be_deprecated_in_favor_of.rb +0 -39
- data/spec/support/unit/matchers/match_output.rb +0 -40
- data/spec/unit/active_record/object_inspection_spec.rb +0 -289
- data/spec/unit/active_support/object_inspection_spec.rb +0 -170
- data/spec/unit/basic/operation_tree_flatteners/array_spec.rb +0 -637
- data/spec/unit/basic/operation_tree_flatteners/custom_object_spec.rb +0 -685
- data/spec/unit/basic/operation_tree_flatteners/default_object_spec.rb +0 -685
- data/spec/unit/basic/operation_tree_flatteners/hash_spec.rb +0 -671
- data/spec/unit/basic/operation_tree_flatteners/multiline_string_spec.rb +0 -131
- data/spec/unit/core/helpers_spec.rb +0 -68
- data/spec/unit/core/tiered_lines_elider_spec.rb +0 -6328
- data/spec/unit/core/tiered_lines_formatter_spec.rb +0 -131
- data/spec/unit/deprecations_spec.rb +0 -176
- data/spec/unit/equality_matchers/main_spec.rb +0 -1842
- data/spec/unit/rspec/matchers/be_compared_to_spec.rb +0 -23
- data/spec/unit/rspec/matchers/be_falsey_spec.rb +0 -9
- data/spec/unit/rspec/matchers/be_nil_spec.rb +0 -9
- data/spec/unit/rspec/matchers/be_predicate_spec.rb +0 -31
- data/spec/unit/rspec/matchers/be_spec.rb +0 -17
- data/spec/unit/rspec/matchers/be_truthy_spec.rb +0 -9
- data/spec/unit/rspec/matchers/contain_exactly_spec.rb +0 -11
- data/spec/unit/rspec/matchers/eq_spec.rb +0 -9
- data/spec/unit/rspec/matchers/have_attributes_spec.rb +0 -11
- data/spec/unit/rspec/matchers/have_predicate_spec.rb +0 -21
- data/spec/unit/rspec/matchers/include_spec.rb +0 -21
- data/spec/unit/rspec/matchers/match_array_spec.rb +0 -11
- data/spec/unit/rspec/matchers/match_spec.rb +0 -9
- data/spec/unit/rspec/matchers/raise_error_spec.rb +0 -77
- data/spec/unit/rspec/matchers/respond_to_spec.rb +0 -85
- data/spec/unit/rspec/object_inspection/rspec_matcher_spec.rb +0 -91
- data/spec/unit/rspec/object_inspection_spec.rb +0 -471
- data/spec/unit/super_diff_spec.rb +0 -2115
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTreeBuilders
|
@@ -7,7 +9,7 @@ module SuperDiff
|
|
7
9
|
end
|
8
10
|
|
9
11
|
def initialize(*args)
|
10
|
-
super
|
12
|
+
super
|
11
13
|
|
12
14
|
establish_expected_and_actual_attributes
|
13
15
|
end
|
@@ -15,11 +17,10 @@ module SuperDiff
|
|
15
17
|
protected
|
16
18
|
|
17
19
|
def unary_operations
|
18
|
-
attribute_names.
|
20
|
+
attribute_names.each_with_object([]) do |name, operations|
|
19
21
|
possibly_add_noop_operation_to(operations, name)
|
20
22
|
possibly_add_delete_operation_to(operations, name)
|
21
23
|
possibly_add_insert_operation_to(operations, name)
|
22
|
-
operations
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
@@ -32,7 +33,7 @@ module SuperDiff
|
|
32
33
|
def attribute_names
|
33
34
|
(
|
34
35
|
expected.instance_variables.sort & actual.instance_variables.sort
|
35
|
-
).map { |variable_name| variable_name[1
|
36
|
+
).map { |variable_name| variable_name[1..] }
|
36
37
|
end
|
37
38
|
|
38
39
|
private
|
@@ -52,15 +53,15 @@ module SuperDiff
|
|
52
53
|
end
|
53
54
|
|
54
55
|
def possibly_add_noop_operation_to(operations, attribute_name)
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
56
|
+
return unless should_add_noop_operation?(attribute_name)
|
57
|
+
|
58
|
+
operations << Core::UnaryOperation.new(
|
59
|
+
name: :noop,
|
60
|
+
collection: actual_attributes,
|
61
|
+
key: attribute_name,
|
62
|
+
index: attribute_names.index(attribute_name),
|
63
|
+
value: actual_attributes[attribute_name]
|
64
|
+
)
|
64
65
|
end
|
65
66
|
|
66
67
|
def should_add_noop_operation?(attribute_name)
|
@@ -71,15 +72,15 @@ module SuperDiff
|
|
71
72
|
end
|
72
73
|
|
73
74
|
def possibly_add_delete_operation_to(operations, attribute_name)
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
75
|
+
return unless should_add_delete_operation?(attribute_name)
|
76
|
+
|
77
|
+
operations << Core::UnaryOperation.new(
|
78
|
+
name: :delete,
|
79
|
+
collection: expected_attributes,
|
80
|
+
key: attribute_name,
|
81
|
+
index: attribute_names.index(attribute_name),
|
82
|
+
value: expected_attributes[attribute_name]
|
83
|
+
)
|
83
84
|
end
|
84
85
|
|
85
86
|
def should_add_delete_operation?(attribute_name)
|
@@ -92,15 +93,15 @@ module SuperDiff
|
|
92
93
|
end
|
93
94
|
|
94
95
|
def possibly_add_insert_operation_to(operations, attribute_name)
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
96
|
+
return unless should_add_insert_operation?(attribute_name)
|
97
|
+
|
98
|
+
operations << Core::UnaryOperation.new(
|
99
|
+
name: :insert,
|
100
|
+
collection: actual_attributes,
|
101
|
+
key: attribute_name,
|
102
|
+
index: attribute_names.index(attribute_name),
|
103
|
+
value: actual_attributes[attribute_name]
|
104
|
+
)
|
104
105
|
end
|
105
106
|
|
106
107
|
def should_add_insert_operation?(attribute_name)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTreeBuilders
|
@@ -20,8 +22,10 @@ module SuperDiff
|
|
20
22
|
|
21
23
|
def unary_operations_using_variant_of_patience_algorithm
|
22
24
|
operations = []
|
23
|
-
aks
|
24
|
-
|
25
|
+
aks = actual.keys
|
26
|
+
eks = expected.keys
|
27
|
+
previous_ei = nil
|
28
|
+
ei = 0
|
25
29
|
ai = 0
|
26
30
|
|
27
31
|
# When diffing a hash, we're more interested in the 'actual' version
|
@@ -30,7 +34,8 @@ module SuperDiff
|
|
30
34
|
# hash, and we start off by looping over it.
|
31
35
|
while ai < aks.size
|
32
36
|
ak = aks[ai]
|
33
|
-
av
|
37
|
+
av = actual[ak]
|
38
|
+
ev = expected[ak]
|
34
39
|
# While we iterate over 'actual' in order, we jump all over
|
35
40
|
# 'expected', trying to match up its keys with the keys in 'actual' as
|
36
41
|
# much as possible.
|
@@ -51,23 +56,23 @@ module SuperDiff
|
|
51
56
|
# the keys in 'expected'.)
|
52
57
|
(previous_ei + 1).upto(ei - 1) do |ei2|
|
53
58
|
ek = eks[ei2]
|
54
|
-
ev2
|
59
|
+
ev2 = expected[ek]
|
60
|
+
av2 = actual[ek]
|
55
61
|
|
56
|
-
|
62
|
+
next unless
|
57
63
|
(!actual.include?(ek) || ev2 != av2) &&
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
end
|
64
|
+
operations.none? do |operation|
|
65
|
+
%i[delete noop].include?(operation.name) &&
|
66
|
+
operation.key == ek
|
67
|
+
end
|
68
|
+
|
69
|
+
operations << Core::UnaryOperation.new(
|
70
|
+
name: :delete,
|
71
|
+
collection: expected,
|
72
|
+
key: ek,
|
73
|
+
value: ev2,
|
74
|
+
index: ei2
|
75
|
+
)
|
71
76
|
end
|
72
77
|
end
|
73
78
|
|
@@ -82,10 +87,9 @@ module SuperDiff
|
|
82
87
|
# (If we're here, it probably means that the key in 'actual' isn't
|
83
88
|
# present in 'expected' or the values don't match.)
|
84
89
|
|
85
|
-
if (
|
86
|
-
|
87
|
-
|
88
|
-
)
|
90
|
+
if (operations.empty? || operations.last.name == :noop) &&
|
91
|
+
(ai.zero? || eks.include?(aks[ai - 1]))
|
92
|
+
|
89
93
|
# If we go from a match in the last iteration to a missing or
|
90
94
|
# extra key in this one, or we're at the first key in 'actual' and
|
91
95
|
# it's missing or extra, look for deletes in the 'expected' hash
|
@@ -98,7 +102,7 @@ module SuperDiff
|
|
98
102
|
# or we hit some other condition (see below).
|
99
103
|
|
100
104
|
start_index =
|
101
|
-
if ai
|
105
|
+
if ai.positive?
|
102
106
|
eks.index(aks[ai - 1]) + 1
|
103
107
|
else
|
104
108
|
0
|
@@ -106,18 +110,18 @@ module SuperDiff
|
|
106
110
|
|
107
111
|
start_index.upto(eks.size - 1) do |ei2|
|
108
112
|
ek = eks[ei2]
|
109
|
-
ev
|
113
|
+
ev = expected[ek]
|
114
|
+
av2 = actual[ek]
|
110
115
|
|
111
116
|
if actual.include?(ek) && ev == av2
|
112
117
|
# If the key in 'expected' we've landed on happens to be a
|
113
118
|
# match in 'actual', then stop, because it's going to be
|
114
119
|
# handled in some future iteration of the 'actual' loop.
|
115
120
|
break
|
116
|
-
elsif
|
117
|
-
aks[ai + 1..-1].any? do |k|
|
121
|
+
elsif aks[ai + 1..].any? do |k| # rubocop:disable Lint/DuplicateBranch for clarity
|
118
122
|
expected.include?(k) && expected[k] != actual[k]
|
119
123
|
end
|
120
|
-
|
124
|
+
|
121
125
|
# While we backtracked a bit to iterate over 'expected', we
|
122
126
|
# now have to look ahead. If we will end up encountering a
|
123
127
|
# insert that matches this delete later, stop and go back to
|
@@ -135,28 +139,27 @@ module SuperDiff
|
|
135
139
|
)
|
136
140
|
end
|
137
141
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
142
|
+
next unless ek == ak && ev != av
|
143
|
+
|
144
|
+
# If we're pointing to the same key in 'expected' as in
|
145
|
+
# 'actual', but with different values, go ahead and add an
|
146
|
+
# insert now to accompany the delete added above. That way
|
147
|
+
# they appear together, which will be easier to read.
|
148
|
+
operations << Core::UnaryOperation.new(
|
149
|
+
name: :insert,
|
150
|
+
collection: actual,
|
151
|
+
key: ak,
|
152
|
+
value: av,
|
153
|
+
index: ai
|
154
|
+
)
|
151
155
|
end
|
152
156
|
end
|
153
157
|
|
154
|
-
if (
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
)
|
158
|
+
if expected.include?(ak) && ev != av &&
|
159
|
+
operations.none? do |op|
|
160
|
+
op.name == :delete && op.key == ak
|
161
|
+
end
|
162
|
+
|
160
163
|
# If we're here, it means that we didn't encounter any delete
|
161
164
|
# operations above for whatever reason and so we need to add a
|
162
165
|
# delete to represent the fact that the value for this key has
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'patience_diff'
|
2
4
|
|
3
5
|
module SuperDiff
|
4
6
|
module Basic
|
@@ -10,7 +12,7 @@ module SuperDiff
|
|
10
12
|
end
|
11
13
|
|
12
14
|
def initialize(*args)
|
13
|
-
super
|
15
|
+
super
|
14
16
|
|
15
17
|
@original_expected = @expected
|
16
18
|
@original_actual = @actual
|
@@ -42,7 +44,7 @@ module SuperDiff
|
|
42
44
|
attr_reader :sequence_matcher, :original_expected, :original_actual
|
43
45
|
|
44
46
|
def split_into_lines(string)
|
45
|
-
string.scan(
|
47
|
+
string.scan(/.*(?:\r|\n|\r\n|\Z)/)
|
46
48
|
end
|
47
49
|
|
48
50
|
def opcodes
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTreeBuilders
|
@@ -14,10 +16,10 @@ module SuperDiff
|
|
14
16
|
# If timezones are different, also show a normalized timestamp at the
|
15
17
|
# end of the diff to help visualize why they are different moments in
|
16
18
|
# time.
|
17
|
-
if actual.zone
|
18
|
-
base + ["utc"]
|
19
|
-
else
|
19
|
+
if actual.zone == expected.zone
|
20
20
|
base
|
21
|
+
else
|
22
|
+
base + ['utc']
|
21
23
|
end
|
22
24
|
end
|
23
25
|
end
|
@@ -1,31 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTreeBuilders
|
4
|
-
autoload :Array,
|
6
|
+
autoload :Array, 'super_diff/basic/operation_tree_builders/array'
|
5
7
|
autoload(
|
6
8
|
:CustomObject,
|
7
|
-
|
9
|
+
'super_diff/basic/operation_tree_builders/custom_object'
|
10
|
+
)
|
11
|
+
autoload(
|
12
|
+
:DataObject,
|
13
|
+
'super_diff/basic/operation_tree_builders/data_object'
|
8
14
|
)
|
9
15
|
autoload(
|
10
16
|
:DefaultObject,
|
11
|
-
|
17
|
+
'super_diff/basic/operation_tree_builders/default_object'
|
12
18
|
)
|
13
|
-
autoload :Hash,
|
19
|
+
autoload :Hash, 'super_diff/basic/operation_tree_builders/hash'
|
14
20
|
# TODO: Where is this used?
|
15
21
|
autoload(
|
16
22
|
:MultilineString,
|
17
|
-
|
23
|
+
'super_diff/basic/operation_tree_builders/multiline_string'
|
18
24
|
)
|
19
|
-
autoload :TimeLike,
|
20
|
-
autoload :DateLike,
|
25
|
+
autoload :TimeLike, 'super_diff/basic/operation_tree_builders/time_like'
|
26
|
+
autoload :DateLike, 'super_diff/basic/operation_tree_builders/date_like'
|
21
27
|
|
22
28
|
class Main
|
23
29
|
def self.call(*args)
|
24
|
-
warn <<~
|
30
|
+
warn <<~WARNING
|
25
31
|
WARNING: SuperDiff::OperationTreeBuilders::Main.call(...) is deprecated and will be removed in the next major release.
|
26
32
|
Please use SuperDiff.build_operation_tree_for(...) instead.
|
27
33
|
#{caller_locations.join("\n")}
|
28
|
-
|
34
|
+
WARNING
|
29
35
|
SuperDiff.build_operation_tree_for(*args)
|
30
36
|
end
|
31
37
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTreeFlatteners
|
@@ -5,11 +7,11 @@ module SuperDiff
|
|
5
7
|
protected
|
6
8
|
|
7
9
|
def open_token
|
8
|
-
|
10
|
+
'['
|
9
11
|
end
|
10
12
|
|
11
13
|
def close_token
|
12
|
-
|
14
|
+
']'
|
13
15
|
end
|
14
16
|
end
|
15
17
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTreeFlatteners
|
@@ -23,7 +25,7 @@ module SuperDiff
|
|
23
25
|
end
|
24
26
|
|
25
27
|
def inner_lines
|
26
|
-
@
|
28
|
+
@inner_lines ||=
|
27
29
|
operation_tree.flat_map do |operation|
|
28
30
|
lines =
|
29
31
|
if operation.name == :change
|
@@ -52,7 +54,7 @@ module SuperDiff
|
|
52
54
|
end
|
53
55
|
|
54
56
|
def add_prefix_at_beginning_of_lines(lines, operation)
|
55
|
-
[lines[0].prefixed_with(item_prefix_for(operation))] + lines[1
|
57
|
+
[lines[0].prefixed_with(item_prefix_for(operation))] + lines[1..]
|
56
58
|
end
|
57
59
|
|
58
60
|
def maybe_add_comma_at_end_of_lines(lines, operation)
|
@@ -81,13 +83,11 @@ module SuperDiff
|
|
81
83
|
operation.left_collection,
|
82
84
|
operation.right_collection
|
83
85
|
) do |already_seen|
|
84
|
-
if already_seen
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
)
|
90
|
-
end
|
86
|
+
raise InfiniteRecursionError if already_seen
|
87
|
+
|
88
|
+
operation.children.flatten(
|
89
|
+
indentation_level: indentation_level + 1
|
90
|
+
)
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
@@ -117,7 +117,7 @@ module SuperDiff
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def item_prefix_for(_operation)
|
120
|
-
|
120
|
+
''
|
121
121
|
end
|
122
122
|
|
123
123
|
def build_lines_from_inspection_of(value, type:, indentation_level:)
|
@@ -131,7 +131,7 @@ module SuperDiff
|
|
131
131
|
|
132
132
|
class InfiniteRecursionError < StandardError
|
133
133
|
def initialize(_message = nil)
|
134
|
-
super(
|
134
|
+
super('Unhandled recursive data structure encountered!')
|
135
135
|
end
|
136
136
|
end
|
137
137
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTreeFlatteners
|
@@ -5,16 +7,16 @@ module SuperDiff
|
|
5
7
|
protected
|
6
8
|
|
7
9
|
def open_token
|
8
|
-
|
10
|
+
format('#<%<class>s {', class: operation_tree.underlying_object.class)
|
9
11
|
end
|
10
12
|
|
11
13
|
def close_token
|
12
|
-
|
14
|
+
'}>'
|
13
15
|
end
|
14
16
|
|
15
17
|
def item_prefix_for(operation)
|
16
18
|
key =
|
17
|
-
#
|
19
|
+
# NOTE: We could have used the right_key here too, they're both the
|
18
20
|
# same keys
|
19
21
|
if operation.respond_to?(:left_key)
|
20
22
|
operation.left_key
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTreeFlatteners
|
@@ -5,18 +7,17 @@ module SuperDiff
|
|
5
7
|
protected
|
6
8
|
|
7
9
|
def open_token
|
8
|
-
"#<#{operation_tree.underlying_object.class.name}:"
|
9
|
-
Core::Helpers.object_address_for(operation_tree.underlying_object)
|
10
|
-
" {"
|
10
|
+
"#<#{operation_tree.underlying_object.class.name}:" \
|
11
|
+
"#{Core::Helpers.object_address_for(operation_tree.underlying_object)} {"
|
11
12
|
end
|
12
13
|
|
13
14
|
def close_token
|
14
|
-
|
15
|
+
'}>'
|
15
16
|
end
|
16
17
|
|
17
18
|
def item_prefix_for(operation)
|
18
19
|
key =
|
19
|
-
#
|
20
|
+
# NOTE: We could have used the right_key here too, they're both the
|
20
21
|
# same keys
|
21
22
|
if operation.respond_to?(:left_key)
|
22
23
|
operation.left_key
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTreeFlatteners
|
@@ -5,11 +7,11 @@ module SuperDiff
|
|
5
7
|
protected
|
6
8
|
|
7
9
|
def open_token
|
8
|
-
|
10
|
+
'{'
|
9
11
|
end
|
10
12
|
|
11
13
|
def close_token
|
12
|
-
|
14
|
+
'}'
|
13
15
|
end
|
14
16
|
|
15
17
|
def item_prefix_for(operation)
|
@@ -25,7 +27,7 @@ module SuperDiff
|
|
25
27
|
end
|
26
28
|
|
27
29
|
def key_for(operation)
|
28
|
-
#
|
30
|
+
# NOTE: We could have used the right_key here too, they're both the
|
29
31
|
# same keys
|
30
32
|
operation.respond_to?(:left_key) ? operation.left_key : operation.key
|
31
33
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTreeFlatteners
|
@@ -10,7 +12,7 @@ module SuperDiff
|
|
10
12
|
# TODO: Test that quotes and things don't get escaped but escape
|
11
13
|
# characters do
|
12
14
|
value:
|
13
|
-
operation.value.inspect[1..-2].gsub(
|
15
|
+
operation.value.inspect[1..-2].gsub('\\"', '"').gsub("\\'", "'")
|
14
16
|
)
|
15
17
|
end
|
16
18
|
end
|
@@ -1,23 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTreeFlatteners
|
4
|
-
autoload :Array,
|
6
|
+
autoload :Array, 'super_diff/basic/operation_tree_flatteners/array'
|
5
7
|
autoload(
|
6
8
|
:Collection,
|
7
|
-
|
9
|
+
'super_diff/basic/operation_tree_flatteners/collection'
|
8
10
|
)
|
9
11
|
autoload(
|
10
12
|
:CustomObject,
|
11
|
-
|
13
|
+
'super_diff/basic/operation_tree_flatteners/custom_object'
|
12
14
|
)
|
13
15
|
autoload(
|
14
16
|
:DefaultObject,
|
15
|
-
|
17
|
+
'super_diff/basic/operation_tree_flatteners/default_object'
|
16
18
|
)
|
17
|
-
autoload :Hash,
|
19
|
+
autoload :Hash, 'super_diff/basic/operation_tree_flatteners/hash'
|
18
20
|
autoload(
|
19
21
|
:MultilineString,
|
20
|
-
|
22
|
+
'super_diff/basic/operation_tree_flatteners/multiline_string'
|
21
23
|
)
|
22
24
|
end
|
23
25
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTrees
|
@@ -17,18 +19,18 @@ module SuperDiff
|
|
17
19
|
pp.text "#<#{self.class.name} "
|
18
20
|
pp.nest(1) do
|
19
21
|
pp.breakable
|
20
|
-
pp.text
|
21
|
-
pp.group(1,
|
22
|
+
pp.text ':operations=>'
|
23
|
+
pp.group(1, '[', ']') do
|
22
24
|
pp.breakable
|
23
25
|
pp.seplist(self) { |value| pp.pp value }
|
24
26
|
end
|
25
27
|
pp.comma_breakable
|
26
|
-
pp.text
|
28
|
+
pp.text ':underlying_object=>'
|
27
29
|
pp.object_address_group underlying_object do
|
28
30
|
# do nothing
|
29
31
|
end
|
30
32
|
end
|
31
|
-
pp.text
|
33
|
+
pp.text '>'
|
32
34
|
end
|
33
35
|
|
34
36
|
protected
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SuperDiff
|
2
4
|
module Basic
|
3
5
|
module OperationTrees
|
4
6
|
class MultilineString < Core::AbstractOperationTree
|
5
7
|
def self.applies_to?(value)
|
6
|
-
value.is_a?(::String)
|
8
|
+
value.is_a?(::String)
|
7
9
|
end
|
8
10
|
|
9
11
|
protected
|