super_diff 0.5.3 → 0.8.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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +46 -20
  3. data/lib/super_diff.rb +46 -7
  4. data/lib/super_diff/active_record.rb +7 -7
  5. data/lib/super_diff/active_record/differs/active_record_relation.rb +3 -13
  6. data/lib/super_diff/active_record/object_inspection.rb +2 -6
  7. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders.rb +16 -0
  8. data/lib/super_diff/active_record/object_inspection/{inspectors → inspection_tree_builders}/active_record_model.rb +19 -20
  9. data/lib/super_diff/active_record/object_inspection/{inspectors → inspection_tree_builders}/active_record_relation.rb +9 -8
  10. data/lib/super_diff/active_record/operation_tree_flatteners.rb +10 -0
  11. data/lib/super_diff/active_record/operation_tree_flatteners/active_record_relation.rb +17 -0
  12. data/lib/super_diff/active_record/operation_trees/active_record_relation.rb +8 -7
  13. data/lib/super_diff/active_support.rb +8 -8
  14. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +3 -13
  15. data/lib/super_diff/active_support/object_inspection.rb +2 -6
  16. data/lib/super_diff/active_support/object_inspection/{inspectors.rb → inspection_tree_builders.rb} +2 -2
  17. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/hash_with_indifferent_access.rb +37 -0
  18. data/lib/super_diff/active_support/operation_tree_builders/hash_with_indifferent_access.rb +17 -0
  19. data/lib/super_diff/active_support/operation_tree_flatteners.rb +10 -0
  20. data/lib/super_diff/active_support/operation_tree_flatteners/hash_with_indifferent_access.rb +17 -0
  21. data/lib/super_diff/active_support/operation_trees/hash_with_indifferent_access.rb +4 -7
  22. data/lib/super_diff/colorized_document_extensions.rb +9 -6
  23. data/lib/super_diff/configuration.rb +102 -19
  24. data/lib/super_diff/csi.rb +1 -1
  25. data/lib/super_diff/csi/four_bit_color.rb +0 -2
  26. data/lib/super_diff/diff_formatters/collection.rb +2 -2
  27. data/lib/super_diff/diff_formatters/multiline_string.rb +4 -4
  28. data/lib/super_diff/differs/array.rb +1 -1
  29. data/lib/super_diff/differs/base.rb +3 -21
  30. data/lib/super_diff/differs/custom_object.rb +1 -1
  31. data/lib/super_diff/differs/default_object.rb +1 -1
  32. data/lib/super_diff/differs/hash.rb +1 -1
  33. data/lib/super_diff/differs/main.rb +1 -7
  34. data/lib/super_diff/differs/multiline_string.rb +1 -1
  35. data/lib/super_diff/differs/time_like.rb +1 -1
  36. data/lib/super_diff/equality_matchers/array.rb +4 -4
  37. data/lib/super_diff/equality_matchers/default.rb +4 -4
  38. data/lib/super_diff/equality_matchers/hash.rb +4 -4
  39. data/lib/super_diff/equality_matchers/multiline_string.rb +4 -4
  40. data/lib/super_diff/equality_matchers/primitive.rb +6 -9
  41. data/lib/super_diff/equality_matchers/singleline_string.rb +4 -4
  42. data/lib/super_diff/gem_version.rb +45 -0
  43. data/lib/super_diff/helpers.rb +52 -2
  44. data/lib/super_diff/line.rb +83 -0
  45. data/lib/super_diff/object_inspection.rb +12 -9
  46. data/lib/super_diff/object_inspection/inspection_tree.rb +183 -81
  47. data/lib/super_diff/object_inspection/inspection_tree_builders.rb +44 -0
  48. data/lib/super_diff/object_inspection/inspection_tree_builders/array.rb +38 -0
  49. data/lib/super_diff/object_inspection/inspection_tree_builders/base.rb +27 -0
  50. data/lib/super_diff/object_inspection/inspection_tree_builders/custom_object.rb +37 -0
  51. data/lib/super_diff/object_inspection/inspection_tree_builders/default_object.rb +63 -0
  52. data/lib/super_diff/object_inspection/{inspectors → inspection_tree_builders}/defaults.rb +1 -2
  53. data/lib/super_diff/object_inspection/inspection_tree_builders/hash.rb +46 -0
  54. data/lib/super_diff/object_inspection/{inspectors → inspection_tree_builders}/main.rb +5 -10
  55. data/lib/super_diff/object_inspection/inspection_tree_builders/primitive.rb +21 -0
  56. data/lib/super_diff/object_inspection/inspection_tree_builders/time_like.rb +64 -0
  57. data/lib/super_diff/object_inspection/nodes.rb +33 -32
  58. data/lib/super_diff/object_inspection/nodes/as_lines_when_rendering_to_lines.rb +97 -0
  59. data/lib/super_diff/object_inspection/nodes/as_prefix_when_rendering_to_lines.rb +27 -0
  60. data/lib/super_diff/object_inspection/nodes/as_prelude_when_rendering_to_lines.rb +27 -0
  61. data/lib/super_diff/object_inspection/nodes/as_single_line.rb +33 -0
  62. data/lib/super_diff/object_inspection/nodes/base.rb +55 -20
  63. data/lib/super_diff/object_inspection/nodes/inspection.rb +47 -7
  64. data/lib/super_diff/object_inspection/nodes/nesting.rb +16 -5
  65. data/lib/super_diff/object_inspection/nodes/only_when.rb +54 -0
  66. data/lib/super_diff/object_inspection/nodes/text.rb +16 -2
  67. data/lib/super_diff/object_inspection/nodes/when_empty.rb +21 -6
  68. data/lib/super_diff/object_inspection/nodes/when_non_empty.rb +20 -5
  69. data/lib/super_diff/object_inspection/nodes/when_rendering_to_lines.rb +27 -0
  70. data/lib/super_diff/object_inspection/nodes/when_rendering_to_string.rb +27 -0
  71. data/lib/super_diff/object_inspection/prefix_for_next_node.rb +6 -0
  72. data/lib/super_diff/object_inspection/prelude_for_next_node.rb +6 -0
  73. data/lib/super_diff/operation_tree_builders/array.rb +7 -10
  74. data/lib/super_diff/operation_tree_builders/base.rb +6 -6
  75. data/lib/super_diff/operation_tree_builders/custom_object.rb +5 -2
  76. data/lib/super_diff/operation_tree_builders/default_object.rb +1 -1
  77. data/lib/super_diff/operation_tree_builders/defaults.rb +1 -1
  78. data/lib/super_diff/operation_tree_builders/hash.rb +1 -8
  79. data/lib/super_diff/operation_tree_builders/multiline_string.rb +2 -6
  80. data/lib/super_diff/operation_tree_builders/time_like.rb +2 -2
  81. data/lib/super_diff/operation_tree_flatteners.rb +20 -0
  82. data/lib/super_diff/operation_tree_flatteners/array.rb +15 -0
  83. data/lib/super_diff/operation_tree_flatteners/base.rb +54 -0
  84. data/lib/super_diff/operation_tree_flatteners/collection.rb +139 -0
  85. data/lib/super_diff/operation_tree_flatteners/custom_object.rb +28 -0
  86. data/lib/super_diff/operation_tree_flatteners/default_object.rb +32 -0
  87. data/lib/super_diff/operation_tree_flatteners/hash.rb +41 -0
  88. data/lib/super_diff/operation_tree_flatteners/multiline_string.rb +17 -0
  89. data/lib/super_diff/operation_trees/array.rb +4 -7
  90. data/lib/super_diff/operation_trees/base.rb +39 -16
  91. data/lib/super_diff/operation_trees/custom_object.rb +4 -8
  92. data/lib/super_diff/operation_trees/default_object.rb +28 -13
  93. data/lib/super_diff/operation_trees/hash.rb +4 -7
  94. data/lib/super_diff/operation_trees/main.rb +1 -1
  95. data/lib/super_diff/operation_trees/multiline_string.rb +4 -7
  96. data/lib/super_diff/operations/binary_operation.rb +1 -6
  97. data/lib/super_diff/operations/unary_operation.rb +2 -30
  98. data/lib/super_diff/recursion_guard.rb +3 -3
  99. data/lib/super_diff/rspec.rb +41 -13
  100. data/lib/super_diff/rspec/differs/collection_including.rb +4 -2
  101. data/lib/super_diff/rspec/differs/hash_including.rb +4 -2
  102. data/lib/super_diff/rspec/matcher_text_builders/base.rb +7 -7
  103. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +6 -6
  104. data/lib/super_diff/rspec/matcher_text_builders/contain_exactly.rb +1 -1
  105. data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +4 -4
  106. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +1 -1
  107. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +5 -5
  108. data/lib/super_diff/rspec/monkey_patches.rb +353 -306
  109. data/lib/super_diff/rspec/object_inspection.rb +4 -1
  110. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders.rb +44 -0
  111. data/lib/super_diff/rspec/object_inspection/{inspectors → inspection_tree_builders}/collection_containing_exactly.rb +9 -8
  112. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_including.rb +34 -0
  113. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/double.rb +103 -0
  114. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/hash_including.rb +36 -0
  115. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/instance_of.rb +26 -0
  116. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/kind_of.rb +26 -0
  117. data/lib/super_diff/rspec/object_inspection/{inspectors → inspection_tree_builders}/object_having_attributes.rb +10 -12
  118. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/primitive.rb +10 -0
  119. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/value_within.rb +33 -0
  120. data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +12 -4
  121. data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +10 -3
  122. data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +10 -3
  123. data/lib/super_diff/tiered_lines.rb +4 -0
  124. data/lib/super_diff/tiered_lines_elider.rb +490 -0
  125. data/lib/super_diff/tiered_lines_formatter.rb +79 -0
  126. data/lib/super_diff/version.rb +1 -1
  127. data/spec/examples.txt +407 -5
  128. data/spec/integration/rails/active_support_spec.rb +19 -0
  129. data/spec/integration/rspec/be_falsey_matcher_spec.rb +10 -10
  130. data/spec/integration/rspec/be_matcher_spec.rb +100 -100
  131. data/spec/integration/rspec/be_nil_matcher_spec.rb +10 -10
  132. data/spec/integration/rspec/be_predicate_matcher_spec.rb +103 -103
  133. data/spec/integration/rspec/be_truthy_matcher_spec.rb +10 -10
  134. data/spec/integration/rspec/contain_exactly_matcher_spec.rb +113 -107
  135. data/spec/integration/rspec/eq_matcher_spec.rb +223 -277
  136. data/spec/integration/rspec/have_attributes_matcher_spec.rb +138 -129
  137. data/spec/integration/rspec/have_predicate_matcher_spec.rb +65 -65
  138. data/spec/integration/rspec/include_matcher_spec.rb +73 -73
  139. data/spec/integration/rspec/match_array_matcher_spec.rb +126 -119
  140. data/spec/integration/rspec/match_matcher_spec.rb +362 -274
  141. data/spec/integration/rspec/raise_error_matcher_spec.rb +86 -86
  142. data/spec/integration/rspec/respond_to_matcher_spec.rb +240 -240
  143. data/spec/integration/rspec/third_party_matcher_spec.rb +8 -8
  144. data/spec/integration/rspec/unhandled_errors_spec.rb +5 -5
  145. data/spec/spec_helper.rb +33 -13
  146. data/spec/support/command_runner.rb +15 -25
  147. data/spec/support/helpers.rb +21 -0
  148. data/spec/support/integration/helpers.rb +8 -2
  149. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +4 -4
  150. data/spec/support/integration/test_programs/base.rb +38 -10
  151. data/spec/support/integration/test_programs/rspec_active_record.rb +1 -1
  152. data/spec/support/integration/test_programs/rspec_active_support.rb +17 -0
  153. data/spec/support/integration/test_programs/rspec_rails.rb +1 -1
  154. data/spec/support/shared_examples/active_record.rb +109 -108
  155. data/spec/support/shared_examples/active_support.rb +65 -0
  156. data/spec/support/shared_examples/elided_diffs.rb +914 -0
  157. data/spec/support/shared_examples/hash_with_indifferent_access.rb +196 -232
  158. data/spec/support/unit/helpers.rb +15 -0
  159. data/spec/support/unit/matchers/match_output.rb +41 -0
  160. data/spec/unit/active_record/object_inspection_spec.rb +273 -0
  161. data/spec/unit/equality_matchers/main_spec.rb +445 -465
  162. data/spec/unit/helpers_spec.rb +61 -0
  163. data/spec/unit/operation_tree_flatteners/array_spec.rb +604 -0
  164. data/spec/unit/operation_tree_flatteners/custom_object_spec.rb +667 -0
  165. data/spec/unit/operation_tree_flatteners/default_object_spec.rb +687 -0
  166. data/spec/unit/operation_tree_flatteners/hash_spec.rb +632 -0
  167. data/spec/unit/operation_tree_flatteners/multiline_string_spec.rb +121 -0
  168. data/spec/unit/rspec/object_inspection_spec.rb +446 -0
  169. data/spec/unit/super_diff_spec.rb +1958 -0
  170. data/spec/unit/tiered_lines_elider_spec.rb +6356 -0
  171. data/spec/unit/tiered_lines_formatter_spec.rb +193 -0
  172. data/super_diff.gemspec +1 -1
  173. metadata +95 -50
  174. data/lib/super_diff/active_record/diff_formatters.rb +0 -10
  175. data/lib/super_diff/active_record/diff_formatters/active_record_relation.rb +0 -23
  176. data/lib/super_diff/active_record/object_inspection/inspectors.rb +0 -16
  177. data/lib/super_diff/active_support/diff_formatters.rb +0 -10
  178. data/lib/super_diff/active_support/diff_formatters/hash_with_indifferent_access.rb +0 -36
  179. data/lib/super_diff/active_support/object_inspection/inspectors/hash_with_indifferent_access.rb +0 -28
  180. data/lib/super_diff/diff_formatters.rb +0 -14
  181. data/lib/super_diff/diff_formatters/array.rb +0 -21
  182. data/lib/super_diff/diff_formatters/base.rb +0 -33
  183. data/lib/super_diff/diff_formatters/custom_object.rb +0 -30
  184. data/lib/super_diff/diff_formatters/default_object.rb +0 -46
  185. data/lib/super_diff/diff_formatters/defaults.rb +0 -10
  186. data/lib/super_diff/diff_formatters/hash.rb +0 -34
  187. data/lib/super_diff/diff_formatters/main.rb +0 -41
  188. data/lib/super_diff/object_inspection/inspectors.rb +0 -23
  189. data/lib/super_diff/object_inspection/inspectors/array.rb +0 -32
  190. data/lib/super_diff/object_inspection/inspectors/base.rb +0 -36
  191. data/lib/super_diff/object_inspection/inspectors/custom_object.rb +0 -37
  192. data/lib/super_diff/object_inspection/inspectors/default_object.rb +0 -61
  193. data/lib/super_diff/object_inspection/inspectors/hash.rb +0 -32
  194. data/lib/super_diff/object_inspection/inspectors/primitive.rb +0 -28
  195. data/lib/super_diff/object_inspection/inspectors/string.rb +0 -23
  196. data/lib/super_diff/object_inspection/inspectors/time_like.rb +0 -23
  197. data/lib/super_diff/object_inspection/nodes/break.rb +0 -15
  198. data/lib/super_diff/object_inspection/nodes/when_multiline.rb +0 -22
  199. data/lib/super_diff/object_inspection/nodes/when_singleline.rb +0 -24
  200. data/lib/super_diff/rspec/object_inspection/inspectors.rb +0 -40
  201. data/lib/super_diff/rspec/object_inspection/inspectors/collection_including.rb +0 -28
  202. data/lib/super_diff/rspec/object_inspection/inspectors/hash_including.rb +0 -31
  203. data/lib/super_diff/rspec/object_inspection/inspectors/instance_of.rb +0 -23
  204. data/lib/super_diff/rspec/object_inspection/inspectors/kind_of.rb +0 -23
  205. data/lib/super_diff/rspec/object_inspection/inspectors/primitive.rb +0 -13
  206. data/lib/super_diff/rspec/object_inspection/inspectors/value_within.rb +0 -29
  207. data/spec/support/object_id.rb +0 -27
  208. data/spec/support/ruby_versions.rb +0 -11
  209. data/spec/unit/object_inspection_spec.rb +0 -1168
@@ -0,0 +1,28 @@
1
+ module SuperDiff
2
+ module OperationTreeFlatteners
3
+ class CustomObject < Collection
4
+ protected
5
+
6
+ def open_token
7
+ "#<%<class>s {" % { class: operation_tree.underlying_object.class }
8
+ end
9
+
10
+ def close_token
11
+ "}>"
12
+ end
13
+
14
+ def item_prefix_for(operation)
15
+ key =
16
+ # Note: We could have used the right_key here too, they're both the
17
+ # same keys
18
+ if operation.respond_to?(:left_key)
19
+ operation.left_key
20
+ else
21
+ operation.key
22
+ end
23
+
24
+ "#{key}: "
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,32 @@
1
+ module SuperDiff
2
+ module OperationTreeFlatteners
3
+ class DefaultObject < Collection
4
+ protected
5
+
6
+ def open_token
7
+ "#<#{operation_tree.underlying_object.class.name}:" +
8
+ SuperDiff::Helpers.object_address_for(
9
+ operation_tree.underlying_object
10
+ ) +
11
+ " {"
12
+ end
13
+
14
+ def close_token
15
+ "}>"
16
+ end
17
+
18
+ def item_prefix_for(operation)
19
+ key =
20
+ # Note: We could have used the right_key here too, they're both the
21
+ # same keys
22
+ if operation.respond_to?(:left_key)
23
+ operation.left_key
24
+ else
25
+ operation.key
26
+ end
27
+
28
+ "@#{key}="
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,41 @@
1
+ module SuperDiff
2
+ module OperationTreeFlatteners
3
+ class Hash < Collection
4
+ protected
5
+
6
+ def open_token
7
+ "{"
8
+ end
9
+
10
+ def close_token
11
+ "}"
12
+ end
13
+
14
+ def item_prefix_for(operation)
15
+ key = key_for(operation)
16
+
17
+ if format_keys_as_kwargs?
18
+ "#{key}: "
19
+ else
20
+ "#{key.inspect} => "
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def format_keys_as_kwargs?
27
+ operation_tree.all? { |operation| key_for(operation).is_a?(Symbol) }
28
+ end
29
+
30
+ def key_for(operation)
31
+ # Note: We could have used the right_key here too, they're both the
32
+ # same keys
33
+ if operation.respond_to?(:left_key)
34
+ operation.left_key
35
+ else
36
+ operation.key
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,17 @@
1
+ module SuperDiff
2
+ module OperationTreeFlatteners
3
+ class MultilineString < Base
4
+ def build_tiered_lines
5
+ operation_tree.map do |operation|
6
+ Line.new(
7
+ type: operation.name,
8
+ indentation_level: indentation_level,
9
+ # TODO: Test that quotes and things don't get escaped but escape
10
+ # characters do
11
+ value: operation.value.inspect[1..-2].gsub(/\\"/, '"').gsub(/\\'/, "'")
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -5,13 +5,10 @@ module SuperDiff
5
5
  value.is_a?(::Array)
6
6
  end
7
7
 
8
- def to_diff(indent_level:, collection_prefix:, add_comma:)
9
- DiffFormatters::Array.call(
10
- self,
11
- indent_level: indent_level,
12
- collection_prefix: collection_prefix,
13
- add_comma: add_comma,
14
- )
8
+ protected
9
+
10
+ def operation_tree_flattener_class
11
+ OperationTreeFlatteners::Array
15
12
  end
16
13
  end
17
14
  end
@@ -1,33 +1,56 @@
1
- require 'delegate'
1
+ require "forwardable"
2
2
 
3
3
  module SuperDiff
4
4
  module OperationTrees
5
- class Base < SimpleDelegator
6
- def self.applies_to?(_value)
5
+ class Base
6
+ def self.applies_to?(*)
7
7
  unimplemented_class_method!
8
8
  end
9
9
 
10
+ include Enumerable
11
+ include ImplementationChecks
10
12
  extend ImplementationChecks
13
+ extend Forwardable
11
14
 
12
- # rubocop:disable Lint/UnusedMethodArgument
13
- def to_diff(indent_level:, add_comma: false, collection_prefix: nil)
14
- raise NotImplementedError
15
+ def_delegators :operations, :<<, :delete, :each
16
+
17
+ def initialize(operations)
18
+ @operations = operations
19
+ end
20
+
21
+ def to_diff(indentation_level:)
22
+ TieredLinesFormatter.call(
23
+ perhaps_elide(flatten(indentation_level: indentation_level)),
24
+ )
25
+ end
26
+
27
+ def flatten(indentation_level:)
28
+ operation_tree_flattener_class.call(
29
+ self,
30
+ indentation_level: indentation_level,
31
+ )
15
32
  end
16
- # rubocop:enable Lint/UnusedMethodArgument
17
33
 
18
34
  def pretty_print(pp)
19
- pp.text "#{self.class.name}.new(["
20
- pp.group_sub do
21
- pp.nest(2) do
22
- pp.breakable
23
- pp.seplist(self) do |value|
24
- pp.pp value
25
- end
35
+ pp.group(1, "#<#{self.class.name} [", "]>") do
36
+ pp.breakable
37
+ pp.seplist(self) do |value|
38
+ pp.pp value
26
39
  end
27
40
  end
28
- pp.breakable
29
- pp.text("])")
30
41
  end
42
+
43
+ def perhaps_elide(tiered_lines)
44
+ if SuperDiff.configuration.diff_elision_enabled?
45
+ TieredLinesElider.call(tiered_lines)
46
+ else
47
+ tiered_lines
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ attr_reader :operations
31
54
  end
32
55
  end
33
56
  end
@@ -5,14 +5,10 @@ module SuperDiff
5
5
  value.respond_to?(:attributes_for_super_diff)
6
6
  end
7
7
 
8
- def to_diff(indent_level:, add_comma: false, collection_prefix: nil)
9
- DiffFormatters::CustomObject.call(
10
- self,
11
- indent_level: indent_level,
12
- collection_prefix: collection_prefix,
13
- add_comma: add_comma,
14
- value_class: value_class,
15
- )
8
+ protected
9
+
10
+ def operation_tree_flattener_class
11
+ OperationTreeFlatteners::CustomObject
16
12
  end
17
13
  end
18
14
  end
@@ -1,26 +1,41 @@
1
1
  module SuperDiff
2
2
  module OperationTrees
3
3
  class DefaultObject < Base
4
- def self.applies_to?(_value)
4
+ def self.applies_to?(*)
5
5
  true
6
6
  end
7
7
 
8
- attr_reader :value_class
8
+ attr_reader :underlying_object
9
9
 
10
- # TODO: Default this to collection.class?
11
- def initialize(collection, value_class:)
12
- super(collection)
10
+ def initialize(operations, underlying_object:)
11
+ super(operations)
12
+ @underlying_object = underlying_object
13
+ end
13
14
 
14
- @value_class = value_class
15
+ def pretty_print(pp)
16
+ pp.text "#<#{self.class.name} "
17
+ pp.nest(1) do
18
+ pp.breakable
19
+ pp.text ":operations=>"
20
+ pp.group(1, "[", "]") do
21
+ pp.breakable
22
+ pp.seplist(self) do |value|
23
+ pp.pp value
24
+ end
25
+ end
26
+ pp.comma_breakable
27
+ pp.text ":underlying_object=>"
28
+ pp.object_address_group underlying_object do
29
+ # do nothing
30
+ end
31
+ end
32
+ pp.text ">"
15
33
  end
16
34
 
17
- def to_diff(indent_level:, add_comma: false, **_rest)
18
- DiffFormatters::Main.call(
19
- self,
20
- indent_level: indent_level,
21
- add_comma: add_comma,
22
- value_class: value_class,
23
- )
35
+ protected
36
+
37
+ def operation_tree_flattener_class
38
+ OperationTreeFlatteners::DefaultObject
24
39
  end
25
40
  end
26
41
  end
@@ -5,13 +5,10 @@ module SuperDiff
5
5
  value.is_a?(::Hash)
6
6
  end
7
7
 
8
- def to_diff(indent_level:, collection_prefix:, add_comma:)
9
- DiffFormatters::Hash.call(
10
- self,
11
- indent_level: indent_level,
12
- collection_prefix: collection_prefix,
13
- add_comma: add_comma,
14
- )
8
+ protected
9
+
10
+ def operation_tree_flattener_class
11
+ OperationTreeFlatteners::Hash
15
12
  end
16
13
  end
17
14
  end
@@ -8,7 +8,7 @@ module SuperDiff
8
8
  def call
9
9
  if resolved_class
10
10
  begin
11
- resolved_class.new([], value_class: value.class)
11
+ resolved_class.new([], underlying_object: value)
12
12
  rescue ArgumentError
13
13
  resolved_class.new([])
14
14
  end
@@ -5,13 +5,10 @@ module SuperDiff
5
5
  value.is_a?(::String) && value.is_a?(::String)
6
6
  end
7
7
 
8
- def to_diff(indent_level:, collection_prefix:, add_comma:)
9
- DiffFormatters::MultilineString.call(
10
- self,
11
- indent_level: indent_level,
12
- collection_prefix: collection_prefix,
13
- add_comma: add_comma,
14
- )
8
+ protected
9
+
10
+ def operation_tree_flattener_class
11
+ OperationTreeFlatteners::MultilineString
15
12
  end
16
13
  end
17
14
  end
@@ -14,14 +14,9 @@ module SuperDiff
14
14
  :right_value!,
15
15
  :left_index!,
16
16
  :right_index!,
17
- child_operations: [],
17
+ children: [],
18
18
  ],
19
19
  )
20
-
21
- def should_add_comma_after_displaying?
22
- left_index < left_collection.size - 1 ||
23
- right_index < right_collection.size - 1
24
- end
25
20
  end
26
21
  end
27
22
  end
@@ -1,37 +1,9 @@
1
1
  module SuperDiff
2
2
  module Operations
3
3
  class UnaryOperation
4
- attr_reader(
5
- :name,
6
- :collection,
7
- :key,
8
- :value,
9
- # TODO: Is this even used??
10
- :index,
11
- :index_in_collection,
12
- )
4
+ extend AttrExtras.mixin
13
5
 
14
- def initialize(
15
- name:,
16
- collection:,
17
- key:,
18
- value:,
19
- # TODO: Is this even used??
20
- index:,
21
- index_in_collection: index
22
- )
23
- @name = name
24
- @collection = collection
25
- @key = key
26
- @value = value
27
- # TODO: Is this even used??
28
- @index = index
29
- @index_in_collection = index_in_collection
30
- end
31
-
32
- def should_add_comma_after_displaying?
33
- index_in_collection < collection.size - 1
34
- end
6
+ rattr_initialize [:name!, :collection!, :key!, :value!, :index!]
35
7
  end
36
8
  end
37
9
  end
@@ -7,7 +7,7 @@ module SuperDiff
7
7
 
8
8
  def self.guarding_recursion_of(*objects, &block)
9
9
  already_seen_objects, first_seen_objects = objects.partition do |object|
10
- already_seen_object_ids.include?(object.object_id)
10
+ !SuperDiff.primitive?(object) && already_seen?(object)
11
11
  end
12
12
 
13
13
  first_seen_objects.each do |object|
@@ -38,8 +38,8 @@ module SuperDiff
38
38
  end
39
39
  end
40
40
 
41
- def self.already_seen_objects
42
- already_seen_object_ids.map { |object_id| ObjectSpace._id2ref(object_id) }
41
+ def self.already_seen?(object)
42
+ already_seen_object_ids.include?(object.object_id)
43
43
  end
44
44
 
45
45
  def self.already_seen_object_ids
@@ -11,8 +11,8 @@ module SuperDiff
11
11
  autoload :ObjectInspection, "super_diff/rspec/object_inspection"
12
12
  autoload :OperationTreeBuilders, "super_diff/rspec/operation_tree_builders"
13
13
 
14
- def self.configure
15
- yield configuration
14
+ def self.configure(&block)
15
+ SuperDiff.configure(&block)
16
16
  end
17
17
 
18
18
  def self.configuration
@@ -26,12 +26,22 @@ module SuperDiff
26
26
  value.expecteds.first.is_a?(::Hash)
27
27
  end
28
28
 
29
+ # HINT: `a_hash_including` is an alias of `include` in the rspec-expectations gem.
30
+ # `hash_including` is an argument matcher in the rspec-mocks gem.
31
+ def self.hash_including_something?(value)
32
+ value.is_a?(::RSpec::Mocks::ArgumentMatchers::HashIncludingMatcher)
33
+ end
34
+
29
35
  def self.a_collection_including_something?(value)
30
36
  fuzzy_object?(value) &&
31
37
  value.respond_to?(:expecteds) &&
32
38
  !(value.expecteds.one? && value.expecteds.first.is_a?(::Hash))
33
39
  end
34
40
 
41
+ def self.array_including_something?(value)
42
+ value.is_a?(::RSpec::Mocks::ArgumentMatchers::ArrayIncludingMatcher)
43
+ end
44
+
35
45
  def self.an_object_having_some_attributes?(value)
36
46
  fuzzy_object?(value) &&
37
47
  value.base_matcher.is_a?(::RSpec::Matchers::BuiltIn::HaveAttributes)
@@ -47,11 +57,23 @@ module SuperDiff
47
57
  value.base_matcher.is_a?(::RSpec::Matchers::BuiltIn::BeAKindOf)
48
58
  end
49
59
 
60
+ # HINT: `a_kind_of` is a matcher in the rspec-expectations gem.
61
+ # `kind_of` is an argument matcher in the rspec-mocks gem.
62
+ def self.kind_of_something?(value)
63
+ value.is_a?(::RSpec::Mocks::ArgumentMatchers::KindOf)
64
+ end
65
+
50
66
  def self.an_instance_of_something?(value)
51
67
  fuzzy_object?(value) &&
52
68
  value.base_matcher.is_a?(::RSpec::Matchers::BuiltIn::BeAnInstanceOf)
53
69
  end
54
70
 
71
+ # HINT: `an_instance_of` is a matcher in the rspec-expectations gem.
72
+ # `instance_of` is an argument matcher in the rspec-mocks gem.
73
+ def self.instance_of_something?(value)
74
+ value.is_a?(::RSpec::Mocks::ArgumentMatchers::InstanceOf)
75
+ end
76
+
55
77
  def self.a_value_within_something?(value)
56
78
  fuzzy_object?(value) &&
57
79
  value.base_matcher.is_a?(::RSpec::Matchers::BuiltIn::BeWithin)
@@ -61,6 +83,13 @@ module SuperDiff
61
83
  value.is_a?(::RSpec::Matchers::AliasedMatcher)
62
84
  end
63
85
 
86
+ def self.rspec_version
87
+ @_rspec_version ||= begin
88
+ require "rspec/core/version"
89
+ GemVersion.new(::RSpec::Core::Version::STRING)
90
+ end
91
+ end
92
+
64
93
  SuperDiff.configuration.tap do |config|
65
94
  config.add_extra_differ_classes(
66
95
  Differs::CollectionContainingExactly,
@@ -76,20 +105,19 @@ module SuperDiff
76
105
  OperationTreeBuilders::ObjectHavingAttributes,
77
106
  )
78
107
 
79
- config.add_extra_inspector_classes(
80
- ObjectInspection::Inspectors::CollectionContainingExactly,
81
- ObjectInspection::Inspectors::CollectionIncluding,
82
- ObjectInspection::Inspectors::HashIncluding,
83
- ObjectInspection::Inspectors::InstanceOf,
84
- ObjectInspection::Inspectors::KindOf,
85
- ObjectInspection::Inspectors::ObjectHavingAttributes,
86
- ObjectInspection::Inspectors::Primitive,
87
- ObjectInspection::Inspectors::ValueWithin,
108
+ config.add_extra_inspection_tree_builder_classes(
109
+ ObjectInspection::InspectionTreeBuilders::Double,
110
+ ObjectInspection::InspectionTreeBuilders::CollectionContainingExactly,
111
+ ObjectInspection::InspectionTreeBuilders::CollectionIncluding,
112
+ ObjectInspection::InspectionTreeBuilders::HashIncluding,
113
+ ObjectInspection::InspectionTreeBuilders::InstanceOf,
114
+ ObjectInspection::InspectionTreeBuilders::KindOf,
115
+ ObjectInspection::InspectionTreeBuilders::ObjectHavingAttributes,
116
+ # ObjectInspection::InspectionTreeBuilders::Primitive,
117
+ ObjectInspection::InspectionTreeBuilders::ValueWithin,
88
118
  )
89
119
  end
90
120
  end
91
121
  end
92
122
 
93
123
  require_relative "rspec/monkey_patches"
94
-
95
- SuperDiff::Csi.color_enabled = ::RSpec.configuration.color_enabled?