super_diff 0.9.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +65 -26
  3. data/lib/super_diff/active_record/differs/active_record_relation.rb +1 -2
  4. data/lib/super_diff/active_record/differs.rb +1 -1
  5. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_model.rb +22 -18
  6. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_relation.rb +14 -7
  7. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders.rb +2 -2
  8. data/lib/super_diff/active_record/object_inspection.rb +1 -1
  9. data/lib/super_diff/active_record/operation_tree_builders/active_record_model.rb +1 -2
  10. data/lib/super_diff/active_record/operation_tree_builders/active_record_relation.rb +1 -2
  11. data/lib/super_diff/active_record/operation_tree_builders.rb +2 -2
  12. data/lib/super_diff/active_record/operation_tree_flatteners.rb +1 -1
  13. data/lib/super_diff/active_record/operation_trees.rb +1 -1
  14. data/lib/super_diff/active_record.rb +7 -15
  15. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +5 -6
  16. data/lib/super_diff/active_support/differs.rb +1 -1
  17. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/hash_with_indifferent_access.rb +20 -11
  18. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/ordered_options.rb +46 -0
  19. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders.rb +5 -1
  20. data/lib/super_diff/active_support/object_inspection.rb +1 -1
  21. data/lib/super_diff/active_support/operation_tree_builders/hash_with_indifferent_access.rb +5 -6
  22. data/lib/super_diff/active_support/operation_tree_builders.rb +1 -1
  23. data/lib/super_diff/active_support/operation_tree_flatteners.rb +1 -1
  24. data/lib/super_diff/active_support/operation_trees.rb +1 -1
  25. data/lib/super_diff/active_support.rb +6 -10
  26. data/lib/super_diff/colorized_document_extensions.rb +2 -4
  27. data/lib/super_diff/configuration.rb +14 -8
  28. data/lib/super_diff/csi/color.rb +4 -4
  29. data/lib/super_diff/csi/colorized_document.rb +12 -16
  30. data/lib/super_diff/csi/document.rb +8 -19
  31. data/lib/super_diff/csi/eight_bit_color.rb +19 -19
  32. data/lib/super_diff/csi/four_bit_color.rb +82 -31
  33. data/lib/super_diff/csi/twenty_four_bit_color.rb +12 -11
  34. data/lib/super_diff/csi/uncolorized_document.rb +2 -6
  35. data/lib/super_diff/csi.rb +10 -14
  36. data/lib/super_diff/diff_formatters/collection.rb +35 -41
  37. data/lib/super_diff/differs/date_like.rb +15 -0
  38. data/lib/super_diff/differs/default_object.rb +1 -1
  39. data/lib/super_diff/differs/defaults.rb +2 -1
  40. data/lib/super_diff/differs/main.rb +2 -13
  41. data/lib/super_diff/differs.rb +1 -0
  42. data/lib/super_diff/equality_matchers/array.rb +10 -12
  43. data/lib/super_diff/equality_matchers/base.rb +1 -1
  44. data/lib/super_diff/equality_matchers/default.rb +2 -4
  45. data/lib/super_diff/equality_matchers/defaults.rb +1 -1
  46. data/lib/super_diff/equality_matchers/hash.rb +10 -12
  47. data/lib/super_diff/equality_matchers/multiline_string.rb +11 -13
  48. data/lib/super_diff/equality_matchers/primitive.rb +10 -12
  49. data/lib/super_diff/equality_matchers/singleline_string.rb +10 -12
  50. data/lib/super_diff/equality_matchers.rb +1 -1
  51. data/lib/super_diff/errors.rb +2 -6
  52. data/lib/super_diff/gem_version.rb +3 -3
  53. data/lib/super_diff/helpers.rb +10 -10
  54. data/lib/super_diff/implementation_checks.rb +2 -2
  55. data/lib/super_diff/line.rb +3 -3
  56. data/lib/super_diff/object_inspection/inspection_tree.rb +64 -73
  57. data/lib/super_diff/object_inspection/inspection_tree_builders/array.rb +29 -14
  58. data/lib/super_diff/object_inspection/inspection_tree_builders/custom_object.rb +17 -13
  59. data/lib/super_diff/object_inspection/inspection_tree_builders/date_like.rb +51 -0
  60. data/lib/super_diff/object_inspection/inspection_tree_builders/default_object.rb +43 -27
  61. data/lib/super_diff/object_inspection/inspection_tree_builders/defaults.rb +2 -1
  62. data/lib/super_diff/object_inspection/inspection_tree_builders/hash.rb +35 -18
  63. data/lib/super_diff/object_inspection/inspection_tree_builders/primitive.rb +3 -5
  64. data/lib/super_diff/object_inspection/inspection_tree_builders/time_like.rb +30 -36
  65. data/lib/super_diff/object_inspection/inspection_tree_builders.rb +13 -9
  66. data/lib/super_diff/object_inspection/nodes/as_lines_when_rendering_to_lines.rb +11 -22
  67. data/lib/super_diff/object_inspection/nodes/as_prefix_when_rendering_to_lines.rb +1 -5
  68. data/lib/super_diff/object_inspection/nodes/as_prelude_when_rendering_to_lines.rb +1 -5
  69. data/lib/super_diff/object_inspection/nodes/as_single_line.rb +3 -7
  70. data/lib/super_diff/object_inspection/nodes/base.rb +9 -14
  71. data/lib/super_diff/object_inspection/nodes/inspection.rb +26 -34
  72. data/lib/super_diff/object_inspection/nodes/nesting.rb +1 -1
  73. data/lib/super_diff/object_inspection/nodes/only_when.rb +2 -6
  74. data/lib/super_diff/object_inspection/nodes/text.rb +1 -5
  75. data/lib/super_diff/object_inspection/nodes/when_empty.rb +2 -6
  76. data/lib/super_diff/object_inspection/nodes/when_non_empty.rb +2 -6
  77. data/lib/super_diff/object_inspection/nodes/when_rendering_to_lines.rb +1 -1
  78. data/lib/super_diff/object_inspection/nodes/when_rendering_to_string.rb +1 -5
  79. data/lib/super_diff/object_inspection/nodes.rb +7 -7
  80. data/lib/super_diff/object_inspection.rb +3 -3
  81. data/lib/super_diff/operation_tree_builders/array.rb +12 -11
  82. data/lib/super_diff/operation_tree_builders/base.rb +17 -15
  83. data/lib/super_diff/operation_tree_builders/custom_object.rb +8 -6
  84. data/lib/super_diff/operation_tree_builders/date_like.rb +15 -0
  85. data/lib/super_diff/operation_tree_builders/default_object.rb +29 -21
  86. data/lib/super_diff/operation_tree_builders/defaults.rb +1 -1
  87. data/lib/super_diff/operation_tree_builders/hash.rb +23 -24
  88. data/lib/super_diff/operation_tree_builders/main.rb +4 -11
  89. data/lib/super_diff/operation_tree_builders/multiline_string.rb +3 -3
  90. data/lib/super_diff/operation_tree_builders/time_like.rb +1 -11
  91. data/lib/super_diff/operation_tree_builders.rb +2 -1
  92. data/lib/super_diff/operation_tree_flatteners/base.rb +1 -5
  93. data/lib/super_diff/operation_tree_flatteners/collection.rb +13 -16
  94. data/lib/super_diff/operation_tree_flatteners/default_object.rb +1 -2
  95. data/lib/super_diff/operation_tree_flatteners/hash.rb +2 -10
  96. data/lib/super_diff/operation_tree_flatteners/multiline_string.rb +2 -1
  97. data/lib/super_diff/operation_tree_flatteners.rb +3 -3
  98. data/lib/super_diff/operation_trees/base.rb +3 -5
  99. data/lib/super_diff/operation_trees/default_object.rb +1 -3
  100. data/lib/super_diff/operations/binary_operation.rb +2 -2
  101. data/lib/super_diff/operations/unary_operation.rb +1 -1
  102. data/lib/super_diff/rails.rb +2 -1
  103. data/lib/super_diff/recursion_guard.rb +5 -4
  104. data/lib/super_diff/rspec/augmented_matcher.rb +4 -5
  105. data/lib/super_diff/rspec/differ.rb +6 -13
  106. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +3 -2
  107. data/lib/super_diff/rspec/differs/collection_including.rb +1 -1
  108. data/lib/super_diff/rspec/differs/hash_including.rb +1 -1
  109. data/lib/super_diff/rspec/differs.rb +3 -3
  110. data/lib/super_diff/rspec/matcher_text_builders/base.rb +13 -15
  111. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +5 -7
  112. data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +3 -5
  113. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +2 -10
  114. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +2 -6
  115. data/lib/super_diff/rspec/matcher_text_builders.rb +5 -8
  116. data/lib/super_diff/rspec/matcher_text_template.rb +13 -16
  117. data/lib/super_diff/rspec/monkey_patches.rb +180 -123
  118. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_containing_exactly.rb +14 -7
  119. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_including.rb +21 -13
  120. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/double.rb +35 -36
  121. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/generic_describable_matcher.rb +19 -0
  122. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/hash_including.rb +21 -15
  123. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/instance_of.rb +11 -10
  124. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/kind_of.rb +11 -10
  125. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/object_having_attributes.rb +14 -7
  126. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/value_within.rb +10 -11
  127. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders.rb +13 -9
  128. data/lib/super_diff/rspec/object_inspection.rb +1 -1
  129. data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +11 -10
  130. data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +7 -6
  131. data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +11 -10
  132. data/lib/super_diff/rspec/operation_tree_builders/object_having_attributes.rb +22 -17
  133. data/lib/super_diff/rspec/operation_tree_builders.rb +4 -4
  134. data/lib/super_diff/rspec.rb +17 -18
  135. data/lib/super_diff/tiered_lines_elider.rb +87 -115
  136. data/lib/super_diff/tiered_lines_formatter.rb +5 -9
  137. data/lib/super_diff/version.rb +1 -1
  138. data/lib/super_diff.rb +13 -9
  139. data/spec/examples.txt +541 -483
  140. data/spec/integration/rails/active_record_spec.rb +3 -1
  141. data/spec/integration/rails/engines_spec.rb +25 -0
  142. data/spec/integration/rails/hash_with_indifferent_access_spec.rb +3 -1
  143. data/spec/integration/rspec/be_falsey_matcher_spec.rb +40 -35
  144. data/spec/integration/rspec/be_matcher_spec.rb +360 -320
  145. data/spec/integration/rspec/be_nil_matcher_spec.rb +38 -34
  146. data/spec/integration/rspec/be_predicate_matcher_spec.rb +376 -359
  147. data/spec/integration/rspec/be_truthy_matcher_spec.rb +38 -33
  148. data/spec/integration/rspec/contain_exactly_matcher_spec.rb +257 -254
  149. data/spec/integration/rspec/eq_matcher_spec.rb +695 -585
  150. data/spec/integration/rspec/generic_describable_matchers_spec.rb +177 -0
  151. data/spec/integration/rspec/have_attributes_matcher_spec.rb +312 -304
  152. data/spec/integration/rspec/have_predicate_matcher_spec.rb +291 -297
  153. data/spec/integration/rspec/include_matcher_spec.rb +327 -225
  154. data/spec/integration/rspec/magic_metadata_spec.rb +51 -0
  155. data/spec/integration/rspec/match_array_matcher_spec.rb +294 -291
  156. data/spec/integration/rspec/match_matcher_spec.rb +916 -903
  157. data/spec/integration/rspec/raise_error_matcher_spec.rb +1208 -449
  158. data/spec/integration/rspec/respond_to_matcher_spec.rb +702 -697
  159. data/spec/integration/rspec/third_party_matcher_spec.rb +142 -138
  160. data/spec/integration/rspec/unhandled_errors_spec.rb +88 -84
  161. data/spec/internal/log/test.log +0 -0
  162. data/spec/spec_helper.rb +20 -20
  163. data/spec/support/command_runner.rb +34 -57
  164. data/spec/support/integration/helpers.rb +44 -32
  165. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +28 -23
  166. data/spec/support/integration/matchers.rb +34 -0
  167. data/spec/support/integration/test_programs/base.rb +17 -22
  168. data/spec/support/integration/test_programs/plain.rb +6 -0
  169. data/spec/support/integration/test_programs/rspec_active_record.rb +4 -1
  170. data/spec/support/integration/test_programs/rspec_active_support.rb +4 -1
  171. data/spec/support/integration/test_programs/rspec_rails.rb +4 -1
  172. data/spec/support/integration/test_programs/rspec_rails_engine.rb +20 -0
  173. data/spec/support/models/active_record/person.rb +6 -4
  174. data/spec/support/models/active_record/shipping_address.rb +9 -10
  175. data/spec/support/models/customer.rb +2 -4
  176. data/spec/support/models/player.rb +3 -6
  177. data/spec/support/models/shipping_address.rb +4 -13
  178. data/spec/support/shared_examples/active_record.rb +258 -240
  179. data/spec/support/shared_examples/active_support.rb +174 -51
  180. data/spec/support/shared_examples/elided_diffs.rb +447 -423
  181. data/spec/support/shared_examples/hash_with_indifferent_access.rb +500 -464
  182. data/spec/support/shared_examples/key.rb +123 -0
  183. data/spec/support/unit/helpers.rb +1 -3
  184. data/spec/support/unit/matchers/match_output.rb +12 -13
  185. data/spec/unit/active_record/object_inspection_spec.rb +222 -206
  186. data/spec/unit/active_support/object_inspection_spec.rb +170 -0
  187. data/spec/unit/equality_matchers/main_spec.rb +1049 -984
  188. data/spec/unit/helpers_spec.rb +14 -21
  189. data/spec/unit/operation_tree_flatteners/array_spec.rb +557 -524
  190. data/spec/unit/operation_tree_flatteners/custom_object_spec.rb +619 -601
  191. data/spec/unit/operation_tree_flatteners/default_object_spec.rb +619 -621
  192. data/spec/unit/operation_tree_flatteners/hash_spec.rb +595 -556
  193. data/spec/unit/operation_tree_flatteners/multiline_string_spec.rb +102 -92
  194. data/spec/unit/rspec/matchers/be_compared_to_spec.rb +3 -3
  195. data/spec/unit/rspec/matchers/be_predicate_spec.rb +3 -3
  196. data/spec/unit/rspec/matchers/contain_exactly_spec.rb +1 -1
  197. data/spec/unit/rspec/matchers/have_attributes_spec.rb +1 -1
  198. data/spec/unit/rspec/matchers/have_predicate_spec.rb +2 -2
  199. data/spec/unit/rspec/matchers/include_spec.rb +2 -2
  200. data/spec/unit/rspec/matchers/match_array_spec.rb +2 -2
  201. data/spec/unit/rspec/matchers/raise_error_spec.rb +43 -11
  202. data/spec/unit/rspec/matchers/respond_to_spec.rb +23 -16
  203. data/spec/unit/rspec/object_inspection/rspec_matcher_spec.rb +91 -0
  204. data/spec/unit/rspec/object_inspection_spec.rb +351 -326
  205. data/spec/unit/super_diff_spec.rb +1594 -1437
  206. data/spec/unit/tiered_lines_elider_spec.rb +3508 -3536
  207. data/spec/unit/tiered_lines_formatter_spec.rb +54 -116
  208. data/super_diff.gemspec +13 -12
  209. metadata +88 -75
  210. data/lib/super_diff/errors/no_diff_formatter_available_error.rb +0 -21
  211. data/lib/super_diff/errors/no_operational_sequencer_available_error.rb +0 -22
  212. data/spec/tmp/warnings_logger/all_warnings.txt +0 -2
@@ -0,0 +1,19 @@
1
+ module SuperDiff
2
+ module RSpec
3
+ module ObjectInspection
4
+ module InspectionTreeBuilders
5
+ class GenericDescribableMatcher < SuperDiff::ObjectInspection::InspectionTreeBuilders::Base
6
+ def self.applies_to?(value)
7
+ ::RSpec::Matchers.is_a_describable_matcher?(value)
8
+ end
9
+
10
+ def call
11
+ SuperDiff::ObjectInspection::InspectionTree.new do |t1|
12
+ t1.add_text "#<#{object.description}>"
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -4,28 +4,34 @@ module SuperDiff
4
4
  module InspectionTreeBuilders
5
5
  class HashIncluding < SuperDiff::ObjectInspection::InspectionTreeBuilders::Base
6
6
  def self.applies_to?(value)
7
- SuperDiff::RSpec.a_hash_including_something?(value) || SuperDiff::RSpec.hash_including_something?(value)
7
+ SuperDiff::RSpec.a_hash_including_something?(value) ||
8
+ SuperDiff::RSpec.hash_including_something?(value)
8
9
  end
9
10
 
10
11
  def call
11
- SuperDiff::ObjectInspection::InspectionTree.new do
12
- as_lines_when_rendering_to_lines(collection_bookend: :open) do
13
- add_text "#<a hash including ("
12
+ SuperDiff::ObjectInspection::InspectionTree.new do |t1|
13
+ # stree-ignore
14
+ t1.as_lines_when_rendering_to_lines(
15
+ collection_bookend: :open
16
+ ) do |t2|
17
+ t2.add_text "#<a hash including ("
14
18
  end
15
19
 
16
- nested do |value|
17
- hash =
18
- if SuperDiff::RSpec.a_hash_including_something?(value)
19
- value.expecteds.first
20
- else
21
- value.instance_variable_get(:@expected)
22
- end
23
-
24
- insert_hash_inspection_of(hash)
20
+ t1.nested do |t2|
21
+ if SuperDiff::RSpec.a_hash_including_something?(object)
22
+ t2.insert_hash_inspection_of(object.expecteds.first)
23
+ else
24
+ t2.insert_hash_inspection_of(
25
+ object.instance_variable_get(:@expected)
26
+ )
27
+ end
25
28
  end
26
29
 
27
- as_lines_when_rendering_to_lines(collection_bookend: :close) do
28
- add_text ")>"
30
+ # stree-ignore
31
+ t1.as_lines_when_rendering_to_lines(
32
+ collection_bookend: :close
33
+ ) do |t2|
34
+ t2.add_text ")>"
29
35
  end
30
36
  end
31
37
  end
@@ -4,19 +4,20 @@ module SuperDiff
4
4
  module InspectionTreeBuilders
5
5
  class InstanceOf < SuperDiff::ObjectInspection::InspectionTreeBuilders::Base
6
6
  def self.applies_to?(value)
7
- SuperDiff::RSpec.an_instance_of_something?(value) || SuperDiff::RSpec.instance_of_something?(value)
7
+ SuperDiff::RSpec.an_instance_of_something?(value) ||
8
+ SuperDiff::RSpec.instance_of_something?(value)
8
9
  end
9
10
 
10
11
  def call
11
- SuperDiff::ObjectInspection::InspectionTree.new do
12
- add_text do |value|
13
- klass = if SuperDiff::RSpec.an_instance_of_something?(value)
14
- value.expected
15
- else
16
- value.instance_variable_get(:@klass)
17
- end
18
- "#<an instance of #{klass}>"
19
- end
12
+ SuperDiff::ObjectInspection::InspectionTree.new do |t1|
13
+ klass =
14
+ if SuperDiff::RSpec.an_instance_of_something?(object)
15
+ object.expected
16
+ else
17
+ object.instance_variable_get(:@klass)
18
+ end
19
+
20
+ t1.add_text "#<an instance of #{klass}>"
20
21
  end
21
22
  end
22
23
  end
@@ -4,19 +4,20 @@ module SuperDiff
4
4
  module InspectionTreeBuilders
5
5
  class KindOf < SuperDiff::ObjectInspection::InspectionTreeBuilders::Base
6
6
  def self.applies_to?(value)
7
- SuperDiff::RSpec.a_kind_of_something?(value) || SuperDiff::RSpec.kind_of_something?(value)
7
+ SuperDiff::RSpec.a_kind_of_something?(value) ||
8
+ SuperDiff::RSpec.kind_of_something?(value)
8
9
  end
9
10
 
10
11
  def call
11
- SuperDiff::ObjectInspection::InspectionTree.new do
12
- add_text do |value|
13
- klass = if SuperDiff::RSpec.a_kind_of_something?(value)
14
- value.expected
15
- else
16
- value.instance_variable_get(:@klass)
17
- end
18
- "#<a kind of #{klass}>"
19
- end
12
+ SuperDiff::ObjectInspection::InspectionTree.new do |t1|
13
+ klass =
14
+ if SuperDiff::RSpec.a_kind_of_something?(object)
15
+ object.expected
16
+ else
17
+ object.instance_variable_get(:@klass)
18
+ end
19
+
20
+ t1.add_text "#<a kind of #{klass}>"
20
21
  end
21
22
  end
22
23
  end
@@ -8,17 +8,24 @@ module SuperDiff
8
8
  end
9
9
 
10
10
  def call
11
- SuperDiff::ObjectInspection::InspectionTree.new do
12
- as_lines_when_rendering_to_lines(collection_bookend: :open) do
13
- add_text "#<an object having attributes ("
11
+ SuperDiff::ObjectInspection::InspectionTree.new do |t1|
12
+ # stree-ignore
13
+ t1.as_lines_when_rendering_to_lines(
14
+ collection_bookend: :open
15
+ ) do |t2|
16
+ t2.add_text "#<an object having attributes ("
14
17
  end
15
18
 
16
- nested do |aliased_matcher|
17
- insert_hash_inspection_of(aliased_matcher.expected)
19
+ # stree-ignore
20
+ t1.nested do |t2|
21
+ t2.insert_hash_inspection_of(object.expected)
18
22
  end
19
23
 
20
- as_lines_when_rendering_to_lines(collection_bookend: :close) do
21
- add_text ")>"
24
+ # stree-ignore
25
+ t1.as_lines_when_rendering_to_lines(
26
+ collection_bookend: :close
27
+ ) do |t2|
28
+ t2.add_text ")>"
22
29
  end
23
30
  end
24
31
  end
@@ -8,22 +8,21 @@ module SuperDiff
8
8
  end
9
9
 
10
10
  def call
11
- SuperDiff::ObjectInspection::InspectionTree.new do
12
- as_prelude_when_rendering_to_lines do
13
- add_text "#<a value within "
11
+ SuperDiff::ObjectInspection::InspectionTree.new do |t1|
12
+ t1.as_prelude_when_rendering_to_lines do |t2|
13
+ t2.add_text "#<a value within "
14
14
 
15
- add_inspection_of as_lines: false do |aliased_matcher|
16
- aliased_matcher.base_matcher.instance_variable_get("@delta")
17
- end
15
+ t2.add_inspection_of(
16
+ object.base_matcher.instance_variable_get("@delta"),
17
+ as_lines: false
18
+ )
18
19
 
19
- add_text " of "
20
+ t2.add_text " of "
20
21
  end
21
22
 
22
- # rubocop:disable Style/SymbolProc
23
- add_inspection_of { |aliased_matcher| aliased_matcher.expected }
24
- # rubocop:enable Style/SymbolProc
23
+ t1.add_inspection_of object.expected
25
24
 
26
- add_text ">"
25
+ t1.add_text ">"
27
26
  end
28
27
  end
29
28
  end
@@ -4,39 +4,43 @@ module SuperDiff
4
4
  module InspectionTreeBuilders
5
5
  autoload(
6
6
  :CollectionContainingExactly,
7
- "super_diff/rspec/object_inspection/inspection_tree_builders/collection_containing_exactly",
7
+ "super_diff/rspec/object_inspection/inspection_tree_builders/collection_containing_exactly"
8
8
  )
9
9
  autoload(
10
10
  :CollectionIncluding,
11
- "super_diff/rspec/object_inspection/inspection_tree_builders/collection_including",
11
+ "super_diff/rspec/object_inspection/inspection_tree_builders/collection_including"
12
12
  )
13
13
  autoload(
14
14
  :Double,
15
- "super_diff/rspec/object_inspection/inspection_tree_builders/double",
15
+ "super_diff/rspec/object_inspection/inspection_tree_builders/double"
16
+ )
17
+ autoload(
18
+ :GenericDescribableMatcher,
19
+ "super_diff/rspec/object_inspection/inspection_tree_builders/generic_describable_matcher"
16
20
  )
17
21
  autoload(
18
22
  :HashIncluding,
19
- "super_diff/rspec/object_inspection/inspection_tree_builders/hash_including",
23
+ "super_diff/rspec/object_inspection/inspection_tree_builders/hash_including"
20
24
  )
21
25
  autoload(
22
26
  :InstanceOf,
23
- "super_diff/rspec/object_inspection/inspection_tree_builders/instance_of",
27
+ "super_diff/rspec/object_inspection/inspection_tree_builders/instance_of"
24
28
  )
25
29
  autoload(
26
30
  :KindOf,
27
- "super_diff/rspec/object_inspection/inspection_tree_builders/kind_of",
31
+ "super_diff/rspec/object_inspection/inspection_tree_builders/kind_of"
28
32
  )
29
33
  autoload(
30
34
  :ObjectHavingAttributes,
31
- "super_diff/rspec/object_inspection/inspection_tree_builders/object_having_attributes",
35
+ "super_diff/rspec/object_inspection/inspection_tree_builders/object_having_attributes"
32
36
  )
33
37
  autoload(
34
38
  :Primitive,
35
- "super_diff/rspec/object_inspection/inspection_tree_builders/primitive",
39
+ "super_diff/rspec/object_inspection/inspection_tree_builders/primitive"
36
40
  )
37
41
  autoload(
38
42
  :ValueWithin,
39
- "super_diff/rspec/object_inspection/inspection_tree_builders/value_within",
43
+ "super_diff/rspec/object_inspection/inspection_tree_builders/value_within"
40
44
  )
41
45
  end
42
46
  end
@@ -3,7 +3,7 @@ module SuperDiff
3
3
  module ObjectInspection
4
4
  autoload(
5
5
  :InspectionTreeBuilders,
6
- "super_diff/rspec/object_inspection/inspection_tree_builders",
6
+ "super_diff/rspec/object_inspection/inspection_tree_builders"
7
7
  )
8
8
  end
9
9
  end
@@ -3,8 +3,9 @@ module SuperDiff
3
3
  module OperationTreeBuilders
4
4
  class CollectionContainingExactly < SuperDiff::OperationTreeBuilders::Base
5
5
  def self.applies_to?(expected, actual)
6
- SuperDiff::RSpec.a_collection_containing_exactly_something?(expected) &&
7
- actual.is_a?(::Array)
6
+ SuperDiff::RSpec.a_collection_containing_exactly_something?(
7
+ expected
8
+ ) && actual.is_a?(::Array)
8
9
  end
9
10
 
10
11
  def initialize(actual:, **)
@@ -17,11 +18,11 @@ module SuperDiff
17
18
  def unary_operations
18
19
  operations = []
19
20
 
20
- (0...actual.length).reject do |index|
21
- indexes_in_actual_but_not_in_expected.include?(index)
22
- end.each do |index|
23
- add_noop_to(operations, index)
24
- end
21
+ (0...actual.length)
22
+ .reject do |index|
23
+ indexes_in_actual_but_not_in_expected.include?(index)
24
+ end
25
+ .each { |index| add_noop_to(operations, index) }
25
26
 
26
27
  indexes_in_actual_but_not_in_expected.each do |index|
27
28
  add_insert_to(operations, index)
@@ -51,7 +52,7 @@ module SuperDiff
51
52
  collection: collection,
52
53
  key: index,
53
54
  value: value,
54
- index: index,
55
+ index: index
55
56
  )
56
57
  end
57
58
 
@@ -62,7 +63,7 @@ module SuperDiff
62
63
  collection: collection,
63
64
  key: index,
64
65
  value: value,
65
- index: index,
66
+ index: index
66
67
  )
67
68
  end
68
69
 
@@ -73,7 +74,7 @@ module SuperDiff
73
74
  collection: collection,
74
75
  key: index,
75
76
  value: value,
76
- index: index,
77
+ index: index
77
78
  )
78
79
  end
79
80
 
@@ -5,7 +5,7 @@ module SuperDiff
5
5
  def self.applies_to?(expected, actual)
6
6
  (
7
7
  SuperDiff::RSpec.a_collection_including_something?(expected) ||
8
- SuperDiff::RSpec.array_including_something?(expected)
8
+ SuperDiff::RSpec.array_including_something?(expected)
9
9
  ) && actual.is_a?(::Array)
10
10
  end
11
11
 
@@ -18,11 +18,12 @@ module SuperDiff
18
18
  private
19
19
 
20
20
  def actual_with_extra_items_in_expected_at_end
21
- value = if SuperDiff::RSpec.a_collection_including_something?(expected)
22
- expected.expecteds
23
- else
24
- expected.instance_variable_get(:@expected)
25
- end
21
+ value =
22
+ if SuperDiff::RSpec.a_collection_including_something?(expected)
23
+ expected.expecteds
24
+ else
25
+ expected.instance_variable_get(:@expected)
26
+ end
26
27
  actual + (value - actual)
27
28
  end
28
29
  end
@@ -2,29 +2,30 @@ module SuperDiff
2
2
  module RSpec
3
3
  module OperationTreeBuilders
4
4
  class HashIncluding < SuperDiff::OperationTreeBuilders::Hash
5
+ include ::RSpec::Matchers::Composable
6
+
5
7
  def self.applies_to?(expected, actual)
6
8
  (
7
9
  SuperDiff::RSpec.a_hash_including_something?(expected) ||
8
- SuperDiff::RSpec.hash_including_something?(expected)
10
+ SuperDiff::RSpec.hash_including_something?(expected)
9
11
  ) && actual.is_a?(::Hash)
10
12
  end
11
13
 
12
14
  def initialize(expected:, **rest)
13
- hash = if SuperDiff::RSpec.a_hash_including_something?(expected)
14
- expected.expecteds.first
15
- else
16
- expected.instance_variable_get(:@expected)
17
- end
15
+ hash =
16
+ if SuperDiff::RSpec.a_hash_including_something?(expected)
17
+ expected.expecteds.first
18
+ else
19
+ expected.instance_variable_get(:@expected)
20
+ end
18
21
  super(expected: hash, **rest)
19
22
  end
20
23
 
21
24
  private
22
25
 
23
26
  def should_add_noop_operation?(key)
24
- !expected.include?(key) || (
25
- actual.include?(key) &&
26
- expected[key] == actual[key]
27
- )
27
+ !expected.include?(key) ||
28
+ (actual.include?(key) && values_match?(expected[key], actual[key]))
28
29
  end
29
30
  end
30
31
  end
@@ -23,34 +23,39 @@ module SuperDiff
23
23
  private
24
24
 
25
25
  def establish_expected_and_actual_attributes
26
- @expected_attributes = attribute_names.reduce({}) do |hash, name|
27
- if expected.expected.include?(name)
28
- hash.merge(name => expected.expected[name])
29
- else
30
- hash
26
+ @expected_attributes =
27
+ attribute_names.reduce({}) do |hash, name|
28
+ if expected.expected.include?(name)
29
+ hash.merge(name => expected.expected[name])
30
+ else
31
+ hash
32
+ end
31
33
  end
32
- end
33
34
 
34
- @actual_attributes = attribute_names.reduce({}) do |hash, name|
35
- if actual.respond_to?(name)
36
- hash.merge(name => actual.public_send(name))
37
- else
38
- hash
35
+ @actual_attributes =
36
+ attribute_names.reduce({}) do |hash, name|
37
+ if actual.respond_to?(name)
38
+ hash.merge(name => actual.public_send(name))
39
+ else
40
+ hash
41
+ end
39
42
  end
40
- end
41
43
  end
42
44
 
43
45
  def should_add_noop_operation?(attribute_name)
44
- !expected_attributes.include?(attribute_name) || (
45
- actual_attributes.include?(attribute_name) &&
46
- expected_attributes[attribute_name] == actual_attributes[attribute_name]
47
- )
46
+ !expected_attributes.include?(attribute_name) ||
47
+ (
48
+ actual_attributes.include?(attribute_name) &&
49
+ expected_attributes[attribute_name] ==
50
+ actual_attributes[attribute_name]
51
+ )
48
52
  end
49
53
 
50
54
  def should_add_insert_operation?(attribute_name)
51
55
  expected_attributes.include?(attribute_name) &&
52
56
  actual_attributes.include?(attribute_name) &&
53
- expected_attributes[attribute_name] != actual_attributes[attribute_name]
57
+ expected_attributes[attribute_name] !=
58
+ actual_attributes[attribute_name]
54
59
  end
55
60
  end
56
61
  end
@@ -3,19 +3,19 @@ module SuperDiff
3
3
  module OperationTreeBuilders
4
4
  autoload(
5
5
  :CollectionContainingExactly,
6
- "super_diff/rspec/operation_tree_builders/collection_containing_exactly",
6
+ "super_diff/rspec/operation_tree_builders/collection_containing_exactly"
7
7
  )
8
8
  autoload(
9
9
  :CollectionIncluding,
10
- "super_diff/rspec/operation_tree_builders/collection_including",
10
+ "super_diff/rspec/operation_tree_builders/collection_including"
11
11
  )
12
12
  autoload(
13
13
  :HashIncluding,
14
- "super_diff/rspec/operation_tree_builders/hash_including",
14
+ "super_diff/rspec/operation_tree_builders/hash_including"
15
15
  )
16
16
  autoload(
17
17
  :ObjectHavingAttributes,
18
- "super_diff/rspec/operation_tree_builders/object_having_attributes",
18
+ "super_diff/rspec/operation_tree_builders/object_having_attributes"
19
19
  )
20
20
  end
21
21
  end
@@ -20,10 +20,8 @@ module SuperDiff
20
20
  end
21
21
 
22
22
  def self.a_hash_including_something?(value)
23
- fuzzy_object?(value) &&
24
- value.respond_to?(:expecteds) &&
25
- value.expecteds.one? &&
26
- value.expecteds.first.is_a?(::Hash)
23
+ aliased_matcher?(value) && value.respond_to?(:expecteds) &&
24
+ value.expecteds.one? && value.expecteds.first.is_a?(::Hash)
27
25
  end
28
26
 
29
27
  # HINT: `a_hash_including` is an alias of `include` in the rspec-expectations gem.
@@ -33,8 +31,7 @@ module SuperDiff
33
31
  end
34
32
 
35
33
  def self.a_collection_including_something?(value)
36
- fuzzy_object?(value) &&
37
- value.respond_to?(:expecteds) &&
34
+ aliased_matcher?(value) && value.respond_to?(:expecteds) &&
38
35
  !(value.expecteds.one? && value.expecteds.first.is_a?(::Hash))
39
36
  end
40
37
 
@@ -43,17 +40,17 @@ module SuperDiff
43
40
  end
44
41
 
45
42
  def self.an_object_having_some_attributes?(value)
46
- fuzzy_object?(value) &&
43
+ aliased_matcher?(value) &&
47
44
  value.base_matcher.is_a?(::RSpec::Matchers::BuiltIn::HaveAttributes)
48
45
  end
49
46
 
50
47
  def self.a_collection_containing_exactly_something?(value)
51
- fuzzy_object?(value) &&
48
+ aliased_matcher?(value) &&
52
49
  value.base_matcher.is_a?(::RSpec::Matchers::BuiltIn::ContainExactly)
53
50
  end
54
51
 
55
52
  def self.a_kind_of_something?(value)
56
- fuzzy_object?(value) &&
53
+ aliased_matcher?(value) &&
57
54
  value.base_matcher.is_a?(::RSpec::Matchers::BuiltIn::BeAKindOf)
58
55
  end
59
56
 
@@ -64,7 +61,7 @@ module SuperDiff
64
61
  end
65
62
 
66
63
  def self.an_instance_of_something?(value)
67
- fuzzy_object?(value) &&
64
+ aliased_matcher?(value) &&
68
65
  value.base_matcher.is_a?(::RSpec::Matchers::BuiltIn::BeAnInstanceOf)
69
66
  end
70
67
 
@@ -75,19 +72,20 @@ module SuperDiff
75
72
  end
76
73
 
77
74
  def self.a_value_within_something?(value)
78
- fuzzy_object?(value) &&
75
+ aliased_matcher?(value) &&
79
76
  value.base_matcher.is_a?(::RSpec::Matchers::BuiltIn::BeWithin)
80
77
  end
81
78
 
82
- def self.fuzzy_object?(value)
79
+ def self.aliased_matcher?(value)
83
80
  value.is_a?(::RSpec::Matchers::AliasedMatcher)
84
81
  end
85
82
 
86
83
  def self.rspec_version
87
- @_rspec_version ||= begin
88
- require "rspec/core/version"
89
- GemVersion.new(::RSpec::Core::Version::STRING)
90
- end
84
+ @_rspec_version ||=
85
+ begin
86
+ require "rspec/core/version"
87
+ GemVersion.new(::RSpec::Core::Version::STRING)
88
+ end
91
89
  end
92
90
 
93
91
  SuperDiff.configuration.tap do |config|
@@ -95,14 +93,14 @@ module SuperDiff
95
93
  Differs::CollectionContainingExactly,
96
94
  Differs::CollectionIncluding,
97
95
  Differs::HashIncluding,
98
- Differs::ObjectHavingAttributes,
96
+ Differs::ObjectHavingAttributes
99
97
  )
100
98
 
101
99
  config.add_extra_operation_tree_builder_classes(
102
100
  OperationTreeBuilders::CollectionContainingExactly,
103
101
  OperationTreeBuilders::CollectionIncluding,
104
102
  OperationTreeBuilders::HashIncluding,
105
- OperationTreeBuilders::ObjectHavingAttributes,
103
+ OperationTreeBuilders::ObjectHavingAttributes
106
104
  )
107
105
 
108
106
  config.add_extra_inspection_tree_builder_classes(
@@ -115,6 +113,7 @@ module SuperDiff
115
113
  ObjectInspection::InspectionTreeBuilders::ObjectHavingAttributes,
116
114
  # ObjectInspection::InspectionTreeBuilders::Primitive,
117
115
  ObjectInspection::InspectionTreeBuilders::ValueWithin,
116
+ ObjectInspection::InspectionTreeBuilders::GenericDescribableMatcher
118
117
  )
119
118
  end
120
119
  end