super_diff 0.4.1 → 0.5.3

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 (158) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +23 -10
  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 +9 -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/recursion_guard.rb +2 -0
  91. data/lib/super_diff/rspec.rb +45 -13
  92. data/lib/super_diff/rspec/augmented_matcher.rb +1 -1
  93. data/lib/super_diff/rspec/differ.rb +2 -17
  94. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +2 -7
  95. data/lib/super_diff/rspec/differs/collection_including.rb +2 -7
  96. data/lib/super_diff/rspec/differs/hash_including.rb +2 -7
  97. data/lib/super_diff/rspec/differs/object_having_attributes.rb +2 -7
  98. data/lib/super_diff/rspec/matcher_text_builders/match.rb +1 -1
  99. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +1 -1
  100. data/lib/super_diff/rspec/matcher_text_template.rb +1 -1
  101. data/lib/super_diff/rspec/monkey_patches.rb +4 -2
  102. data/lib/super_diff/rspec/object_inspection.rb +0 -1
  103. data/lib/super_diff/rspec/object_inspection/inspectors.rb +16 -0
  104. data/lib/super_diff/rspec/object_inspection/inspectors/collection_containing_exactly.rb +17 -8
  105. data/lib/super_diff/rspec/object_inspection/inspectors/collection_including.rb +15 -9
  106. data/lib/super_diff/rspec/object_inspection/inspectors/hash_including.rb +20 -10
  107. data/lib/super_diff/rspec/object_inspection/inspectors/instance_of.rb +23 -0
  108. data/lib/super_diff/rspec/object_inspection/inspectors/kind_of.rb +23 -0
  109. data/lib/super_diff/rspec/object_inspection/inspectors/object_having_attributes.rb +20 -11
  110. data/lib/super_diff/rspec/object_inspection/inspectors/primitive.rb +13 -0
  111. data/lib/super_diff/rspec/object_inspection/inspectors/value_within.rb +29 -0
  112. data/lib/super_diff/rspec/operation_tree_builders.rb +22 -0
  113. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/collection_containing_exactly.rb +5 -5
  114. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/collection_including.rb +2 -2
  115. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/hash_including.rb +3 -11
  116. data/lib/super_diff/rspec/{operational_sequencers → operation_tree_builders}/object_having_attributes.rb +4 -8
  117. data/lib/super_diff/version.rb +1 -1
  118. data/spec/integration/rspec/have_attributes_matcher_spec.rb +354 -227
  119. data/spec/integration/rspec/include_matcher_spec.rb +2 -2
  120. data/spec/integration/rspec/match_array_matcher_spec.rb +42 -0
  121. data/spec/integration/rspec/unhandled_errors_spec.rb +68 -12
  122. data/spec/support/command_runner.rb +3 -0
  123. data/spec/support/integration/helpers.rb +12 -96
  124. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +14 -29
  125. data/spec/support/integration/test_programs/base.rb +120 -0
  126. data/spec/support/integration/test_programs/plain.rb +13 -0
  127. data/spec/support/integration/test_programs/rspec_active_record.rb +17 -0
  128. data/spec/support/integration/test_programs/rspec_rails.rb +17 -0
  129. data/spec/support/models/active_record/person.rb +4 -11
  130. data/spec/support/models/active_record/shipping_address.rb +10 -14
  131. data/spec/support/object_id.rb +6 -5
  132. data/spec/unit/{equality_matcher_spec.rb → equality_matchers/main_spec.rb} +157 -1
  133. data/spec/unit/object_inspection_spec.rb +77 -1
  134. data/spec/unit/rspec/matchers/raise_error_spec.rb +16 -0
  135. data/super_diff.gemspec +2 -1
  136. metadata +74 -53
  137. data/lib/super_diff/active_record/object_inspection/map_extension.rb +0 -18
  138. data/lib/super_diff/active_record/operational_sequencers.rb +0 -14
  139. data/lib/super_diff/active_support/object_inspection/map_extension.rb +0 -15
  140. data/lib/super_diff/active_support/operational_sequencers.rb +0 -10
  141. data/lib/super_diff/diff_formatter.rb +0 -32
  142. data/lib/super_diff/differ.rb +0 -51
  143. data/lib/super_diff/differs/time.rb +0 -24
  144. data/lib/super_diff/equality_matcher.rb +0 -32
  145. data/lib/super_diff/no_differ_available_error.rb +0 -22
  146. data/lib/super_diff/no_operational_sequencer_available_error.rb +0 -20
  147. data/lib/super_diff/object_inspection/inspector.rb +0 -27
  148. data/lib/super_diff/object_inspection/inspectors/time.rb +0 -13
  149. data/lib/super_diff/object_inspection/map.rb +0 -30
  150. data/lib/super_diff/operation_sequences.rb +0 -9
  151. data/lib/super_diff/operational_sequencer.rb +0 -48
  152. data/lib/super_diff/operational_sequencers.rb +0 -17
  153. data/lib/super_diff/operational_sequencers/base.rb +0 -89
  154. data/lib/super_diff/operational_sequencers/hash.rb +0 -85
  155. data/lib/super_diff/operational_sequencers/time_like.rb +0 -30
  156. data/lib/super_diff/rspec/configuration.rb +0 -31
  157. data/lib/super_diff/rspec/object_inspection/map_extension.rb +0 -23
  158. data/lib/super_diff/rspec/operational_sequencers.rb +0 -22
@@ -1,24 +1,15 @@
1
1
  module SuperDiff
2
2
  module ObjectInspection
3
3
  autoload :InspectionTree, "super_diff/object_inspection/inspection_tree"
4
- autoload :Inspector, "super_diff/object_inspection/inspector"
5
4
  autoload :Inspectors, "super_diff/object_inspection/inspectors"
6
- autoload :Map, "super_diff/object_inspection/map"
7
5
  autoload :Nodes, "super_diff/object_inspection/nodes"
8
6
 
9
- class << self
10
- attr_accessor :map
11
- end
12
-
13
7
  def self.inspect(object, as_single_line:, indent_level: 0)
14
- Inspector.call(
15
- map,
8
+ Inspectors::Main.call(
16
9
  object,
17
10
  as_single_line: as_single_line,
18
11
  indent_level: indent_level,
19
12
  )
20
13
  end
21
-
22
- self.map = Map.new
23
14
  end
24
15
  end
@@ -107,8 +107,12 @@ module SuperDiff
107
107
  end
108
108
  end
109
109
 
110
- def add_inspection_of(value)
111
- add_node :inspection, value
110
+ def add_inspection_of(value = nil, &block)
111
+ if block
112
+ add_node :inspection, &block
113
+ else
114
+ add_node :inspection, value
115
+ end
112
116
  end
113
117
 
114
118
  def apply_tree(tree)
@@ -1,6 +1,7 @@
1
1
  module SuperDiff
2
2
  module ObjectInspection
3
3
  module Inspectors
4
+ autoload :Base, "super_diff/object_inspection/inspectors/base"
4
5
  autoload :Array, "super_diff/object_inspection/inspectors/array"
5
6
  autoload(
6
7
  :CustomObject,
@@ -11,9 +12,12 @@ module SuperDiff
11
12
  "super_diff/object_inspection/inspectors/default_object",
12
13
  )
13
14
  autoload :Hash, "super_diff/object_inspection/inspectors/hash"
15
+ autoload :Main, "super_diff/object_inspection/inspectors/main"
14
16
  autoload :Primitive, "super_diff/object_inspection/inspectors/primitive"
15
17
  autoload :String, "super_diff/object_inspection/inspectors/string"
16
- autoload :Time, "super_diff/object_inspection/inspectors/time"
18
+ autoload :TimeLike, "super_diff/object_inspection/inspectors/time_like"
17
19
  end
18
20
  end
19
21
  end
22
+
23
+ require "super_diff/object_inspection/inspectors/defaults"
@@ -1,20 +1,30 @@
1
1
  module SuperDiff
2
2
  module ObjectInspection
3
3
  module Inspectors
4
- Array = InspectionTree.new do
5
- when_empty do
6
- add_text "[]"
4
+ class Array < Base
5
+ def self.applies_to?(value)
6
+ value.is_a?(::Array)
7
7
  end
8
8
 
9
- when_non_empty do
10
- add_text "["
9
+ protected
11
10
 
12
- nested do |array|
13
- insert_array_inspection_of(array)
14
- end
11
+ def inspection_tree
12
+ InspectionTree.new do
13
+ when_empty do
14
+ add_text "[]"
15
+ end
16
+
17
+ when_non_empty do
18
+ add_text "["
15
19
 
16
- add_break
17
- add_text "]"
20
+ nested do |array|
21
+ insert_array_inspection_of(array)
22
+ end
23
+
24
+ add_break
25
+ add_text "]"
26
+ end
27
+ end
18
28
  end
19
29
  end
20
30
  end
@@ -0,0 +1,36 @@
1
+ module SuperDiff
2
+ module ObjectInspection
3
+ module Inspectors
4
+ class Base
5
+ extend AttrExtras.mixin
6
+ extend ImplementationChecks
7
+
8
+ def self.applies_to?(_value)
9
+ unimplemented_class_method!
10
+ end
11
+
12
+ method_object :object, [:as_single_line!, :indent_level]
13
+
14
+ def call
15
+ SuperDiff::RecursionGuard.substituting_recursion_of(object) do
16
+ inspection_tree.evaluate(
17
+ object,
18
+ as_single_line: as_single_line,
19
+ indent_level: indent_level,
20
+ )
21
+ end
22
+ end
23
+
24
+ protected
25
+
26
+ def inspection_tree
27
+ unimplemented_instance_method!
28
+ end
29
+
30
+ private
31
+
32
+ attr_query :as_single_line?
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,26 +1,36 @@
1
1
  module SuperDiff
2
2
  module ObjectInspection
3
3
  module Inspectors
4
- CustomObject = InspectionTree.new do
5
- add_text do |object|
6
- "#<#{object.class}"
4
+ class CustomObject < Base
5
+ def self.applies_to?(value)
6
+ value.respond_to?(:attributes_for_super_diff)
7
7
  end
8
8
 
9
- when_multiline do
10
- add_text " {"
11
- end
9
+ protected
12
10
 
13
- nested do |object|
14
- insert_hash_inspection_of(object.attributes_for_super_diff)
15
- end
11
+ def inspection_tree
12
+ InspectionTree.new do
13
+ add_text do |object|
14
+ "#<#{object.class}"
15
+ end
16
16
 
17
- add_break
17
+ when_multiline do
18
+ add_text " {"
19
+ end
18
20
 
19
- when_multiline do
20
- add_text "}"
21
- end
21
+ nested do |object|
22
+ insert_hash_inspection_of(object.attributes_for_super_diff)
23
+ end
22
24
 
23
- add_text ">"
25
+ add_break
26
+
27
+ when_multiline do
28
+ add_text "}"
29
+ end
30
+
31
+ add_text ">"
32
+ end
33
+ end
24
34
  end
25
35
  end
26
36
  end
@@ -1,45 +1,59 @@
1
1
  module SuperDiff
2
2
  module ObjectInspection
3
3
  module Inspectors
4
- DefaultObject = InspectionTree.new do
5
- when_empty do
6
- add_text do |object|
7
- object.inspect
8
- end
4
+ class DefaultObject < Base
5
+ def self.applies_to?(_value)
6
+ true
9
7
  end
10
8
 
11
- when_non_empty do
12
- when_singleline do
13
- add_text do |object|
14
- object.inspect
15
- end
16
- end
9
+ protected
17
10
 
18
- when_multiline do
19
- add_text do |object|
20
- "#<%<class>s:0x%<id>x {" % {
21
- class: object.class,
22
- id: object.object_id * 2,
23
- }
11
+ def inspection_tree
12
+ # rubocop:disable Metrics/BlockLength
13
+ InspectionTree.new do
14
+ when_empty do
15
+ # rubocop:disable Style/SymbolProc
16
+ add_text do |object|
17
+ object.inspect
18
+ end
19
+ # rubocop:enable Style/SymbolProc
24
20
  end
25
21
 
26
- nested do |object|
27
- add_break " "
28
-
29
- insert_separated_list(
30
- object.instance_variables.sort,
31
- separator: ","
32
- ) do |name|
33
- add_text name.to_s
34
- add_text "="
35
- add_inspection_of object.instance_variable_get(name)
22
+ when_non_empty do
23
+ when_singleline do
24
+ add_text do |object|
25
+ object.inspect
26
+ end
36
27
  end
37
- end
38
28
 
39
- add_break
29
+ when_multiline do
30
+ add_text do |object|
31
+ "#<%<class>s:0x%<id>x {" % {
32
+ class: object.class,
33
+ id: object.object_id * 2,
34
+ }
35
+ end
40
36
 
41
- add_text "}>"
37
+ nested do |object|
38
+ add_break " "
39
+
40
+ insert_separated_list(
41
+ object.instance_variables.sort,
42
+ separator: ","
43
+ ) do |name|
44
+ add_text name.to_s
45
+ add_text "="
46
+ add_inspection_of object.instance_variable_get(name)
47
+ end
48
+ end
49
+
50
+ add_break
51
+
52
+ add_text "}>"
53
+ end
54
+ end
42
55
  end
56
+ # rubocop:enable Metrics/BlockLength
43
57
  end
44
58
  end
45
59
  end
@@ -0,0 +1,15 @@
1
+ module SuperDiff
2
+ module ObjectInspection
3
+ module Inspectors
4
+ DEFAULTS = [
5
+ CustomObject,
6
+ Array,
7
+ Hash,
8
+ Primitive,
9
+ String,
10
+ TimeLike,
11
+ DefaultObject,
12
+ ].freeze
13
+ end
14
+ end
15
+ end
@@ -1,20 +1,30 @@
1
1
  module SuperDiff
2
2
  module ObjectInspection
3
3
  module Inspectors
4
- Hash = InspectionTree.new do
5
- when_empty do
6
- add_text "{}"
4
+ class Hash < Base
5
+ def self.applies_to?(value)
6
+ value.is_a?(::Hash)
7
7
  end
8
8
 
9
- when_non_empty do
10
- add_text "{"
9
+ protected
11
10
 
12
- nested do |hash|
13
- insert_hash_inspection_of(hash)
14
- end
11
+ def inspection_tree
12
+ InspectionTree.new do
13
+ when_empty do
14
+ add_text "{}"
15
+ end
16
+
17
+ when_non_empty do
18
+ add_text "{"
15
19
 
16
- add_break " "
17
- add_text "}"
20
+ nested do |hash|
21
+ insert_hash_inspection_of(hash)
22
+ end
23
+
24
+ add_break " "
25
+ add_text "}"
26
+ end
27
+ end
18
28
  end
19
29
  end
20
30
  end
@@ -0,0 +1,35 @@
1
+ module SuperDiff
2
+ module ObjectInspection
3
+ module Inspectors
4
+ class Main
5
+ extend AttrExtras.mixin
6
+
7
+ method_object :object, [:as_single_line!, :indent_level!]
8
+
9
+ def call
10
+ if resolved_class
11
+ resolved_class.call(
12
+ object,
13
+ as_single_line: as_single_line?,
14
+ indent_level: indent_level,
15
+ )
16
+ else
17
+ raise NoInspectorAvailableError.create(object)
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ attr_query :as_single_line?
24
+
25
+ def resolved_class
26
+ available_classes.find { |klass| klass.applies_to?(object) }
27
+ end
28
+
29
+ def available_classes
30
+ SuperDiff.configuration.extra_inspector_classes + DEFAULTS
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,12 +1,27 @@
1
1
  module SuperDiff
2
2
  module ObjectInspection
3
3
  module Inspectors
4
- Primitive = InspectionTree.new do
5
- # rubocop:disable Style/SymbolProc
6
- add_text do |object|
7
- object.inspect
4
+ class Primitive < Base
5
+ def self.applies_to?(value)
6
+ case value
7
+ when true, false, nil, Symbol, Numeric, Regexp, Class
8
+ true
9
+ else
10
+ false
11
+ end
12
+ end
13
+
14
+ protected
15
+
16
+ def inspection_tree
17
+ InspectionTree.new do
18
+ # rubocop:disable Style/SymbolProc
19
+ add_text do |object|
20
+ object.inspect
21
+ end
22
+ # rubocop:enable Style/SymbolProc
23
+ end
8
24
  end
9
- # rubocop:enable Style/SymbolProc
10
25
  end
11
26
  end
12
27
  end
@@ -1,12 +1,22 @@
1
1
  module SuperDiff
2
2
  module ObjectInspection
3
3
  module Inspectors
4
- String = InspectionTree.new do
5
- # rubocop:disable Style/SymbolProc
6
- add_text do |string|
7
- string.inspect
4
+ class String < Base
5
+ def self.applies_to?(value)
6
+ value.is_a?(::String)
7
+ end
8
+
9
+ protected
10
+
11
+ def inspection_tree
12
+ InspectionTree.new do
13
+ # rubocop:disable Style/SymbolProc
14
+ add_text do |string|
15
+ string.inspect
16
+ end
17
+ # rubocop:enable Style/SymbolProc
18
+ end
8
19
  end
9
- # rubocop:enable Style/SymbolProc
10
20
  end
11
21
  end
12
22
  end
@@ -0,0 +1,23 @@
1
+ module SuperDiff
2
+ module ObjectInspection
3
+ module Inspectors
4
+ class TimeLike < Base
5
+ def self.applies_to?(value)
6
+ SuperDiff.time_like?(value)
7
+ end
8
+
9
+ TIME_FORMAT = "%Y-%m-%d %H:%M:%S.%3N %Z %:z".freeze
10
+
11
+ protected
12
+
13
+ def inspection_tree
14
+ InspectionTree.new do
15
+ add_text do |time|
16
+ "#{time.strftime(TIME_FORMAT)} (#{time.class})"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end