super_diff 0.5.3 → 0.8.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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +46 -20
  3. data/lib/super_diff.rb +46 -7
  4. data/lib/super_diff/active_record.rb +7 -7
  5. data/lib/super_diff/active_record/differs/active_record_relation.rb +3 -13
  6. data/lib/super_diff/active_record/object_inspection.rb +2 -6
  7. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders.rb +16 -0
  8. data/lib/super_diff/active_record/object_inspection/{inspectors → inspection_tree_builders}/active_record_model.rb +19 -20
  9. data/lib/super_diff/active_record/object_inspection/{inspectors → inspection_tree_builders}/active_record_relation.rb +9 -8
  10. data/lib/super_diff/active_record/operation_tree_flatteners.rb +10 -0
  11. data/lib/super_diff/active_record/operation_tree_flatteners/active_record_relation.rb +17 -0
  12. data/lib/super_diff/active_record/operation_trees/active_record_relation.rb +8 -7
  13. data/lib/super_diff/active_support.rb +8 -8
  14. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +3 -13
  15. data/lib/super_diff/active_support/object_inspection.rb +2 -6
  16. data/lib/super_diff/active_support/object_inspection/{inspectors.rb → inspection_tree_builders.rb} +2 -2
  17. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/hash_with_indifferent_access.rb +37 -0
  18. data/lib/super_diff/active_support/operation_tree_builders/hash_with_indifferent_access.rb +17 -0
  19. data/lib/super_diff/active_support/operation_tree_flatteners.rb +10 -0
  20. data/lib/super_diff/active_support/operation_tree_flatteners/hash_with_indifferent_access.rb +17 -0
  21. data/lib/super_diff/active_support/operation_trees/hash_with_indifferent_access.rb +4 -7
  22. data/lib/super_diff/colorized_document_extensions.rb +9 -6
  23. data/lib/super_diff/configuration.rb +102 -19
  24. data/lib/super_diff/csi.rb +1 -1
  25. data/lib/super_diff/csi/four_bit_color.rb +0 -2
  26. data/lib/super_diff/diff_formatters/collection.rb +2 -2
  27. data/lib/super_diff/diff_formatters/multiline_string.rb +4 -4
  28. data/lib/super_diff/differs/array.rb +1 -1
  29. data/lib/super_diff/differs/base.rb +3 -21
  30. data/lib/super_diff/differs/custom_object.rb +1 -1
  31. data/lib/super_diff/differs/default_object.rb +1 -1
  32. data/lib/super_diff/differs/hash.rb +1 -1
  33. data/lib/super_diff/differs/main.rb +1 -7
  34. data/lib/super_diff/differs/multiline_string.rb +1 -1
  35. data/lib/super_diff/differs/time_like.rb +1 -1
  36. data/lib/super_diff/equality_matchers/array.rb +4 -4
  37. data/lib/super_diff/equality_matchers/default.rb +4 -4
  38. data/lib/super_diff/equality_matchers/hash.rb +4 -4
  39. data/lib/super_diff/equality_matchers/multiline_string.rb +4 -4
  40. data/lib/super_diff/equality_matchers/primitive.rb +6 -9
  41. data/lib/super_diff/equality_matchers/singleline_string.rb +4 -4
  42. data/lib/super_diff/gem_version.rb +45 -0
  43. data/lib/super_diff/helpers.rb +52 -2
  44. data/lib/super_diff/line.rb +83 -0
  45. data/lib/super_diff/object_inspection.rb +12 -9
  46. data/lib/super_diff/object_inspection/inspection_tree.rb +183 -81
  47. data/lib/super_diff/object_inspection/inspection_tree_builders.rb +44 -0
  48. data/lib/super_diff/object_inspection/inspection_tree_builders/array.rb +38 -0
  49. data/lib/super_diff/object_inspection/inspection_tree_builders/base.rb +27 -0
  50. data/lib/super_diff/object_inspection/inspection_tree_builders/custom_object.rb +37 -0
  51. data/lib/super_diff/object_inspection/inspection_tree_builders/default_object.rb +63 -0
  52. data/lib/super_diff/object_inspection/{inspectors → inspection_tree_builders}/defaults.rb +1 -2
  53. data/lib/super_diff/object_inspection/inspection_tree_builders/hash.rb +46 -0
  54. data/lib/super_diff/object_inspection/{inspectors → inspection_tree_builders}/main.rb +5 -10
  55. data/lib/super_diff/object_inspection/inspection_tree_builders/primitive.rb +21 -0
  56. data/lib/super_diff/object_inspection/inspection_tree_builders/time_like.rb +64 -0
  57. data/lib/super_diff/object_inspection/nodes.rb +33 -32
  58. data/lib/super_diff/object_inspection/nodes/as_lines_when_rendering_to_lines.rb +97 -0
  59. data/lib/super_diff/object_inspection/nodes/as_prefix_when_rendering_to_lines.rb +27 -0
  60. data/lib/super_diff/object_inspection/nodes/as_prelude_when_rendering_to_lines.rb +27 -0
  61. data/lib/super_diff/object_inspection/nodes/as_single_line.rb +33 -0
  62. data/lib/super_diff/object_inspection/nodes/base.rb +55 -20
  63. data/lib/super_diff/object_inspection/nodes/inspection.rb +47 -7
  64. data/lib/super_diff/object_inspection/nodes/nesting.rb +16 -5
  65. data/lib/super_diff/object_inspection/nodes/only_when.rb +54 -0
  66. data/lib/super_diff/object_inspection/nodes/text.rb +16 -2
  67. data/lib/super_diff/object_inspection/nodes/when_empty.rb +21 -6
  68. data/lib/super_diff/object_inspection/nodes/when_non_empty.rb +20 -5
  69. data/lib/super_diff/object_inspection/nodes/when_rendering_to_lines.rb +27 -0
  70. data/lib/super_diff/object_inspection/nodes/when_rendering_to_string.rb +27 -0
  71. data/lib/super_diff/object_inspection/prefix_for_next_node.rb +6 -0
  72. data/lib/super_diff/object_inspection/prelude_for_next_node.rb +6 -0
  73. data/lib/super_diff/operation_tree_builders/array.rb +7 -10
  74. data/lib/super_diff/operation_tree_builders/base.rb +6 -6
  75. data/lib/super_diff/operation_tree_builders/custom_object.rb +5 -2
  76. data/lib/super_diff/operation_tree_builders/default_object.rb +1 -1
  77. data/lib/super_diff/operation_tree_builders/defaults.rb +1 -1
  78. data/lib/super_diff/operation_tree_builders/hash.rb +1 -8
  79. data/lib/super_diff/operation_tree_builders/multiline_string.rb +2 -6
  80. data/lib/super_diff/operation_tree_builders/time_like.rb +2 -2
  81. data/lib/super_diff/operation_tree_flatteners.rb +20 -0
  82. data/lib/super_diff/operation_tree_flatteners/array.rb +15 -0
  83. data/lib/super_diff/operation_tree_flatteners/base.rb +54 -0
  84. data/lib/super_diff/operation_tree_flatteners/collection.rb +139 -0
  85. data/lib/super_diff/operation_tree_flatteners/custom_object.rb +28 -0
  86. data/lib/super_diff/operation_tree_flatteners/default_object.rb +32 -0
  87. data/lib/super_diff/operation_tree_flatteners/hash.rb +41 -0
  88. data/lib/super_diff/operation_tree_flatteners/multiline_string.rb +17 -0
  89. data/lib/super_diff/operation_trees/array.rb +4 -7
  90. data/lib/super_diff/operation_trees/base.rb +39 -16
  91. data/lib/super_diff/operation_trees/custom_object.rb +4 -8
  92. data/lib/super_diff/operation_trees/default_object.rb +28 -13
  93. data/lib/super_diff/operation_trees/hash.rb +4 -7
  94. data/lib/super_diff/operation_trees/main.rb +1 -1
  95. data/lib/super_diff/operation_trees/multiline_string.rb +4 -7
  96. data/lib/super_diff/operations/binary_operation.rb +1 -6
  97. data/lib/super_diff/operations/unary_operation.rb +2 -30
  98. data/lib/super_diff/recursion_guard.rb +3 -3
  99. data/lib/super_diff/rspec.rb +41 -13
  100. data/lib/super_diff/rspec/differs/collection_including.rb +4 -2
  101. data/lib/super_diff/rspec/differs/hash_including.rb +4 -2
  102. data/lib/super_diff/rspec/matcher_text_builders/base.rb +7 -7
  103. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +6 -6
  104. data/lib/super_diff/rspec/matcher_text_builders/contain_exactly.rb +1 -1
  105. data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +4 -4
  106. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +1 -1
  107. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +5 -5
  108. data/lib/super_diff/rspec/monkey_patches.rb +353 -306
  109. data/lib/super_diff/rspec/object_inspection.rb +4 -1
  110. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders.rb +44 -0
  111. data/lib/super_diff/rspec/object_inspection/{inspectors → inspection_tree_builders}/collection_containing_exactly.rb +9 -8
  112. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_including.rb +34 -0
  113. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/double.rb +103 -0
  114. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/hash_including.rb +36 -0
  115. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/instance_of.rb +26 -0
  116. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/kind_of.rb +26 -0
  117. data/lib/super_diff/rspec/object_inspection/{inspectors → inspection_tree_builders}/object_having_attributes.rb +10 -12
  118. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/primitive.rb +10 -0
  119. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/value_within.rb +33 -0
  120. data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +12 -4
  121. data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +10 -3
  122. data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +10 -3
  123. data/lib/super_diff/tiered_lines.rb +4 -0
  124. data/lib/super_diff/tiered_lines_elider.rb +490 -0
  125. data/lib/super_diff/tiered_lines_formatter.rb +79 -0
  126. data/lib/super_diff/version.rb +1 -1
  127. data/spec/examples.txt +407 -5
  128. data/spec/integration/rails/active_support_spec.rb +19 -0
  129. data/spec/integration/rspec/be_falsey_matcher_spec.rb +10 -10
  130. data/spec/integration/rspec/be_matcher_spec.rb +100 -100
  131. data/spec/integration/rspec/be_nil_matcher_spec.rb +10 -10
  132. data/spec/integration/rspec/be_predicate_matcher_spec.rb +103 -103
  133. data/spec/integration/rspec/be_truthy_matcher_spec.rb +10 -10
  134. data/spec/integration/rspec/contain_exactly_matcher_spec.rb +113 -107
  135. data/spec/integration/rspec/eq_matcher_spec.rb +223 -277
  136. data/spec/integration/rspec/have_attributes_matcher_spec.rb +138 -129
  137. data/spec/integration/rspec/have_predicate_matcher_spec.rb +65 -65
  138. data/spec/integration/rspec/include_matcher_spec.rb +73 -73
  139. data/spec/integration/rspec/match_array_matcher_spec.rb +126 -119
  140. data/spec/integration/rspec/match_matcher_spec.rb +362 -274
  141. data/spec/integration/rspec/raise_error_matcher_spec.rb +86 -86
  142. data/spec/integration/rspec/respond_to_matcher_spec.rb +240 -240
  143. data/spec/integration/rspec/third_party_matcher_spec.rb +8 -8
  144. data/spec/integration/rspec/unhandled_errors_spec.rb +5 -5
  145. data/spec/spec_helper.rb +33 -13
  146. data/spec/support/command_runner.rb +15 -25
  147. data/spec/support/helpers.rb +21 -0
  148. data/spec/support/integration/helpers.rb +8 -2
  149. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +4 -4
  150. data/spec/support/integration/test_programs/base.rb +38 -10
  151. data/spec/support/integration/test_programs/rspec_active_record.rb +1 -1
  152. data/spec/support/integration/test_programs/rspec_active_support.rb +17 -0
  153. data/spec/support/integration/test_programs/rspec_rails.rb +1 -1
  154. data/spec/support/shared_examples/active_record.rb +109 -108
  155. data/spec/support/shared_examples/active_support.rb +65 -0
  156. data/spec/support/shared_examples/elided_diffs.rb +914 -0
  157. data/spec/support/shared_examples/hash_with_indifferent_access.rb +196 -232
  158. data/spec/support/unit/helpers.rb +15 -0
  159. data/spec/support/unit/matchers/match_output.rb +41 -0
  160. data/spec/unit/active_record/object_inspection_spec.rb +273 -0
  161. data/spec/unit/equality_matchers/main_spec.rb +445 -465
  162. data/spec/unit/helpers_spec.rb +61 -0
  163. data/spec/unit/operation_tree_flatteners/array_spec.rb +604 -0
  164. data/spec/unit/operation_tree_flatteners/custom_object_spec.rb +667 -0
  165. data/spec/unit/operation_tree_flatteners/default_object_spec.rb +687 -0
  166. data/spec/unit/operation_tree_flatteners/hash_spec.rb +632 -0
  167. data/spec/unit/operation_tree_flatteners/multiline_string_spec.rb +121 -0
  168. data/spec/unit/rspec/object_inspection_spec.rb +446 -0
  169. data/spec/unit/super_diff_spec.rb +1958 -0
  170. data/spec/unit/tiered_lines_elider_spec.rb +6356 -0
  171. data/spec/unit/tiered_lines_formatter_spec.rb +193 -0
  172. data/super_diff.gemspec +1 -1
  173. metadata +95 -50
  174. data/lib/super_diff/active_record/diff_formatters.rb +0 -10
  175. data/lib/super_diff/active_record/diff_formatters/active_record_relation.rb +0 -23
  176. data/lib/super_diff/active_record/object_inspection/inspectors.rb +0 -16
  177. data/lib/super_diff/active_support/diff_formatters.rb +0 -10
  178. data/lib/super_diff/active_support/diff_formatters/hash_with_indifferent_access.rb +0 -36
  179. data/lib/super_diff/active_support/object_inspection/inspectors/hash_with_indifferent_access.rb +0 -28
  180. data/lib/super_diff/diff_formatters.rb +0 -14
  181. data/lib/super_diff/diff_formatters/array.rb +0 -21
  182. data/lib/super_diff/diff_formatters/base.rb +0 -33
  183. data/lib/super_diff/diff_formatters/custom_object.rb +0 -30
  184. data/lib/super_diff/diff_formatters/default_object.rb +0 -46
  185. data/lib/super_diff/diff_formatters/defaults.rb +0 -10
  186. data/lib/super_diff/diff_formatters/hash.rb +0 -34
  187. data/lib/super_diff/diff_formatters/main.rb +0 -41
  188. data/lib/super_diff/object_inspection/inspectors.rb +0 -23
  189. data/lib/super_diff/object_inspection/inspectors/array.rb +0 -32
  190. data/lib/super_diff/object_inspection/inspectors/base.rb +0 -36
  191. data/lib/super_diff/object_inspection/inspectors/custom_object.rb +0 -37
  192. data/lib/super_diff/object_inspection/inspectors/default_object.rb +0 -61
  193. data/lib/super_diff/object_inspection/inspectors/hash.rb +0 -32
  194. data/lib/super_diff/object_inspection/inspectors/primitive.rb +0 -28
  195. data/lib/super_diff/object_inspection/inspectors/string.rb +0 -23
  196. data/lib/super_diff/object_inspection/inspectors/time_like.rb +0 -23
  197. data/lib/super_diff/object_inspection/nodes/break.rb +0 -15
  198. data/lib/super_diff/object_inspection/nodes/when_multiline.rb +0 -22
  199. data/lib/super_diff/object_inspection/nodes/when_singleline.rb +0 -24
  200. data/lib/super_diff/rspec/object_inspection/inspectors.rb +0 -40
  201. data/lib/super_diff/rspec/object_inspection/inspectors/collection_including.rb +0 -28
  202. data/lib/super_diff/rspec/object_inspection/inspectors/hash_including.rb +0 -31
  203. data/lib/super_diff/rspec/object_inspection/inspectors/instance_of.rb +0 -23
  204. data/lib/super_diff/rspec/object_inspection/inspectors/kind_of.rb +0 -23
  205. data/lib/super_diff/rspec/object_inspection/inspectors/primitive.rb +0 -13
  206. data/lib/super_diff/rspec/object_inspection/inspectors/value_within.rb +0 -29
  207. data/spec/support/object_id.rb +0 -27
  208. data/spec/support/ruby_versions.rb +0 -11
  209. data/spec/unit/object_inspection_spec.rb +0 -1168
@@ -0,0 +1,37 @@
1
+ module SuperDiff
2
+ module ObjectInspection
3
+ module InspectionTreeBuilders
4
+ class CustomObject < Base
5
+ def self.applies_to?(value)
6
+ value.respond_to?(:attributes_for_super_diff)
7
+ end
8
+
9
+ def call
10
+ InspectionTree.new do
11
+ as_lines_when_rendering_to_lines(collection_bookend: :open) do
12
+ add_text do |object|
13
+ "#<#{object.class} "
14
+ end
15
+
16
+ when_rendering_to_lines do
17
+ add_text "{"
18
+ end
19
+ end
20
+
21
+ nested do |object|
22
+ insert_hash_inspection_of(object.attributes_for_super_diff)
23
+ end
24
+
25
+ as_lines_when_rendering_to_lines(collection_bookend: :close) do
26
+ when_rendering_to_lines do
27
+ add_text "}"
28
+ end
29
+
30
+ add_text ">"
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,63 @@
1
+ module SuperDiff
2
+ module ObjectInspection
3
+ module InspectionTreeBuilders
4
+ class DefaultObject < Base
5
+ def self.applies_to?(_value)
6
+ true
7
+ end
8
+
9
+ def call
10
+ empty = -> { object.instance_variables.empty? }
11
+ nonempty = -> { !object.instance_variables.empty? }
12
+
13
+ InspectionTree.new do
14
+ only_when empty do
15
+ as_lines_when_rendering_to_lines do
16
+ add_text do |object|
17
+ "#<#{object.class.name}:" +
18
+ SuperDiff::Helpers.object_address_for(object) +
19
+ ">"
20
+ end
21
+ end
22
+ end
23
+
24
+ only_when nonempty do
25
+ as_lines_when_rendering_to_lines(collection_bookend: :open) do
26
+ add_text do |object|
27
+ "#<#{object.class.name}:" +
28
+ SuperDiff::Helpers.object_address_for(object)
29
+ end
30
+
31
+ when_rendering_to_lines do
32
+ add_text " {"
33
+ end
34
+ end
35
+
36
+ when_rendering_to_string do
37
+ add_text " "
38
+ end
39
+
40
+ nested do |object|
41
+ insert_separated_list(object.instance_variables.sort) do |name|
42
+ as_prefix_when_rendering_to_lines do
43
+ add_text "#{name}="
44
+ end
45
+
46
+ add_inspection_of object.instance_variable_get(name)
47
+ end
48
+ end
49
+
50
+ as_lines_when_rendering_to_lines(collection_bookend: :close) do
51
+ when_rendering_to_lines do
52
+ add_text "}"
53
+ end
54
+
55
+ add_text ">"
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,12 +1,11 @@
1
1
  module SuperDiff
2
2
  module ObjectInspection
3
- module Inspectors
3
+ module InspectionTreeBuilders
4
4
  DEFAULTS = [
5
5
  CustomObject,
6
6
  Array,
7
7
  Hash,
8
8
  Primitive,
9
- String,
10
9
  TimeLike,
11
10
  DefaultObject,
12
11
  ].freeze
@@ -0,0 +1,46 @@
1
+ module SuperDiff
2
+ module ObjectInspection
3
+ module InspectionTreeBuilders
4
+ class Hash < Base
5
+ def self.applies_to?(value)
6
+ value.is_a?(::Hash)
7
+ end
8
+
9
+ def call
10
+ empty = -> { object.empty? }
11
+ nonempty = -> { !object.empty? }
12
+
13
+ InspectionTree.new do
14
+ only_when empty do
15
+ as_lines_when_rendering_to_lines do
16
+ add_text "{}"
17
+ end
18
+ end
19
+
20
+ only_when nonempty do
21
+ as_lines_when_rendering_to_lines(collection_bookend: :open) do
22
+ add_text "{"
23
+ end
24
+
25
+ when_rendering_to_string do
26
+ add_text " "
27
+ end
28
+
29
+ nested do |hash|
30
+ insert_hash_inspection_of(hash)
31
+ end
32
+
33
+ when_rendering_to_string do
34
+ add_text " "
35
+ end
36
+
37
+ as_lines_when_rendering_to_lines(collection_bookend: :close) do
38
+ add_text "}"
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -1,18 +1,14 @@
1
1
  module SuperDiff
2
2
  module ObjectInspection
3
- module Inspectors
3
+ module InspectionTreeBuilders
4
4
  class Main
5
5
  extend AttrExtras.mixin
6
6
 
7
- method_object :object, [:as_single_line!, :indent_level!]
7
+ method_object :object
8
8
 
9
9
  def call
10
10
  if resolved_class
11
- resolved_class.call(
12
- object,
13
- as_single_line: as_single_line?,
14
- indent_level: indent_level,
15
- )
11
+ resolved_class.call(object)
16
12
  else
17
13
  raise NoInspectorAvailableError.create(object)
18
14
  end
@@ -20,14 +16,13 @@ module SuperDiff
20
16
 
21
17
  private
22
18
 
23
- attr_query :as_single_line?
24
-
25
19
  def resolved_class
26
20
  available_classes.find { |klass| klass.applies_to?(object) }
27
21
  end
28
22
 
29
23
  def available_classes
30
- SuperDiff.configuration.extra_inspector_classes + DEFAULTS
24
+ SuperDiff.configuration.extra_inspection_tree_builder_classes +
25
+ DEFAULTS
31
26
  end
32
27
  end
33
28
  end
@@ -0,0 +1,21 @@
1
+ module SuperDiff
2
+ module ObjectInspection
3
+ module InspectionTreeBuilders
4
+ class Primitive < Base
5
+ def self.applies_to?(value)
6
+ SuperDiff.primitive?(value) || value.is_a?(::String)
7
+ end
8
+
9
+ def call
10
+ InspectionTree.new do
11
+ as_lines_when_rendering_to_lines do
12
+ # rubocop:disable Style/SymbolProc
13
+ add_text { |object| object.inspect }
14
+ # rubocop:enable Style/SymbolProc
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,64 @@
1
+ module SuperDiff
2
+ module ObjectInspection
3
+ module InspectionTreeBuilders
4
+ class TimeLike < Base
5
+ def self.applies_to?(value)
6
+ SuperDiff.time_like?(value)
7
+ end
8
+
9
+ def call
10
+ InspectionTree.new do
11
+ as_lines_when_rendering_to_lines(collection_bookend: :open) do
12
+ add_text do |time|
13
+ "#<#{time.class} "
14
+ end
15
+
16
+ when_rendering_to_lines do
17
+ add_text "{"
18
+ end
19
+ end
20
+
21
+ when_rendering_to_string do
22
+ add_text do |time|
23
+ time.strftime("%Y-%m-%d %H:%M:%S") +
24
+ (time.subsec == 0 ? "" : "+#{time.subsec.inspect}") +
25
+ " " + time.strftime("%:z") +
26
+ (time.zone ? " (#{time.zone})" : "")
27
+ end
28
+ end
29
+
30
+ when_rendering_to_lines do
31
+ nested do |time|
32
+ insert_separated_list(
33
+ [
34
+ :year,
35
+ :month,
36
+ :day,
37
+ :hour,
38
+ :min,
39
+ :sec,
40
+ :subsec,
41
+ :zone,
42
+ :utc_offset
43
+ ]
44
+ ) do |name|
45
+ add_text name.to_s
46
+ add_text ": "
47
+ add_inspection_of time.public_send(name)
48
+ end
49
+ end
50
+ end
51
+
52
+ as_lines_when_rendering_to_lines(collection_bookend: :close) do
53
+ when_rendering_to_lines do
54
+ add_text "}"
55
+ end
56
+
57
+ add_text ">"
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -1,48 +1,49 @@
1
1
  module SuperDiff
2
2
  module ObjectInspection
3
3
  module Nodes
4
- autoload :Base, "super_diff/object_inspection/nodes/base"
5
- autoload :Break, "super_diff/object_inspection/nodes/break"
6
- autoload :Inspection, "super_diff/object_inspection/nodes/inspection"
7
- autoload :Nesting, "super_diff/object_inspection/nodes/nesting"
8
- autoload :Text, "super_diff/object_inspection/nodes/text"
9
4
  autoload(
10
- :WhenEmpty,
11
- "super_diff/object_inspection/nodes/when_empty",
5
+ :AsLinesWhenRenderingToLines,
6
+ "super_diff/object_inspection/nodes/as_lines_when_rendering_to_lines",
12
7
  )
13
8
  autoload(
14
- :WhenMultiline,
15
- "super_diff/object_inspection/nodes/when_multiline",
9
+ :AsPrefixWhenRenderingToLines,
10
+ "super_diff/object_inspection/nodes/as_prefix_when_rendering_to_lines",
16
11
  )
17
12
  autoload(
18
- :WhenNonEmpty,
19
- "super_diff/object_inspection/nodes/when_non_empty",
13
+ :AsPreludeWhenRenderingToLines,
14
+ "super_diff/object_inspection/nodes/as_prelude_when_rendering_to_lines",
20
15
  )
21
16
  autoload(
22
- :WhenSingleline,
23
- "super_diff/object_inspection/nodes/when_singleline",
17
+ :AsSingleLine,
18
+ "super_diff/object_inspection/nodes/as_single_line",
19
+ )
20
+ autoload :Base, "super_diff/object_inspection/nodes/base"
21
+ autoload :Inspection, "super_diff/object_inspection/nodes/inspection"
22
+ autoload :Nesting, "super_diff/object_inspection/nodes/nesting"
23
+ autoload :OnlyWhen, "super_diff/object_inspection/nodes/only_when"
24
+ autoload :Text, "super_diff/object_inspection/nodes/text"
25
+ autoload(
26
+ :WhenRenderingToLines,
27
+ "super_diff/object_inspection/nodes/when_rendering_to_lines",
28
+ )
29
+ autoload(
30
+ :WhenRenderingToString,
31
+ "super_diff/object_inspection/nodes/when_rendering_to_string",
24
32
  )
25
-
26
- def self.fetch(type)
27
- registry.fetch(type) do
28
- raise(
29
- KeyError,
30
- "#{type.inspect} is not included in ObjectInspection::Nodes.registry!",
31
- )
32
- end
33
- end
34
33
 
35
34
  def self.registry
36
- @_registry ||= {
37
- break: Break,
38
- inspection: Inspection,
39
- nesting: Nesting,
40
- text: Text,
41
- when_empty: WhenEmpty,
42
- when_multiline: WhenMultiline,
43
- when_non_empty: WhenNonEmpty,
44
- when_singleline: WhenSingleline,
45
- }
35
+ @_registry ||= [
36
+ AsLinesWhenRenderingToLines,
37
+ AsPrefixWhenRenderingToLines,
38
+ AsPreludeWhenRenderingToLines,
39
+ AsSingleLine,
40
+ Inspection,
41
+ Nesting,
42
+ OnlyWhen,
43
+ Text,
44
+ WhenRenderingToLines,
45
+ WhenRenderingToString,
46
+ ]
46
47
  end
47
48
  end
48
49
  end
@@ -0,0 +1,97 @@
1
+ module SuperDiff
2
+ module ObjectInspection
3
+ module Nodes
4
+ class AsLinesWhenRenderingToLines < Base
5
+ def self.node_name
6
+ :as_lines_when_rendering_to_lines
7
+ end
8
+
9
+ def self.method_name
10
+ :as_lines_when_rendering_to_lines
11
+ end
12
+
13
+ def initialize(
14
+ tree,
15
+ *args,
16
+ add_comma: false,
17
+ collection_bookend: nil,
18
+ **rest
19
+ )
20
+ super(tree, *args, **rest)
21
+
22
+ @add_comma = add_comma
23
+ @collection_bookend = collection_bookend
24
+ end
25
+
26
+ def render_to_string(object)
27
+ # TODO: This happens a lot, can we simplify this?
28
+ string =
29
+ if block
30
+ render_to_string_in_subtree(object)
31
+ else
32
+ immediate_value.to_s
33
+ end
34
+
35
+ if add_comma?
36
+ string + ","
37
+ else
38
+ string
39
+ end
40
+ end
41
+
42
+ def render_to_lines(object, type:, indentation_level:)
43
+ lines =
44
+ if block
45
+ render_to_lines_in_subtree(
46
+ object,
47
+ type: type,
48
+ indentation_level: indentation_level,
49
+ disallowed_node_names: [
50
+ :line,
51
+ :as_lines_when_rendering_to_lines,
52
+ ],
53
+ )
54
+ else
55
+ [
56
+ SuperDiff::Line.new(
57
+ type: type,
58
+ indentation_level: indentation_level,
59
+ value: immediate_value.to_s,
60
+ ),
61
+ ]
62
+ end
63
+
64
+ with_collection_bookend_added_to_last_line_in(
65
+ with_add_comma_added_to_last_line_in(lines),
66
+ )
67
+ end
68
+
69
+ private
70
+
71
+ attr_reader :collection_bookend
72
+
73
+ def add_comma?
74
+ @add_comma
75
+ end
76
+
77
+ def with_collection_bookend_added_to_last_line_in(lines)
78
+ if collection_bookend
79
+ lines[0..-2] + [
80
+ lines[-1].clone_with(collection_bookend: collection_bookend),
81
+ ]
82
+ else
83
+ lines
84
+ end
85
+ end
86
+
87
+ def with_add_comma_added_to_last_line_in(lines)
88
+ if add_comma?
89
+ lines[0..-2] + [lines[-1].clone_with(add_comma: add_comma?)]
90
+ else
91
+ lines
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end