super_diff 0.13.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (275) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/super_diff/active_record/differs/active_record_relation.rb +2 -0
  4. data/lib/super_diff/active_record/differs.rb +3 -1
  5. data/lib/super_diff/active_record/inspection_tree_builders/active_record_model.rb +7 -5
  6. data/lib/super_diff/active_record/inspection_tree_builders/active_record_relation.rb +12 -10
  7. data/lib/super_diff/active_record/inspection_tree_builders.rb +4 -2
  8. data/lib/super_diff/active_record/monkey_patches.rb +4 -2
  9. data/lib/super_diff/active_record/object_inspection.rb +6 -4
  10. data/lib/super_diff/active_record/operation_tree_builders/active_record_model.rb +3 -1
  11. data/lib/super_diff/active_record/operation_tree_builders/active_record_relation.rb +3 -1
  12. data/lib/super_diff/active_record/operation_tree_builders.rb +4 -2
  13. data/lib/super_diff/active_record/operation_tree_flatteners/active_record_relation.rb +4 -2
  14. data/lib/super_diff/active_record/operation_tree_flatteners.rb +3 -1
  15. data/lib/super_diff/active_record/operation_trees/active_record_relation.rb +2 -0
  16. data/lib/super_diff/active_record/operation_trees.rb +3 -1
  17. data/lib/super_diff/active_record.rb +10 -8
  18. data/lib/super_diff/active_support/differs/hash_with_indifferent_access.rb +2 -0
  19. data/lib/super_diff/active_support/differs.rb +3 -1
  20. data/lib/super_diff/active_support/inspection_tree_builders/hash_with_indifferent_access.rb +16 -14
  21. data/lib/super_diff/active_support/inspection_tree_builders/ordered_options.rb +16 -14
  22. data/lib/super_diff/active_support/inspection_tree_builders.rb +4 -2
  23. data/lib/super_diff/active_support/object_inspection.rb +6 -4
  24. data/lib/super_diff/active_support/operation_tree_builders/hash_with_indifferent_access.rb +6 -4
  25. data/lib/super_diff/active_support/operation_tree_builders.rb +3 -1
  26. data/lib/super_diff/active_support/operation_tree_flatteners/hash_with_indifferent_access.rb +4 -2
  27. data/lib/super_diff/active_support/operation_tree_flatteners.rb +3 -1
  28. data/lib/super_diff/active_support/operation_trees/hash_with_indifferent_access.rb +2 -0
  29. data/lib/super_diff/active_support/operation_trees.rb +3 -1
  30. data/lib/super_diff/active_support.rb +8 -6
  31. data/lib/super_diff/basic/diff_formatters/collection.rb +18 -18
  32. data/lib/super_diff/basic/diff_formatters/multiline_string.rb +2 -0
  33. data/lib/super_diff/basic/diff_formatters.rb +4 -2
  34. data/lib/super_diff/basic/differs/array.rb +2 -0
  35. data/lib/super_diff/basic/differs/custom_object.rb +3 -1
  36. data/lib/super_diff/basic/differs/date_like.rb +2 -0
  37. data/lib/super_diff/basic/differs/default_object.rb +3 -1
  38. data/lib/super_diff/basic/differs/hash.rb +2 -0
  39. data/lib/super_diff/basic/differs/multiline_string.rb +2 -0
  40. data/lib/super_diff/basic/differs/time_like.rb +2 -0
  41. data/lib/super_diff/basic/differs.rb +11 -9
  42. data/lib/super_diff/basic/inspection_tree_builders/array.rb +5 -3
  43. data/lib/super_diff/basic/inspection_tree_builders/custom_object.rb +5 -3
  44. data/lib/super_diff/basic/inspection_tree_builders/data_object.rb +6 -4
  45. data/lib/super_diff/basic/inspection_tree_builders/date_like.rb +7 -5
  46. data/lib/super_diff/basic/inspection_tree_builders/default_object.rb +7 -5
  47. data/lib/super_diff/basic/inspection_tree_builders/hash.rb +7 -5
  48. data/lib/super_diff/basic/inspection_tree_builders/primitive.rb +2 -0
  49. data/lib/super_diff/basic/inspection_tree_builders/range_object.rb +19 -0
  50. data/lib/super_diff/basic/inspection_tree_builders/time_like.rb +8 -8
  51. data/lib/super_diff/basic/inspection_tree_builders.rb +15 -9
  52. data/lib/super_diff/basic/operation_tree_builders/array.rb +6 -4
  53. data/lib/super_diff/basic/operation_tree_builders/custom_object.rb +3 -1
  54. data/lib/super_diff/basic/operation_tree_builders/data_object.rb +4 -2
  55. data/lib/super_diff/basic/operation_tree_builders/date_like.rb +2 -0
  56. data/lib/super_diff/basic/operation_tree_builders/default_object.rb +32 -31
  57. data/lib/super_diff/basic/operation_tree_builders/hash.rb +49 -46
  58. data/lib/super_diff/basic/operation_tree_builders/multiline_string.rb +5 -3
  59. data/lib/super_diff/basic/operation_tree_builders/time_like.rb +5 -3
  60. data/lib/super_diff/basic/operation_tree_builders.rb +12 -10
  61. data/lib/super_diff/basic/operation_tree_flatteners/array.rb +4 -2
  62. data/lib/super_diff/basic/operation_tree_flatteners/collection.rb +11 -11
  63. data/lib/super_diff/basic/operation_tree_flatteners/custom_object.rb +5 -3
  64. data/lib/super_diff/basic/operation_tree_flatteners/default_object.rb +6 -5
  65. data/lib/super_diff/basic/operation_tree_flatteners/hash.rb +5 -3
  66. data/lib/super_diff/basic/operation_tree_flatteners/multiline_string.rb +3 -1
  67. data/lib/super_diff/basic/operation_tree_flatteners.rb +8 -6
  68. data/lib/super_diff/basic/operation_trees/array.rb +2 -0
  69. data/lib/super_diff/basic/operation_trees/custom_object.rb +2 -0
  70. data/lib/super_diff/basic/operation_trees/default_object.rb +6 -4
  71. data/lib/super_diff/basic/operation_trees/hash.rb +2 -0
  72. data/lib/super_diff/basic/operation_trees/multiline_string.rb +3 -1
  73. data/lib/super_diff/basic/operation_trees.rb +9 -7
  74. data/lib/super_diff/basic.rb +9 -6
  75. data/lib/super_diff/core/abstract_differ.rb +2 -0
  76. data/lib/super_diff/core/abstract_inspection_tree_builder.rb +2 -0
  77. data/lib/super_diff/core/abstract_operation_tree.rb +4 -2
  78. data/lib/super_diff/core/abstract_operation_tree_builder.rb +15 -18
  79. data/lib/super_diff/core/abstract_operation_tree_flattener.rb +5 -3
  80. data/lib/super_diff/core/binary_operation.rb +3 -1
  81. data/lib/super_diff/core/colorized_document_extensions.rb +2 -0
  82. data/lib/super_diff/core/configuration.rb +14 -38
  83. data/lib/super_diff/core/differ_dispatcher.rb +4 -2
  84. data/lib/super_diff/core/gem_version.rb +2 -0
  85. data/lib/super_diff/core/helpers.rb +13 -11
  86. data/lib/super_diff/core/implementation_checks.rb +6 -2
  87. data/lib/super_diff/core/inspection_tree.rb +38 -38
  88. data/lib/super_diff/core/inspection_tree_builder_dispatcher.rb +5 -5
  89. data/lib/super_diff/core/inspection_tree_nodes/as_lines_when_rendering_to_lines.rb +3 -1
  90. data/lib/super_diff/core/inspection_tree_nodes/as_prefix_when_rendering_to_lines.rb +2 -0
  91. data/lib/super_diff/core/inspection_tree_nodes/as_prelude_when_rendering_to_lines.rb +2 -0
  92. data/lib/super_diff/core/inspection_tree_nodes/as_single_line.rb +2 -0
  93. data/lib/super_diff/core/inspection_tree_nodes/base.rb +9 -9
  94. data/lib/super_diff/core/inspection_tree_nodes/inspection.rb +2 -0
  95. data/lib/super_diff/core/inspection_tree_nodes/nesting.rb +2 -0
  96. data/lib/super_diff/core/inspection_tree_nodes/only_when.rb +5 -1
  97. data/lib/super_diff/core/inspection_tree_nodes/text.rb +2 -0
  98. data/lib/super_diff/core/inspection_tree_nodes/when_empty.rb +3 -1
  99. data/lib/super_diff/core/inspection_tree_nodes/when_non_empty.rb +3 -1
  100. data/lib/super_diff/core/inspection_tree_nodes/when_rendering_to_lines.rb +3 -1
  101. data/lib/super_diff/core/inspection_tree_nodes/when_rendering_to_string.rb +2 -0
  102. data/lib/super_diff/core/inspection_tree_nodes.rb +16 -14
  103. data/lib/super_diff/core/line.rb +9 -7
  104. data/lib/super_diff/core/no_differ_available_error.rb +7 -5
  105. data/lib/super_diff/core/no_inspection_tree_builder_available_error.rb +5 -3
  106. data/lib/super_diff/core/no_operation_tree_available_error.rb +4 -2
  107. data/lib/super_diff/core/no_operation_tree_builder_available_error.rb +7 -5
  108. data/lib/super_diff/core/operation_tree_builder_dispatcher.rb +3 -3
  109. data/lib/super_diff/core/operation_tree_finder.rb +8 -8
  110. data/lib/super_diff/core/prefix_for_next_inspection_tree_node.rb +2 -0
  111. data/lib/super_diff/core/prelude_for_next_inspection_tree_node.rb +2 -0
  112. data/lib/super_diff/core/recursion_guard.rb +6 -4
  113. data/lib/super_diff/core/tiered_lines.rb +2 -0
  114. data/lib/super_diff/core/tiered_lines_elider.rb +53 -54
  115. data/lib/super_diff/core/tiered_lines_formatter.rb +6 -4
  116. data/lib/super_diff/core/unary_operation.rb +2 -0
  117. data/lib/super_diff/core.rb +31 -29
  118. data/lib/super_diff/csi/bold_sequence.rb +2 -0
  119. data/lib/super_diff/csi/color.rb +4 -4
  120. data/lib/super_diff/csi/color_sequence_block.rb +3 -1
  121. data/lib/super_diff/csi/colorized_document.rb +7 -9
  122. data/lib/super_diff/csi/document.rb +15 -18
  123. data/lib/super_diff/csi/eight_bit_color.rb +32 -37
  124. data/lib/super_diff/csi/four_bit_color.rb +12 -9
  125. data/lib/super_diff/csi/reset_sequence.rb +2 -0
  126. data/lib/super_diff/csi/twenty_four_bit_color.rb +22 -21
  127. data/lib/super_diff/csi/uncolorized_document.rb +2 -0
  128. data/lib/super_diff/csi.rb +12 -10
  129. data/lib/super_diff/differs.rb +6 -4
  130. data/lib/super_diff/equality_matchers/array.rb +18 -16
  131. data/lib/super_diff/equality_matchers/base.rb +6 -4
  132. data/lib/super_diff/equality_matchers/default.rb +5 -3
  133. data/lib/super_diff/equality_matchers/defaults.rb +2 -0
  134. data/lib/super_diff/equality_matchers/hash.rb +18 -16
  135. data/lib/super_diff/equality_matchers/main.rb +3 -1
  136. data/lib/super_diff/equality_matchers/multiline_string.rb +18 -16
  137. data/lib/super_diff/equality_matchers/primitive.rb +15 -13
  138. data/lib/super_diff/equality_matchers/singleline_string.rb +16 -14
  139. data/lib/super_diff/equality_matchers.rb +11 -9
  140. data/lib/super_diff/errors.rb +4 -2
  141. data/lib/super_diff/object_inspection.rb +17 -15
  142. data/lib/super_diff/operation_tree_builders.rb +6 -4
  143. data/lib/super_diff/operation_tree_flatteners.rb +6 -4
  144. data/lib/super_diff/operation_trees.rb +6 -4
  145. data/lib/super_diff/operations.rb +4 -2
  146. data/lib/super_diff/rails.rb +4 -2
  147. data/lib/super_diff/rspec/augmented_matcher.rb +3 -1
  148. data/lib/super_diff/rspec/differ.rb +16 -7
  149. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +2 -0
  150. data/lib/super_diff/rspec/differs/collection_including.rb +2 -0
  151. data/lib/super_diff/rspec/differs/hash_including.rb +2 -0
  152. data/lib/super_diff/rspec/differs/object_having_attributes.rb +2 -0
  153. data/lib/super_diff/rspec/differs.rb +6 -4
  154. data/lib/super_diff/rspec/inspection_tree_builders/collection_containing_exactly.rb +12 -10
  155. data/lib/super_diff/rspec/inspection_tree_builders/collection_including.rb +10 -8
  156. data/lib/super_diff/rspec/inspection_tree_builders/double.rb +20 -18
  157. data/lib/super_diff/rspec/inspection_tree_builders/generic_describable_matcher.rb +2 -0
  158. data/lib/super_diff/rspec/inspection_tree_builders/hash_including.rb +10 -8
  159. data/lib/super_diff/rspec/inspection_tree_builders/instance_of.rb +2 -0
  160. data/lib/super_diff/rspec/inspection_tree_builders/kind_of.rb +2 -0
  161. data/lib/super_diff/rspec/inspection_tree_builders/object_having_attributes.rb +12 -10
  162. data/lib/super_diff/rspec/inspection_tree_builders/primitive.rb +2 -0
  163. data/lib/super_diff/rspec/inspection_tree_builders/value_within.rb +6 -4
  164. data/lib/super_diff/rspec/inspection_tree_builders.rb +12 -10
  165. data/lib/super_diff/rspec/matcher_text_builders/base.rb +12 -12
  166. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +19 -17
  167. data/lib/super_diff/rspec/matcher_text_builders/contain_exactly.rb +3 -1
  168. data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +7 -5
  169. data/lib/super_diff/rspec/matcher_text_builders/match.rb +6 -4
  170. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +5 -3
  171. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +20 -18
  172. data/lib/super_diff/rspec/matcher_text_builders.rb +9 -7
  173. data/lib/super_diff/rspec/matcher_text_template.rb +34 -39
  174. data/lib/super_diff/rspec/object_inspection.rb +7 -5
  175. data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +4 -4
  176. data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +2 -0
  177. data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +2 -0
  178. data/lib/super_diff/rspec/operation_tree_builders/object_having_attributes.rb +2 -0
  179. data/lib/super_diff/rspec/operation_tree_builders.rb +6 -4
  180. data/lib/super_diff/rspec-rails.rb +4 -2
  181. data/lib/super_diff/rspec.rb +15 -13
  182. data/lib/super_diff/version.rb +3 -1
  183. data/lib/super_diff.rb +24 -26
  184. data/super_diff.gemspec +20 -19
  185. metadata +6 -185
  186. data/spec/examples.txt +0 -450
  187. data/spec/integration/rails/active_record_spec.rb +0 -21
  188. data/spec/integration/rails/active_support_spec.rb +0 -19
  189. data/spec/integration/rails/engines_spec.rb +0 -25
  190. data/spec/integration/rails/hash_with_indifferent_access_spec.rb +0 -21
  191. data/spec/integration/rspec/be_falsey_matcher_spec.rb +0 -58
  192. data/spec/integration/rspec/be_matcher_spec.rb +0 -605
  193. data/spec/integration/rspec/be_nil_matcher_spec.rb +0 -57
  194. data/spec/integration/rspec/be_predicate_matcher_spec.rb +0 -615
  195. data/spec/integration/rspec/be_truthy_matcher_spec.rb +0 -62
  196. data/spec/integration/rspec/contain_exactly_matcher_spec.rb +0 -377
  197. data/spec/integration/rspec/eq_matcher_spec.rb +0 -1066
  198. data/spec/integration/rspec/generic_describable_matchers_spec.rb +0 -177
  199. data/spec/integration/rspec/have_attributes_matcher_spec.rb +0 -443
  200. data/spec/integration/rspec/have_predicate_matcher_spec.rb +0 -478
  201. data/spec/integration/rspec/include_matcher_spec.rb +0 -452
  202. data/spec/integration/rspec/magic_metadata_spec.rb +0 -51
  203. data/spec/integration/rspec/match_array_matcher_spec.rb +0 -424
  204. data/spec/integration/rspec/match_matcher_spec.rb +0 -1359
  205. data/spec/integration/rspec/raise_error_matcher_spec.rb +0 -1488
  206. data/spec/integration/rspec/respond_to_matcher_spec.rb +0 -999
  207. data/spec/integration/rspec/third_party_matcher_spec.rb +0 -245
  208. data/spec/integration/rspec/unhandled_errors_spec.rb +0 -150
  209. data/spec/spec_helper.rb +0 -91
  210. data/spec/support/colorizer.rb +0 -9
  211. data/spec/support/command_runner.rb +0 -253
  212. data/spec/support/helpers.rb +0 -21
  213. data/spec/support/integration/helpers.rb +0 -124
  214. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +0 -104
  215. data/spec/support/integration/matchers.rb +0 -177
  216. data/spec/support/integration/test_programs/base.rb +0 -143
  217. data/spec/support/integration/test_programs/plain.rb +0 -19
  218. data/spec/support/integration/test_programs/rspec_active_record.rb +0 -20
  219. data/spec/support/integration/test_programs/rspec_active_support.rb +0 -20
  220. data/spec/support/integration/test_programs/rspec_rails.rb +0 -20
  221. data/spec/support/integration/test_programs/rspec_rails_engine.rb +0 -20
  222. data/spec/support/models/a.rb +0 -11
  223. data/spec/support/models/active_record/person.rb +0 -28
  224. data/spec/support/models/active_record/query.rb +0 -15
  225. data/spec/support/models/active_record/shipping_address.rb +0 -24
  226. data/spec/support/models/customer.rb +0 -22
  227. data/spec/support/models/empty_class.rb +0 -6
  228. data/spec/support/models/item.rb +0 -10
  229. data/spec/support/models/order.rb +0 -9
  230. data/spec/support/models/person.rb +0 -20
  231. data/spec/support/models/player.rb +0 -30
  232. data/spec/support/models/point.rb +0 -7
  233. data/spec/support/models/shipping_address.rb +0 -25
  234. data/spec/support/shared_examples/active_record.rb +0 -428
  235. data/spec/support/shared_examples/active_support.rb +0 -188
  236. data/spec/support/shared_examples/elided_diffs.rb +0 -938
  237. data/spec/support/shared_examples/hash_with_indifferent_access.rb +0 -749
  238. data/spec/support/shared_examples/key.rb +0 -123
  239. data/spec/support/unit/helpers.rb +0 -24
  240. data/spec/support/unit/matchers/be_deprecated_in_favor_of.rb +0 -39
  241. data/spec/support/unit/matchers/match_output.rb +0 -40
  242. data/spec/unit/active_record/object_inspection_spec.rb +0 -289
  243. data/spec/unit/active_support/object_inspection_spec.rb +0 -170
  244. data/spec/unit/basic/inspection_tree_builders/data_object_spec.rb +0 -146
  245. data/spec/unit/basic/operation_tree_builders/data_object_spec.rb +0 -82
  246. data/spec/unit/basic/operation_tree_flatteners/array_spec.rb +0 -637
  247. data/spec/unit/basic/operation_tree_flatteners/custom_object_spec.rb +0 -685
  248. data/spec/unit/basic/operation_tree_flatteners/default_object_spec.rb +0 -685
  249. data/spec/unit/basic/operation_tree_flatteners/hash_spec.rb +0 -671
  250. data/spec/unit/basic/operation_tree_flatteners/multiline_string_spec.rb +0 -131
  251. data/spec/unit/core/configuration_no_rspec_spec.rb +0 -58
  252. data/spec/unit/core/configuration_spec.rb +0 -176
  253. data/spec/unit/core/helpers_spec.rb +0 -68
  254. data/spec/unit/core/tiered_lines_elider_spec.rb +0 -6328
  255. data/spec/unit/core/tiered_lines_formatter_spec.rb +0 -131
  256. data/spec/unit/deprecations_spec.rb +0 -176
  257. data/spec/unit/equality_matchers/main_spec.rb +0 -1842
  258. data/spec/unit/rspec/matchers/be_compared_to_spec.rb +0 -23
  259. data/spec/unit/rspec/matchers/be_falsey_spec.rb +0 -9
  260. data/spec/unit/rspec/matchers/be_nil_spec.rb +0 -9
  261. data/spec/unit/rspec/matchers/be_predicate_spec.rb +0 -31
  262. data/spec/unit/rspec/matchers/be_spec.rb +0 -17
  263. data/spec/unit/rspec/matchers/be_truthy_spec.rb +0 -9
  264. data/spec/unit/rspec/matchers/contain_exactly_spec.rb +0 -11
  265. data/spec/unit/rspec/matchers/eq_spec.rb +0 -9
  266. data/spec/unit/rspec/matchers/have_attributes_spec.rb +0 -11
  267. data/spec/unit/rspec/matchers/have_predicate_spec.rb +0 -21
  268. data/spec/unit/rspec/matchers/include_spec.rb +0 -21
  269. data/spec/unit/rspec/matchers/match_array_spec.rb +0 -11
  270. data/spec/unit/rspec/matchers/match_spec.rb +0 -9
  271. data/spec/unit/rspec/matchers/raise_error_spec.rb +0 -77
  272. data/spec/unit/rspec/matchers/respond_to_spec.rb +0 -85
  273. data/spec/unit/rspec/object_inspection/rspec_matcher_spec.rb +0 -91
  274. data/spec/unit/rspec/object_inspection_spec.rb +0 -471
  275. data/spec/unit/super_diff_spec.rb +0 -2115
@@ -1,685 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe SuperDiff::Basic::OperationTreeFlatteners::DefaultObject do
4
- context "given an empty tree" do
5
- it "returns a set of lines which are simply the open token and close token" do
6
- operation_tree =
7
- SuperDiff::Basic::OperationTrees::DefaultObject.new(
8
- [],
9
- underlying_object: underlying_object
10
- )
11
-
12
- flattened_operation_tree = described_class.call(operation_tree)
13
-
14
- expect(flattened_operation_tree).to match(
15
- [
16
- an_object_having_attributes(
17
- type: :noop,
18
- indentation_level: 0,
19
- prefix: "",
20
- value: a_string_matching(/#<SuperDiff::Test::Item:0x[0-9a-f]+ \{/),
21
- collection_bookend: :open,
22
- complete_bookend: :open
23
- ),
24
- an_object_having_attributes(
25
- type: :noop,
26
- indentation_level: 0,
27
- prefix: "",
28
- value: "}>",
29
- collection_bookend: :close,
30
- complete_bookend: :close
31
- )
32
- ]
33
- )
34
- end
35
- end
36
-
37
- context "given a tree of only noops" do
38
- it "returns a series of lines from inspecting each value, creating multiple lines upon encountering inner data structures" do
39
- collection = Array.new(3) { :some_value }
40
- operation_tree =
41
- SuperDiff::Basic::OperationTrees::DefaultObject.new(
42
- [
43
- double(
44
- :operation,
45
- name: :noop,
46
- collection: collection,
47
- key: :foo,
48
- value: "bar",
49
- index: 0
50
- ),
51
- double(
52
- :operation,
53
- name: :noop,
54
- collection: collection,
55
- key: :baz,
56
- value: SuperDiff::Test::Item.new(name: "spatula", quantity: 3),
57
- index: 1
58
- ),
59
- double(
60
- :operation,
61
- name: :noop,
62
- collection: collection,
63
- key: :qux,
64
- value: "blargh",
65
- index: 2
66
- )
67
- ],
68
- underlying_object: underlying_object
69
- )
70
-
71
- flattened_operation_tree = described_class.call(operation_tree)
72
-
73
- expect(flattened_operation_tree).to match(
74
- [
75
- an_object_having_attributes(
76
- type: :noop,
77
- indentation_level: 0,
78
- prefix: "",
79
- value: a_string_matching(/#<SuperDiff::Test::Item:0x[0-9a-f]+ \{/),
80
- collection_bookend: :open,
81
- complete_bookend: :open,
82
- add_comma: false
83
- ),
84
- an_object_having_attributes(
85
- type: :noop,
86
- indentation_level: 1,
87
- prefix: "@foo=",
88
- value: %("bar"),
89
- add_comma: true
90
- ),
91
- an_object_having_attributes(
92
- type: :noop,
93
- indentation_level: 1,
94
- prefix: "@baz=",
95
- value: a_string_matching(/#<SuperDiff::Test::Item:0x[0-9a-f]+ \{/),
96
- collection_bookend: :open,
97
- complete_bookend: nil,
98
- add_comma: false
99
- ),
100
- an_object_having_attributes(
101
- type: :noop,
102
- indentation_level: 2,
103
- prefix: "@name=",
104
- value: %("spatula"),
105
- add_comma: true
106
- ),
107
- an_object_having_attributes(
108
- type: :noop,
109
- indentation_level: 2,
110
- prefix: "@quantity=",
111
- value: "3",
112
- add_comma: false
113
- ),
114
- an_object_having_attributes(
115
- type: :noop,
116
- indentation_level: 1,
117
- prefix: "",
118
- value: "}>",
119
- collection_bookend: :close,
120
- complete_bookend: nil,
121
- add_comma: true
122
- ),
123
- an_object_having_attributes(
124
- type: :noop,
125
- indentation_level: 1,
126
- prefix: "@qux=",
127
- value: %("blargh"),
128
- add_comma: false
129
- ),
130
- an_object_having_attributes(
131
- type: :noop,
132
- indentation_level: 0,
133
- prefix: "",
134
- value: "}>",
135
- collection_bookend: :close,
136
- complete_bookend: :close,
137
- add_comma: false
138
- )
139
- ]
140
- )
141
- end
142
- end
143
-
144
- context "given a one-dimensional tree of noops, inserts, and deletes" do
145
- it "returns a series of lines from inspecting each value, creating multiple lines upon encountering inner data structures" do
146
- expected = Array.new(3) { :some_value }
147
- actual = Array.new(4) { :some_value }
148
- operation_tree =
149
- SuperDiff::Basic::OperationTrees::DefaultObject.new(
150
- [
151
- double(
152
- :operation,
153
- name: :delete,
154
- collection: expected,
155
- key: :foo,
156
- value: "bar",
157
- index: 0
158
- ),
159
- double(
160
- :operation,
161
- name: :insert,
162
- collection: actual,
163
- key: :foo,
164
- value: "czar",
165
- index: 0
166
- ),
167
- double(
168
- :operation,
169
- name: :noop,
170
- collection: actual,
171
- key: :baz,
172
- value: SuperDiff::Test::Item.new(name: "spatula", quantity: 3),
173
- index: 1
174
- ),
175
- double(
176
- :operation,
177
- name: :noop,
178
- collection: actual,
179
- key: :qux,
180
- value: "blargh",
181
- index: 2
182
- ),
183
- double(
184
- :operation,
185
- name: :insert,
186
- collection: actual,
187
- key: :sing,
188
- value: "song",
189
- index: 3
190
- )
191
- ],
192
- underlying_object: underlying_object
193
- )
194
-
195
- flattened_operation_tree = described_class.call(operation_tree)
196
-
197
- expect(flattened_operation_tree).to match(
198
- [
199
- an_object_having_attributes(
200
- type: :noop,
201
- indentation_level: 0,
202
- prefix: "",
203
- value: a_string_matching(/#<SuperDiff::Test::Item:0x[0-9a-f]+ \{/),
204
- collection_bookend: :open,
205
- complete_bookend: :open,
206
- add_comma: false
207
- ),
208
- an_object_having_attributes(
209
- type: :delete,
210
- indentation_level: 1,
211
- prefix: "@foo=",
212
- value: %("bar"),
213
- add_comma: true
214
- ),
215
- an_object_having_attributes(
216
- type: :insert,
217
- indentation_level: 1,
218
- prefix: "@foo=",
219
- value: %("czar"),
220
- add_comma: true
221
- ),
222
- an_object_having_attributes(
223
- type: :noop,
224
- indentation_level: 1,
225
- prefix: "@baz=",
226
- value: a_string_matching(/#<SuperDiff::Test::Item:0x[0-9a-f]+ \{/),
227
- collection_bookend: :open,
228
- complete_bookend: nil,
229
- add_comma: false
230
- ),
231
- an_object_having_attributes(
232
- type: :noop,
233
- indentation_level: 2,
234
- prefix: "@name=",
235
- value: %("spatula"),
236
- add_comma: true
237
- ),
238
- an_object_having_attributes(
239
- type: :noop,
240
- indentation_level: 2,
241
- prefix: "@quantity=",
242
- value: "3",
243
- add_comma: false
244
- ),
245
- an_object_having_attributes(
246
- type: :noop,
247
- indentation_level: 1,
248
- prefix: "",
249
- value: "}>",
250
- collection_bookend: :close,
251
- complete_bookend: nil,
252
- add_comma: true
253
- ),
254
- an_object_having_attributes(
255
- type: :noop,
256
- indentation_level: 1,
257
- prefix: "@qux=",
258
- value: %("blargh"),
259
- add_comma: true
260
- ),
261
- an_object_having_attributes(
262
- type: :insert,
263
- indentation_level: 1,
264
- prefix: "@sing=",
265
- value: %("song"),
266
- add_comma: false
267
- ),
268
- an_object_having_attributes(
269
- type: :noop,
270
- indentation_level: 0,
271
- prefix: "",
272
- value: "}>",
273
- collection_bookend: :close,
274
- complete_bookend: :close,
275
- add_comma: false
276
- )
277
- ]
278
- )
279
- end
280
- end
281
-
282
- context "given a multi-dimensional tree of operations" do
283
- it "splits change operations into multiple lines" do
284
- collection = Array.new(3) { :some_value }
285
- subcollection = Array.new(2) { :some_value }
286
- operation_tree =
287
- SuperDiff::Basic::OperationTrees::DefaultObject.new(
288
- [
289
- double(
290
- :operation,
291
- name: :noop,
292
- collection: collection,
293
- key: :foo,
294
- value: "bar",
295
- index: 0
296
- ),
297
- double(
298
- :operation,
299
- name: :change,
300
- left_collection: collection,
301
- left_key: :baz,
302
- left_index: 1,
303
- right_collection: collection,
304
- right_key: :baz,
305
- right_index: 1,
306
- children:
307
- SuperDiff::Basic::OperationTrees::DefaultObject.new(
308
- [
309
- double(
310
- :operation,
311
- name: :noop,
312
- collection: subcollection,
313
- key: :one,
314
- value: "fish",
315
- index: 0
316
- ),
317
- double(
318
- :operation,
319
- name: :delete,
320
- collection: subcollection,
321
- key: :two,
322
- value: "fish",
323
- index: 1
324
- ),
325
- double(
326
- :operation,
327
- name: :insert,
328
- collection: subcollection,
329
- key: :blue,
330
- value: "fish",
331
- index: 1
332
- )
333
- ],
334
- underlying_object: underlying_object
335
- )
336
- ),
337
- double(
338
- :operation,
339
- name: :noop,
340
- collection: collection,
341
- key: :qux,
342
- value: "blargh",
343
- index: 2
344
- )
345
- ],
346
- underlying_object: underlying_object
347
- )
348
-
349
- flattened_operation_tree = described_class.call(operation_tree)
350
-
351
- expect(flattened_operation_tree).to match(
352
- [
353
- an_object_having_attributes(
354
- type: :noop,
355
- indentation_level: 0,
356
- prefix: "",
357
- value: a_string_matching(/#<SuperDiff::Test::Item:0x[0-9a-f]+ \{/),
358
- collection_bookend: :open,
359
- complete_bookend: :open,
360
- add_comma: false
361
- ),
362
- an_object_having_attributes(
363
- type: :noop,
364
- indentation_level: 1,
365
- prefix: "@foo=",
366
- value: %("bar"),
367
- add_comma: true
368
- ),
369
- an_object_having_attributes(
370
- type: :noop,
371
- indentation_level: 1,
372
- prefix: "@baz=",
373
- value: a_string_matching(/#<SuperDiff::Test::Item:0x[0-9a-f]+ \{/),
374
- collection_bookend: :open,
375
- complete_bookend: nil,
376
- add_comma: false
377
- ),
378
- an_object_having_attributes(
379
- type: :noop,
380
- indentation_level: 2,
381
- prefix: "@one=",
382
- value: %("fish"),
383
- add_comma: true
384
- ),
385
- an_object_having_attributes(
386
- type: :delete,
387
- indentation_level: 2,
388
- prefix: "@two=",
389
- value: %("fish"),
390
- add_comma: false
391
- ),
392
- an_object_having_attributes(
393
- type: :insert,
394
- indentation_level: 2,
395
- prefix: "@blue=",
396
- value: %("fish"),
397
- add_comma: false
398
- ),
399
- an_object_having_attributes(
400
- type: :noop,
401
- indentation_level: 1,
402
- prefix: "",
403
- value: "}>",
404
- collection_bookend: :close,
405
- complete_bookend: nil,
406
- add_comma: true
407
- ),
408
- an_object_having_attributes(
409
- type: :noop,
410
- indentation_level: 1,
411
- prefix: "@qux=",
412
- value: %("blargh"),
413
- add_comma: false
414
- ),
415
- an_object_having_attributes(
416
- type: :noop,
417
- indentation_level: 0,
418
- prefix: "",
419
- value: "}>",
420
- collection_bookend: :close,
421
- complete_bookend: :close,
422
- add_comma: false
423
- )
424
- ]
425
- )
426
- end
427
- end
428
-
429
- context "given a single-dimensional tree that contains a reference to itself" do
430
- it "replaces the reference with a static placeholder" do
431
- left_collection = Array.new(3) { :some_value }
432
- right_collection =
433
- Array
434
- .new(2) { :some_value }
435
- .tap { |collection| collection << right_collection }
436
-
437
- operation_tree =
438
- SuperDiff::Basic::OperationTrees::DefaultObject.new(
439
- [
440
- double(
441
- :operation,
442
- name: :noop,
443
- collection: right_collection,
444
- key: :foo,
445
- value: "bar",
446
- index: 0
447
- ),
448
- double(
449
- :operation,
450
- name: :noop,
451
- collection: right_collection,
452
- key: :baz,
453
- value: "qux",
454
- index: 1
455
- ),
456
- double(
457
- :operation,
458
- name: :delete,
459
- collection: left_collection,
460
- key: :blargh,
461
- value: "zig",
462
- index: 2
463
- ),
464
- double(
465
- :operation,
466
- name: :insert,
467
- collection: right_collection,
468
- key: :blargh,
469
- value: right_collection,
470
- index: 2
471
- )
472
- ],
473
- underlying_object: underlying_object
474
- )
475
-
476
- flattened_operation_tree = described_class.call(operation_tree)
477
-
478
- expect(flattened_operation_tree).to match(
479
- [
480
- an_object_having_attributes(
481
- type: :noop,
482
- indentation_level: 0,
483
- prefix: "",
484
- value: a_string_matching(/#<SuperDiff::Test::Item:0x[0-9a-f]+ \{/),
485
- collection_bookend: :open,
486
- complete_bookend: :open,
487
- add_comma: false
488
- ),
489
- an_object_having_attributes(
490
- type: :noop,
491
- indentation_level: 1,
492
- prefix: "@foo=",
493
- value: %("bar"),
494
- add_comma: true
495
- ),
496
- an_object_having_attributes(
497
- type: :noop,
498
- indentation_level: 1,
499
- prefix: "@baz=",
500
- value: %("qux"),
501
- add_comma: true
502
- ),
503
- an_object_having_attributes(
504
- type: :delete,
505
- indentation_level: 1,
506
- prefix: "@blargh=",
507
- value: %("zig"),
508
- add_comma: false
509
- ),
510
- an_object_having_attributes(
511
- type: :insert,
512
- indentation_level: 1,
513
- prefix: "@blargh=",
514
- value: "∙∙∙",
515
- add_comma: false
516
- ),
517
- an_object_having_attributes(
518
- type: :noop,
519
- indentation_level: 0,
520
- prefix: "",
521
- value: "}>",
522
- collection_bookend: :close,
523
- complete_bookend: :close,
524
- add_comma: false
525
- )
526
- ]
527
- )
528
- end
529
- end
530
-
531
- context "given a multi-dimensional tree that contains a reference to itself in an inner level" do
532
- it "replaces the reference with a static placeholder" do
533
- collection = Array.new(3) { :some_value }
534
- left_subcollection = Array.new(2) { :some_value }
535
- right_subcollection =
536
- Array.new(1) { :some_value }.tap { |coll| coll << right_subcollection }
537
-
538
- operation_tree =
539
- SuperDiff::Basic::OperationTrees::DefaultObject.new(
540
- [
541
- double(
542
- :operation,
543
- name: :noop,
544
- collection: collection,
545
- key: :foo,
546
- value: "bar",
547
- index: 0
548
- ),
549
- double(
550
- :operation,
551
- name: :change,
552
- left_collection: collection,
553
- left_key: :baz,
554
- left_index: 1,
555
- right_collection: collection,
556
- right_key: :baz,
557
- right_index: 1,
558
- children:
559
- SuperDiff::Basic::OperationTrees::DefaultObject.new(
560
- [
561
- double(
562
- :operation,
563
- name: :noop,
564
- collection: right_subcollection,
565
- key: :one,
566
- value: "fish",
567
- index: 0
568
- ),
569
- double(
570
- :operation,
571
- name: :delete,
572
- collection: left_subcollection,
573
- key: :two,
574
- value: "fish",
575
- index: 1
576
- ),
577
- double(
578
- :operation,
579
- name: :insert,
580
- collection: right_subcollection,
581
- key: :two,
582
- value: right_subcollection,
583
- index: 1
584
- )
585
- ],
586
- underlying_object: underlying_object
587
- )
588
- ),
589
- double(
590
- :operation,
591
- name: :noop,
592
- collection: collection,
593
- key: :qux,
594
- value: "blargh",
595
- index: 2
596
- )
597
- ],
598
- underlying_object: underlying_object
599
- )
600
-
601
- flattened_operation_tree = described_class.call(operation_tree)
602
-
603
- expect(flattened_operation_tree).to match(
604
- [
605
- an_object_having_attributes(
606
- type: :noop,
607
- indentation_level: 0,
608
- prefix: "",
609
- value: a_string_matching(/#<SuperDiff::Test::Item:0x[0-9a-f]+ \{/),
610
- collection_bookend: :open,
611
- complete_bookend: :open,
612
- add_comma: false
613
- ),
614
- an_object_having_attributes(
615
- type: :noop,
616
- indentation_level: 1,
617
- prefix: "@foo=",
618
- value: %("bar"),
619
- add_comma: true
620
- ),
621
- an_object_having_attributes(
622
- type: :noop,
623
- indentation_level: 1,
624
- prefix: "@baz=",
625
- value: a_string_matching(/#<SuperDiff::Test::Item:0x[0-9a-f]+ \{/),
626
- collection_bookend: :open,
627
- complete_bookend: nil,
628
- add_comma: false
629
- ),
630
- an_object_having_attributes(
631
- type: :noop,
632
- indentation_level: 2,
633
- prefix: "@one=",
634
- value: %("fish"),
635
- add_comma: true
636
- ),
637
- an_object_having_attributes(
638
- type: :delete,
639
- indentation_level: 2,
640
- prefix: "@two=",
641
- value: %("fish"),
642
- add_comma: false
643
- ),
644
- an_object_having_attributes(
645
- type: :insert,
646
- indentation_level: 2,
647
- prefix: "@two=",
648
- value: "∙∙∙",
649
- add_comma: false
650
- ),
651
- an_object_having_attributes(
652
- type: :noop,
653
- indentation_level: 1,
654
- prefix: "",
655
- value: "}>",
656
- collection_bookend: :close,
657
- complete_bookend: nil,
658
- add_comma: true
659
- ),
660
- an_object_having_attributes(
661
- type: :noop,
662
- indentation_level: 1,
663
- prefix: "@qux=",
664
- value: %("blargh"),
665
- add_comma: false
666
- ),
667
- an_object_having_attributes(
668
- type: :noop,
669
- indentation_level: 0,
670
- prefix: "",
671
- value: "}>",
672
- collection_bookend: :close,
673
- complete_bookend: :close,
674
- add_comma: false
675
- )
676
- ]
677
- )
678
- end
679
- end
680
-
681
- def underlying_object
682
- @_underlying_object ||=
683
- SuperDiff::Test::Item.new(name: "whatever", quantity: 999)
684
- end
685
- end