super_diff 0.4.2 → 0.5.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.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +21 -8
  3. data/lib/super_diff.rb +20 -11
  4. data/lib/super_diff/active_record.rb +20 -24
  5. data/lib/super_diff/active_record/diff_formatters/active_record_relation.rb +3 -3
  6. data/lib/super_diff/active_record/differs/active_record_relation.rb +3 -5
  7. data/lib/super_diff/active_record/object_inspection/inspectors/active_record_model.rb +32 -22
  8. data/lib/super_diff/active_record/object_inspection/inspectors/active_record_relation.rb +17 -7
  9. data/lib/super_diff/active_record/operation_tree_builders.rb +14 -0
  10. data/lib/super_diff/active_record/{operational_sequencers → operation_tree_builders}/active_record_model.rb +2 -2
  11. data/lib/super_diff/active_record/{operational_sequencers → operation_tree_builders}/active_record_relation.rb +4 -4
  12. data/lib/super_diff/active_record/{operation_sequences.rb → operation_trees.rb} +2 -2
  13. data/lib/super_diff/active_record/{operation_sequences → operation_trees}/active_record_relation.rb +2 -2
  14. data/lib/super_diff/active_support.rb +16 -19
  15. data/lib/super_diff/active_support/diff_formatters/hash_with_indifferent_access.rb +3 -3
  16. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +3 -5
  17. data/lib/super_diff/active_support/object_inspection/inspectors/hash_with_indifferent_access.rb +17 -7
  18. data/lib/super_diff/active_support/operation_tree_builders.rb +10 -0
  19. data/lib/super_diff/active_support/{operational_sequencers → operation_tree_builders}/hash_with_indifferent_access.rb +2 -2
  20. data/lib/super_diff/active_support/{operation_sequences.rb → operation_trees.rb} +2 -2
  21. data/lib/super_diff/active_support/{operation_sequences → operation_trees}/hash_with_indifferent_access.rb +2 -2
  22. data/lib/super_diff/configuration.rb +60 -0
  23. data/lib/super_diff/diff_formatters.rb +3 -3
  24. data/lib/super_diff/diff_formatters/array.rb +3 -3
  25. data/lib/super_diff/diff_formatters/base.rb +3 -2
  26. data/lib/super_diff/diff_formatters/collection.rb +2 -2
  27. data/lib/super_diff/diff_formatters/custom_object.rb +3 -3
  28. data/lib/super_diff/diff_formatters/default_object.rb +6 -8
  29. data/lib/super_diff/diff_formatters/defaults.rb +10 -0
  30. data/lib/super_diff/diff_formatters/hash.rb +3 -3
  31. data/lib/super_diff/diff_formatters/main.rb +41 -0
  32. data/lib/super_diff/diff_formatters/multiline_string.rb +3 -3
  33. data/lib/super_diff/differs.rb +4 -11
  34. data/lib/super_diff/differs/array.rb +2 -11
  35. data/lib/super_diff/differs/base.rb +20 -3
  36. data/lib/super_diff/differs/custom_object.rb +2 -11
  37. data/lib/super_diff/differs/default_object.rb +2 -8
  38. data/lib/super_diff/differs/defaults.rb +12 -0
  39. data/lib/super_diff/differs/hash.rb +2 -11
  40. data/lib/super_diff/differs/main.rb +48 -0
  41. data/lib/super_diff/differs/multiline_string.rb +2 -14
  42. data/lib/super_diff/differs/time_like.rb +15 -0
  43. data/lib/super_diff/equality_matchers.rb +3 -9
  44. data/lib/super_diff/equality_matchers/array.rb +1 -7
  45. data/lib/super_diff/equality_matchers/base.rb +1 -1
  46. data/lib/super_diff/equality_matchers/default.rb +1 -7
  47. data/lib/super_diff/equality_matchers/defaults.rb +12 -0
  48. data/lib/super_diff/equality_matchers/hash.rb +1 -7
  49. data/lib/super_diff/equality_matchers/main.rb +21 -0
  50. data/lib/super_diff/equality_matchers/multiline_string.rb +1 -7
  51. data/lib/super_diff/errors.rb +16 -0
  52. data/lib/super_diff/errors/no_diff_formatter_available_error.rb +21 -0
  53. data/lib/super_diff/errors/no_differ_available_error.rb +24 -0
  54. data/lib/super_diff/errors/no_operational_sequencer_available_error.rb +22 -0
  55. data/lib/super_diff/implementation_checks.rb +19 -0
  56. data/lib/super_diff/object_inspection.rb +1 -10
  57. data/lib/super_diff/object_inspection/inspection_tree.rb +6 -2
  58. data/lib/super_diff/object_inspection/inspectors.rb +5 -1
  59. data/lib/super_diff/object_inspection/inspectors/array.rb +20 -10
  60. data/lib/super_diff/object_inspection/inspectors/base.rb +36 -0
  61. data/lib/super_diff/object_inspection/inspectors/custom_object.rb +24 -14
  62. data/lib/super_diff/object_inspection/inspectors/default_object.rb +44 -30
  63. data/lib/super_diff/object_inspection/inspectors/defaults.rb +15 -0
  64. data/lib/super_diff/object_inspection/inspectors/hash.rb +20 -10
  65. data/lib/super_diff/object_inspection/inspectors/main.rb +35 -0
  66. data/lib/super_diff/object_inspection/inspectors/primitive.rb +20 -5
  67. data/lib/super_diff/object_inspection/inspectors/string.rb +15 -5
  68. data/lib/super_diff/object_inspection/inspectors/time_like.rb +23 -0
  69. data/lib/super_diff/object_inspection/nodes/inspection.rb +9 -2
  70. data/lib/super_diff/operation_tree_builders.rb +18 -0
  71. data/lib/super_diff/{operational_sequencers → operation_tree_builders}/array.rb +38 -59
  72. data/lib/super_diff/operation_tree_builders/base.rb +98 -0
  73. data/lib/super_diff/{operational_sequencers → operation_tree_builders}/custom_object.rb +3 -3
  74. data/lib/super_diff/{operational_sequencers → operation_tree_builders}/default_object.rb +8 -3
  75. data/lib/super_diff/operation_tree_builders/defaults.rb +5 -0
  76. data/lib/super_diff/operation_tree_builders/hash.rb +226 -0
  77. data/lib/super_diff/operation_tree_builders/main.rb +42 -0
  78. data/lib/super_diff/{operational_sequencers → operation_tree_builders}/multiline_string.rb +3 -3
  79. data/lib/super_diff/operation_tree_builders/time_like.rb +34 -0
  80. data/lib/super_diff/operation_trees.rb +13 -0
  81. data/lib/super_diff/{operation_sequences → operation_trees}/array.rb +5 -1
  82. data/lib/super_diff/{operation_sequences → operation_trees}/base.rb +7 -1
  83. data/lib/super_diff/{operation_sequences → operation_trees}/custom_object.rb +5 -1
  84. data/lib/super_diff/{operation_sequences → operation_trees}/default_object.rb +10 -8
  85. data/lib/super_diff/operation_trees/defaults.rb +5 -0
  86. data/lib/super_diff/{operation_sequences → operation_trees}/hash.rb +5 -1
  87. data/lib/super_diff/operation_trees/main.rb +35 -0
  88. data/lib/super_diff/operation_trees/multiline_string.rb +18 -0
  89. data/lib/super_diff/operations/unary_operation.rb +3 -0
  90. data/lib/super_diff/rspec.rb +45 -13
  91. data/lib/super_diff/rspec/augmented_matcher.rb +1 -1
  92. data/lib/super_diff/rspec/differ.rb +2 -17
  93. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +2 -7
  94. data/lib/super_diff/rspec/differs/collection_including.rb +2 -7
  95. data/lib/super_diff/rspec/differs/hash_including.rb +2 -7
  96. data/lib/super_diff/rspec/differs/object_having_attributes.rb +2 -7
  97. data/lib/super_diff/rspec/matcher_text_builders/match.rb +1 -1
  98. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +1 -1
  99. data/lib/super_diff/rspec/matcher_text_template.rb +1 -1
  100. data/lib/super_diff/rspec/object_inspection.rb +0 -1
  101. data/lib/super_diff/rspec/object_inspection/inspectors.rb +16 -0
  102. data/lib/super_diff/rspec/object_inspection/inspectors/collection_containing_exactly.rb +17 -8
  103. data/lib/super_diff/rspec/object_inspection/inspectors/collection_including.rb +15 -9
  104. data/lib/super_diff/rspec/object_inspection/inspectors/hash_including.rb +20 -10
  105. data/lib/super_diff/rspec/object_inspection/inspectors/instance_of.rb +23 -0
  106. data/lib/super_diff/rspec/object_inspection/inspectors/kind_of.rb +23 -0
  107. data/lib/super_diff/rspec/object_inspection/inspectors/object_having_attributes.rb +20 -11
  108. data/lib/super_diff/rspec/object_inspection/inspectors/primitive.rb +13 -0
  109. data/lib/super_diff/rspec/object_inspection/inspectors/value_within.rb +29 -0
  110. data/lib/super_diff/rspec/operation_tree_builders.rb +22 -0
  111. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/collection_containing_exactly.rb +5 -5
  112. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/collection_including.rb +2 -2
  113. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/hash_including.rb +3 -11
  114. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/object_having_attributes.rb +4 -8
  115. data/lib/super_diff/version.rb +1 -1
  116. data/spec/examples.txt +397 -393
  117. data/spec/integration/rspec/have_attributes_matcher_spec.rb +354 -227
  118. data/spec/integration/rspec/include_matcher_spec.rb +2 -2
  119. data/spec/integration/rspec/unhandled_errors_spec.rb +68 -12
  120. data/spec/support/command_runner.rb +3 -0
  121. data/spec/support/integration/helpers.rb +12 -96
  122. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +14 -29
  123. data/spec/support/integration/test_programs/base.rb +120 -0
  124. data/spec/support/integration/test_programs/plain.rb +13 -0
  125. data/spec/support/integration/test_programs/rspec_active_record.rb +17 -0
  126. data/spec/support/integration/test_programs/rspec_rails.rb +17 -0
  127. data/spec/support/models/active_record/person.rb +4 -11
  128. data/spec/support/models/active_record/shipping_address.rb +10 -14
  129. data/spec/support/object_id.rb +6 -5
  130. data/spec/tmp/integration_spec.rb +15 -0
  131. data/spec/unit/{equality_matcher_spec.rb → equality_matchers/main_spec.rb} +157 -1
  132. data/spec/unit/object_inspection_spec.rb +77 -1
  133. data/super_diff.gemspec +0 -1
  134. metadata +72 -64
  135. data/lib/super_diff/active_record/object_inspection/map_extension.rb +0 -18
  136. data/lib/super_diff/active_record/operational_sequencers.rb +0 -14
  137. data/lib/super_diff/active_support/object_inspection/map_extension.rb +0 -15
  138. data/lib/super_diff/active_support/operational_sequencers.rb +0 -10
  139. data/lib/super_diff/diff_formatter.rb +0 -32
  140. data/lib/super_diff/differ.rb +0 -51
  141. data/lib/super_diff/differs/time.rb +0 -24
  142. data/lib/super_diff/equality_matcher.rb +0 -32
  143. data/lib/super_diff/no_differ_available_error.rb +0 -22
  144. data/lib/super_diff/no_operational_sequencer_available_error.rb +0 -20
  145. data/lib/super_diff/object_inspection/inspector.rb +0 -27
  146. data/lib/super_diff/object_inspection/inspectors/time.rb +0 -13
  147. data/lib/super_diff/object_inspection/map.rb +0 -30
  148. data/lib/super_diff/operation_sequences.rb +0 -9
  149. data/lib/super_diff/operational_sequencer.rb +0 -48
  150. data/lib/super_diff/operational_sequencers.rb +0 -17
  151. data/lib/super_diff/operational_sequencers/base.rb +0 -89
  152. data/lib/super_diff/operational_sequencers/hash.rb +0 -85
  153. data/lib/super_diff/operational_sequencers/time_like.rb +0 -30
  154. data/lib/super_diff/rspec/configuration.rb +0 -31
  155. data/lib/super_diff/rspec/object_inspection/map_extension.rb +0 -23
  156. data/lib/super_diff/rspec/operational_sequencers.rb +0 -22
@@ -1,85 +0,0 @@
1
- module SuperDiff
2
- module OperationalSequencers
3
- class Hash < Base
4
- def self.applies_to?(expected, actual)
5
- expected.is_a?(::Hash) && actual.is_a?(::Hash)
6
- end
7
-
8
- protected
9
-
10
- def unary_operations
11
- all_keys.reduce([]) do |operations, key|
12
- possibly_add_noop_to(operations, key)
13
- possibly_add_delete_to(operations, key)
14
- possibly_add_insert_to(operations, key)
15
- operations
16
- end
17
- end
18
-
19
- def build_operation_sequencer
20
- OperationSequences::Hash.new([])
21
- end
22
-
23
- private
24
-
25
- def all_keys
26
- actual.keys | expected.keys
27
- end
28
-
29
- def possibly_add_noop_to(operations, key)
30
- if should_add_noop_operation?(key)
31
- operations << Operations::UnaryOperation.new(
32
- name: :noop,
33
- collection: actual,
34
- key: key,
35
- index: all_keys.index(key),
36
- index_in_collection: actual.keys.index(key),
37
- value: actual[key],
38
- )
39
- end
40
- end
41
-
42
- def should_add_noop_operation?(key)
43
- expected.include?(key) &&
44
- actual.include?(key) &&
45
- expected[key] == actual[key]
46
- end
47
-
48
- def possibly_add_delete_to(operations, key)
49
- if should_add_delete_operation?(key)
50
- operations << Operations::UnaryOperation.new(
51
- name: :delete,
52
- collection: expected,
53
- key: key,
54
- index: all_keys.index(key),
55
- index_in_collection: expected.keys.index(key),
56
- value: expected[key],
57
- )
58
- end
59
- end
60
-
61
- def should_add_delete_operation?(key)
62
- expected.include?(key) &&
63
- (!actual.include?(key) || expected[key] != actual[key])
64
- end
65
-
66
- def possibly_add_insert_to(operations, key)
67
- if should_add_insert_operation?(key)
68
- operations << Operations::UnaryOperation.new(
69
- name: :insert,
70
- collection: actual,
71
- key: key,
72
- index: all_keys.index(key),
73
- index_in_collection: actual.keys.index(key),
74
- value: actual[key],
75
- )
76
- end
77
- end
78
-
79
- def should_add_insert_operation?(key)
80
- !expected.include?(key) ||
81
- (actual.include?(key) && expected[key] != actual[key])
82
- end
83
- end
84
- end
85
- end
@@ -1,30 +0,0 @@
1
- module SuperDiff
2
- module OperationalSequencers
3
- class TimeLike < CustomObject
4
- def self.applies_to?(expected, actual)
5
- (expected.is_a?(Time) && actual.is_a?(Time)) ||
6
- (
7
- # Check for ActiveSupport's #acts_like_time? for their time-like objects
8
- # (like ActiveSupport::TimeWithZone).
9
- expected.respond_to?(:acts_like_time?) && expected.acts_like_time? &&
10
- actual.respond_to?(:acts_like_time?) && actual.acts_like_time?
11
- )
12
- end
13
-
14
- protected
15
-
16
- def attribute_names
17
- base = ["year", "month", "day", "hour", "min", "sec", "nsec", "zone", "gmt_offset"]
18
-
19
- # If timezones are different, also show a normalized timestamp at the
20
- # end of the diff to help visualize why they are different moments in
21
- # time.
22
- if actual.zone != expected.zone
23
- base + ["utc"]
24
- else
25
- base
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,31 +0,0 @@
1
- module SuperDiff
2
- module RSpec
3
- class Configuration
4
- attr_reader(
5
- :extra_differ_classes,
6
- :extra_operational_sequencer_classes,
7
- :extra_diff_formatter_classes,
8
- )
9
-
10
- def initialize
11
- @extra_differ_classes = [].freeze
12
- @extra_operational_sequencer_classes = [].freeze
13
- @extra_diff_formatter_classes = [].freeze
14
- end
15
-
16
- def add_extra_differ_class(klass)
17
- @extra_differ_classes = (@extra_differ_classes + [klass]).freeze
18
- end
19
-
20
- def add_extra_operational_sequencer_class(klass)
21
- @extra_operational_sequencer_classes =
22
- (@extra_operational_sequencer_classes + [klass]).freeze
23
- end
24
-
25
- def add_extra_diff_formatter_class(klass)
26
- @extra_diff_formatter_classes =
27
- (@extra_diff_formatter_classes + [klass]).freeze
28
- end
29
- end
30
- end
31
- end
@@ -1,23 +0,0 @@
1
- module SuperDiff
2
- module RSpec
3
- module ObjectInspection
4
- module MapExtension
5
- def call(object)
6
- if SuperDiff::RSpec.a_hash_including_something?(object)
7
- Inspectors::HashIncluding
8
- elsif SuperDiff::RSpec.a_collection_including_something?(object)
9
- Inspectors::CollectionIncluding
10
- elsif SuperDiff::RSpec.an_object_having_some_attributes?(object)
11
- Inspectors::ObjectHavingAttributes
12
- elsif SuperDiff::RSpec.a_collection_containing_exactly_something?(object)
13
- Inspectors::CollectionContainingExactly
14
- elsif object.is_a?(::RSpec::Mocks::Double)
15
- SuperDiff::ObjectInspection::Inspectors::Primitive
16
- else
17
- super
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end
@@ -1,22 +0,0 @@
1
- module SuperDiff
2
- module RSpec
3
- module OperationalSequencers
4
- autoload(
5
- :CollectionContainingExactly,
6
- "super_diff/rspec/operational_sequencers/collection_containing_exactly",
7
- )
8
- autoload(
9
- :CollectionIncluding,
10
- "super_diff/rspec/operational_sequencers/collection_including",
11
- )
12
- autoload(
13
- :HashIncluding,
14
- "super_diff/rspec/operational_sequencers/hash_including",
15
- )
16
- autoload(
17
- :ObjectHavingAttributes,
18
- "super_diff/rspec/operational_sequencers/object_having_attributes",
19
- )
20
- end
21
- end
22
- end