super_diff 0.11.0 → 0.13.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 (242) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +23 -182
  3. data/lib/super_diff/active_record/differs/active_record_relation.rb +1 -1
  4. data/lib/super_diff/active_record/inspection_tree_builders/active_record_model.rb +57 -0
  5. data/lib/super_diff/active_record/inspection_tree_builders/active_record_relation.rb +34 -0
  6. data/lib/super_diff/active_record/inspection_tree_builders.rb +14 -0
  7. data/lib/super_diff/active_record/monkey_patches.rb +6 -3
  8. data/lib/super_diff/active_record/object_inspection.rb +16 -4
  9. data/lib/super_diff/active_record/operation_tree_builders/active_record_model.rb +6 -2
  10. data/lib/super_diff/active_record/operation_tree_builders/active_record_relation.rb +1 -1
  11. data/lib/super_diff/active_record/operation_tree_flatteners/active_record_relation.rb +1 -1
  12. data/lib/super_diff/active_record/operation_trees/active_record_relation.rb +1 -1
  13. data/lib/super_diff/active_record.rb +12 -16
  14. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +1 -1
  15. data/lib/super_diff/active_support/inspection_tree_builders/hash_with_indifferent_access.rb +44 -0
  16. data/lib/super_diff/active_support/inspection_tree_builders/ordered_options.rb +44 -0
  17. data/lib/super_diff/active_support/inspection_tree_builders.rb +14 -0
  18. data/lib/super_diff/active_support/object_inspection.rb +16 -4
  19. data/lib/super_diff/active_support/operation_tree_builders/hash_with_indifferent_access.rb +1 -1
  20. data/lib/super_diff/active_support/operation_tree_flatteners/hash_with_indifferent_access.rb +1 -1
  21. data/lib/super_diff/active_support/operation_trees/hash_with_indifferent_access.rb +1 -1
  22. data/lib/super_diff/active_support.rb +11 -15
  23. data/lib/super_diff/basic/diff_formatters/collection.rb +135 -0
  24. data/lib/super_diff/basic/diff_formatters/multiline_string.rb +34 -0
  25. data/lib/super_diff/basic/diff_formatters.rb +11 -0
  26. data/lib/super_diff/basic/differs/array.rb +17 -0
  27. data/lib/super_diff/basic/differs/custom_object.rb +19 -0
  28. data/lib/super_diff/basic/differs/date_like.rb +17 -0
  29. data/lib/super_diff/basic/differs/default_object.rb +24 -0
  30. data/lib/super_diff/basic/differs/hash.rb +17 -0
  31. data/lib/super_diff/basic/differs/multiline_string.rb +18 -0
  32. data/lib/super_diff/basic/differs/time_like.rb +17 -0
  33. data/lib/super_diff/basic/differs.rb +24 -0
  34. data/lib/super_diff/{object_inspection → basic}/inspection_tree_builders/array.rb +3 -3
  35. data/lib/super_diff/{object_inspection → basic}/inspection_tree_builders/custom_object.rb +3 -3
  36. data/lib/super_diff/basic/inspection_tree_builders/data_object.rb +40 -0
  37. data/lib/super_diff/{object_inspection → basic}/inspection_tree_builders/date_like.rb +3 -3
  38. data/lib/super_diff/{object_inspection → basic}/inspection_tree_builders/default_object.rb +5 -7
  39. data/lib/super_diff/{object_inspection → basic}/inspection_tree_builders/hash.rb +3 -3
  40. data/lib/super_diff/{object_inspection → basic}/inspection_tree_builders/primitive.rb +4 -4
  41. data/lib/super_diff/{object_inspection → basic}/inspection_tree_builders/time_like.rb +3 -3
  42. data/lib/super_diff/basic/inspection_tree_builders.rb +24 -0
  43. data/lib/super_diff/basic/operation_tree_builders/array.rb +111 -0
  44. data/lib/super_diff/basic/operation_tree_builders/custom_object.rb +42 -0
  45. data/lib/super_diff/basic/operation_tree_builders/data_object.rb +18 -0
  46. data/lib/super_diff/basic/operation_tree_builders/date_like.rb +17 -0
  47. data/lib/super_diff/basic/operation_tree_builders/default_object.rb +117 -0
  48. data/lib/super_diff/basic/operation_tree_builders/hash.rb +222 -0
  49. data/lib/super_diff/basic/operation_tree_builders/multiline_string.rb +90 -0
  50. data/lib/super_diff/basic/operation_tree_builders/time_like.rb +26 -0
  51. data/lib/super_diff/basic/operation_tree_builders.rb +38 -0
  52. data/lib/super_diff/basic/operation_tree_flatteners/array.rb +17 -0
  53. data/lib/super_diff/basic/operation_tree_flatteners/collection.rb +140 -0
  54. data/lib/super_diff/basic/operation_tree_flatteners/custom_object.rb +30 -0
  55. data/lib/super_diff/basic/operation_tree_flatteners/default_object.rb +32 -0
  56. data/lib/super_diff/basic/operation_tree_flatteners/hash.rb +35 -0
  57. data/lib/super_diff/basic/operation_tree_flatteners/multiline_string.rb +20 -0
  58. data/lib/super_diff/basic/operation_tree_flatteners.rb +24 -0
  59. data/lib/super_diff/basic/operation_trees/array.rb +17 -0
  60. data/lib/super_diff/basic/operation_trees/custom_object.rb +17 -0
  61. data/lib/super_diff/basic/operation_trees/default_object.rb +42 -0
  62. data/lib/super_diff/basic/operation_trees/hash.rb +17 -0
  63. data/lib/super_diff/basic/operation_trees/multiline_string.rb +17 -0
  64. data/lib/super_diff/basic/operation_trees.rb +25 -0
  65. data/lib/super_diff/basic.rb +50 -0
  66. data/lib/super_diff/{differs/base.rb → core/abstract_differ.rb} +2 -2
  67. data/lib/super_diff/core/abstract_inspection_tree_builder.rb +26 -0
  68. data/lib/super_diff/{operation_trees/base.rb → core/abstract_operation_tree.rb} +6 -2
  69. data/lib/super_diff/{operation_tree_builders/base.rb → core/abstract_operation_tree_builder.rb} +4 -8
  70. data/lib/super_diff/{operation_tree_flatteners/base.rb → core/abstract_operation_tree_flattener.rb} +2 -2
  71. data/lib/super_diff/{operations → core}/binary_operation.rb +1 -1
  72. data/lib/super_diff/core/colorized_document_extensions.rb +20 -0
  73. data/lib/super_diff/core/configuration.rb +196 -0
  74. data/lib/super_diff/core/differ_dispatcher.rb +31 -0
  75. data/lib/super_diff/core/gem_version.rb +47 -0
  76. data/lib/super_diff/core/helpers.rb +88 -0
  77. data/lib/super_diff/core/implementation_checks.rb +21 -0
  78. data/lib/super_diff/{object_inspection → core}/inspection_tree.rb +7 -6
  79. data/lib/super_diff/core/inspection_tree_builder_dispatcher.rb +23 -0
  80. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/as_lines_when_rendering_to_lines.rb +9 -3
  81. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/as_prefix_when_rendering_to_lines.rb +3 -3
  82. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/as_prelude_when_rendering_to_lines.rb +3 -3
  83. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/as_single_line.rb +3 -3
  84. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/base.rb +2 -2
  85. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/inspection.rb +7 -11
  86. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/nesting.rb +2 -2
  87. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/only_when.rb +2 -2
  88. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/text.rb +2 -2
  89. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/when_empty.rb +2 -2
  90. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/when_non_empty.rb +2 -2
  91. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/when_rendering_to_lines.rb +2 -2
  92. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/when_rendering_to_string.rb +2 -2
  93. data/lib/super_diff/core/inspection_tree_nodes.rb +55 -0
  94. data/lib/super_diff/core/line.rb +85 -0
  95. data/lib/super_diff/{errors → core}/no_differ_available_error.rb +1 -1
  96. data/lib/super_diff/core/no_inspection_tree_builder_available_error.rb +21 -0
  97. data/lib/super_diff/core/no_operation_tree_available_error.rb +20 -0
  98. data/lib/super_diff/core/no_operation_tree_builder_available_error.rb +24 -0
  99. data/lib/super_diff/{operation_tree_builders/main.rb → core/operation_tree_builder_dispatcher.rb} +9 -13
  100. data/lib/super_diff/core/operation_tree_finder.rb +27 -0
  101. data/lib/super_diff/core/prefix_for_next_inspection_tree_node.rb +6 -0
  102. data/lib/super_diff/core/prelude_for_next_inspection_tree_node.rb +6 -0
  103. data/lib/super_diff/core/recursion_guard.rb +52 -0
  104. data/lib/super_diff/core/tiered_lines.rb +6 -0
  105. data/lib/super_diff/core/tiered_lines_elider.rb +472 -0
  106. data/lib/super_diff/core/tiered_lines_formatter.rb +77 -0
  107. data/lib/super_diff/{operations → core}/unary_operation.rb +1 -1
  108. data/lib/super_diff/core.rb +69 -0
  109. data/lib/super_diff/csi.rb +0 -32
  110. data/lib/super_diff/differs.rb +19 -12
  111. data/lib/super_diff/equality_matchers/array.rb +3 -3
  112. data/lib/super_diff/equality_matchers/default.rb +8 -3
  113. data/lib/super_diff/equality_matchers/defaults.rb +1 -1
  114. data/lib/super_diff/equality_matchers/hash.rb +3 -3
  115. data/lib/super_diff/equality_matchers/multiline_string.rb +3 -3
  116. data/lib/super_diff/equality_matchers/primitive.rb +3 -3
  117. data/lib/super_diff/equality_matchers/singleline_string.rb +2 -2
  118. data/lib/super_diff/errors.rb +12 -8
  119. data/lib/super_diff/object_inspection.rb +63 -14
  120. data/lib/super_diff/operation_tree_builders.rb +19 -15
  121. data/lib/super_diff/operation_tree_flatteners.rb +19 -16
  122. data/lib/super_diff/operation_trees.rb +19 -9
  123. data/lib/super_diff/operations.rb +12 -2
  124. data/lib/super_diff/rspec/augmented_matcher.rb +1 -1
  125. data/lib/super_diff/rspec/differ.rb +4 -5
  126. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +1 -1
  127. data/lib/super_diff/rspec/differs/collection_including.rb +1 -1
  128. data/lib/super_diff/rspec/differs/hash_including.rb +1 -1
  129. data/lib/super_diff/rspec/differs/object_having_attributes.rb +1 -1
  130. data/lib/super_diff/rspec/inspection_tree_builders/collection_containing_exactly.rb +34 -0
  131. data/lib/super_diff/rspec/inspection_tree_builders/collection_including.rb +40 -0
  132. data/lib/super_diff/rspec/inspection_tree_builders/double.rb +100 -0
  133. data/lib/super_diff/rspec/inspection_tree_builders/generic_describable_matcher.rb +17 -0
  134. data/lib/super_diff/rspec/inspection_tree_builders/hash_including.rb +40 -0
  135. data/lib/super_diff/rspec/inspection_tree_builders/instance_of.rb +25 -0
  136. data/lib/super_diff/rspec/inspection_tree_builders/kind_of.rb +25 -0
  137. data/lib/super_diff/rspec/inspection_tree_builders/object_having_attributes.rb +34 -0
  138. data/lib/super_diff/rspec/inspection_tree_builders/primitive.rb +9 -0
  139. data/lib/super_diff/rspec/inspection_tree_builders/value_within.rb +30 -0
  140. data/lib/super_diff/rspec/inspection_tree_builders.rb +40 -0
  141. data/lib/super_diff/rspec/object_inspection.rb +14 -4
  142. data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +4 -4
  143. data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +1 -1
  144. data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +1 -1
  145. data/lib/super_diff/rspec/operation_tree_builders/object_having_attributes.rb +2 -2
  146. data/lib/super_diff/rspec.rb +20 -18
  147. data/lib/super_diff/version.rb +1 -1
  148. data/lib/super_diff.rb +70 -23
  149. data/spec/examples.txt +450 -543
  150. data/spec/spec_helper.rb +1 -0
  151. data/spec/support/integration/helpers.rb +4 -1
  152. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +1 -1
  153. data/spec/support/models/active_record/person.rb +8 -1
  154. data/spec/support/models/point.rb +7 -0
  155. data/spec/support/shared_examples/active_record.rb +5 -5
  156. data/spec/support/unit/helpers.rb +12 -1
  157. data/spec/support/unit/matchers/be_deprecated_in_favor_of.rb +39 -0
  158. data/spec/unit/active_record/object_inspection_spec.rb +5 -5
  159. data/spec/unit/basic/inspection_tree_builders/data_object_spec.rb +146 -0
  160. data/spec/unit/basic/operation_tree_builders/data_object_spec.rb +82 -0
  161. data/spec/unit/{operation_tree_flatteners → basic/operation_tree_flatteners}/array_spec.rb +8 -8
  162. data/spec/unit/{operation_tree_flatteners → basic/operation_tree_flatteners}/custom_object_spec.rb +9 -9
  163. data/spec/unit/{operation_tree_flatteners → basic/operation_tree_flatteners}/default_object_spec.rb +9 -9
  164. data/spec/unit/{operation_tree_flatteners → basic/operation_tree_flatteners}/hash_spec.rb +8 -8
  165. data/spec/unit/{operation_tree_flatteners → basic/operation_tree_flatteners}/multiline_string_spec.rb +4 -4
  166. data/spec/unit/core/configuration_no_rspec_spec.rb +58 -0
  167. data/spec/unit/core/configuration_spec.rb +176 -0
  168. data/spec/unit/{helpers_spec.rb → core/helpers_spec.rb} +2 -2
  169. data/spec/unit/{tiered_lines_elider_spec.rb → core/tiered_lines_elider_spec.rb} +2 -2
  170. data/spec/unit/{tiered_lines_formatter_spec.rb → core/tiered_lines_formatter_spec.rb} +1 -1
  171. data/spec/unit/deprecations_spec.rb +176 -0
  172. data/spec/unit/equality_matchers/main_spec.rb +5 -5
  173. data/super_diff.gemspec +10 -3
  174. metadata +144 -120
  175. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_model.rb +0 -51
  176. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_relation.rb +0 -36
  177. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders.rb +0 -16
  178. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/hash_with_indifferent_access.rb +0 -46
  179. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/ordered_options.rb +0 -46
  180. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders.rb +0 -16
  181. data/lib/super_diff/colorized_document_extensions.rb +0 -18
  182. data/lib/super_diff/configuration.rb +0 -149
  183. data/lib/super_diff/diff_formatters/collection.rb +0 -132
  184. data/lib/super_diff/diff_formatters/multiline_string.rb +0 -31
  185. data/lib/super_diff/differs/array.rb +0 -15
  186. data/lib/super_diff/differs/custom_object.rb +0 -17
  187. data/lib/super_diff/differs/date_like.rb +0 -15
  188. data/lib/super_diff/differs/default_object.rb +0 -19
  189. data/lib/super_diff/differs/defaults.rb +0 -13
  190. data/lib/super_diff/differs/empty.rb +0 -13
  191. data/lib/super_diff/differs/hash.rb +0 -15
  192. data/lib/super_diff/differs/main.rb +0 -31
  193. data/lib/super_diff/differs/multiline_string.rb +0 -16
  194. data/lib/super_diff/differs/time_like.rb +0 -15
  195. data/lib/super_diff/gem_version.rb +0 -45
  196. data/lib/super_diff/helpers.rb +0 -86
  197. data/lib/super_diff/implementation_checks.rb +0 -19
  198. data/lib/super_diff/line.rb +0 -83
  199. data/lib/super_diff/object_inspection/inspection_tree_builders/base.rb +0 -27
  200. data/lib/super_diff/object_inspection/inspection_tree_builders/defaults.rb +0 -15
  201. data/lib/super_diff/object_inspection/inspection_tree_builders/main.rb +0 -30
  202. data/lib/super_diff/object_inspection/inspection_tree_builders.rb +0 -48
  203. data/lib/super_diff/object_inspection/nodes.rb +0 -50
  204. data/lib/super_diff/object_inspection/prefix_for_next_node.rb +0 -6
  205. data/lib/super_diff/object_inspection/prelude_for_next_node.rb +0 -6
  206. data/lib/super_diff/operation_tree_builders/array.rb +0 -107
  207. data/lib/super_diff/operation_tree_builders/custom_object.rb +0 -40
  208. data/lib/super_diff/operation_tree_builders/date_like.rb +0 -15
  209. data/lib/super_diff/operation_tree_builders/default_object.rb +0 -119
  210. data/lib/super_diff/operation_tree_builders/defaults.rb +0 -5
  211. data/lib/super_diff/operation_tree_builders/hash.rb +0 -218
  212. data/lib/super_diff/operation_tree_builders/multiline_string.rb +0 -86
  213. data/lib/super_diff/operation_tree_builders/time_like.rb +0 -24
  214. data/lib/super_diff/operation_tree_flatteners/array.rb +0 -15
  215. data/lib/super_diff/operation_tree_flatteners/collection.rb +0 -136
  216. data/lib/super_diff/operation_tree_flatteners/custom_object.rb +0 -28
  217. data/lib/super_diff/operation_tree_flatteners/default_object.rb +0 -31
  218. data/lib/super_diff/operation_tree_flatteners/hash.rb +0 -33
  219. data/lib/super_diff/operation_tree_flatteners/multiline_string.rb +0 -18
  220. data/lib/super_diff/operation_trees/array.rb +0 -15
  221. data/lib/super_diff/operation_trees/custom_object.rb +0 -15
  222. data/lib/super_diff/operation_trees/default_object.rb +0 -40
  223. data/lib/super_diff/operation_trees/defaults.rb +0 -5
  224. data/lib/super_diff/operation_trees/hash.rb +0 -15
  225. data/lib/super_diff/operation_trees/main.rb +0 -35
  226. data/lib/super_diff/operation_trees/multiline_string.rb +0 -15
  227. data/lib/super_diff/recursion_guard.rb +0 -50
  228. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_containing_exactly.rb +0 -36
  229. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_including.rb +0 -42
  230. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/double.rb +0 -102
  231. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/generic_describable_matcher.rb +0 -19
  232. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/hash_including.rb +0 -42
  233. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/instance_of.rb +0 -27
  234. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/kind_of.rb +0 -27
  235. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/object_having_attributes.rb +0 -36
  236. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/primitive.rb +0 -10
  237. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/value_within.rb +0 -32
  238. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders.rb +0 -48
  239. data/lib/super_diff/tiered_lines.rb +0 -4
  240. data/lib/super_diff/tiered_lines_elider.rb +0 -462
  241. data/lib/super_diff/tiered_lines_formatter.rb +0 -75
  242. data/spec/internal/log/test.log +0 -0
@@ -0,0 +1,196 @@
1
+ module SuperDiff
2
+ module Core
3
+ class Configuration
4
+ attr_reader(
5
+ :extra_diff_formatter_classes,
6
+ :extra_differ_classes,
7
+ :extra_inspection_tree_builder_classes,
8
+ :extra_operation_tree_builder_classes,
9
+ :extra_operation_tree_classes
10
+ )
11
+ attr_accessor(
12
+ :actual_color,
13
+ :border_color,
14
+ :color_enabled,
15
+ :diff_elision_enabled,
16
+ :diff_elision_maximum,
17
+ :elision_marker_color,
18
+ :expected_color,
19
+ :header_color,
20
+ :key_enabled
21
+ )
22
+
23
+ def initialize(options = {})
24
+ @actual_color = :yellow
25
+ @border_color = :blue
26
+ @color_enabled = nil
27
+ @diff_elision_enabled = false
28
+ @diff_elision_maximum = 0
29
+ @elision_marker_color = :cyan
30
+ @expected_color = :magenta
31
+ @extra_diff_formatter_classes = [].freeze
32
+ @extra_differ_classes = [].freeze
33
+ @extra_inspection_tree_builder_classes = [].freeze
34
+ @extra_operation_tree_builder_classes = [].freeze
35
+ @extra_operation_tree_classes = [].freeze
36
+ @header_color = :white
37
+ @key_enabled = true
38
+
39
+ merge!(options)
40
+ end
41
+
42
+ def initialize_dup(original)
43
+ super
44
+ @extra_diff_formatter_classes =
45
+ original.extra_diff_formatter_classes.dup.freeze
46
+ @extra_differ_classes = original.extra_differ_classes.dup.freeze
47
+ @extra_operation_tree_builder_classes =
48
+ original.extra_operation_tree_builder_classes.dup.freeze
49
+ @extra_operation_tree_classes =
50
+ original.extra_operation_tree_classes.dup.freeze
51
+ @extra_inspection_tree_builder_classes =
52
+ original.extra_inspection_tree_builder_classes.dup.freeze
53
+ end
54
+
55
+ def color_enabled?
56
+ return color_enabled_by_default? if @color_enabled.nil?
57
+
58
+ @color_enabled
59
+ end
60
+
61
+ def diff_elision_enabled?
62
+ @diff_elision_enabled
63
+ end
64
+
65
+ def key_enabled?
66
+ @key_enabled
67
+ end
68
+
69
+ def merge!(configuration_or_options)
70
+ options =
71
+ if configuration_or_options.is_a?(self.class)
72
+ configuration_or_options.to_h
73
+ else
74
+ configuration_or_options
75
+ end
76
+
77
+ options.each { |key, value| instance_variable_set("@#{key}", value) }
78
+ end
79
+
80
+ def add_extra_diff_formatter_classes(*classes)
81
+ @extra_diff_formatter_classes =
82
+ (@extra_diff_formatter_classes + classes).freeze
83
+ end
84
+ alias_method(
85
+ :add_extra_diff_formatter_class,
86
+ :add_extra_diff_formatter_classes
87
+ )
88
+
89
+ def prepend_extra_diff_formatter_classes(*classes)
90
+ @extra_diff_formatter_classes =
91
+ (classes + @extra_diff_formatter_classes).freeze
92
+ end
93
+ alias_method(
94
+ :prepend_extra_diff_formatter_class,
95
+ :prepend_extra_diff_formatter_classes
96
+ )
97
+
98
+ def add_extra_differ_classes(*classes)
99
+ @extra_differ_classes = (@extra_differ_classes + classes).freeze
100
+ end
101
+ alias_method :add_extra_differ_class, :add_extra_differ_classes
102
+
103
+ def prepend_extra_differ_classes(*classes)
104
+ @extra_differ_classes = (classes + @extra_differ_classes).freeze
105
+ end
106
+ alias_method :prepend_extra_differ_class, :prepend_extra_differ_classes
107
+
108
+ def add_extra_inspection_tree_builder_classes(*classes)
109
+ @extra_inspection_tree_builder_classes =
110
+ (@extra_inspection_tree_builder_classes + classes).freeze
111
+ end
112
+ alias_method(
113
+ :add_extra_inspection_tree_builder_class,
114
+ :add_extra_inspection_tree_builder_classes
115
+ )
116
+
117
+ def prepend_extra_inspection_tree_builder_classes(*classes)
118
+ @extra_inspection_tree_builder_classes =
119
+ (classes + @extra_inspection_tree_builder_classes).freeze
120
+ end
121
+ alias_method(
122
+ :prepend_extra_inspection_tree_builder_class,
123
+ :prepend_extra_inspection_tree_builder_classes
124
+ )
125
+
126
+ def add_extra_operation_tree_builder_classes(*classes)
127
+ @extra_operation_tree_builder_classes =
128
+ (@extra_operation_tree_builder_classes + classes).freeze
129
+ end
130
+ alias_method(
131
+ :add_extra_operation_tree_builder_class,
132
+ :add_extra_operation_tree_builder_classes
133
+ )
134
+
135
+ def prepend_extra_operation_tree_builder_classes(*classes)
136
+ @extra_operation_tree_builder_classes =
137
+ (classes + @extra_operation_tree_builder_classes).freeze
138
+ end
139
+ alias_method(
140
+ :prepend_extra_operation_tree_builder_class,
141
+ :prepend_extra_operation_tree_builder_classes
142
+ )
143
+
144
+ def add_extra_operation_tree_classes(*classes)
145
+ @extra_operation_tree_classes =
146
+ (@extra_operation_tree_classes + classes).freeze
147
+ end
148
+ alias_method(
149
+ :add_extra_operation_tree_class,
150
+ :add_extra_operation_tree_classes
151
+ )
152
+
153
+ def prepend_extra_operation_tree_classes(*classes)
154
+ @extra_operation_tree_classes =
155
+ (classes + @extra_operation_tree_classes).freeze
156
+ end
157
+ alias_method(
158
+ :prepend_extra_operation_tree_class,
159
+ :prepend_extra_operation_tree_classes
160
+ )
161
+
162
+ def to_h
163
+ {
164
+ actual_color: actual_color,
165
+ border_color: border_color,
166
+ color_enabled: @color_enabled,
167
+ diff_elision_enabled: diff_elision_enabled?,
168
+ diff_elision_maximum: diff_elision_maximum,
169
+ elision_marker_color: elision_marker_color,
170
+ expected_color: expected_color,
171
+ extra_diff_formatter_classes: extra_diff_formatter_classes.dup,
172
+ extra_differ_classes: extra_differ_classes.dup,
173
+ extra_inspection_tree_builder_classes:
174
+ extra_inspection_tree_builder_classes.dup,
175
+ extra_operation_tree_builder_classes:
176
+ extra_operation_tree_builder_classes.dup,
177
+ extra_operation_tree_classes: extra_operation_tree_classes.dup,
178
+ header_color: header_color,
179
+ key_enabled: key_enabled?
180
+ }
181
+ end
182
+
183
+ private
184
+
185
+ def color_enabled_by_default?
186
+ return true if ENV["CI"] == "true"
187
+
188
+ if defined?(::SuperDiff::RSpec)
189
+ return ::RSpec.configuration.color_enabled?
190
+ end
191
+
192
+ $stdout.respond_to?(:tty?) && $stdout.tty?
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,31 @@
1
+ module SuperDiff
2
+ module Core
3
+ class DifferDispatcher
4
+ extend AttrExtras.mixin
5
+
6
+ method_object(
7
+ :expected,
8
+ :actual,
9
+ [:available_classes, indent_level: 0, raise_if_nothing_applies: true]
10
+ )
11
+
12
+ def call
13
+ if resolved_class
14
+ resolved_class.call(expected, actual, indent_level: indent_level)
15
+ elsif raise_if_nothing_applies?
16
+ raise NoDifferAvailableError.create(expected, actual)
17
+ else
18
+ ""
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ attr_query :raise_if_nothing_applies?
25
+
26
+ def resolved_class
27
+ available_classes.find { |klass| klass.applies_to?(expected, actual) }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,47 @@
1
+ module SuperDiff
2
+ module Core
3
+ class GemVersion
4
+ def initialize(version)
5
+ @version = Gem::Version.new(version.to_s)
6
+ end
7
+
8
+ def <(other)
9
+ compare?(:<, other)
10
+ end
11
+
12
+ def <=(other)
13
+ compare?(:<=, other)
14
+ end
15
+
16
+ def ==(other)
17
+ compare?(:==, other)
18
+ end
19
+
20
+ def >=(other)
21
+ compare?(:>=, other)
22
+ end
23
+
24
+ def >(other)
25
+ compare?(:>, other)
26
+ end
27
+
28
+ def =~(other)
29
+ Gem::Requirement.new(other).satisfied_by?(version)
30
+ end
31
+
32
+ def to_s
33
+ version.to_s
34
+ end
35
+
36
+ private
37
+
38
+ attr_reader :version
39
+
40
+ def compare?(operator, other_version)
41
+ Gem::Requirement.new("#{operator} #{other_version}").satisfied_by?(
42
+ version
43
+ )
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,88 @@
1
+ module SuperDiff
2
+ module Core
3
+ module Helpers
4
+ extend self
5
+
6
+ # TODO: Simplify this
7
+ def style(*args, color_enabled: true, **opts, &block)
8
+ klass =
9
+ if color_enabled && SuperDiff.configuration.color_enabled?
10
+ Csi::ColorizedDocument
11
+ else
12
+ Csi::UncolorizedDocument
13
+ end
14
+
15
+ document = klass.new.extend(ColorizedDocumentExtensions)
16
+
17
+ if block
18
+ document.__send__(:evaluate_block, &block)
19
+ else
20
+ document.colorize(*args, **opts)
21
+ end
22
+
23
+ document
24
+ end
25
+
26
+ def plural_type_for(value)
27
+ case value
28
+ when Numeric
29
+ "numbers"
30
+ when String
31
+ "strings"
32
+ when Symbol
33
+ "symbols"
34
+ else
35
+ "objects"
36
+ end
37
+ end
38
+
39
+ def jruby?
40
+ defined?(JRUBY_VERSION)
41
+ end
42
+
43
+ def ruby_version_matches?(version_string)
44
+ Gem::Requirement.new(version_string).satisfied_by?(
45
+ Gem::Version.new(RUBY_VERSION)
46
+ )
47
+ end
48
+
49
+ if jruby?
50
+ def object_address_for(object)
51
+ # Source: <https://github.com/jruby/jruby/blob/master/core/src/main/java/org/jruby/RubyBasicObject.java>
52
+ "0x%x" % object.hash
53
+ end
54
+ elsif ruby_version_matches?(">= 2.7.0")
55
+ require "json"
56
+ require "objspace"
57
+
58
+ def object_address_for(object)
59
+ # Sources: <https://bugs.ruby-lang.org/issues/15408> and <https://bugs.ruby-lang.org/issues/15626#Object-ID>
60
+ json = JSON.parse(ObjectSpace.dump(object))
61
+ json.is_a?(Hash) ? "0x%016x" % Integer(json["address"], 16) : ""
62
+ end
63
+ else
64
+ def object_address_for(object)
65
+ "0x%016x" % (object.object_id * 2)
66
+ end
67
+ end
68
+
69
+ def with_slice_of_array_replaced(array, range, replacement)
70
+ beginning =
71
+ if range.begin > 0
72
+ array[Range.new(0, range.begin - 1)]
73
+ else
74
+ []
75
+ end
76
+
77
+ ending =
78
+ if range.end <= array.length - 1
79
+ array[Range.new(range.end + 1, array.length - 1)]
80
+ else
81
+ []
82
+ end
83
+
84
+ beginning + [replacement] + ending
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,21 @@
1
+ module SuperDiff
2
+ module Core
3
+ module ImplementationChecks
4
+ protected def unimplemented_instance_method!
5
+ raise(
6
+ NotImplementedError,
7
+ "#{self.class} must implement ##{caller_locations(1, 1).first.label}",
8
+ caller(1)
9
+ )
10
+ end
11
+
12
+ protected def unimplemented_class_method!
13
+ raise(
14
+ NotImplementedError,
15
+ "#{self} must implement .#{caller_locations(1, 1).first.label}",
16
+ caller(1)
17
+ )
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,5 +1,5 @@
1
1
  module SuperDiff
2
- module ObjectInspection
2
+ module Core
3
3
  class InspectionTree
4
4
  include Enumerable
5
5
 
@@ -10,7 +10,7 @@ module SuperDiff
10
10
  evaluate_block(&block) if block
11
11
  end
12
12
 
13
- Nodes.registry.each do |node_class|
13
+ InspectionTreeNodes.registry.each do |node_class|
14
14
  define_method(node_class.method_name) do |*args, **options, &block|
15
15
  add_node(node_class, *args, **options, &block)
16
16
  end
@@ -59,7 +59,7 @@ module SuperDiff
59
59
  insert_separated_list(array) do |t, value|
60
60
  # Have to do these shenanigans so that if value is a hash, Ruby
61
61
  # doesn't try to interpret it as keyword args
62
- if SuperDiff::Helpers.ruby_version_matches?(">= 2.7.1")
62
+ if Helpers.ruby_version_matches?(">= 2.7.1")
63
63
  t.add_inspection_of(value, **{})
64
64
  else
65
65
  t.add_inspection_of(*[value, {}])
@@ -86,7 +86,7 @@ module SuperDiff
86
86
 
87
87
  # Have to do these shenanigans so that if hash[key] is a hash, Ruby
88
88
  # doesn't try to interpret it as keyword args
89
- if SuperDiff::Helpers.ruby_version_matches?(">= 2.7.1")
89
+ if Helpers.ruby_version_matches?(">= 2.7.1")
90
90
  t1.add_inspection_of(hash[key], **{})
91
91
  else
92
92
  t1.add_inspection_of(*[hash[key], {}])
@@ -148,11 +148,12 @@ module SuperDiff
148
148
  def call
149
149
  if rendering.is_a?(Array)
150
150
  concat_with_lines
151
- elsif rendering.is_a?(PrefixForNextNode)
151
+ elsif rendering.is_a?(PrefixForNextInspectionTreeNode)
152
152
  add_to_prefix
153
153
  elsif tiered_lines.any?
154
154
  add_to_last_line
155
- elsif index < nodes.size - 1 || rendering.is_a?(PreludeForNextNode)
155
+ elsif index < nodes.size - 1 ||
156
+ rendering.is_a?(PreludeForNextInspectionTreeNode)
156
157
  add_to_prelude
157
158
  else
158
159
  add_to_lines
@@ -0,0 +1,23 @@
1
+ module SuperDiff
2
+ module Core
3
+ class InspectionTreeBuilderDispatcher
4
+ extend AttrExtras.mixin
5
+
6
+ method_object :object, [:available_classes]
7
+
8
+ def call
9
+ if resolved_class
10
+ resolved_class.call(object)
11
+ else
12
+ raise NoInspectionTreeBuilderAvailableError.create(object)
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def resolved_class
19
+ available_classes.find { |klass| klass.applies_to?(object) }
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class AsLinesWhenRenderingToLines < Base
5
5
  def self.node_name
6
6
  :as_lines_when_rendering_to_lines
@@ -27,7 +27,13 @@ module SuperDiff
27
27
  def render_to_string(object)
28
28
  # TODO: This happens a lot, can we simplify this?
29
29
  string =
30
- (block ? render_to_string_in_subtree(object) : immediate_value.to_s)
30
+ (
31
+ if block
32
+ render_to_string_in_subtree(object)
33
+ else
34
+ immediate_value.to_s
35
+ end
36
+ )
31
37
 
32
38
  add_comma? ? string + "," : string
33
39
  end
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class AsPrefixWhenRenderingToLines < Base
5
5
  def self.name
6
6
  :as_prefix_when_rendering_to_lines
@@ -15,7 +15,7 @@ module SuperDiff
15
15
  end
16
16
 
17
17
  def render_to_lines(object, **)
18
- ObjectInspection::PrefixForNextNode.new(render_to_string(object))
18
+ PrefixForNextInspectionTreeNode.new(render_to_string(object))
19
19
  end
20
20
  end
21
21
  end
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class AsPreludeWhenRenderingToLines < Base
5
5
  def self.name
6
6
  :as_prelude_when_rendering_to_lines
@@ -15,7 +15,7 @@ module SuperDiff
15
15
  end
16
16
 
17
17
  def render_to_lines(object, **)
18
- ObjectInspection::PreludeForNextNode.new(render_to_string(object))
18
+ PreludeForNextInspectionTreeNode.new(render_to_string(object))
19
19
  end
20
20
  end
21
21
  end
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class AsSingleLine < Base
5
5
  def self.node_name
6
6
  :as_single_line
@@ -16,7 +16,7 @@ module SuperDiff
16
16
 
17
17
  def render_to_lines(object, type:, indentation_level:)
18
18
  [
19
- SuperDiff::Line.new(
19
+ Line.new(
20
20
  type: type,
21
21
  indentation_level: indentation_level,
22
22
  value: render_to_string(object)
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class Base
5
5
  def self.node_name
6
6
  unimplemented_class_method!
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class Inspection < Base
5
5
  def self.node_name
6
6
  :inspection
@@ -13,11 +13,9 @@ module SuperDiff
13
13
  def render_to_string(object)
14
14
  value = (block ? evaluate_block(object) : immediate_value)
15
15
 
16
- SuperDiff::RecursionGuard.guarding_recursion_of(
17
- value
18
- ) do |already_seen|
16
+ RecursionGuard.guarding_recursion_of(value) do |already_seen|
19
17
  if already_seen
20
- SuperDiff::RecursionGuard::PLACEHOLDER
18
+ RecursionGuard::PLACEHOLDER
21
19
  else
22
20
  SuperDiff.inspect_object(value, as_lines: false)
23
21
  end
@@ -27,15 +25,13 @@ module SuperDiff
27
25
  def render_to_lines(object, type:, indentation_level:)
28
26
  value = (block ? evaluate_block(object) : immediate_value)
29
27
 
30
- SuperDiff::RecursionGuard.guarding_recursion_of(
31
- value
32
- ) do |already_seen|
28
+ RecursionGuard.guarding_recursion_of(value) do |already_seen|
33
29
  if already_seen
34
30
  [
35
- SuperDiff::Line.new(
31
+ SuperDiff::Core::Line.new(
36
32
  type: type,
37
33
  indentation_level: indentation_level,
38
- value: SuperDiff::RecursionGuard::PLACEHOLDER
34
+ value: RecursionGuard::PLACEHOLDER
39
35
  )
40
36
  ]
41
37
  else
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class Nesting < Base
5
5
  def self.node_name
6
6
  :nesting
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class OnlyWhen < Base
5
5
  def self.node_name
6
6
  :only_when
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class Text < Base
5
5
  def self.node_name
6
6
  :text
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class WhenEmpty < Base
5
5
  def self.node_name
6
6
  :when_empty
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class WhenNonEmpty < Base
5
5
  def self.node_name
6
6
  :when_non_empty
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class WhenRenderingToLines < Base
5
5
  def self.node_name
6
6
  :when_rendering_to_lines
@@ -1,6 +1,6 @@
1
1
  module SuperDiff
2
- module ObjectInspection
3
- module Nodes
2
+ module Core
3
+ module InspectionTreeNodes
4
4
  class WhenRenderingToString < Base
5
5
  def self.node_name
6
6
  :when_rendering_to_string