super_diff 0.2.0 → 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 (187) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +108 -74
  3. data/lib/super_diff.rb +20 -11
  4. data/lib/super_diff/active_record.rb +21 -23
  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/monkey_patches.rb +9 -0
  8. data/lib/super_diff/active_record/object_inspection/inspectors/active_record_model.rb +32 -22
  9. data/lib/super_diff/active_record/object_inspection/inspectors/active_record_relation.rb +17 -7
  10. data/lib/super_diff/active_record/operation_tree_builders.rb +14 -0
  11. data/lib/super_diff/active_record/{operational_sequencers → operation_tree_builders}/active_record_model.rb +2 -2
  12. data/lib/super_diff/active_record/{operational_sequencers → operation_tree_builders}/active_record_relation.rb +4 -4
  13. data/lib/super_diff/active_record/{operation_sequences.rb → operation_trees.rb} +2 -2
  14. data/lib/super_diff/active_record/{operation_sequences → operation_trees}/active_record_relation.rb +2 -2
  15. data/lib/super_diff/active_support.rb +16 -19
  16. data/lib/super_diff/active_support/diff_formatters/hash_with_indifferent_access.rb +3 -3
  17. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +3 -5
  18. data/lib/super_diff/active_support/object_inspection/inspectors/hash_with_indifferent_access.rb +17 -7
  19. data/lib/super_diff/active_support/operation_tree_builders.rb +10 -0
  20. data/lib/super_diff/active_support/{operational_sequencers → operation_tree_builders}/hash_with_indifferent_access.rb +2 -2
  21. data/lib/super_diff/active_support/{operation_sequences.rb → operation_trees.rb} +2 -2
  22. data/lib/super_diff/active_support/{operation_sequences → operation_trees}/hash_with_indifferent_access.rb +2 -2
  23. data/lib/super_diff/configuration.rb +60 -0
  24. data/lib/super_diff/csi.rb +4 -0
  25. data/lib/super_diff/diff_formatters.rb +3 -3
  26. data/lib/super_diff/diff_formatters/array.rb +3 -3
  27. data/lib/super_diff/diff_formatters/base.rb +3 -2
  28. data/lib/super_diff/diff_formatters/collection.rb +2 -2
  29. data/lib/super_diff/diff_formatters/custom_object.rb +3 -3
  30. data/lib/super_diff/diff_formatters/default_object.rb +6 -8
  31. data/lib/super_diff/diff_formatters/defaults.rb +10 -0
  32. data/lib/super_diff/diff_formatters/hash.rb +3 -3
  33. data/lib/super_diff/diff_formatters/main.rb +41 -0
  34. data/lib/super_diff/diff_formatters/multiline_string.rb +3 -3
  35. data/lib/super_diff/differs.rb +4 -9
  36. data/lib/super_diff/differs/array.rb +2 -11
  37. data/lib/super_diff/differs/base.rb +20 -3
  38. data/lib/super_diff/differs/custom_object.rb +2 -11
  39. data/lib/super_diff/differs/default_object.rb +2 -8
  40. data/lib/super_diff/differs/defaults.rb +12 -0
  41. data/lib/super_diff/differs/hash.rb +2 -11
  42. data/lib/super_diff/differs/main.rb +48 -0
  43. data/lib/super_diff/differs/multiline_string.rb +2 -14
  44. data/lib/super_diff/differs/time_like.rb +15 -0
  45. data/lib/super_diff/equality_matchers.rb +3 -9
  46. data/lib/super_diff/equality_matchers/array.rb +1 -7
  47. data/lib/super_diff/equality_matchers/base.rb +1 -1
  48. data/lib/super_diff/equality_matchers/default.rb +2 -8
  49. data/lib/super_diff/equality_matchers/defaults.rb +12 -0
  50. data/lib/super_diff/equality_matchers/hash.rb +1 -7
  51. data/lib/super_diff/equality_matchers/main.rb +21 -0
  52. data/lib/super_diff/equality_matchers/multiline_string.rb +1 -7
  53. data/lib/super_diff/errors.rb +16 -0
  54. data/lib/super_diff/errors/no_diff_formatter_available_error.rb +21 -0
  55. data/lib/super_diff/errors/no_differ_available_error.rb +24 -0
  56. data/lib/super_diff/errors/no_operational_sequencer_available_error.rb +22 -0
  57. data/lib/super_diff/implementation_checks.rb +19 -0
  58. data/lib/super_diff/object_inspection.rb +1 -10
  59. data/lib/super_diff/object_inspection/inspection_tree.rb +6 -2
  60. data/lib/super_diff/object_inspection/inspectors.rb +5 -0
  61. data/lib/super_diff/object_inspection/inspectors/array.rb +20 -10
  62. data/lib/super_diff/object_inspection/inspectors/base.rb +36 -0
  63. data/lib/super_diff/object_inspection/inspectors/custom_object.rb +24 -14
  64. data/lib/super_diff/object_inspection/inspectors/default_object.rb +44 -30
  65. data/lib/super_diff/object_inspection/inspectors/defaults.rb +15 -0
  66. data/lib/super_diff/object_inspection/inspectors/hash.rb +20 -10
  67. data/lib/super_diff/object_inspection/inspectors/main.rb +35 -0
  68. data/lib/super_diff/object_inspection/inspectors/primitive.rb +20 -5
  69. data/lib/super_diff/object_inspection/inspectors/string.rb +15 -5
  70. data/lib/super_diff/object_inspection/inspectors/time_like.rb +23 -0
  71. data/lib/super_diff/object_inspection/nodes/inspection.rb +9 -2
  72. data/lib/super_diff/operation_tree_builders.rb +18 -0
  73. data/lib/super_diff/{operational_sequencers → operation_tree_builders}/array.rb +38 -59
  74. data/lib/super_diff/operation_tree_builders/base.rb +98 -0
  75. data/lib/super_diff/{operational_sequencers → operation_tree_builders}/custom_object.rb +3 -3
  76. data/lib/super_diff/{operational_sequencers → operation_tree_builders}/default_object.rb +8 -3
  77. data/lib/super_diff/operation_tree_builders/defaults.rb +5 -0
  78. data/lib/super_diff/operation_tree_builders/hash.rb +226 -0
  79. data/lib/super_diff/operation_tree_builders/main.rb +42 -0
  80. data/lib/super_diff/{operational_sequencers → operation_tree_builders}/multiline_string.rb +3 -3
  81. data/lib/super_diff/operation_tree_builders/time_like.rb +34 -0
  82. data/lib/super_diff/operation_trees.rb +13 -0
  83. data/lib/super_diff/{operation_sequences → operation_trees}/array.rb +5 -1
  84. data/lib/super_diff/operation_trees/base.rb +31 -0
  85. data/lib/super_diff/{operation_sequences → operation_trees}/custom_object.rb +5 -1
  86. data/lib/super_diff/{operation_sequences → operation_trees}/default_object.rb +10 -8
  87. data/lib/super_diff/operation_trees/defaults.rb +5 -0
  88. data/lib/super_diff/{operation_sequences → operation_trees}/hash.rb +5 -1
  89. data/lib/super_diff/operation_trees/main.rb +35 -0
  90. data/lib/super_diff/operation_trees/multiline_string.rb +18 -0
  91. data/lib/super_diff/operations/unary_operation.rb +3 -0
  92. data/lib/super_diff/rspec.rb +54 -22
  93. data/lib/super_diff/rspec/augmented_matcher.rb +1 -1
  94. data/lib/super_diff/rspec/differ.rb +2 -17
  95. data/lib/super_diff/rspec/differs.rb +9 -3
  96. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +3 -8
  97. data/lib/super_diff/rspec/differs/collection_including.rb +18 -0
  98. data/lib/super_diff/rspec/differs/hash_including.rb +18 -0
  99. data/lib/super_diff/rspec/differs/object_having_attributes.rb +17 -0
  100. data/lib/super_diff/rspec/matcher_text_builders.rb +4 -0
  101. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +26 -7
  102. data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +61 -0
  103. data/lib/super_diff/rspec/matcher_text_builders/match.rb +1 -1
  104. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +13 -1
  105. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +1 -1
  106. data/lib/super_diff/rspec/matcher_text_template.rb +1 -1
  107. data/lib/super_diff/rspec/monkey_patches.rb +226 -115
  108. data/lib/super_diff/rspec/object_inspection.rb +0 -1
  109. data/lib/super_diff/rspec/object_inspection/inspectors.rb +22 -6
  110. data/lib/super_diff/rspec/object_inspection/inspectors/collection_containing_exactly.rb +17 -8
  111. data/lib/super_diff/rspec/object_inspection/inspectors/collection_including.rb +28 -0
  112. data/lib/super_diff/rspec/object_inspection/inspectors/hash_including.rb +31 -0
  113. data/lib/super_diff/rspec/object_inspection/inspectors/instance_of.rb +23 -0
  114. data/lib/super_diff/rspec/object_inspection/inspectors/kind_of.rb +23 -0
  115. data/lib/super_diff/rspec/object_inspection/inspectors/object_having_attributes.rb +31 -0
  116. data/lib/super_diff/rspec/object_inspection/inspectors/primitive.rb +13 -0
  117. data/lib/super_diff/rspec/object_inspection/inspectors/value_within.rb +29 -0
  118. data/lib/super_diff/rspec/operation_tree_builders.rb +22 -0
  119. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/collection_containing_exactly.rb +6 -6
  120. data/lib/super_diff/rspec/{operational_sequencers/partial_array.rb → operation_tree_builders/collection_including.rb} +4 -3
  121. data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +25 -0
  122. data/lib/super_diff/rspec/{operational_sequencers/partial_object.rb → operation_tree_builders/object_having_attributes.rb} +5 -11
  123. data/lib/super_diff/version.rb +1 -1
  124. data/spec/examples.txt +397 -328
  125. data/spec/integration/rails/active_record_spec.rb +1 -1
  126. data/spec/integration/rails/hash_with_indifferent_access_spec.rb +1 -1
  127. data/spec/integration/rspec/be_predicate_matcher_spec.rb +111 -59
  128. data/spec/integration/rspec/eq_matcher_spec.rb +139 -3
  129. data/spec/integration/rspec/have_attributes_matcher_spec.rb +354 -227
  130. data/spec/integration/rspec/have_predicate_matcher_spec.rb +484 -0
  131. data/spec/integration/rspec/include_matcher_spec.rb +2 -2
  132. data/spec/integration/rspec/match_array_matcher_spec.rb +372 -0
  133. data/spec/integration/rspec/match_matcher_spec.rb +8 -8
  134. data/spec/integration/rspec/raise_error_matcher_spec.rb +605 -226
  135. data/spec/integration/rspec/third_party_matcher_spec.rb +241 -0
  136. data/spec/integration/rspec/unhandled_errors_spec.rb +110 -58
  137. data/spec/spec_helper.rb +18 -7
  138. data/spec/support/command_runner.rb +3 -0
  139. data/spec/support/integration/helpers.rb +14 -90
  140. data/spec/support/integration/matchers.rb +143 -0
  141. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +14 -29
  142. data/spec/support/integration/test_programs/base.rb +120 -0
  143. data/spec/support/integration/test_programs/plain.rb +13 -0
  144. data/spec/support/integration/test_programs/rspec_active_record.rb +17 -0
  145. data/spec/support/integration/test_programs/rspec_rails.rb +17 -0
  146. data/spec/support/models/active_record/person.rb +4 -11
  147. data/spec/support/models/active_record/query.rb +15 -0
  148. data/spec/support/models/active_record/shipping_address.rb +10 -14
  149. data/spec/support/object_id.rb +27 -0
  150. data/spec/support/ruby_versions.rb +4 -0
  151. data/spec/support/shared_examples/active_record.rb +71 -0
  152. data/spec/support/shared_examples/hash_with_indifferent_access.rb +724 -208
  153. data/spec/tmp/integration_spec.rb +15 -0
  154. data/spec/unit/{equality_matcher_spec.rb → equality_matchers/main_spec.rb} +165 -9
  155. data/spec/unit/object_inspection_spec.rb +94 -18
  156. data/spec/unit/rspec/matchers/have_predicate_spec.rb +21 -0
  157. data/spec/unit/rspec/matchers/match_array_spec.rb +11 -0
  158. data/spec/unit/rspec/matchers/raise_error_spec.rb +16 -0
  159. data/super_diff.gemspec +3 -6
  160. metadata +99 -91
  161. data/lib/super_diff/active_record/object_inspection/map_extension.rb +0 -18
  162. data/lib/super_diff/active_record/operational_sequencers.rb +0 -14
  163. data/lib/super_diff/active_support/object_inspection/map_extension.rb +0 -15
  164. data/lib/super_diff/active_support/operational_sequencers.rb +0 -10
  165. data/lib/super_diff/diff_formatter.rb +0 -32
  166. data/lib/super_diff/differ.rb +0 -51
  167. data/lib/super_diff/equality_matcher.rb +0 -32
  168. data/lib/super_diff/no_differ_available_error.rb +0 -22
  169. data/lib/super_diff/no_operational_sequencer_available_error.rb +0 -20
  170. data/lib/super_diff/object_inspection/inspector.rb +0 -27
  171. data/lib/super_diff/object_inspection/map.rb +0 -28
  172. data/lib/super_diff/operation_sequences.rb +0 -9
  173. data/lib/super_diff/operation_sequences/base.rb +0 -11
  174. data/lib/super_diff/operational_sequencer.rb +0 -48
  175. data/lib/super_diff/operational_sequencers.rb +0 -16
  176. data/lib/super_diff/operational_sequencers/base.rb +0 -89
  177. data/lib/super_diff/operational_sequencers/hash.rb +0 -85
  178. data/lib/super_diff/rspec/configuration.rb +0 -31
  179. data/lib/super_diff/rspec/differs/partial_array.rb +0 -22
  180. data/lib/super_diff/rspec/differs/partial_hash.rb +0 -22
  181. data/lib/super_diff/rspec/differs/partial_object.rb +0 -22
  182. data/lib/super_diff/rspec/object_inspection/inspectors/partial_array.rb +0 -22
  183. data/lib/super_diff/rspec/object_inspection/inspectors/partial_hash.rb +0 -21
  184. data/lib/super_diff/rspec/object_inspection/inspectors/partial_object.rb +0 -21
  185. data/lib/super_diff/rspec/object_inspection/map_extension.rb +0 -23
  186. data/lib/super_diff/rspec/operational_sequencers.rb +0 -22
  187. data/lib/super_diff/rspec/operational_sequencers/partial_hash.rb +0 -32
@@ -2,15 +2,25 @@ module SuperDiff
2
2
  module ActiveRecord
3
3
  module ObjectInspection
4
4
  module Inspectors
5
- ActiveRecordRelation = SuperDiff::ObjectInspection::InspectionTree.new do
6
- add_text "#<ActiveRecord::Relation ["
7
-
8
- nested do |array|
9
- insert_array_inspection_of(array)
5
+ class ActiveRecordRelation < SuperDiff::ObjectInspection::Inspectors::Base
6
+ def self.applies_to?(value)
7
+ value.is_a?(::ActiveRecord::Relation)
10
8
  end
11
9
 
12
- add_break
13
- add_text "]>"
10
+ protected
11
+
12
+ def inspection_tree
13
+ SuperDiff::ObjectInspection::InspectionTree.new do
14
+ add_text "#<ActiveRecord::Relation ["
15
+
16
+ nested do |array|
17
+ insert_array_inspection_of(array)
18
+ end
19
+
20
+ add_break
21
+ add_text "]>"
22
+ end
23
+ end
14
24
  end
15
25
  end
16
26
  end
@@ -0,0 +1,14 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module OperationTreeBuilders
4
+ autoload(
5
+ :ActiveRecordModel,
6
+ "super_diff/active_record/operation_tree_builders/active_record_model",
7
+ )
8
+ autoload(
9
+ :ActiveRecordRelation,
10
+ "super_diff/active_record/operation_tree_builders/active_record_relation",
11
+ )
12
+ end
13
+ end
14
+ end
@@ -1,7 +1,7 @@
1
1
  module SuperDiff
2
2
  module ActiveRecord
3
- module OperationalSequencers
4
- class ActiveRecordModel < SuperDiff::OperationalSequencers::CustomObject
3
+ module OperationTreeBuilders
4
+ class ActiveRecordModel < SuperDiff::OperationTreeBuilders::CustomObject
5
5
  def self.applies_to?(expected, actual)
6
6
  expected.is_a?(::ActiveRecord::Base) &&
7
7
  actual.is_a?(::ActiveRecord::Base) &&
@@ -1,7 +1,7 @@
1
1
  module SuperDiff
2
2
  module ActiveRecord
3
- module OperationalSequencers
4
- class ActiveRecordRelation < SuperDiff::OperationalSequencers::Array
3
+ module OperationTreeBuilders
4
+ class ActiveRecordRelation < SuperDiff::OperationTreeBuilders::Array
5
5
  def self.applies_to?(expected, actual)
6
6
  expected.is_a?(::Array) &&
7
7
  actual.is_a?(::ActiveRecord::Relation)
@@ -15,8 +15,8 @@ module SuperDiff
15
15
 
16
16
  private
17
17
 
18
- def operations
19
- @_operations ||= OperationSequences::ActiveRecordRelation.new([])
18
+ def operation_tree
19
+ @_operation_tree ||= OperationTrees::ActiveRecordRelation.new([])
20
20
  end
21
21
  end
22
22
  end
@@ -1,9 +1,9 @@
1
1
  module SuperDiff
2
2
  module ActiveRecord
3
- module OperationSequences
3
+ module OperationTrees
4
4
  autoload(
5
5
  :ActiveRecordRelation,
6
- "super_diff/active_record/operation_sequences/active_record_relation",
6
+ "super_diff/active_record/operation_trees/active_record_relation",
7
7
  )
8
8
  end
9
9
  end
@@ -1,7 +1,7 @@
1
1
  module SuperDiff
2
2
  module ActiveRecord
3
- module OperationSequences
4
- class ActiveRecordRelation < SuperDiff::OperationSequences::Array
3
+ module OperationTrees
4
+ class ActiveRecordRelation < SuperDiff::OperationTrees::Array
5
5
  def to_diff(indent_level:, collection_prefix:, add_comma:)
6
6
  DiffFormatters::ActiveRecordRelation.call(
7
7
  self,
@@ -4,30 +4,27 @@ module SuperDiff
4
4
  autoload :Differs, "super_diff/active_support/differs"
5
5
  autoload :ObjectInspection, "super_diff/active_support/object_inspection"
6
6
  autoload(
7
- :OperationalSequencers,
8
- "super_diff/active_support/operational_sequencers",
7
+ :OperationTreeBuilders,
8
+ "super_diff/active_support/operation_tree_builders",
9
9
  )
10
10
  autoload(
11
11
  :OperationalSequences,
12
12
  "super_diff/active_support/operational_sequences",
13
13
  )
14
- end
15
- end
16
14
 
17
- if defined?(SuperDiff::RSpec)
18
- SuperDiff::RSpec.configure do |config|
19
- config.add_extra_differ_class(
20
- SuperDiff::ActiveSupport::Differs::HashWithIndifferentAccess,
21
- )
22
- config.add_extra_operational_sequencer_class(
23
- SuperDiff::ActiveSupport::OperationalSequencers::HashWithIndifferentAccess,
24
- )
25
- config.add_extra_diff_formatter_class(
26
- SuperDiff::ActiveSupport::DiffFormatters::HashWithIndifferentAccess,
27
- )
15
+ SuperDiff.configure do |config|
16
+ config.add_extra_differ_classes(
17
+ Differs::HashWithIndifferentAccess,
18
+ )
19
+ config.add_extra_operation_tree_builder_classes(
20
+ OperationTreeBuilders::HashWithIndifferentAccess,
21
+ )
22
+ config.add_extra_diff_formatter_classes(
23
+ DiffFormatters::HashWithIndifferentAccess,
24
+ )
25
+ config.add_extra_inspector_classes(
26
+ ObjectInspection::Inspectors::HashWithIndifferentAccess,
27
+ )
28
+ end
28
29
  end
29
30
  end
30
-
31
- SuperDiff::ObjectInspection.map.prepend(
32
- SuperDiff::ActiveSupport::ObjectInspection::MapExtension,
33
- )
@@ -2,8 +2,8 @@ module SuperDiff
2
2
  module ActiveSupport
3
3
  module DiffFormatters
4
4
  class HashWithIndifferentAccess < SuperDiff::DiffFormatters::Base
5
- def self.applies_to?(operations)
6
- operations.is_a?(OperationSequences::HashWithIndifferentAccess)
5
+ def self.applies_to?(operation_tree)
6
+ operation_tree.is_a?(OperationTrees::HashWithIndifferentAccess)
7
7
  end
8
8
 
9
9
  def call
@@ -25,7 +25,7 @@ module SuperDiff
25
25
  "#{key.inspect} => "
26
26
  end
27
27
  },
28
- operations: operations,
28
+ operation_tree: operation_tree,
29
29
  indent_level: indent_level,
30
30
  add_comma: add_comma?,
31
31
  )
@@ -15,19 +15,17 @@ module SuperDiff
15
15
 
16
16
  def call
17
17
  DiffFormatters::HashWithIndifferentAccess.call(
18
- operations,
18
+ operation_tree,
19
19
  indent_level: indent_level,
20
20
  )
21
21
  end
22
22
 
23
23
  private
24
24
 
25
- def operations
26
- OperationalSequencers::HashWithIndifferentAccess.call(
25
+ def operation_tree
26
+ OperationTreeBuilders::HashWithIndifferentAccess.call(
27
27
  expected: expected,
28
28
  actual: actual,
29
- extra_operational_sequencer_classes: extra_operational_sequencer_classes,
30
- extra_diff_formatter_classes: extra_diff_formatter_classes,
31
29
  )
32
30
  end
33
31
  end
@@ -2,15 +2,25 @@ module SuperDiff
2
2
  module ActiveSupport
3
3
  module ObjectInspection
4
4
  module Inspectors
5
- HashWithIndifferentAccess = SuperDiff::ObjectInspection::InspectionTree.new do
6
- add_text "#<HashWithIndifferentAccess {"
7
-
8
- nested do |hash|
9
- insert_hash_inspection_of(hash)
5
+ class HashWithIndifferentAccess < SuperDiff::ObjectInspection::Inspectors::Base
6
+ def self.applies_to?(value)
7
+ value.is_a?(::HashWithIndifferentAccess)
10
8
  end
11
9
 
12
- add_break " "
13
- add_text "}>"
10
+ protected
11
+
12
+ def inspection_tree
13
+ SuperDiff::ObjectInspection::InspectionTree.new do
14
+ add_text "#<HashWithIndifferentAccess {"
15
+
16
+ nested do |hash|
17
+ insert_hash_inspection_of(hash)
18
+ end
19
+
20
+ add_break " "
21
+ add_text "}>"
22
+ end
23
+ end
14
24
  end
15
25
  end
16
26
  end
@@ -0,0 +1,10 @@
1
+ module SuperDiff
2
+ module ActiveSupport
3
+ module OperationTreeBuilders
4
+ autoload(
5
+ :HashWithIndifferentAccess,
6
+ "super_diff/active_support/operation_tree_builders/hash_with_indifferent_access",
7
+ )
8
+ end
9
+ end
10
+ end
@@ -1,7 +1,7 @@
1
1
  module SuperDiff
2
2
  module ActiveSupport
3
- module OperationalSequencers
4
- class HashWithIndifferentAccess < SuperDiff::OperationalSequencers::Hash
3
+ module OperationTreeBuilders
4
+ class HashWithIndifferentAccess < SuperDiff::OperationTreeBuilders::Hash
5
5
  def initialize(expected:, actual:, **rest)
6
6
  super
7
7
 
@@ -1,9 +1,9 @@
1
1
  module SuperDiff
2
2
  module ActiveSupport
3
- module OperationSequences
3
+ module OperationTrees
4
4
  autoload(
5
5
  :HashWithIndifferentAccess,
6
- "super_diff/active_support/operation_sequences/hash_with_indifferent_access",
6
+ "super_diff/active_support/operation_trees/hash_with_indifferent_access",
7
7
  )
8
8
  end
9
9
  end
@@ -1,7 +1,7 @@
1
1
  module SuperDiff
2
2
  module ActiveSupport
3
- module OperationSequences
4
- class HashWithIndifferentAccess < SuperDiff::OperationSequences::Base
3
+ module OperationTrees
4
+ class HashWithIndifferentAccess < SuperDiff::OperationTrees::Base
5
5
  def to_diff(indent_level:, collection_prefix:, add_comma:)
6
6
  DiffFormatters::HashWithIndifferentAccess.call(
7
7
  self,
@@ -0,0 +1,60 @@
1
+ module SuperDiff
2
+ class Configuration
3
+ attr_reader(
4
+ :extra_differ_classes,
5
+ :extra_operation_tree_builder_classes,
6
+ :extra_operation_tree_classes,
7
+ :extra_diff_formatter_classes,
8
+ :extra_inspector_classes,
9
+ )
10
+
11
+ def initialize
12
+ @extra_differ_classes = [].freeze
13
+ @extra_operation_tree_builder_classes = [].freeze
14
+ @extra_operation_tree_classes = [].freeze
15
+ @extra_diff_formatter_classes = [].freeze
16
+ @extra_inspector_classes = [].freeze
17
+ end
18
+
19
+ def add_extra_differ_classes(*classes)
20
+ @extra_differ_classes = (@extra_differ_classes + classes).freeze
21
+ end
22
+ alias_method :add_extra_differ_class, :add_extra_differ_classes
23
+
24
+ def add_extra_operation_tree_builder_classes(*classes)
25
+ @extra_operation_tree_builder_classes =
26
+ (@extra_operation_tree_builder_classes + classes).freeze
27
+ end
28
+ alias_method(
29
+ :add_extra_operation_tree_builder_class,
30
+ :add_extra_operation_tree_builder_classes,
31
+ )
32
+
33
+ def add_extra_operation_tree_classes(*classes)
34
+ @extra_operation_tree_classes =
35
+ (@extra_operation_tree_classes + classes).freeze
36
+ end
37
+ alias_method(
38
+ :add_extra_operation_tree_class,
39
+ :add_extra_operation_tree_classes,
40
+ )
41
+
42
+ def add_extra_diff_formatter_classes(*classes)
43
+ @extra_diff_formatter_classes =
44
+ (@extra_diff_formatter_classes + classes).freeze
45
+ end
46
+ alias_method(
47
+ :add_extra_diff_formatter_class,
48
+ :add_extra_diff_formatter_classes,
49
+ )
50
+
51
+ def add_extra_inspector_classes(*classes)
52
+ @extra_inspector_classes =
53
+ (@extra_inspector_classes + classes).freeze
54
+ end
55
+ alias_method(
56
+ :add_extra_inspector_class,
57
+ :add_extra_inspector_classes,
58
+ )
59
+ end
60
+ end
@@ -36,6 +36,10 @@ module SuperDiff
36
36
  text.gsub(/\e\[\d+(?:;\d+)*m(.+?)\e\[0m/, '\1')
37
37
  end
38
38
 
39
+ def self.already_colorized?(text)
40
+ text.match?(/\e\[\d+m/)
41
+ end
42
+
39
43
  def self.inspect_colors_in(text)
40
44
  [FourBitColor, EightBitColor, TwentyFourBitColor].
41
45
  reduce(text) do |str, klass|
@@ -6,9 +6,9 @@ module SuperDiff
6
6
  autoload :CustomObject, "super_diff/diff_formatters/custom_object"
7
7
  autoload :DefaultObject, "super_diff/diff_formatters/default_object"
8
8
  autoload :Hash, "super_diff/diff_formatters/hash"
9
+ autoload :Main, "super_diff/diff_formatters/main"
9
10
  autoload :MultilineString, "super_diff/diff_formatters/multiline_string"
10
-
11
- # TODO: Why doesn't this include CustomObject and DefaultObject?
12
- DEFAULTS = [Array, Hash, MultilineString].freeze
13
11
  end
14
12
  end
13
+
14
+ require "super_diff/diff_formatters/defaults"
@@ -1,8 +1,8 @@
1
1
  module SuperDiff
2
2
  module DiffFormatters
3
3
  class Array < Base
4
- def self.applies_to?(operations)
5
- operations.is_a?(OperationSequences::Array)
4
+ def self.applies_to?(operation_tree)
5
+ operation_tree.is_a?(OperationTrees::Array)
6
6
  end
7
7
 
8
8
  def call
@@ -11,7 +11,7 @@ module SuperDiff
11
11
  close_token: "]",
12
12
  collection_prefix: collection_prefix,
13
13
  build_item_prefix: proc { "" },
14
- operations: operations,
14
+ operation_tree: operation_tree,
15
15
  indent_level: indent_level,
16
16
  add_comma: add_comma?,
17
17
  )
@@ -1,14 +1,15 @@
1
1
  module SuperDiff
2
2
  module DiffFormatters
3
3
  class Base
4
- def self.applies_to?(_operations)
4
+ def self.applies_to?(*)
5
5
  raise NotImplementedError
6
6
  end
7
7
 
8
+ include ImplementationChecks
8
9
  extend AttrExtras.mixin
9
10
 
10
11
  method_object(
11
- :operations,
12
+ :operation_tree,
12
13
  [
13
14
  :indent_level!,
14
15
  collection_prefix: "",
@@ -10,7 +10,7 @@ module SuperDiff
10
10
  [
11
11
  :open_token!,
12
12
  :close_token!,
13
- :operations!,
13
+ :operation_tree!,
14
14
  :indent_level!,
15
15
  :add_comma!,
16
16
  :collection_prefix!,
@@ -35,7 +35,7 @@ module SuperDiff
35
35
  end
36
36
 
37
37
  def contents
38
- operations.map do |operation|
38
+ operation_tree.map do |operation|
39
39
  if operation.name == :change
40
40
  handle_change_operation(operation)
41
41
  else
@@ -1,8 +1,8 @@
1
1
  module SuperDiff
2
2
  module DiffFormatters
3
3
  class CustomObject < DefaultObject
4
- def self.applies_to?(operations)
5
- operations.is_a?(OperationSequences::CustomObject)
4
+ def self.applies_to?(operation_tree)
5
+ operation_tree.is_a?(OperationTrees::CustomObject)
6
6
  end
7
7
 
8
8
  def call
@@ -20,7 +20,7 @@ module SuperDiff
20
20
 
21
21
  "#{key}: "
22
22
  },
23
- operations: operations,
23
+ operation_tree: operation_tree,
24
24
  indent_level: indent_level,
25
25
  add_comma: add_comma?,
26
26
  )
@@ -1,12 +1,12 @@
1
1
  module SuperDiff
2
2
  module DiffFormatters
3
3
  class DefaultObject < Base
4
- def self.applies_to?(operations)
5
- operations.is_a?(OperationSequences::DefaultObject)
4
+ def self.applies_to?(operation_tree)
5
+ operation_tree.is_a?(OperationTrees::DefaultObject)
6
6
  end
7
7
 
8
- def initialize(operations, value_class: nil, **rest)
9
- super(operations, **rest)
8
+ def initialize(operation_tree, value_class: nil, **rest)
9
+ super(operation_tree, **rest)
10
10
 
11
11
  @value_class = value_class
12
12
  end
@@ -26,7 +26,7 @@ module SuperDiff
26
26
 
27
27
  "@#{key}="
28
28
  },
29
- operations: operations,
29
+ operation_tree: operation_tree,
30
30
  indent_level: indent_level,
31
31
  add_comma: add_comma?,
32
32
  )
@@ -38,9 +38,7 @@ module SuperDiff
38
38
  if @value_class
39
39
  @value_class
40
40
  else
41
- raise NotImplementedError.new(
42
- "You must override #value_class in your subclass.",
43
- )
41
+ unimplemented_instance_method!
44
42
  end
45
43
  end
46
44
  end