super_diff 0.9.0 → 0.10.0

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