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
@@ -0,0 +1,10 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module Differs
4
+ autoload(
5
+ :ActiveRecordRelation,
6
+ "super_diff/active_record/differs/active_record_relation",
7
+ )
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,30 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module Differs
4
+ class ActiveRecordRelation < SuperDiff::Differs::Base
5
+ def self.applies_to?(expected, actual)
6
+ expected.is_a?(::Array) &&
7
+ actual.is_a?(::ActiveRecord::Relation)
8
+ end
9
+
10
+ def call
11
+ DiffFormatters::ActiveRecordRelation.call(
12
+ operations,
13
+ indent_level: indent_level,
14
+ )
15
+ end
16
+
17
+ private
18
+
19
+ def operations
20
+ OperationalSequencers::ActiveRecordRelation.call(
21
+ expected: expected,
22
+ actual: actual,
23
+ extra_operational_sequencer_classes: extra_operational_sequencer_classes,
24
+ extra_diff_formatter_classes: extra_diff_formatter_classes,
25
+ )
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,14 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module ObjectInspection
4
+ autoload(
5
+ :Inspectors,
6
+ "super_diff/active_record/object_inspection/inspectors",
7
+ )
8
+ autoload(
9
+ :MapExtension,
10
+ "super_diff/active_record/object_inspection/map_extension",
11
+ )
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module ObjectInspection
4
+ module Inspectors
5
+ autoload(
6
+ :ActiveRecordModel,
7
+ "super_diff/active_record/object_inspection/inspectors/active_record_model",
8
+ )
9
+ autoload(
10
+ :ActiveRecordRelation,
11
+ "super_diff/active_record/object_inspection/inspectors/active_record_relation",
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,38 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module ObjectInspection
4
+ module Inspectors
5
+ ActiveRecordModel = SuperDiff::ObjectInspection::InspectionTree.new do
6
+ add_text do |object|
7
+ "#<#{object.class} "
8
+ end
9
+
10
+ when_multiline do
11
+ add_text "{"
12
+ end
13
+
14
+ nested do |object|
15
+ add_break
16
+
17
+ insert_separated_list(
18
+ ["id"] + (object.attributes.keys.sort - ["id"]),
19
+ separator: ",",
20
+ ) do |name|
21
+ add_text name
22
+ add_text ": "
23
+ add_inspection_of object.read_attribute(name)
24
+ end
25
+ end
26
+
27
+ add_break
28
+
29
+ when_multiline do
30
+ add_text "}"
31
+ end
32
+
33
+ add_text ">"
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,18 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module ObjectInspection
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)
10
+ end
11
+
12
+ add_break
13
+ add_text "]>"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module ObjectInspection
4
+ module MapExtension
5
+ def call(object)
6
+ case object
7
+ when ::ActiveRecord::Base
8
+ Inspectors::ActiveRecordModel
9
+ when ::ActiveRecord::Relation
10
+ Inspectors::ActiveRecordRelation
11
+ else
12
+ super
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,10 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module OperationSequences
4
+ autoload(
5
+ :ActiveRecordRelation,
6
+ "super_diff/active_record/operation_sequences/active_record_relation",
7
+ )
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module OperationSequences
4
+ class ActiveRecordRelation < SuperDiff::OperationSequences::Array
5
+ def to_diff(indent_level:, collection_prefix:, add_comma:)
6
+ DiffFormatters::ActiveRecordRelation.call(
7
+ self,
8
+ indent_level: indent_level,
9
+ collection_prefix: collection_prefix,
10
+ add_comma: add_comma,
11
+ )
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module OperationalSequencers
4
+ autoload(
5
+ :ActiveRecordModel,
6
+ "super_diff/active_record/operational_sequencers/active_record_model",
7
+ )
8
+ autoload(
9
+ :ActiveRecordRelation,
10
+ "super_diff/active_record/operational_sequencers/active_record_relation",
11
+ )
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module OperationalSequencers
4
+ class ActiveRecordModel < SuperDiff::OperationalSequencers::CustomObject
5
+ def self.applies_to?(expected, actual)
6
+ expected.is_a?(::ActiveRecord::Base) &&
7
+ actual.is_a?(::ActiveRecord::Base) &&
8
+ expected.class == actual.class
9
+ end
10
+
11
+ protected
12
+
13
+ def attribute_names
14
+ ["id"] + (expected.attributes.keys.sort - ["id"])
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ module SuperDiff
2
+ module ActiveRecord
3
+ module OperationalSequencers
4
+ class ActiveRecordRelation < SuperDiff::OperationalSequencers::Array
5
+ def self.applies_to?(expected, actual)
6
+ expected.is_a?(::Array) &&
7
+ actual.is_a?(::ActiveRecord::Relation)
8
+ end
9
+
10
+ def initialize(actual:, **rest)
11
+ super
12
+
13
+ @actual = actual.to_a
14
+ end
15
+
16
+ private
17
+
18
+ def operations
19
+ @_operations ||= OperationSequences::ActiveRecordRelation.new([])
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
1
+ module SuperDiff
2
+ module ActiveSupport
3
+ autoload :DiffFormatters, "super_diff/active_support/diff_formatters"
4
+ autoload :Differs, "super_diff/active_support/differs"
5
+ autoload :ObjectInspection, "super_diff/active_support/object_inspection"
6
+ autoload(
7
+ :OperationalSequencers,
8
+ "super_diff/active_support/operational_sequencers",
9
+ )
10
+ autoload(
11
+ :OperationalSequences,
12
+ "super_diff/active_support/operational_sequences",
13
+ )
14
+ end
15
+ end
16
+
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
+ )
28
+ end
29
+ end
30
+
31
+ SuperDiff::ObjectInspection.map.prepend(
32
+ SuperDiff::ActiveSupport::ObjectInspection::MapExtension,
33
+ )
@@ -0,0 +1,10 @@
1
+ module SuperDiff
2
+ module ActiveSupport
3
+ module DiffFormatters
4
+ autoload(
5
+ :HashWithIndifferentAccess,
6
+ "super_diff/active_support/diff_formatters/hash_with_indifferent_access",
7
+ )
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,36 @@
1
+ module SuperDiff
2
+ module ActiveSupport
3
+ module DiffFormatters
4
+ class HashWithIndifferentAccess < SuperDiff::DiffFormatters::Base
5
+ def self.applies_to?(operations)
6
+ operations.is_a?(OperationSequences::HashWithIndifferentAccess)
7
+ end
8
+
9
+ def call
10
+ SuperDiff::DiffFormatters::Collection.call(
11
+ open_token: "#<HashWithIndifferentAccess {",
12
+ close_token: "}>",
13
+ collection_prefix: collection_prefix,
14
+ build_item_prefix: -> (operation) {
15
+ key =
16
+ if operation.respond_to?(:left_key)
17
+ operation.left_key
18
+ else
19
+ operation.key
20
+ end
21
+
22
+ if key.is_a?(Symbol)
23
+ "#{key}: "
24
+ else
25
+ "#{key.inspect} => "
26
+ end
27
+ },
28
+ operations: operations,
29
+ indent_level: indent_level,
30
+ add_comma: add_comma?,
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,10 @@
1
+ module SuperDiff
2
+ module ActiveSupport
3
+ module Differs
4
+ autoload(
5
+ :HashWithIndifferentAccess,
6
+ "super_diff/active_support/differs/hash_with_indifferent_access",
7
+ )
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,36 @@
1
+ module SuperDiff
2
+ module ActiveSupport
3
+ module Differs
4
+ class HashWithIndifferentAccess < SuperDiff::Differs::Hash
5
+ def self.applies_to?(expected, actual)
6
+ (
7
+ expected.is_a?(::HashWithIndifferentAccess) &&
8
+ actual.is_a?(::Hash)
9
+ ) ||
10
+ (
11
+ expected.is_a?(::Hash) &&
12
+ actual.is_a?(::HashWithIndifferentAccess)
13
+ )
14
+ end
15
+
16
+ def call
17
+ DiffFormatters::HashWithIndifferentAccess.call(
18
+ operations,
19
+ indent_level: indent_level,
20
+ )
21
+ end
22
+
23
+ private
24
+
25
+ def operations
26
+ OperationalSequencers::HashWithIndifferentAccess.call(
27
+ expected: expected,
28
+ actual: actual,
29
+ extra_operational_sequencer_classes: extra_operational_sequencer_classes,
30
+ extra_diff_formatter_classes: extra_diff_formatter_classes,
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,14 @@
1
+ module SuperDiff
2
+ module ActiveSupport
3
+ module ObjectInspection
4
+ autoload(
5
+ :Inspectors,
6
+ "super_diff/active_support/object_inspection/inspectors",
7
+ )
8
+ autoload(
9
+ :MapExtension,
10
+ "super_diff/active_support/object_inspection/map_extension",
11
+ )
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,12 @@
1
+ module SuperDiff
2
+ module ActiveSupport
3
+ module ObjectInspection
4
+ module Inspectors
5
+ autoload(
6
+ :HashWithIndifferentAccess,
7
+ "super_diff/active_support/object_inspection/inspectors/hash_with_indifferent_access",
8
+ )
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ module SuperDiff
2
+ module ActiveSupport
3
+ module ObjectInspection
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)
10
+ end
11
+
12
+ add_break " "
13
+ add_text "}>"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ module SuperDiff
2
+ module ActiveSupport
3
+ module ObjectInspection
4
+ module MapExtension
5
+ def call(object)
6
+ if object.is_a?(::HashWithIndifferentAccess)
7
+ Inspectors::HashWithIndifferentAccess
8
+ else
9
+ super
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end