super_diff 0.10.0 → 0.12.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.

Potentially problematic release.


This version of super_diff might be problematic. Click here for more details.

Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -166
  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 -14
  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/basic/inspection_tree_builders/array.rb +53 -0
  35. data/lib/super_diff/basic/inspection_tree_builders/custom_object.rb +41 -0
  36. data/lib/super_diff/basic/inspection_tree_builders/date_like.rb +51 -0
  37. data/lib/super_diff/basic/inspection_tree_builders/default_object.rb +77 -0
  38. data/lib/super_diff/basic/inspection_tree_builders/hash.rb +63 -0
  39. data/lib/super_diff/basic/inspection_tree_builders/primitive.rb +19 -0
  40. data/lib/super_diff/basic/inspection_tree_builders/time_like.rb +58 -0
  41. data/lib/super_diff/basic/inspection_tree_builders.rb +20 -0
  42. data/lib/super_diff/basic/operation_tree_builders/array.rb +111 -0
  43. data/lib/super_diff/basic/operation_tree_builders/custom_object.rb +42 -0
  44. data/lib/super_diff/basic/operation_tree_builders/date_like.rb +17 -0
  45. data/lib/super_diff/basic/operation_tree_builders/default_object.rb +117 -0
  46. data/lib/super_diff/basic/operation_tree_builders/hash.rb +222 -0
  47. data/lib/super_diff/basic/operation_tree_builders/multiline_string.rb +90 -0
  48. data/lib/super_diff/basic/operation_tree_builders/time_like.rb +26 -0
  49. data/lib/super_diff/basic/operation_tree_builders.rb +34 -0
  50. data/lib/super_diff/basic/operation_tree_flatteners/array.rb +17 -0
  51. data/lib/super_diff/basic/operation_tree_flatteners/collection.rb +140 -0
  52. data/lib/super_diff/basic/operation_tree_flatteners/custom_object.rb +30 -0
  53. data/lib/super_diff/basic/operation_tree_flatteners/default_object.rb +32 -0
  54. data/lib/super_diff/basic/operation_tree_flatteners/hash.rb +35 -0
  55. data/lib/super_diff/basic/operation_tree_flatteners/multiline_string.rb +20 -0
  56. data/lib/super_diff/basic/operation_tree_flatteners.rb +24 -0
  57. data/lib/super_diff/basic/operation_trees/array.rb +17 -0
  58. data/lib/super_diff/basic/operation_trees/custom_object.rb +17 -0
  59. data/lib/super_diff/basic/operation_trees/default_object.rb +42 -0
  60. data/lib/super_diff/basic/operation_trees/hash.rb +17 -0
  61. data/lib/super_diff/basic/operation_trees/multiline_string.rb +17 -0
  62. data/lib/super_diff/basic/operation_trees.rb +25 -0
  63. data/lib/super_diff/basic.rb +48 -0
  64. data/lib/super_diff/{differs/base.rb → core/abstract_differ.rb} +2 -2
  65. data/lib/super_diff/core/abstract_inspection_tree_builder.rb +26 -0
  66. data/lib/super_diff/{operation_trees/base.rb → core/abstract_operation_tree.rb} +6 -2
  67. data/lib/super_diff/{operation_tree_builders/base.rb → core/abstract_operation_tree_builder.rb} +4 -8
  68. data/lib/super_diff/{operation_tree_flatteners/base.rb → core/abstract_operation_tree_flattener.rb} +2 -2
  69. data/lib/super_diff/{operations → core}/binary_operation.rb +1 -1
  70. data/lib/super_diff/core/colorized_document_extensions.rb +20 -0
  71. data/lib/super_diff/core/configuration.rb +192 -0
  72. data/lib/super_diff/core/differ_dispatcher.rb +33 -0
  73. data/lib/super_diff/core/gem_version.rb +47 -0
  74. data/lib/super_diff/core/helpers.rb +88 -0
  75. data/lib/super_diff/core/implementation_checks.rb +21 -0
  76. data/lib/super_diff/{object_inspection → core}/inspection_tree.rb +32 -26
  77. data/lib/super_diff/core/inspection_tree_builder_dispatcher.rb +23 -0
  78. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/as_lines_when_rendering_to_lines.rb +12 -5
  79. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/as_prefix_when_rendering_to_lines.rb +3 -3
  80. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/as_prelude_when_rendering_to_lines.rb +3 -3
  81. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/as_single_line.rb +3 -3
  82. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/base.rb +2 -2
  83. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/inspection.rb +7 -11
  84. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/nesting.rb +2 -2
  85. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/only_when.rb +2 -2
  86. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/text.rb +2 -2
  87. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/when_empty.rb +2 -2
  88. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/when_non_empty.rb +2 -2
  89. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/when_rendering_to_lines.rb +2 -2
  90. data/lib/super_diff/{object_inspection/nodes → core/inspection_tree_nodes}/when_rendering_to_string.rb +2 -2
  91. data/lib/super_diff/core/inspection_tree_nodes.rb +55 -0
  92. data/lib/super_diff/core/line.rb +85 -0
  93. data/lib/super_diff/{errors → core}/no_differ_available_error.rb +1 -1
  94. data/lib/super_diff/core/no_inspection_tree_builder_available_error.rb +21 -0
  95. data/lib/super_diff/core/no_operation_tree_available_error.rb +20 -0
  96. data/lib/super_diff/{errors/no_operational_sequencer_available_error.rb → core/no_operation_tree_builder_available_error.rb} +6 -4
  97. data/lib/super_diff/{operation_tree_builders/main.rb → core/operation_tree_builder_dispatcher.rb} +9 -13
  98. data/lib/super_diff/core/operation_tree_finder.rb +27 -0
  99. data/lib/super_diff/core/prefix_for_next_inspection_tree_node.rb +6 -0
  100. data/lib/super_diff/core/prelude_for_next_inspection_tree_node.rb +6 -0
  101. data/lib/super_diff/core/recursion_guard.rb +52 -0
  102. data/lib/super_diff/core/tiered_lines.rb +6 -0
  103. data/lib/super_diff/core/tiered_lines_elider.rb +472 -0
  104. data/lib/super_diff/core/tiered_lines_formatter.rb +77 -0
  105. data/lib/super_diff/{operations → core}/unary_operation.rb +1 -1
  106. data/lib/super_diff/core.rb +69 -0
  107. data/lib/super_diff/differs.rb +19 -11
  108. data/lib/super_diff/equality_matchers/array.rb +3 -3
  109. data/lib/super_diff/equality_matchers/default.rb +8 -3
  110. data/lib/super_diff/equality_matchers/hash.rb +3 -3
  111. data/lib/super_diff/equality_matchers/multiline_string.rb +3 -3
  112. data/lib/super_diff/equality_matchers/primitive.rb +3 -3
  113. data/lib/super_diff/equality_matchers/singleline_string.rb +2 -2
  114. data/lib/super_diff/errors.rb +12 -12
  115. data/lib/super_diff/object_inspection.rb +63 -14
  116. data/lib/super_diff/operation_tree_builders.rb +19 -14
  117. data/lib/super_diff/operation_tree_flatteners.rb +19 -16
  118. data/lib/super_diff/operation_trees.rb +19 -9
  119. data/lib/super_diff/operations.rb +12 -2
  120. data/lib/super_diff/rspec/augmented_matcher.rb +1 -1
  121. data/lib/super_diff/rspec/differ.rb +4 -5
  122. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +1 -1
  123. data/lib/super_diff/rspec/differs/collection_including.rb +1 -1
  124. data/lib/super_diff/rspec/differs/hash_including.rb +1 -1
  125. data/lib/super_diff/rspec/differs/object_having_attributes.rb +1 -1
  126. data/lib/super_diff/rspec/inspection_tree_builders/collection_containing_exactly.rb +34 -0
  127. data/lib/super_diff/rspec/inspection_tree_builders/collection_including.rb +40 -0
  128. data/lib/super_diff/rspec/inspection_tree_builders/double.rb +100 -0
  129. data/lib/super_diff/rspec/inspection_tree_builders/generic_describable_matcher.rb +17 -0
  130. data/lib/super_diff/rspec/inspection_tree_builders/hash_including.rb +40 -0
  131. data/lib/super_diff/rspec/inspection_tree_builders/instance_of.rb +25 -0
  132. data/lib/super_diff/rspec/inspection_tree_builders/kind_of.rb +25 -0
  133. data/lib/super_diff/rspec/inspection_tree_builders/object_having_attributes.rb +34 -0
  134. data/lib/super_diff/rspec/inspection_tree_builders/primitive.rb +9 -0
  135. data/lib/super_diff/rspec/inspection_tree_builders/value_within.rb +30 -0
  136. data/lib/super_diff/rspec/inspection_tree_builders.rb +40 -0
  137. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +3 -7
  138. data/lib/super_diff/rspec/monkey_patches.rb +59 -8
  139. data/lib/super_diff/rspec/object_inspection.rb +14 -4
  140. data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +4 -4
  141. data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +1 -1
  142. data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +1 -1
  143. data/lib/super_diff/rspec/operation_tree_builders/object_having_attributes.rb +2 -2
  144. data/lib/super_diff/rspec.rb +28 -25
  145. data/lib/super_diff/version.rb +1 -1
  146. data/lib/super_diff.rb +78 -21
  147. data/spec/examples.txt +704 -493
  148. data/spec/integration/rails/engines_spec.rb +8 -3
  149. data/spec/integration/rspec/contain_exactly_matcher_spec.rb +19 -19
  150. data/spec/integration/rspec/eq_matcher_spec.rb +111 -39
  151. data/spec/integration/rspec/generic_describable_matchers_spec.rb +177 -0
  152. data/spec/integration/rspec/have_attributes_matcher_spec.rb +25 -25
  153. data/spec/integration/rspec/include_matcher_spec.rb +23 -23
  154. data/spec/integration/rspec/magic_metadata_spec.rb +51 -0
  155. data/spec/integration/rspec/match_array_matcher_spec.rb +30 -30
  156. data/spec/integration/rspec/match_matcher_spec.rb +93 -93
  157. data/spec/integration/rspec/raise_error_matcher_spec.rb +813 -69
  158. data/spec/internal/log/test.log +0 -0
  159. data/spec/spec_helper.rb +3 -0
  160. data/spec/support/integration/helpers.rb +19 -11
  161. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +1 -1
  162. data/spec/support/integration/matchers.rb +34 -0
  163. data/spec/support/integration/test_programs/base.rb +6 -6
  164. data/spec/support/integration/test_programs/rspec_rails_engine.rb +3 -13
  165. data/spec/support/models/active_record/person.rb +8 -1
  166. data/spec/support/shared_examples/active_record.rb +38 -38
  167. data/spec/support/shared_examples/active_support.rb +125 -4
  168. data/spec/support/shared_examples/elided_diffs.rb +48 -48
  169. data/spec/support/shared_examples/hash_with_indifferent_access.rb +88 -88
  170. data/spec/support/shared_examples/key.rb +10 -10
  171. data/spec/support/unit/helpers.rb +12 -1
  172. data/spec/support/unit/matchers/be_deprecated_in_favor_of.rb +39 -0
  173. data/spec/unit/active_record/object_inspection_spec.rb +5 -5
  174. data/spec/unit/active_support/object_inspection_spec.rb +170 -0
  175. data/spec/unit/{operation_tree_flatteners → basic/operation_tree_flatteners}/array_spec.rb +8 -8
  176. data/spec/unit/{operation_tree_flatteners → basic/operation_tree_flatteners}/custom_object_spec.rb +9 -9
  177. data/spec/unit/{operation_tree_flatteners → basic/operation_tree_flatteners}/default_object_spec.rb +9 -9
  178. data/spec/unit/{operation_tree_flatteners → basic/operation_tree_flatteners}/hash_spec.rb +8 -8
  179. data/spec/unit/{operation_tree_flatteners → basic/operation_tree_flatteners}/multiline_string_spec.rb +4 -4
  180. data/spec/unit/{helpers_spec.rb → core/helpers_spec.rb} +2 -2
  181. data/spec/unit/{tiered_lines_elider_spec.rb → core/tiered_lines_elider_spec.rb} +2 -2
  182. data/spec/unit/{tiered_lines_formatter_spec.rb → core/tiered_lines_formatter_spec.rb} +1 -1
  183. data/spec/unit/deprecations_spec.rb +176 -0
  184. data/spec/unit/equality_matchers/main_spec.rb +5 -5
  185. data/spec/unit/rspec/matchers/raise_error_spec.rb +43 -11
  186. data/spec/unit/rspec/object_inspection/rspec_matcher_spec.rb +91 -0
  187. data/spec/unit/rspec/object_inspection_spec.rb +2 -2
  188. data/spec/unit/super_diff_spec.rb +64 -0
  189. data/super_diff.gemspec +6 -0
  190. metadata +137 -112
  191. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_model.rb +0 -39
  192. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_relation.rb +0 -27
  193. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders.rb +0 -16
  194. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/hash_with_indifferent_access.rb +0 -31
  195. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders.rb +0 -12
  196. data/lib/super_diff/colorized_document_extensions.rb +0 -18
  197. data/lib/super_diff/configuration.rb +0 -149
  198. data/lib/super_diff/diff_formatters/collection.rb +0 -132
  199. data/lib/super_diff/diff_formatters/multiline_string.rb +0 -31
  200. data/lib/super_diff/differs/array.rb +0 -15
  201. data/lib/super_diff/differs/custom_object.rb +0 -17
  202. data/lib/super_diff/differs/default_object.rb +0 -19
  203. data/lib/super_diff/differs/defaults.rb +0 -12
  204. data/lib/super_diff/differs/empty.rb +0 -13
  205. data/lib/super_diff/differs/hash.rb +0 -15
  206. data/lib/super_diff/differs/main.rb +0 -31
  207. data/lib/super_diff/differs/multiline_string.rb +0 -16
  208. data/lib/super_diff/differs/time_like.rb +0 -15
  209. data/lib/super_diff/errors/no_diff_formatter_available_error.rb +0 -21
  210. data/lib/super_diff/gem_version.rb +0 -45
  211. data/lib/super_diff/helpers.rb +0 -86
  212. data/lib/super_diff/implementation_checks.rb +0 -19
  213. data/lib/super_diff/line.rb +0 -83
  214. data/lib/super_diff/object_inspection/inspection_tree_builders/array.rb +0 -34
  215. data/lib/super_diff/object_inspection/inspection_tree_builders/base.rb +0 -27
  216. data/lib/super_diff/object_inspection/inspection_tree_builders/custom_object.rb +0 -31
  217. data/lib/super_diff/object_inspection/inspection_tree_builders/default_object.rb +0 -54
  218. data/lib/super_diff/object_inspection/inspection_tree_builders/defaults.rb +0 -14
  219. data/lib/super_diff/object_inspection/inspection_tree_builders/hash.rb +0 -38
  220. data/lib/super_diff/object_inspection/inspection_tree_builders/main.rb +0 -30
  221. data/lib/super_diff/object_inspection/inspection_tree_builders/primitive.rb +0 -21
  222. data/lib/super_diff/object_inspection/inspection_tree_builders/time_like.rb +0 -47
  223. data/lib/super_diff/object_inspection/inspection_tree_builders.rb +0 -44
  224. data/lib/super_diff/object_inspection/nodes.rb +0 -50
  225. data/lib/super_diff/object_inspection/prefix_for_next_node.rb +0 -6
  226. data/lib/super_diff/object_inspection/prelude_for_next_node.rb +0 -6
  227. data/lib/super_diff/operation_tree_builders/array.rb +0 -107
  228. data/lib/super_diff/operation_tree_builders/custom_object.rb +0 -40
  229. data/lib/super_diff/operation_tree_builders/default_object.rb +0 -119
  230. data/lib/super_diff/operation_tree_builders/defaults.rb +0 -5
  231. data/lib/super_diff/operation_tree_builders/hash.rb +0 -218
  232. data/lib/super_diff/operation_tree_builders/multiline_string.rb +0 -86
  233. data/lib/super_diff/operation_tree_builders/time_like.rb +0 -24
  234. data/lib/super_diff/operation_tree_flatteners/array.rb +0 -15
  235. data/lib/super_diff/operation_tree_flatteners/collection.rb +0 -136
  236. data/lib/super_diff/operation_tree_flatteners/custom_object.rb +0 -28
  237. data/lib/super_diff/operation_tree_flatteners/default_object.rb +0 -31
  238. data/lib/super_diff/operation_tree_flatteners/hash.rb +0 -33
  239. data/lib/super_diff/operation_tree_flatteners/multiline_string.rb +0 -18
  240. data/lib/super_diff/operation_trees/array.rb +0 -15
  241. data/lib/super_diff/operation_trees/custom_object.rb +0 -15
  242. data/lib/super_diff/operation_trees/default_object.rb +0 -40
  243. data/lib/super_diff/operation_trees/defaults.rb +0 -5
  244. data/lib/super_diff/operation_trees/hash.rb +0 -15
  245. data/lib/super_diff/operation_trees/main.rb +0 -35
  246. data/lib/super_diff/operation_trees/multiline_string.rb +0 -15
  247. data/lib/super_diff/recursion_guard.rb +0 -50
  248. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_containing_exactly.rb +0 -29
  249. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_including.rb +0 -36
  250. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/double.rb +0 -98
  251. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/hash_including.rb +0 -37
  252. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/instance_of.rb +0 -28
  253. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/kind_of.rb +0 -28
  254. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/object_having_attributes.rb +0 -29
  255. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/primitive.rb +0 -10
  256. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/value_within.rb +0 -33
  257. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders.rb +0 -44
  258. data/lib/super_diff/tiered_lines.rb +0 -4
  259. data/lib/super_diff/tiered_lines_elider.rb +0 -462
  260. data/lib/super_diff/tiered_lines_formatter.rb +0 -75
@@ -1,7 +1,7 @@
1
1
  module SuperDiff
2
2
  module ActiveSupport
3
3
  module OperationTrees
4
- class HashWithIndifferentAccess < SuperDiff::OperationTrees::Base
4
+ class HashWithIndifferentAccess < Core::AbstractOperationTree
5
5
  protected
6
6
 
7
7
  def operation_tree_flattener_class
@@ -1,24 +1,21 @@
1
+ require "super_diff/active_support/differs"
2
+ require "super_diff/active_support/inspection_tree_builders"
3
+ require "super_diff/active_support/operation_trees"
4
+ require "super_diff/active_support/operation_tree_builders"
5
+ require "super_diff/active_support/operation_tree_flatteners"
6
+
1
7
  module SuperDiff
2
8
  module ActiveSupport
3
- autoload :Differs, "super_diff/active_support/differs"
4
9
  autoload :ObjectInspection, "super_diff/active_support/object_inspection"
5
- autoload(:OperationTrees, "super_diff/active_support/operation_trees")
6
- autoload(
7
- :OperationTreeBuilders,
8
- "super_diff/active_support/operation_tree_builders"
9
- )
10
- autoload(
11
- :OperationTreeFlatteners,
12
- "super_diff/active_support/operation_tree_flatteners"
13
- )
14
10
 
15
11
  SuperDiff.configure do |config|
16
- config.add_extra_differ_classes(Differs::HashWithIndifferentAccess)
17
- config.add_extra_operation_tree_builder_classes(
12
+ config.prepend_extra_differ_classes(Differs::HashWithIndifferentAccess)
13
+ config.prepend_extra_operation_tree_builder_classes(
18
14
  OperationTreeBuilders::HashWithIndifferentAccess
19
15
  )
20
- config.add_extra_inspection_tree_builder_classes(
21
- ObjectInspection::InspectionTreeBuilders::HashWithIndifferentAccess
16
+ config.prepend_extra_inspection_tree_builder_classes(
17
+ InspectionTreeBuilders::HashWithIndifferentAccess,
18
+ InspectionTreeBuilders::OrderedOptions
22
19
  )
23
20
  end
24
21
  end
@@ -0,0 +1,135 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module DiffFormatters
4
+ # TODO: Remove
5
+ class Collection
6
+ extend AttrExtras.mixin
7
+
8
+ ICONS = { delete: "-", insert: "+" }.freeze
9
+ STYLES = { insert: :actual, delete: :expected, noop: :plain }.freeze
10
+
11
+ method_object(
12
+ %i[
13
+ open_token!
14
+ close_token!
15
+ operation_tree!
16
+ indent_level!
17
+ add_comma!
18
+ collection_prefix!
19
+ build_item_prefix!
20
+ ]
21
+ )
22
+
23
+ def call
24
+ lines.join("\n")
25
+ end
26
+
27
+ private
28
+
29
+ attr_query :add_comma?
30
+
31
+ def lines
32
+ [
33
+ " #{indentation}#{collection_prefix}#{open_token}",
34
+ *contents,
35
+ " #{indentation}#{close_token}#{comma}"
36
+ ]
37
+ end
38
+
39
+ def contents
40
+ operation_tree.map do |operation|
41
+ if operation.name == :change
42
+ handle_change_operation(operation)
43
+ else
44
+ handle_non_change_operation(operation)
45
+ end
46
+ end
47
+ end
48
+
49
+ def handle_change_operation(operation)
50
+ SuperDiff::RecursionGuard.guarding_recursion_of(
51
+ operation.left_collection,
52
+ operation.right_collection
53
+ ) do |already_seen|
54
+ if already_seen
55
+ raise "Infinite recursion!"
56
+ else
57
+ operation.child_operations.to_diff(
58
+ indent_level: indent_level + 1,
59
+ collection_prefix: build_item_prefix.call(operation),
60
+ add_comma: operation.should_add_comma_after_displaying?
61
+ )
62
+ end
63
+ end
64
+ end
65
+
66
+ def handle_non_change_operation(operation)
67
+ icon = ICONS.fetch(operation.name, " ")
68
+ style_name = STYLES.fetch(operation.name, :normal)
69
+ chunk =
70
+ build_chunk_for(
71
+ operation,
72
+ prefix: build_item_prefix.call(operation),
73
+ icon: icon
74
+ )
75
+
76
+ chunk << "," if operation.should_add_comma_after_displaying?
77
+
78
+ style_chunk(style_name, chunk)
79
+ end
80
+
81
+ def build_chunk_for(operation, prefix:, icon:)
82
+ if operation.value.equal?(operation.collection)
83
+ build_chunk_from_string(
84
+ SuperDiff::RecursionGuard::PLACEHOLDER,
85
+ prefix: build_item_prefix.call(operation),
86
+ icon: icon
87
+ )
88
+ else
89
+ build_chunk_by_inspecting(
90
+ operation.value,
91
+ prefix: build_item_prefix.call(operation),
92
+ icon: icon
93
+ )
94
+ end
95
+ end
96
+
97
+ def build_chunk_by_inspecting(value, prefix:, icon:)
98
+ inspection = SuperDiff.inspect_object(value, as_single_line: false)
99
+ build_chunk_from_string(inspection, prefix: prefix, icon: icon)
100
+ end
101
+
102
+ def build_chunk_from_string(value, prefix:, icon:)
103
+ value
104
+ .split("\n")
105
+ .map
106
+ .with_index do |line, index|
107
+ [
108
+ icon,
109
+ " ",
110
+ indentation(offset: 1),
111
+ (index == 0 ? prefix : ""),
112
+ line
113
+ ].join
114
+ end
115
+ .join("\n")
116
+ end
117
+
118
+ def style_chunk(style_name, chunk)
119
+ chunk
120
+ .split("\n")
121
+ .map { |line| Helpers.style(style_name, line) }
122
+ .join("\n")
123
+ end
124
+
125
+ def indentation(offset: 0)
126
+ " " * (indent_level + offset)
127
+ end
128
+
129
+ def comma
130
+ add_comma? ? "," : ""
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,34 @@
1
+ module SuperDiff
2
+ module Core
3
+ module DiffFormatters
4
+ # TODO: Remove
5
+ class MultilineString < Base
6
+ def self.applies_to?(operation_tree)
7
+ operation_tree.is_a?(OperationTrees::MultilineString)
8
+ end
9
+
10
+ def call
11
+ lines.join("\n")
12
+ end
13
+
14
+ private
15
+
16
+ def lines
17
+ operation_tree.reduce([]) do |array, operation|
18
+ case operation.name
19
+ when :change
20
+ array << Helpers.style(:expected, "- #{operation.left_value}")
21
+ array << Helpers.style(:actual, "+ #{operation.right_value}")
22
+ when :delete
23
+ array << Helpers.style(:expected, "- #{operation.value}")
24
+ when :insert
25
+ array << Helpers.style(:actual, "+ #{operation.value}")
26
+ else
27
+ array << Helpers.style(:plain, " #{operation.value}")
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,11 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module DiffFormatters
4
+ autoload :Collection, "super_diff/basic/diff_formatters/collection"
5
+ autoload(
6
+ :MultilineString,
7
+ "super_diff/basic/diff_formatters/multiline_string"
8
+ )
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module Differs
4
+ class Array < Core::AbstractDiffer
5
+ def self.applies_to?(expected, actual)
6
+ expected.is_a?(::Array) && actual.is_a?(::Array)
7
+ end
8
+
9
+ protected
10
+
11
+ def operation_tree_builder_class
12
+ OperationTreeBuilders::Array
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module Differs
4
+ class CustomObject < Core::AbstractDiffer
5
+ def self.applies_to?(expected, actual)
6
+ expected.class == actual.class &&
7
+ expected.respond_to?(:attributes_for_super_diff) &&
8
+ actual.respond_to?(:attributes_for_super_diff)
9
+ end
10
+
11
+ protected
12
+
13
+ def operation_tree_builder_class
14
+ OperationTreeBuilders::CustomObject
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module Differs
4
+ class DateLike < Core::AbstractDiffer
5
+ def self.applies_to?(expected, actual)
6
+ SuperDiff.date_like?(expected) && SuperDiff.date_like?(actual)
7
+ end
8
+
9
+ protected
10
+
11
+ def operation_tree_builder_class
12
+ OperationTreeBuilders::DateLike
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module Differs
4
+ class DefaultObject < Core::AbstractDiffer
5
+ def self.applies_to?(expected, actual)
6
+ expected.class == actual.class
7
+ end
8
+
9
+ protected
10
+
11
+ def operation_tree
12
+ SuperDiff.build_operation_tree_for(
13
+ expected,
14
+ actual,
15
+ extra_operation_tree_builder_classes: [
16
+ SuperDiff::Basic::OperationTreeBuilders::DefaultObject
17
+ ],
18
+ raise_if_nothing_applies: true
19
+ )
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module Differs
4
+ class Hash < Core::AbstractDiffer
5
+ def self.applies_to?(expected, actual)
6
+ expected.is_a?(::Hash) && actual.is_a?(::Hash)
7
+ end
8
+
9
+ protected
10
+
11
+ def operation_tree_builder_class
12
+ OperationTreeBuilders::Hash
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module Differs
4
+ class MultilineString < Core::AbstractDiffer
5
+ def self.applies_to?(expected, actual)
6
+ expected.is_a?(::String) && actual.is_a?(::String) &&
7
+ (expected.include?("\n") || actual.include?("\n"))
8
+ end
9
+
10
+ protected
11
+
12
+ def operation_tree_builder_class
13
+ OperationTreeBuilders::MultilineString
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module Differs
4
+ class TimeLike < Core::AbstractDiffer
5
+ def self.applies_to?(expected, actual)
6
+ SuperDiff.time_like?(expected) && SuperDiff.time_like?(actual)
7
+ end
8
+
9
+ protected
10
+
11
+ def operation_tree_builder_class
12
+ OperationTreeBuilders::TimeLike
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module Differs
4
+ autoload :Array, "super_diff/basic/differs/array"
5
+ autoload :CustomObject, "super_diff/basic/differs/custom_object"
6
+ autoload :DateLike, "super_diff/basic/differs/date_like"
7
+ autoload :DefaultObject, "super_diff/basic/differs/default_object"
8
+ autoload :Hash, "super_diff/basic/differs/hash"
9
+ autoload :MultilineString, "super_diff/basic/differs/multiline_string"
10
+ autoload :TimeLike, "super_diff/basic/differs/time_like"
11
+
12
+ class Main
13
+ def self.call(*args)
14
+ warn <<~EOT
15
+ WARNING: SuperDiff::Differs::Main.call(...) is deprecated and will be removed in the next major release.
16
+ Please use SuperDiff.diff(...) instead.
17
+ #{caller_locations.join("\n")}
18
+ EOT
19
+ SuperDiff.diff(*args)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,53 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module InspectionTreeBuilders
4
+ class Array < Core::AbstractInspectionTreeBuilder
5
+ def self.applies_to?(value)
6
+ value.is_a?(::Array)
7
+ end
8
+
9
+ def call
10
+ Core::InspectionTree.new do |t1|
11
+ t1.only_when empty do |t2|
12
+ # stree-ignore
13
+ t2.as_lines_when_rendering_to_lines do |t3|
14
+ t3.add_text "[]"
15
+ end
16
+ end
17
+
18
+ t1.only_when nonempty do |t2|
19
+ # stree-ignore
20
+ t2.as_lines_when_rendering_to_lines(
21
+ collection_bookend: :open
22
+ ) do |t3|
23
+ t3.add_text "["
24
+ end
25
+
26
+ # stree-ignore
27
+ t2.nested do |t3|
28
+ t3.insert_array_inspection_of(object)
29
+ end
30
+
31
+ # stree-ignore
32
+ t2.as_lines_when_rendering_to_lines(
33
+ collection_bookend: :close
34
+ ) do |t3|
35
+ t3.add_text "]"
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def empty
44
+ -> { object.empty? }
45
+ end
46
+
47
+ def nonempty
48
+ -> { !object.empty? }
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,41 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module InspectionTreeBuilders
4
+ class CustomObject < Core::AbstractInspectionTreeBuilder
5
+ def self.applies_to?(value)
6
+ value.respond_to?(:attributes_for_super_diff)
7
+ end
8
+
9
+ def call
10
+ Core::InspectionTree.new do |t1|
11
+ t1.as_lines_when_rendering_to_lines(
12
+ collection_bookend: :open
13
+ ) do |t2|
14
+ t2.add_text "#<#{object.class} "
15
+
16
+ # stree-ignore
17
+ t2.when_rendering_to_lines do |t3|
18
+ t3.add_text "{"
19
+ end
20
+ end
21
+
22
+ t1.nested do |t2|
23
+ t2.insert_hash_inspection_of(object.attributes_for_super_diff)
24
+ end
25
+
26
+ t1.as_lines_when_rendering_to_lines(
27
+ collection_bookend: :close
28
+ ) do |t2|
29
+ # stree-ignore
30
+ t2.when_rendering_to_lines do |t3|
31
+ t3.add_text "}"
32
+ end
33
+
34
+ t2.add_text ">"
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,51 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module InspectionTreeBuilders
4
+ class DateLike < Core::AbstractInspectionTreeBuilder
5
+ def self.applies_to?(value)
6
+ SuperDiff.date_like?(value)
7
+ end
8
+
9
+ def call
10
+ Core::InspectionTree.new do |t1|
11
+ t1.as_lines_when_rendering_to_lines(
12
+ collection_bookend: :open
13
+ ) do |t2|
14
+ t2.add_text "#<#{object.class} "
15
+
16
+ # stree-ignore
17
+ t2.when_rendering_to_lines do |t3|
18
+ t3.add_text "{"
19
+ end
20
+ end
21
+
22
+ t1.when_rendering_to_string do |t2|
23
+ t2.add_text object.strftime("%Y-%m-%d")
24
+ end
25
+
26
+ t1.when_rendering_to_lines do |t2|
27
+ t2.nested do |t3|
28
+ t3.insert_separated_list(%i[year month day]) do |t4, name|
29
+ t4.add_text name.to_s
30
+ t4.add_text ": "
31
+ t4.add_inspection_of object.public_send(name)
32
+ end
33
+ end
34
+ end
35
+
36
+ t1.as_lines_when_rendering_to_lines(
37
+ collection_bookend: :close
38
+ ) do |t2|
39
+ # stree-ignore
40
+ t2.when_rendering_to_lines do |t3|
41
+ t3.add_text "}"
42
+ end
43
+
44
+ t2.add_text ">"
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,77 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module InspectionTreeBuilders
4
+ class DefaultObject < Core::AbstractInspectionTreeBuilder
5
+ def self.applies_to?(_value)
6
+ true
7
+ end
8
+
9
+ def call
10
+ Core::InspectionTree.new do |t1|
11
+ t1.only_when empty do |t2|
12
+ t2.as_lines_when_rendering_to_lines do |t3|
13
+ t3.add_text(
14
+ "#<#{object.class.name}:" + object_address_for(object) + ">"
15
+ )
16
+ end
17
+ end
18
+
19
+ t1.only_when nonempty do |t2|
20
+ t2.as_lines_when_rendering_to_lines(
21
+ collection_bookend: :open
22
+ ) do |t3|
23
+ t3.add_text(
24
+ "#<#{object.class.name}:" + object_address_for(object)
25
+ )
26
+
27
+ # stree-ignore
28
+ t3.when_rendering_to_lines do |t4|
29
+ t4.add_text " {"
30
+ end
31
+ end
32
+
33
+ # stree-ignore
34
+ t2.when_rendering_to_string do |t3|
35
+ t3.add_text " "
36
+ end
37
+
38
+ t2.nested do |t3|
39
+ t3.insert_separated_list(
40
+ object.instance_variables.sort
41
+ ) do |t4, name|
42
+ # stree-ignore
43
+ t4.as_prefix_when_rendering_to_lines do |t5|
44
+ t5.add_text "#{name}="
45
+ end
46
+
47
+ t4.add_inspection_of object.instance_variable_get(name)
48
+ end
49
+ end
50
+
51
+ t2.as_lines_when_rendering_to_lines(
52
+ collection_bookend: :close
53
+ ) do |t3|
54
+ # stree-ignore
55
+ t3.when_rendering_to_lines do |t4|
56
+ t4.add_text "}"
57
+ end
58
+
59
+ t3.add_text ">"
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def empty
68
+ -> { object.instance_variables.empty? }
69
+ end
70
+
71
+ def nonempty
72
+ -> { !object.instance_variables.empty? }
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,63 @@
1
+ module SuperDiff
2
+ module Basic
3
+ module InspectionTreeBuilders
4
+ class Hash < Core::AbstractInspectionTreeBuilder
5
+ def self.applies_to?(value)
6
+ value.is_a?(::Hash)
7
+ end
8
+
9
+ def call
10
+ Core::InspectionTree.new do |t1|
11
+ t1.only_when empty do |t2|
12
+ # stree-ignore
13
+ t2.as_lines_when_rendering_to_lines do |t3|
14
+ t3.add_text "{}"
15
+ end
16
+ end
17
+
18
+ t1.only_when nonempty do |t2|
19
+ # stree-ignore
20
+ t2.as_lines_when_rendering_to_lines(
21
+ collection_bookend: :open
22
+ ) do |t3|
23
+ t3.add_text "{"
24
+ end
25
+
26
+ # stree-ignore
27
+ t2.when_rendering_to_string do |t3|
28
+ t3.add_text " "
29
+ end
30
+
31
+ # stree-ignore
32
+ t2.nested do |t3|
33
+ t3.insert_hash_inspection_of(object)
34
+ end
35
+
36
+ # stree-ignore
37
+ t2.when_rendering_to_string do |t3|
38
+ t3.add_text " "
39
+ end
40
+
41
+ # stree-ignore
42
+ t2.as_lines_when_rendering_to_lines(
43
+ collection_bookend: :close
44
+ ) do |t3|
45
+ t3.add_text "}"
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def empty
54
+ -> { object.empty? }
55
+ end
56
+
57
+ def nonempty
58
+ -> { !object.empty? }
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end