super_diff 0.1.0 → 0.2.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 (206) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +117 -89
  3. data/lib/super_diff.rb +33 -47
  4. data/lib/super_diff/active_record.rb +41 -0
  5. data/lib/super_diff/active_record/diff_formatters.rb +10 -0
  6. data/lib/super_diff/active_record/diff_formatters/active_record_relation.rb +23 -0
  7. data/lib/super_diff/active_record/differs.rb +10 -0
  8. data/lib/super_diff/active_record/differs/active_record_relation.rb +30 -0
  9. data/lib/super_diff/active_record/object_inspection.rb +14 -0
  10. data/lib/super_diff/active_record/object_inspection/inspectors.rb +16 -0
  11. data/lib/super_diff/active_record/object_inspection/inspectors/active_record_model.rb +38 -0
  12. data/lib/super_diff/active_record/object_inspection/inspectors/active_record_relation.rb +18 -0
  13. data/lib/super_diff/active_record/object_inspection/map_extension.rb +18 -0
  14. data/lib/super_diff/active_record/operation_sequences.rb +10 -0
  15. data/lib/super_diff/active_record/operation_sequences/active_record_relation.rb +16 -0
  16. data/lib/super_diff/active_record/operational_sequencers.rb +14 -0
  17. data/lib/super_diff/active_record/operational_sequencers/active_record_model.rb +19 -0
  18. data/lib/super_diff/active_record/operational_sequencers/active_record_relation.rb +24 -0
  19. data/lib/super_diff/active_support.rb +33 -0
  20. data/lib/super_diff/active_support/diff_formatters.rb +10 -0
  21. data/lib/super_diff/active_support/diff_formatters/hash_with_indifferent_access.rb +36 -0
  22. data/lib/super_diff/active_support/differs.rb +10 -0
  23. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +36 -0
  24. data/lib/super_diff/active_support/object_inspection.rb +14 -0
  25. data/lib/super_diff/active_support/object_inspection/inspectors.rb +12 -0
  26. data/lib/super_diff/active_support/object_inspection/inspectors/hash_with_indifferent_access.rb +18 -0
  27. data/lib/super_diff/active_support/object_inspection/map_extension.rb +15 -0
  28. data/lib/super_diff/active_support/operation_sequences.rb +10 -0
  29. data/lib/super_diff/active_support/operation_sequences/hash_with_indifferent_access.rb +16 -0
  30. data/lib/super_diff/active_support/operational_sequencers.rb +10 -0
  31. data/lib/super_diff/active_support/operational_sequencers/hash_with_indifferent_access.rb +21 -0
  32. data/lib/super_diff/colorized_document_extensions.rb +17 -0
  33. data/lib/super_diff/csi.rb +45 -15
  34. data/lib/super_diff/csi/bold_sequence.rb +9 -0
  35. data/lib/super_diff/csi/color.rb +62 -0
  36. data/lib/super_diff/csi/color_sequence_block.rb +28 -0
  37. data/lib/super_diff/csi/colorized_document.rb +72 -0
  38. data/lib/super_diff/csi/document.rb +183 -0
  39. data/lib/super_diff/csi/eight_bit_color.rb +72 -26
  40. data/lib/super_diff/csi/four_bit_color.rb +63 -29
  41. data/lib/super_diff/csi/twenty_four_bit_color.rb +79 -18
  42. data/lib/super_diff/csi/uncolorized_document.rb +29 -0
  43. data/lib/super_diff/diff_formatter.rb +10 -15
  44. data/lib/super_diff/diff_formatters.rb +10 -1
  45. data/lib/super_diff/diff_formatters/base.rb +12 -17
  46. data/lib/super_diff/diff_formatters/collection.rb +81 -50
  47. data/lib/super_diff/diff_formatters/{object.rb → custom_object.rb} +12 -9
  48. data/lib/super_diff/diff_formatters/default_object.rb +48 -0
  49. data/lib/super_diff/diff_formatters/multiline_string.rb +31 -0
  50. data/lib/super_diff/differ.rb +35 -32
  51. data/lib/super_diff/differs.rb +16 -1
  52. data/lib/super_diff/differs/array.rb +2 -2
  53. data/lib/super_diff/differs/base.rb +11 -21
  54. data/lib/super_diff/differs/custom_object.rb +26 -0
  55. data/lib/super_diff/differs/default_object.rb +25 -0
  56. data/lib/super_diff/differs/empty.rb +1 -1
  57. data/lib/super_diff/differs/hash.rb +2 -2
  58. data/lib/super_diff/differs/{multi_line_string.rb → multiline_string.rb} +6 -5
  59. data/lib/super_diff/equality_matcher.rb +9 -22
  60. data/lib/super_diff/equality_matchers.rb +19 -1
  61. data/lib/super_diff/equality_matchers/array.rb +6 -4
  62. data/lib/super_diff/equality_matchers/base.rb +8 -16
  63. data/lib/super_diff/equality_matchers/default.rb +60 -0
  64. data/lib/super_diff/equality_matchers/hash.rb +6 -4
  65. data/lib/super_diff/equality_matchers/{multi_line_string.rb → multiline_string.rb} +9 -6
  66. data/lib/super_diff/equality_matchers/primitive.rb +34 -0
  67. data/lib/super_diff/equality_matchers/{single_line_string.rb → singleline_string.rb} +7 -5
  68. data/lib/super_diff/helpers.rb +17 -81
  69. data/lib/super_diff/no_differ_available_error.rb +22 -0
  70. data/lib/super_diff/{errors.rb → no_operational_sequencer_available_error.rb} +0 -0
  71. data/lib/super_diff/object_inspection.rb +24 -0
  72. data/lib/super_diff/object_inspection/inspection_tree.rb +144 -0
  73. data/lib/super_diff/object_inspection/inspector.rb +27 -0
  74. data/lib/super_diff/object_inspection/inspectors.rb +18 -0
  75. data/lib/super_diff/object_inspection/inspectors/array.rb +22 -0
  76. data/lib/super_diff/object_inspection/inspectors/custom_object.rb +27 -0
  77. data/lib/super_diff/object_inspection/inspectors/default_object.rb +47 -0
  78. data/lib/super_diff/object_inspection/inspectors/hash.rb +22 -0
  79. data/lib/super_diff/object_inspection/inspectors/primitive.rb +13 -0
  80. data/lib/super_diff/object_inspection/inspectors/string.rb +13 -0
  81. data/lib/super_diff/object_inspection/map.rb +28 -0
  82. data/lib/super_diff/object_inspection/nodes.rb +49 -0
  83. data/lib/super_diff/object_inspection/nodes/base.rb +86 -0
  84. data/lib/super_diff/object_inspection/nodes/break.rb +15 -0
  85. data/lib/super_diff/object_inspection/nodes/inspection.rb +15 -0
  86. data/lib/super_diff/object_inspection/nodes/nesting.rb +16 -0
  87. data/lib/super_diff/object_inspection/nodes/text.rb +15 -0
  88. data/lib/super_diff/object_inspection/nodes/when_empty.rb +30 -0
  89. data/lib/super_diff/object_inspection/nodes/when_multiline.rb +22 -0
  90. data/lib/super_diff/object_inspection/nodes/when_non_empty.rb +30 -0
  91. data/lib/super_diff/object_inspection/nodes/when_singleline.rb +24 -0
  92. data/lib/super_diff/operation_sequences.rb +9 -0
  93. data/lib/super_diff/operation_sequences/base.rb +1 -1
  94. data/lib/super_diff/operation_sequences/{object.rb → custom_object.rb} +4 -3
  95. data/lib/super_diff/operation_sequences/default_object.rb +25 -0
  96. data/lib/super_diff/operational_sequencer.rb +23 -18
  97. data/lib/super_diff/operational_sequencers.rb +12 -1
  98. data/lib/super_diff/operational_sequencers/array.rb +65 -62
  99. data/lib/super_diff/operational_sequencers/base.rb +18 -26
  100. data/lib/super_diff/operational_sequencers/custom_object.rb +35 -0
  101. data/lib/super_diff/operational_sequencers/{object.rb → default_object.rb} +21 -11
  102. data/lib/super_diff/operational_sequencers/hash.rb +8 -5
  103. data/lib/super_diff/operational_sequencers/{multi_line_string.rb → multiline_string.rb} +11 -6
  104. data/lib/super_diff/operations.rb +6 -0
  105. data/lib/super_diff/operations/binary_operation.rb +14 -34
  106. data/lib/super_diff/operations/unary_operation.rb +11 -2
  107. data/lib/super_diff/rails.rb +1 -0
  108. data/lib/super_diff/recursion_guard.rb +47 -0
  109. data/lib/super_diff/rspec-rails.rb +2 -0
  110. data/lib/super_diff/rspec.rb +52 -8
  111. data/lib/super_diff/rspec/augmented_matcher.rb +98 -0
  112. data/lib/super_diff/rspec/configuration.rb +31 -0
  113. data/lib/super_diff/rspec/differ.rb +60 -16
  114. data/lib/super_diff/rspec/differs.rb +13 -0
  115. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +23 -0
  116. data/lib/super_diff/rspec/differs/partial_array.rb +22 -0
  117. data/lib/super_diff/rspec/differs/partial_hash.rb +22 -0
  118. data/lib/super_diff/rspec/differs/partial_object.rb +22 -0
  119. data/lib/super_diff/rspec/matcher_text_builders.rb +24 -0
  120. data/lib/super_diff/rspec/matcher_text_builders/base.rb +155 -0
  121. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +78 -0
  122. data/lib/super_diff/rspec/matcher_text_builders/contain_exactly.rb +14 -0
  123. data/lib/super_diff/rspec/matcher_text_builders/match.rb +23 -0
  124. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +13 -0
  125. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +99 -0
  126. data/lib/super_diff/rspec/matcher_text_template.rb +240 -0
  127. data/lib/super_diff/rspec/monkey_patches.rb +601 -98
  128. data/lib/super_diff/rspec/object_inspection.rb +8 -0
  129. data/lib/super_diff/rspec/object_inspection/inspectors.rb +24 -0
  130. data/lib/super_diff/rspec/object_inspection/inspectors/collection_containing_exactly.rb +19 -0
  131. data/lib/super_diff/rspec/object_inspection/inspectors/partial_array.rb +22 -0
  132. data/lib/super_diff/rspec/object_inspection/inspectors/partial_hash.rb +21 -0
  133. data/lib/super_diff/rspec/object_inspection/inspectors/partial_object.rb +21 -0
  134. data/lib/super_diff/rspec/object_inspection/map_extension.rb +23 -0
  135. data/lib/super_diff/rspec/operational_sequencers.rb +22 -0
  136. data/lib/super_diff/rspec/operational_sequencers/collection_containing_exactly.rb +97 -0
  137. data/lib/super_diff/rspec/operational_sequencers/partial_array.rb +23 -0
  138. data/lib/super_diff/rspec/operational_sequencers/partial_hash.rb +32 -0
  139. data/lib/super_diff/rspec/operational_sequencers/partial_object.rb +64 -0
  140. data/lib/super_diff/version.rb +1 -1
  141. data/spec/examples.txt +328 -46
  142. data/spec/integration/rails/active_record_spec.rb +19 -0
  143. data/spec/integration/rails/hash_with_indifferent_access_spec.rb +19 -0
  144. data/spec/integration/rspec/be_falsey_matcher_spec.rb +53 -0
  145. data/spec/integration/rspec/be_matcher_spec.rb +565 -0
  146. data/spec/integration/rspec/be_nil_matcher_spec.rb +53 -0
  147. data/spec/integration/rspec/be_predicate_matcher_spec.rb +546 -0
  148. data/spec/integration/rspec/be_truthy_matcher_spec.rb +57 -0
  149. data/spec/integration/rspec/contain_exactly_matcher_spec.rb +368 -0
  150. data/spec/integration/rspec/eq_matcher_spec.rb +874 -0
  151. data/spec/integration/rspec/have_attributes_matcher_spec.rb +299 -0
  152. data/spec/integration/rspec/include_matcher_spec.rb +350 -0
  153. data/spec/integration/rspec/match_matcher_spec.rb +1258 -0
  154. data/spec/integration/rspec/raise_error_matcher_spec.rb +350 -0
  155. data/spec/integration/rspec/respond_to_matcher_spec.rb +994 -0
  156. data/spec/integration/rspec/unhandled_errors_spec.rb +94 -0
  157. data/spec/spec_helper.rb +19 -4
  158. data/spec/support/colorizer.rb +9 -0
  159. data/spec/support/command_runner.rb +4 -0
  160. data/spec/support/integration/helpers.rb +179 -0
  161. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +79 -41
  162. data/spec/support/models/a.rb +11 -0
  163. data/spec/support/models/active_record/person.rb +26 -0
  164. data/spec/support/models/active_record/shipping_address.rb +29 -0
  165. data/spec/support/models/customer.rb +24 -0
  166. data/spec/support/models/empty_class.rb +6 -0
  167. data/spec/support/models/item.rb +10 -0
  168. data/spec/support/models/order.rb +9 -0
  169. data/spec/support/models/person.rb +20 -0
  170. data/spec/support/models/player.rb +33 -0
  171. data/spec/support/models/shipping_address.rb +34 -0
  172. data/spec/support/ruby_versions.rb +7 -0
  173. data/spec/support/shared_examples/active_record.rb +338 -0
  174. data/spec/support/shared_examples/hash_with_indifferent_access.rb +233 -0
  175. data/spec/unit/equality_matcher_spec.rb +579 -171
  176. data/spec/unit/object_inspection_spec.rb +1092 -0
  177. data/spec/unit/rspec/matchers/be_compared_to_spec.rb +23 -0
  178. data/spec/unit/rspec/matchers/be_falsey_spec.rb +9 -0
  179. data/spec/unit/rspec/matchers/be_nil_spec.rb +9 -0
  180. data/spec/unit/rspec/matchers/be_predicate_spec.rb +31 -0
  181. data/spec/unit/rspec/matchers/be_spec.rb +17 -0
  182. data/spec/unit/rspec/matchers/be_truthy_spec.rb +9 -0
  183. data/spec/unit/rspec/matchers/contain_exactly_spec.rb +11 -0
  184. data/spec/unit/rspec/matchers/eq_spec.rb +9 -0
  185. data/spec/unit/rspec/matchers/have_attributes_spec.rb +11 -0
  186. data/spec/unit/rspec/matchers/include_spec.rb +21 -0
  187. data/spec/unit/rspec/matchers/match_spec.rb +9 -0
  188. data/spec/unit/rspec/matchers/raise_error_spec.rb +29 -0
  189. data/spec/unit/rspec/matchers/respond_to_spec.rb +78 -0
  190. data/super_diff.gemspec +4 -2
  191. metadata +231 -34
  192. data/lib/super_diff/csi/color_helper.rb +0 -52
  193. data/lib/super_diff/csi/eight_bit_sequence.rb +0 -27
  194. data/lib/super_diff/csi/four_bit_sequence.rb +0 -24
  195. data/lib/super_diff/csi/sequence.rb +0 -22
  196. data/lib/super_diff/csi/twenty_four_bit_sequence.rb +0 -27
  197. data/lib/super_diff/diff_formatters/multi_line_string.rb +0 -31
  198. data/lib/super_diff/differs/object.rb +0 -68
  199. data/lib/super_diff/equality_matchers/object.rb +0 -18
  200. data/lib/super_diff/value_inspection.rb +0 -11
  201. data/spec/integration/rspec_spec.rb +0 -261
  202. data/spec/support/color_helper.rb +0 -49
  203. data/spec/support/person.rb +0 -23
  204. data/spec/support/person_diff_formatter.rb +0 -15
  205. data/spec/support/person_operation_sequence.rb +0 -14
  206. data/spec/support/person_operational_sequencer.rb +0 -19
@@ -1,8 +1,8 @@
1
1
  module SuperDiff
2
2
  module Differs
3
3
  class Array < Base
4
- def self.applies_to?(value)
5
- value.is_a?(::Array)
4
+ def self.applies_to?(expected, actual)
5
+ expected.is_a?(::Array) && actual.is_a?(::Array)
6
6
  end
7
7
 
8
8
  def call
@@ -1,29 +1,22 @@
1
1
  module SuperDiff
2
2
  module Differs
3
3
  class Base
4
- def self.applies_to?(_value)
4
+ def self.applies_to?(_expected, _actual)
5
5
  raise NotImplementedError
6
6
  end
7
7
 
8
- def self.call(*args)
9
- new(*args).call
10
- end
8
+ extend AttrExtras.mixin
11
9
 
12
- def initialize(
13
- expected,
14
- actual,
15
- indent_level:,
16
- index_in_collection: nil,
17
- extra_operational_sequencer_classes: [],
18
- extra_diff_formatter_classes: []
10
+ method_object(
11
+ :expected,
12
+ :actual,
13
+ [
14
+ :indent_level!,
15
+ index_in_collection: nil,
16
+ extra_operational_sequencer_classes: [],
17
+ extra_diff_formatter_classes: [],
18
+ ],
19
19
  )
20
- @expected = expected
21
- @actual = actual
22
- @indent_level = indent_level
23
- @index_in_collection = index_in_collection
24
- @extra_operational_sequencer_classes = extra_operational_sequencer_classes
25
- @extra_diff_formatter_classes = extra_diff_formatter_classes
26
- end
27
20
 
28
21
  def call
29
22
  raise NotImplementedError
@@ -31,9 +24,6 @@ module SuperDiff
31
24
 
32
25
  protected
33
26
 
34
- attr_reader :expected, :actual, :indent_level, :index_in_collection,
35
- :extra_operational_sequencer_classes, :extra_diff_formatter_classes
36
-
37
27
  def indentation
38
28
  " " * (indent_level * 2)
39
29
  end
@@ -0,0 +1,26 @@
1
+ module SuperDiff
2
+ module Differs
3
+ class CustomObject < Base
4
+ def self.applies_to?(expected, actual)
5
+ expected.class == actual.class &&
6
+ expected.respond_to?(:attributes_for_super_diff) &&
7
+ actual.respond_to?(:attributes_for_super_diff)
8
+ end
9
+
10
+ def call
11
+ operations.to_diff(indent_level: indent_level)
12
+ end
13
+
14
+ private
15
+
16
+ def operations
17
+ OperationalSequencers::CustomObject.call(
18
+ expected: expected,
19
+ actual: actual,
20
+ extra_operational_sequencer_classes: extra_operational_sequencer_classes,
21
+ extra_diff_formatter_classes: extra_diff_formatter_classes,
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ module SuperDiff
2
+ module Differs
3
+ class DefaultObject < Base
4
+ def self.applies_to?(expected, actual)
5
+ expected.class == actual.class
6
+ end
7
+
8
+ def call
9
+ operations.to_diff(indent_level: indent_level)
10
+ end
11
+
12
+ private
13
+
14
+ def operations
15
+ OperationalSequencer.call(
16
+ expected: expected,
17
+ actual: actual,
18
+ all_or_nothing: true,
19
+ extra_classes: extra_operational_sequencer_classes,
20
+ extra_diff_formatter_classes: extra_diff_formatter_classes,
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,7 +1,7 @@
1
1
  module SuperDiff
2
2
  module Differs
3
3
  class Empty < Base
4
- def self.applies_to?(_value)
4
+ def self.applies_to?(_expected, _actual)
5
5
  true
6
6
  end
7
7
 
@@ -1,8 +1,8 @@
1
1
  module SuperDiff
2
2
  module Differs
3
3
  class Hash < Base
4
- def self.applies_to?(value)
5
- value.is_a?(::Hash)
4
+ def self.applies_to?(expected, actual)
5
+ expected.is_a?(::Hash) && actual.is_a?(::Hash)
6
6
  end
7
7
 
8
8
  def call
@@ -1,12 +1,13 @@
1
1
  module SuperDiff
2
2
  module Differs
3
- class MultiLineString < Base
4
- def self.applies_to?(value)
5
- value.is_a?(::String) && value.include?("\n")
3
+ class MultilineString < Base
4
+ def self.applies_to?(expected, actual)
5
+ expected.is_a?(::String) && actual.is_a?(::String) &&
6
+ (expected.include?("\n") || actual.include?("\n"))
6
7
  end
7
8
 
8
9
  def call
9
- DiffFormatters::MultiLineString.call(
10
+ DiffFormatters::MultilineString.call(
10
11
  operations,
11
12
  indent_level: indent_level,
12
13
  )
@@ -15,7 +16,7 @@ module SuperDiff
15
16
  private
16
17
 
17
18
  def operations
18
- OperationalSequencers::MultiLineString.call(
19
+ OperationalSequencers::MultilineString.call(
19
20
  expected: expected,
20
21
  actual: actual,
21
22
  extra_operational_sequencer_classes: extra_operational_sequencer_classes,
@@ -1,22 +1,16 @@
1
1
  module SuperDiff
2
2
  class EqualityMatcher
3
- def self.call(*args)
4
- new(*args).call
5
- end
3
+ extend AttrExtras.mixin
6
4
 
7
- def initialize(
8
- expected:,
9
- actual:,
10
- extra_classes: [],
11
- extra_operational_sequencer_classes: [],
12
- extra_diff_formatter_classes: []
5
+ method_object(
6
+ [
7
+ :expected!,
8
+ :actual!,
9
+ extra_classes: [],
10
+ extra_operational_sequencer_classes: [],
11
+ extra_diff_formatter_classes: [],
12
+ ],
13
13
  )
14
- @expected = expected
15
- @actual = actual
16
- @extra_classes = extra_classes
17
- @extra_operational_sequencer_classes = extra_operational_sequencer_classes
18
- @extra_diff_formatter_classes = extra_diff_formatter_classes
19
- end
20
14
 
21
15
  def call
22
16
  resolved_class.call(
@@ -29,14 +23,7 @@ module SuperDiff
29
23
 
30
24
  private
31
25
 
32
- attr_reader :expected, :actual, :extra_classes,
33
- :extra_operational_sequencer_classes, :extra_diff_formatter_classes
34
-
35
26
  def resolved_class
36
- matching_class || EqualityMatchers::Object
37
- end
38
-
39
- def matching_class
40
27
  (EqualityMatchers::DEFAULTS + extra_classes).find do |klass|
41
28
  klass.applies_to?(expected) && klass.applies_to?(actual)
42
29
  end
@@ -1,5 +1,23 @@
1
1
  module SuperDiff
2
2
  module EqualityMatchers
3
- DEFAULTS = [Array, Hash, MultiLineString, SingleLineString, Object].freeze
3
+ autoload :Array, "super_diff/equality_matchers/array"
4
+ autoload :Base, "super_diff/equality_matchers/base"
5
+ autoload :Hash, "super_diff/equality_matchers/hash"
6
+ autoload :MultilineString, "super_diff/equality_matchers/multiline_string"
7
+ autoload :Default, "super_diff/equality_matchers/default"
8
+ autoload :Primitive, "super_diff/equality_matchers/primitive"
9
+ autoload(
10
+ :SinglelineString,
11
+ "super_diff/equality_matchers/singleline_string",
12
+ )
13
+
14
+ DEFAULTS = [
15
+ Primitive,
16
+ Array,
17
+ Hash,
18
+ MultilineString,
19
+ SinglelineString,
20
+ Default,
21
+ ].freeze
4
22
  end
5
23
  end
@@ -11,14 +11,16 @@ module SuperDiff
11
11
 
12
12
  #{
13
13
  Helpers.style(
14
- :deleted,
15
- "Expected: #{Helpers.inspect_object(expected)}",
14
+ :alpha,
15
+ "Expected: " +
16
+ ObjectInspection.inspect(expected, as_single_line: true),
16
17
  )
17
18
  }
18
19
  #{
19
20
  Helpers.style(
20
- :inserted,
21
- " Actual: #{Helpers.inspect_object(actual)}",
21
+ :beta,
22
+ " Actual: " +
23
+ ObjectInspection.inspect(actual, as_single_line: true),
22
24
  )
23
25
  }
24
26
 
@@ -5,21 +5,16 @@ module SuperDiff
5
5
  raise NotImplementedError
6
6
  end
7
7
 
8
- def self.call(*args)
9
- new(*args).call
10
- end
8
+ extend AttrExtras.mixin
11
9
 
12
- def initialize(
13
- expected:,
14
- actual:,
15
- extra_operational_sequencer_classes: [],
16
- extra_diff_formatter_classes: []
10
+ method_object(
11
+ [
12
+ :expected!,
13
+ :actual!,
14
+ extra_operational_sequencer_classes: [],
15
+ extra_diff_formatter_classes: [],
16
+ ]
17
17
  )
18
- @expected = expected
19
- @actual = actual
20
- @extra_operational_sequencer_classes = extra_operational_sequencer_classes
21
- @extra_diff_formatter_classes = extra_diff_formatter_classes
22
- end
23
18
 
24
19
  def call
25
20
  if expected == actual
@@ -31,9 +26,6 @@ module SuperDiff
31
26
 
32
27
  protected
33
28
 
34
- attr_reader :expected, :actual, :extra_operational_sequencer_classes,
35
- :extra_diff_formatter_classes
36
-
37
29
  def fail
38
30
  raise NotImplementedError
39
31
  end
@@ -0,0 +1,60 @@
1
+ module SuperDiff
2
+ module EqualityMatchers
3
+ class Default < Base
4
+ def self.applies_to?(_value)
5
+ true
6
+ end
7
+
8
+ def fail
9
+ <<~OUTPUT.strip
10
+ Differing objects.
11
+
12
+ #{expected_line}
13
+ #{actual_line}
14
+ #{diff_section}
15
+ OUTPUT
16
+ end
17
+
18
+ protected
19
+
20
+ def expected_line
21
+ Helpers.style(
22
+ :alpha,
23
+ "Expected: " +
24
+ ObjectInspection.inspect(expected, as_single_line: true),
25
+ )
26
+ end
27
+
28
+ def actual_line
29
+ Helpers.style(
30
+ :beta,
31
+ " Actual: " +
32
+ ObjectInspection.inspect(actual, as_single_line: true),
33
+ )
34
+ end
35
+
36
+ def diff_section
37
+ if diff.blank?
38
+ ""
39
+ else
40
+ <<~SECTION
41
+
42
+ Diff:
43
+
44
+ #{diff}
45
+ SECTION
46
+ end
47
+ end
48
+
49
+ def diff
50
+ Differ.call(
51
+ expected,
52
+ actual,
53
+ indent_level: 0,
54
+ extra_operational_sequencer_classes: extra_operational_sequencer_classes,
55
+ extra_diff_formatter_classes: extra_diff_formatter_classes,
56
+ )
57
+ end
58
+ end
59
+ end
60
+ end
@@ -11,14 +11,16 @@ module SuperDiff
11
11
 
12
12
  #{
13
13
  Helpers.style(
14
- :deleted,
15
- "Expected: #{Helpers.inspect_object(expected)}",
14
+ :alpha,
15
+ "Expected: " +
16
+ ObjectInspection.inspect(expected, as_single_line: true),
16
17
  )
17
18
  }
18
19
  #{
19
20
  Helpers.style(
20
- :inserted,
21
- " Actual: #{Helpers.inspect_object(actual)}",
21
+ :beta,
22
+ " Actual: " +
23
+ ObjectInspection.inspect(actual, as_single_line: true),
22
24
  )
23
25
  }
24
26
 
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
2
  module EqualityMatchers
3
- class MultiLineString < Base
3
+ class MultilineString < Base
4
4
  def self.applies_to?(value)
5
5
  value.is_a?(::String) && value.include?("\n")
6
6
  end
@@ -10,15 +10,18 @@ module SuperDiff
10
10
  Differing strings.
11
11
 
12
12
  #{
13
+ # TODO: This whole thing should not be red or green, just the values
13
14
  Helpers.style(
14
- :deleted,
15
- "Expected: #{Helpers.inspect_object(expected)}",
15
+ :alpha,
16
+ "Expected: " +
17
+ ObjectInspection.inspect(expected, as_single_line: true),
16
18
  )
17
19
  }
18
20
  #{
19
21
  Helpers.style(
20
- :inserted,
21
- " Actual: #{Helpers.inspect_object(actual)}",
22
+ :beta,
23
+ " Actual: " +
24
+ ObjectInspection.inspect(actual, as_single_line: true),
22
25
  )
23
26
  }
24
27
 
@@ -31,7 +34,7 @@ module SuperDiff
31
34
  private
32
35
 
33
36
  def diff
34
- Differs::MultiLineString.call(
37
+ Differs::MultilineString.call(
35
38
  expected,
36
39
  actual,
37
40
  indent_level: 0,
@@ -0,0 +1,34 @@
1
+ module SuperDiff
2
+ module EqualityMatchers
3
+ class Primitive < Base
4
+ def self.applies_to?(value)
5
+ value.is_a?(Symbol) ||
6
+ value.is_a?(Numeric) ||
7
+ # TODO: Test this
8
+ value == true ||
9
+ value == false
10
+ end
11
+
12
+ def fail
13
+ <<~OUTPUT.strip
14
+ Differing #{Helpers.plural_type_for(actual)}.
15
+
16
+ #{
17
+ Helpers.style(
18
+ :alpha,
19
+ "Expected: " +
20
+ ObjectInspection.inspect(expected, as_single_line: true),
21
+ )
22
+ }
23
+ #{
24
+ Helpers.style(
25
+ :beta,
26
+ " Actual: " +
27
+ ObjectInspection.inspect(actual, as_single_line: true),
28
+ )
29
+ }
30
+ OUTPUT
31
+ end
32
+ end
33
+ end
34
+ end