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
@@ -5,7 +5,9 @@ module SuperDiff
5
5
  raise NotImplementedError
6
6
  end
7
7
 
8
+ extend ImplementationChecks
8
9
  extend AttrExtras.mixin
10
+ include ImplementationChecks
9
11
 
10
12
  method_object(
11
13
  :expected,
@@ -13,13 +15,15 @@ module SuperDiff
13
15
  [
14
16
  :indent_level!,
15
17
  index_in_collection: nil,
16
- extra_operational_sequencer_classes: [],
17
- extra_diff_formatter_classes: [],
18
18
  ],
19
19
  )
20
20
 
21
21
  def call
22
- raise NotImplementedError
22
+ operation_tree.to_diff(
23
+ indent_level: indent_level,
24
+ collection_prefix: nil,
25
+ add_comma: false,
26
+ )
23
27
  end
24
28
 
25
29
  protected
@@ -27,6 +31,19 @@ module SuperDiff
27
31
  def indentation
28
32
  " " * (indent_level * 2)
29
33
  end
34
+
35
+ def operation_tree_builder_class
36
+ unimplemented_instance_method!
37
+ end
38
+
39
+ private
40
+
41
+ def operation_tree
42
+ operation_tree_builder_class.call(
43
+ expected: expected,
44
+ actual: actual,
45
+ )
46
+ end
30
47
  end
31
48
  end
32
49
  end
@@ -7,19 +7,10 @@ module SuperDiff
7
7
  actual.respond_to?(:attributes_for_super_diff)
8
8
  end
9
9
 
10
- def call
11
- operations.to_diff(indent_level: indent_level)
12
- end
13
-
14
10
  private
15
11
 
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
- )
12
+ def operation_tree_builder_class
13
+ OperationTreeBuilders::CustomObject
23
14
  end
24
15
  end
25
16
  end
@@ -5,19 +5,13 @@ module SuperDiff
5
5
  expected.class == actual.class
6
6
  end
7
7
 
8
- def call
9
- operations.to_diff(indent_level: indent_level)
10
- end
11
-
12
8
  private
13
9
 
14
- def operations
15
- OperationalSequencer.call(
10
+ def operation_tree
11
+ OperationTreeBuilders::Main.call(
16
12
  expected: expected,
17
13
  actual: actual,
18
14
  all_or_nothing: true,
19
- extra_classes: extra_operational_sequencer_classes,
20
- extra_diff_formatter_classes: extra_diff_formatter_classes,
21
15
  )
22
16
  end
23
17
  end
@@ -0,0 +1,12 @@
1
+ module SuperDiff
2
+ module Differs
3
+ DEFAULTS = [
4
+ Array,
5
+ Hash,
6
+ TimeLike,
7
+ MultilineString,
8
+ CustomObject,
9
+ DefaultObject,
10
+ ].freeze
11
+ end
12
+ end
@@ -5,19 +5,10 @@ module SuperDiff
5
5
  expected.is_a?(::Hash) && actual.is_a?(::Hash)
6
6
  end
7
7
 
8
- def call
9
- DiffFormatters::Hash.call(operations, indent_level: indent_level)
10
- end
11
-
12
8
  private
13
9
 
14
- def operations
15
- OperationalSequencers::Hash.call(
16
- expected: expected,
17
- actual: actual,
18
- extra_operational_sequencer_classes: extra_operational_sequencer_classes,
19
- extra_diff_formatter_classes: extra_diff_formatter_classes,
20
- )
10
+ def operation_tree_builder_class
11
+ OperationTreeBuilders::Hash
21
12
  end
22
13
  end
23
14
  end
@@ -0,0 +1,48 @@
1
+ module SuperDiff
2
+ module Differs
3
+ class Main
4
+ extend AttrExtras.mixin
5
+
6
+ method_object(
7
+ :expected,
8
+ :actual,
9
+ [
10
+ indent_level: 0,
11
+ index_in_collection: nil,
12
+ omit_empty: false,
13
+ ],
14
+ )
15
+
16
+ def call
17
+ if resolved_class
18
+ resolved_class.call(
19
+ expected,
20
+ actual,
21
+ indent_level: indent_level,
22
+ index_in_collection: index_in_collection,
23
+ )
24
+ else
25
+ raise Errors::NoDifferAvailableError.create(expected, actual)
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ attr_query :omit_empty?
32
+
33
+ def resolved_class
34
+ available_classes.find { |klass| klass.applies_to?(expected, actual) }
35
+ end
36
+
37
+ def available_classes
38
+ classes = SuperDiff.configuration.extra_differ_classes + DEFAULTS
39
+
40
+ if omit_empty?
41
+ classes
42
+ else
43
+ classes + [Empty]
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -6,22 +6,10 @@ module SuperDiff
6
6
  (expected.include?("\n") || actual.include?("\n"))
7
7
  end
8
8
 
9
- def call
10
- DiffFormatters::MultilineString.call(
11
- operations,
12
- indent_level: indent_level,
13
- )
14
- end
15
-
16
9
  private
17
10
 
18
- def operations
19
- OperationalSequencers::MultilineString.call(
20
- expected: expected,
21
- actual: actual,
22
- extra_operational_sequencer_classes: extra_operational_sequencer_classes,
23
- extra_diff_formatter_classes: extra_diff_formatter_classes,
24
- )
11
+ def operation_tree_builder_class
12
+ OperationTreeBuilders::MultilineString
25
13
  end
26
14
  end
27
15
  end
@@ -0,0 +1,15 @@
1
+ module SuperDiff
2
+ module Differs
3
+ class TimeLike < Base
4
+ def self.applies_to?(expected, actual)
5
+ SuperDiff.time_like?(expected) && SuperDiff.time_like?(actual)
6
+ end
7
+
8
+ private
9
+
10
+ def operation_tree_builder_class
11
+ OperationTreeBuilders::TimeLike
12
+ end
13
+ end
14
+ end
15
+ end
@@ -3,6 +3,7 @@ module SuperDiff
3
3
  autoload :Array, "super_diff/equality_matchers/array"
4
4
  autoload :Base, "super_diff/equality_matchers/base"
5
5
  autoload :Hash, "super_diff/equality_matchers/hash"
6
+ autoload :Main, "super_diff/equality_matchers/main"
6
7
  autoload :MultilineString, "super_diff/equality_matchers/multiline_string"
7
8
  autoload :Default, "super_diff/equality_matchers/default"
8
9
  autoload :Primitive, "super_diff/equality_matchers/primitive"
@@ -10,14 +11,7 @@ module SuperDiff
10
11
  :SinglelineString,
11
12
  "super_diff/equality_matchers/singleline_string",
12
13
  )
13
-
14
- DEFAULTS = [
15
- Primitive,
16
- Array,
17
- Hash,
18
- MultilineString,
19
- SinglelineString,
20
- Default,
21
- ].freeze
22
14
  end
23
15
  end
16
+
17
+ require "super_diff/equality_matchers/defaults"
@@ -33,13 +33,7 @@ module SuperDiff
33
33
  protected
34
34
 
35
35
  def diff
36
- Differs::Array.call(
37
- expected,
38
- actual,
39
- indent_level: 0,
40
- extra_operational_sequencer_classes: extra_operational_sequencer_classes,
41
- extra_diff_formatter_classes: extra_diff_formatter_classes,
42
- )
36
+ Differs::Array.call(expected, actual, indent_level: 0)
43
37
  end
44
38
  end
45
39
  end
@@ -11,7 +11,7 @@ module SuperDiff
11
11
  [
12
12
  :expected!,
13
13
  :actual!,
14
- extra_operational_sequencer_classes: [],
14
+ extra_operation_tree_builder_classes: [],
15
15
  extra_diff_formatter_classes: [],
16
16
  ]
17
17
  )
@@ -47,13 +47,7 @@ module SuperDiff
47
47
  end
48
48
 
49
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
- )
50
+ Differs::Main.call(expected, actual, indent_level: 0)
57
51
  end
58
52
  end
59
53
  end
@@ -0,0 +1,12 @@
1
+ module SuperDiff
2
+ module EqualityMatchers
3
+ DEFAULTS = [
4
+ Primitive,
5
+ Array,
6
+ Hash,
7
+ MultilineString,
8
+ SinglelineString,
9
+ Default,
10
+ ].freeze
11
+ end
12
+ end
@@ -33,13 +33,7 @@ module SuperDiff
33
33
  protected
34
34
 
35
35
  def diff
36
- Differs::Hash.call(
37
- expected,
38
- actual,
39
- indent_level: 0,
40
- extra_operational_sequencer_classes: extra_operational_sequencer_classes,
41
- extra_diff_formatter_classes: extra_diff_formatter_classes,
42
- )
36
+ Differs::Hash.call(expected, actual, indent_level: 0)
43
37
  end
44
38
  end
45
39
  end
@@ -0,0 +1,21 @@
1
+ module SuperDiff
2
+ module EqualityMatchers
3
+ class Main
4
+ extend AttrExtras.mixin
5
+
6
+ method_object [:expected!, :actual!, extra_classes: []]
7
+
8
+ def call
9
+ resolved_class.call(expected: expected, actual: actual)
10
+ end
11
+
12
+ private
13
+
14
+ def resolved_class
15
+ (DEFAULTS + extra_classes).find do |klass|
16
+ klass.applies_to?(expected) && klass.applies_to?(actual)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -34,13 +34,7 @@ module SuperDiff
34
34
  private
35
35
 
36
36
  def diff
37
- Differs::MultilineString.call(
38
- expected,
39
- actual,
40
- indent_level: 0,
41
- extra_operational_sequencer_classes: extra_operational_sequencer_classes,
42
- extra_diff_formatter_classes: extra_diff_formatter_classes,
43
- )
37
+ Differs::MultilineString.call(expected, actual, indent_level: 0)
44
38
  end
45
39
  end
46
40
  end
@@ -0,0 +1,16 @@
1
+ module SuperDiff
2
+ module Errors
3
+ autoload(
4
+ :NoDiffFormatterAvailableError,
5
+ "super_diff/errors/no_diff_formatter_available_error",
6
+ )
7
+ autoload(
8
+ :NoDifferAvailableError,
9
+ "super_diff/errors/no_differ_available_error",
10
+ )
11
+ autoload(
12
+ :NoOperationTreeBuilderAvailableError,
13
+ "super_diff/errors/no_operation_tree_builder_available_error",
14
+ )
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ module SuperDiff
2
+ module Errors
3
+ class NoDiffFormatterAvailableError < StandardError
4
+ def self.create(operation_tree)
5
+ allocate.tap do |error|
6
+ error.operation_tree = operation_tree
7
+ error.__send__(:initialize)
8
+ end
9
+ end
10
+
11
+ attr_accessor :operation_tree
12
+
13
+ def initialize
14
+ super(<<-MESSAGE)
15
+ There is no diff formatter available to handle an operation tree object of
16
+ #{operation_tree.class}.
17
+ MESSAGE
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ module SuperDiff
2
+ module Errors
3
+ class NoDifferAvailableError < StandardError
4
+ def self.create(expected, actual)
5
+ allocate.tap do |error|
6
+ error.expected = expected
7
+ error.actual = actual
8
+ error.__send__(:initialize)
9
+ end
10
+ end
11
+
12
+ attr_accessor :expected, :actual
13
+
14
+ def initialize
15
+ super(<<-MESSAGE)
16
+ There is no differ available to handle an "expected" value of type
17
+ #{expected.class}
18
+ and an "actual" value of type
19
+ #{actual.class}.
20
+ MESSAGE
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,22 @@
1
+ module SuperDiff
2
+ module Errors
3
+ class NoOperationalSequencerAvailableError < StandardError
4
+ def self.create(expected, actual)
5
+ allocate.tap do |error|
6
+ error.expected = expected
7
+ error.actual = actual
8
+ error.__send__(:initialize)
9
+ end
10
+ end
11
+
12
+ attr_accessor :expected, :actual
13
+
14
+ def initialize
15
+ super(<<-MESSAGE)
16
+ There is no operational sequencer available to handle an "expected" value of
17
+ type #{expected.class} and an "actual" value of type #{actual.class}.
18
+ MESSAGE
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ module SuperDiff
2
+ module ImplementationChecks
3
+ protected def unimplemented_instance_method!
4
+ raise(
5
+ NotImplementedError,
6
+ "#{self.class} must implement ##{caller_locations(1, 1).first.label}",
7
+ caller(1),
8
+ )
9
+ end
10
+
11
+ protected def unimplemented_class_method!
12
+ raise(
13
+ NotImplementedError,
14
+ "#{self} must implement .#{caller_locations(1, 1).first.label}",
15
+ caller(1),
16
+ )
17
+ end
18
+ end
19
+ end