super_diff 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) 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 +22 -18
  6. data/lib/super_diff/active_record/object_inspection/inspection_tree_builders/active_record_relation.rb +14 -7
  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 +20 -11
  18. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders/ordered_options.rb +46 -0
  19. data/lib/super_diff/active_support/object_inspection/inspection_tree_builders.rb +5 -1
  20. data/lib/super_diff/active_support/object_inspection.rb +1 -1
  21. data/lib/super_diff/active_support/operation_tree_builders/hash_with_indifferent_access.rb +5 -6
  22. data/lib/super_diff/active_support/operation_tree_builders.rb +1 -1
  23. data/lib/super_diff/active_support/operation_tree_flatteners.rb +1 -1
  24. data/lib/super_diff/active_support/operation_trees.rb +1 -1
  25. data/lib/super_diff/active_support.rb +6 -10
  26. data/lib/super_diff/colorized_document_extensions.rb +2 -4
  27. data/lib/super_diff/configuration.rb +14 -8
  28. data/lib/super_diff/csi/color.rb +4 -4
  29. data/lib/super_diff/csi/colorized_document.rb +12 -16
  30. data/lib/super_diff/csi/document.rb +8 -19
  31. data/lib/super_diff/csi/eight_bit_color.rb +19 -19
  32. data/lib/super_diff/csi/four_bit_color.rb +82 -31
  33. data/lib/super_diff/csi/twenty_four_bit_color.rb +12 -11
  34. data/lib/super_diff/csi/uncolorized_document.rb +2 -6
  35. data/lib/super_diff/csi.rb +10 -14
  36. data/lib/super_diff/diff_formatters/collection.rb +35 -41
  37. data/lib/super_diff/differs/date_like.rb +15 -0
  38. data/lib/super_diff/differs/default_object.rb +1 -1
  39. data/lib/super_diff/differs/defaults.rb +2 -1
  40. data/lib/super_diff/differs/main.rb +2 -13
  41. data/lib/super_diff/differs.rb +1 -0
  42. data/lib/super_diff/equality_matchers/array.rb +10 -12
  43. data/lib/super_diff/equality_matchers/base.rb +1 -1
  44. data/lib/super_diff/equality_matchers/default.rb +2 -4
  45. data/lib/super_diff/equality_matchers/defaults.rb +1 -1
  46. data/lib/super_diff/equality_matchers/hash.rb +10 -12
  47. data/lib/super_diff/equality_matchers/multiline_string.rb +11 -13
  48. data/lib/super_diff/equality_matchers/primitive.rb +10 -12
  49. data/lib/super_diff/equality_matchers/singleline_string.rb +10 -12
  50. data/lib/super_diff/equality_matchers.rb +1 -1
  51. data/lib/super_diff/errors.rb +2 -6
  52. data/lib/super_diff/gem_version.rb +3 -3
  53. data/lib/super_diff/helpers.rb +10 -10
  54. data/lib/super_diff/implementation_checks.rb +2 -2
  55. data/lib/super_diff/line.rb +3 -3
  56. data/lib/super_diff/object_inspection/inspection_tree.rb +64 -73
  57. data/lib/super_diff/object_inspection/inspection_tree_builders/array.rb +29 -14
  58. data/lib/super_diff/object_inspection/inspection_tree_builders/custom_object.rb +17 -13
  59. data/lib/super_diff/object_inspection/inspection_tree_builders/date_like.rb +51 -0
  60. data/lib/super_diff/object_inspection/inspection_tree_builders/default_object.rb +43 -27
  61. data/lib/super_diff/object_inspection/inspection_tree_builders/defaults.rb +2 -1
  62. data/lib/super_diff/object_inspection/inspection_tree_builders/hash.rb +35 -18
  63. data/lib/super_diff/object_inspection/inspection_tree_builders/primitive.rb +3 -5
  64. data/lib/super_diff/object_inspection/inspection_tree_builders/time_like.rb +30 -36
  65. data/lib/super_diff/object_inspection/inspection_tree_builders.rb +13 -9
  66. data/lib/super_diff/object_inspection/nodes/as_lines_when_rendering_to_lines.rb +11 -22
  67. data/lib/super_diff/object_inspection/nodes/as_prefix_when_rendering_to_lines.rb +1 -5
  68. data/lib/super_diff/object_inspection/nodes/as_prelude_when_rendering_to_lines.rb +1 -5
  69. data/lib/super_diff/object_inspection/nodes/as_single_line.rb +3 -7
  70. data/lib/super_diff/object_inspection/nodes/base.rb +9 -14
  71. data/lib/super_diff/object_inspection/nodes/inspection.rb +26 -34
  72. data/lib/super_diff/object_inspection/nodes/nesting.rb +1 -1
  73. data/lib/super_diff/object_inspection/nodes/only_when.rb +2 -6
  74. data/lib/super_diff/object_inspection/nodes/text.rb +1 -5
  75. data/lib/super_diff/object_inspection/nodes/when_empty.rb +2 -6
  76. data/lib/super_diff/object_inspection/nodes/when_non_empty.rb +2 -6
  77. data/lib/super_diff/object_inspection/nodes/when_rendering_to_lines.rb +1 -1
  78. data/lib/super_diff/object_inspection/nodes/when_rendering_to_string.rb +1 -5
  79. data/lib/super_diff/object_inspection/nodes.rb +7 -7
  80. data/lib/super_diff/object_inspection.rb +3 -3
  81. data/lib/super_diff/operation_tree_builders/array.rb +12 -11
  82. data/lib/super_diff/operation_tree_builders/base.rb +17 -15
  83. data/lib/super_diff/operation_tree_builders/custom_object.rb +8 -6
  84. data/lib/super_diff/operation_tree_builders/date_like.rb +15 -0
  85. data/lib/super_diff/operation_tree_builders/default_object.rb +29 -21
  86. data/lib/super_diff/operation_tree_builders/defaults.rb +1 -1
  87. data/lib/super_diff/operation_tree_builders/hash.rb +23 -24
  88. data/lib/super_diff/operation_tree_builders/main.rb +4 -11
  89. data/lib/super_diff/operation_tree_builders/multiline_string.rb +3 -3
  90. data/lib/super_diff/operation_tree_builders/time_like.rb +1 -11
  91. data/lib/super_diff/operation_tree_builders.rb +2 -1
  92. data/lib/super_diff/operation_tree_flatteners/base.rb +1 -5
  93. data/lib/super_diff/operation_tree_flatteners/collection.rb +13 -16
  94. data/lib/super_diff/operation_tree_flatteners/default_object.rb +1 -2
  95. data/lib/super_diff/operation_tree_flatteners/hash.rb +2 -10
  96. data/lib/super_diff/operation_tree_flatteners/multiline_string.rb +2 -1
  97. data/lib/super_diff/operation_tree_flatteners.rb +3 -3
  98. data/lib/super_diff/operation_trees/base.rb +3 -5
  99. data/lib/super_diff/operation_trees/default_object.rb +1 -3
  100. data/lib/super_diff/operations/binary_operation.rb +2 -2
  101. data/lib/super_diff/operations/unary_operation.rb +1 -1
  102. data/lib/super_diff/rails.rb +2 -1
  103. data/lib/super_diff/recursion_guard.rb +5 -4
  104. data/lib/super_diff/rspec/augmented_matcher.rb +4 -5
  105. data/lib/super_diff/rspec/differ.rb +6 -13
  106. data/lib/super_diff/rspec/differs/collection_containing_exactly.rb +3 -2
  107. data/lib/super_diff/rspec/differs/collection_including.rb +1 -1
  108. data/lib/super_diff/rspec/differs/hash_including.rb +1 -1
  109. data/lib/super_diff/rspec/differs.rb +3 -3
  110. data/lib/super_diff/rspec/matcher_text_builders/base.rb +13 -15
  111. data/lib/super_diff/rspec/matcher_text_builders/be_predicate.rb +5 -7
  112. data/lib/super_diff/rspec/matcher_text_builders/have_predicate.rb +3 -5
  113. data/lib/super_diff/rspec/matcher_text_builders/raise_error.rb +2 -10
  114. data/lib/super_diff/rspec/matcher_text_builders/respond_to.rb +2 -6
  115. data/lib/super_diff/rspec/matcher_text_builders.rb +5 -8
  116. data/lib/super_diff/rspec/matcher_text_template.rb +13 -16
  117. data/lib/super_diff/rspec/monkey_patches.rb +180 -123
  118. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_containing_exactly.rb +14 -7
  119. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/collection_including.rb +21 -13
  120. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/double.rb +35 -36
  121. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/generic_describable_matcher.rb +19 -0
  122. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/hash_including.rb +21 -15
  123. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/instance_of.rb +11 -10
  124. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/kind_of.rb +11 -10
  125. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/object_having_attributes.rb +14 -7
  126. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders/value_within.rb +10 -11
  127. data/lib/super_diff/rspec/object_inspection/inspection_tree_builders.rb +13 -9
  128. data/lib/super_diff/rspec/object_inspection.rb +1 -1
  129. data/lib/super_diff/rspec/operation_tree_builders/collection_containing_exactly.rb +11 -10
  130. data/lib/super_diff/rspec/operation_tree_builders/collection_including.rb +7 -6
  131. data/lib/super_diff/rspec/operation_tree_builders/hash_including.rb +11 -10
  132. data/lib/super_diff/rspec/operation_tree_builders/object_having_attributes.rb +22 -17
  133. data/lib/super_diff/rspec/operation_tree_builders.rb +4 -4
  134. data/lib/super_diff/rspec.rb +17 -18
  135. data/lib/super_diff/tiered_lines_elider.rb +87 -115
  136. data/lib/super_diff/tiered_lines_formatter.rb +5 -9
  137. data/lib/super_diff/version.rb +1 -1
  138. data/lib/super_diff.rb +13 -9
  139. data/spec/examples.txt +541 -483
  140. data/spec/integration/rails/active_record_spec.rb +3 -1
  141. data/spec/integration/rails/engines_spec.rb +25 -0
  142. data/spec/integration/rails/hash_with_indifferent_access_spec.rb +3 -1
  143. data/spec/integration/rspec/be_falsey_matcher_spec.rb +40 -35
  144. data/spec/integration/rspec/be_matcher_spec.rb +360 -320
  145. data/spec/integration/rspec/be_nil_matcher_spec.rb +38 -34
  146. data/spec/integration/rspec/be_predicate_matcher_spec.rb +376 -359
  147. data/spec/integration/rspec/be_truthy_matcher_spec.rb +38 -33
  148. data/spec/integration/rspec/contain_exactly_matcher_spec.rb +257 -254
  149. data/spec/integration/rspec/eq_matcher_spec.rb +695 -585
  150. data/spec/integration/rspec/generic_describable_matchers_spec.rb +177 -0
  151. data/spec/integration/rspec/have_attributes_matcher_spec.rb +312 -304
  152. data/spec/integration/rspec/have_predicate_matcher_spec.rb +291 -297
  153. data/spec/integration/rspec/include_matcher_spec.rb +327 -225
  154. data/spec/integration/rspec/magic_metadata_spec.rb +51 -0
  155. data/spec/integration/rspec/match_array_matcher_spec.rb +294 -291
  156. data/spec/integration/rspec/match_matcher_spec.rb +916 -903
  157. data/spec/integration/rspec/raise_error_matcher_spec.rb +1208 -449
  158. data/spec/integration/rspec/respond_to_matcher_spec.rb +702 -697
  159. data/spec/integration/rspec/third_party_matcher_spec.rb +142 -138
  160. data/spec/integration/rspec/unhandled_errors_spec.rb +88 -84
  161. data/spec/internal/log/test.log +0 -0
  162. data/spec/spec_helper.rb +20 -20
  163. data/spec/support/command_runner.rb +34 -57
  164. data/spec/support/integration/helpers.rb +44 -32
  165. data/spec/support/integration/matchers/produce_output_when_run_matcher.rb +28 -23
  166. data/spec/support/integration/matchers.rb +34 -0
  167. data/spec/support/integration/test_programs/base.rb +17 -22
  168. data/spec/support/integration/test_programs/plain.rb +6 -0
  169. data/spec/support/integration/test_programs/rspec_active_record.rb +4 -1
  170. data/spec/support/integration/test_programs/rspec_active_support.rb +4 -1
  171. data/spec/support/integration/test_programs/rspec_rails.rb +4 -1
  172. data/spec/support/integration/test_programs/rspec_rails_engine.rb +20 -0
  173. data/spec/support/models/active_record/person.rb +6 -4
  174. data/spec/support/models/active_record/shipping_address.rb +9 -10
  175. data/spec/support/models/customer.rb +2 -4
  176. data/spec/support/models/player.rb +3 -6
  177. data/spec/support/models/shipping_address.rb +4 -13
  178. data/spec/support/shared_examples/active_record.rb +258 -240
  179. data/spec/support/shared_examples/active_support.rb +174 -51
  180. data/spec/support/shared_examples/elided_diffs.rb +447 -423
  181. data/spec/support/shared_examples/hash_with_indifferent_access.rb +500 -464
  182. data/spec/support/shared_examples/key.rb +123 -0
  183. data/spec/support/unit/helpers.rb +1 -3
  184. data/spec/support/unit/matchers/match_output.rb +12 -13
  185. data/spec/unit/active_record/object_inspection_spec.rb +222 -206
  186. data/spec/unit/active_support/object_inspection_spec.rb +170 -0
  187. data/spec/unit/equality_matchers/main_spec.rb +1049 -984
  188. data/spec/unit/helpers_spec.rb +14 -21
  189. data/spec/unit/operation_tree_flatteners/array_spec.rb +557 -524
  190. data/spec/unit/operation_tree_flatteners/custom_object_spec.rb +619 -601
  191. data/spec/unit/operation_tree_flatteners/default_object_spec.rb +619 -621
  192. data/spec/unit/operation_tree_flatteners/hash_spec.rb +595 -556
  193. data/spec/unit/operation_tree_flatteners/multiline_string_spec.rb +102 -92
  194. data/spec/unit/rspec/matchers/be_compared_to_spec.rb +3 -3
  195. data/spec/unit/rspec/matchers/be_predicate_spec.rb +3 -3
  196. data/spec/unit/rspec/matchers/contain_exactly_spec.rb +1 -1
  197. data/spec/unit/rspec/matchers/have_attributes_spec.rb +1 -1
  198. data/spec/unit/rspec/matchers/have_predicate_spec.rb +2 -2
  199. data/spec/unit/rspec/matchers/include_spec.rb +2 -2
  200. data/spec/unit/rspec/matchers/match_array_spec.rb +2 -2
  201. data/spec/unit/rspec/matchers/raise_error_spec.rb +43 -11
  202. data/spec/unit/rspec/matchers/respond_to_spec.rb +23 -16
  203. data/spec/unit/rspec/object_inspection/rspec_matcher_spec.rb +91 -0
  204. data/spec/unit/rspec/object_inspection_spec.rb +351 -326
  205. data/spec/unit/super_diff_spec.rb +1594 -1437
  206. data/spec/unit/tiered_lines_elider_spec.rb +3508 -3536
  207. data/spec/unit/tiered_lines_formatter_spec.rb +54 -116
  208. data/super_diff.gemspec +13 -12
  209. metadata +88 -75
  210. data/lib/super_diff/errors/no_diff_formatter_available_error.rb +0 -21
  211. data/lib/super_diff/errors/no_operational_sequencer_available_error.rb +0 -22
  212. data/spec/tmp/warnings_logger/all_warnings.txt +0 -2
@@ -12,19 +12,22 @@ RSpec.describe SuperDiff, type: :unit do
12
12
 
13
13
  context "given as_lines: true" do
14
14
  it "returns nil wrapped in a single Line" do
15
- tiered_lines = described_class.inspect_object(
16
- nil,
17
- as_lines: true,
18
- type: :delete,
19
- indentation_level: 1,
20
- )
21
- expect(tiered_lines).to match([
22
- an_object_having_attributes(
15
+ tiered_lines =
16
+ described_class.inspect_object(
17
+ nil,
18
+ as_lines: true,
23
19
  type: :delete,
24
- indentation_level: 1,
25
- value: %(nil),
26
- ),
27
- ])
20
+ indentation_level: 1
21
+ )
22
+ expect(tiered_lines).to match(
23
+ [
24
+ an_object_having_attributes(
25
+ type: :delete,
26
+ indentation_level: 1,
27
+ value: "nil"
28
+ )
29
+ ]
30
+ )
28
31
  end
29
32
  end
30
33
  end
@@ -39,19 +42,22 @@ RSpec.describe SuperDiff, type: :unit do
39
42
 
40
43
  context "given as_lines: true" do
41
44
  it "returns true wrapped in a single Line" do
42
- tiered_lines = described_class.inspect_object(
43
- true,
44
- as_lines: true,
45
- type: :delete,
46
- indentation_level: 1,
47
- )
48
- expect(tiered_lines).to match([
49
- an_object_having_attributes(
45
+ tiered_lines =
46
+ described_class.inspect_object(
47
+ true,
48
+ as_lines: true,
50
49
  type: :delete,
51
- indentation_level: 1,
52
- value: %(true),
53
- ),
54
- ])
50
+ indentation_level: 1
51
+ )
52
+ expect(tiered_lines).to match(
53
+ [
54
+ an_object_having_attributes(
55
+ type: :delete,
56
+ indentation_level: 1,
57
+ value: "true"
58
+ )
59
+ ]
60
+ )
55
61
  end
56
62
  end
57
63
  end
@@ -66,19 +72,22 @@ RSpec.describe SuperDiff, type: :unit do
66
72
 
67
73
  context "given as_lines: true" do
68
74
  it "returns false wrapped in a single Line" do
69
- tiered_lines = described_class.inspect_object(
70
- false,
71
- as_lines: true,
72
- type: :delete,
73
- indentation_level: 1,
74
- )
75
- expect(tiered_lines).to match([
76
- an_object_having_attributes(
75
+ tiered_lines =
76
+ described_class.inspect_object(
77
+ false,
78
+ as_lines: true,
77
79
  type: :delete,
78
- indentation_level: 1,
79
- value: %(false),
80
- ),
81
- ])
80
+ indentation_level: 1
81
+ )
82
+ expect(tiered_lines).to match(
83
+ [
84
+ an_object_having_attributes(
85
+ type: :delete,
86
+ indentation_level: 1,
87
+ value: "false"
88
+ )
89
+ ]
90
+ )
82
91
  end
83
92
  end
84
93
  end
@@ -93,19 +102,22 @@ RSpec.describe SuperDiff, type: :unit do
93
102
 
94
103
  context "given as_lines: true" do
95
104
  it "returns the number wrapped in a single Line" do
96
- tiered_lines = described_class.inspect_object(
97
- 3,
98
- as_lines: true,
99
- type: :delete,
100
- indentation_level: 1,
101
- )
102
- expect(tiered_lines).to match([
103
- an_object_having_attributes(
105
+ tiered_lines =
106
+ described_class.inspect_object(
107
+ 3,
108
+ as_lines: true,
104
109
  type: :delete,
105
- indentation_level: 1,
106
- value: %(3),
107
- ),
108
- ])
110
+ indentation_level: 1
111
+ )
112
+ expect(tiered_lines).to match(
113
+ [
114
+ an_object_having_attributes(
115
+ type: :delete,
116
+ indentation_level: 1,
117
+ value: "3"
118
+ )
119
+ ]
120
+ )
109
121
  end
110
122
  end
111
123
  end
@@ -120,19 +132,22 @@ RSpec.describe SuperDiff, type: :unit do
120
132
 
121
133
  context "given as_lines: true" do
122
134
  it "returns an inspected version of the symbol wrapped in a single Line" do
123
- tiered_lines = described_class.inspect_object(
124
- :foo,
125
- as_lines: true,
126
- type: :delete,
127
- indentation_level: 1,
128
- )
129
- expect(tiered_lines).to match([
130
- an_object_having_attributes(
135
+ tiered_lines =
136
+ described_class.inspect_object(
137
+ :foo,
138
+ as_lines: true,
131
139
  type: :delete,
132
- indentation_level: 1,
133
- value: %(:foo),
134
- ),
135
- ])
140
+ indentation_level: 1
141
+ )
142
+ expect(tiered_lines).to match(
143
+ [
144
+ an_object_having_attributes(
145
+ type: :delete,
146
+ indentation_level: 1,
147
+ value: ":foo"
148
+ )
149
+ ]
150
+ )
136
151
  end
137
152
  end
138
153
  end
@@ -147,19 +162,22 @@ RSpec.describe SuperDiff, type: :unit do
147
162
 
148
163
  context "given as_lines: true" do
149
164
  it "returns an inspected version of the regex wrapped in a single Line" do
150
- tiered_lines = described_class.inspect_object(
151
- /foo/,
152
- as_lines: true,
153
- type: :delete,
154
- indentation_level: 1,
155
- )
156
- expect(tiered_lines).to match([
157
- an_object_having_attributes(
165
+ tiered_lines =
166
+ described_class.inspect_object(
167
+ /foo/,
168
+ as_lines: true,
158
169
  type: :delete,
159
- indentation_level: 1,
160
- value: %(/foo/),
161
- ),
162
- ])
170
+ indentation_level: 1
171
+ )
172
+ expect(tiered_lines).to match(
173
+ [
174
+ an_object_having_attributes(
175
+ type: :delete,
176
+ indentation_level: 1,
177
+ value: "/foo/"
178
+ )
179
+ ]
180
+ )
163
181
  end
164
182
  end
165
183
  end
@@ -174,19 +192,22 @@ RSpec.describe SuperDiff, type: :unit do
174
192
 
175
193
  context "given as_lines: true" do
176
194
  it "returns an inspected version of the string wrapped in a single Line" do
177
- tiered_lines = described_class.inspect_object(
178
- "Marty",
179
- as_lines: true,
180
- type: :delete,
181
- indentation_level: 1,
182
- )
183
- expect(tiered_lines).to match([
184
- an_object_having_attributes(
195
+ tiered_lines =
196
+ described_class.inspect_object(
197
+ "Marty",
198
+ as_lines: true,
185
199
  type: :delete,
186
- indentation_level: 1,
187
- value: %("Marty"),
188
- ),
189
- ])
200
+ indentation_level: 1
201
+ )
202
+ expect(tiered_lines).to match(
203
+ [
204
+ an_object_having_attributes(
205
+ type: :delete,
206
+ indentation_level: 1,
207
+ value: %("Marty")
208
+ )
209
+ ]
210
+ )
190
211
  end
191
212
  end
192
213
  end
@@ -195,31 +216,36 @@ RSpec.describe SuperDiff, type: :unit do
195
216
  context "that does not contain color codes" do
196
217
  context "given as_lines: false" do
197
218
  it "returns an inspected version of the string, with newline characters escaped" do
198
- string = described_class.inspect_object(
199
- "This is a line\nAnd that's a line\nAnd there's a line too",
200
- as_lines: false,
201
- )
219
+ string =
220
+ described_class.inspect_object(
221
+ "This is a line\nAnd that's a line\nAnd there's a line too",
222
+ as_lines: false
223
+ )
202
224
  expect(string).to eq(
203
- %("This is a line\\nAnd that's a line\\nAnd there's a line too"),
225
+ %("This is a line\\nAnd that's a line\\nAnd there's a line too")
204
226
  )
205
227
  end
206
228
  end
207
229
 
208
230
  context "given as_lines: true" do
209
231
  it "returns an inspected version of the string, with newline characters escaped, wrapped in a Line" do
210
- tiered_lines = described_class.inspect_object(
211
- "This is a line\nAnd that's a line\nAnd there's a line too",
212
- as_lines: true,
213
- type: :delete,
214
- indentation_level: 1,
215
- )
216
- expect(tiered_lines).to match([
217
- an_object_having_attributes(
232
+ tiered_lines =
233
+ described_class.inspect_object(
234
+ "This is a line\nAnd that's a line\nAnd there's a line too",
235
+ as_lines: true,
218
236
  type: :delete,
219
- indentation_level: 1,
220
- value: %("This is a line\\nAnd that's a line\\nAnd there's a line too"),
221
- ),
222
- ])
237
+ indentation_level: 1
238
+ )
239
+ expect(tiered_lines).to match(
240
+ [
241
+ an_object_having_attributes(
242
+ type: :delete,
243
+ indentation_level: 1,
244
+ value:
245
+ %("This is a line\\nAnd that's a line\\nAnd there's a line too")
246
+ )
247
+ ]
248
+ )
223
249
  end
224
250
  end
225
251
  end
@@ -233,29 +259,27 @@ RSpec.describe SuperDiff, type: :unit do
233
259
  red: 3,
234
260
  green: 8,
235
261
  blue: 4,
236
- layer: :foreground,
262
+ layer: :foreground
237
263
  ),
238
264
  SuperDiff::Csi::TwentyFourBitColor.new(
239
265
  red: 47,
240
266
  green: 164,
241
267
  blue: 59,
242
- layer: :foreground,
243
- ),
268
+ layer: :foreground
269
+ )
244
270
  ]
245
271
  string_to_inspect = [
246
272
  colored("This is a line", colors[0]),
247
273
  colored("And that's a line", colors[1]),
248
- colored("And there's a line too", colors[2]),
274
+ colored("And there's a line too", colors[2])
249
275
  ].join("\n")
250
276
 
251
- inspection = described_class.inspect_object(
252
- string_to_inspect,
253
- as_lines: false,
254
- )
277
+ inspection =
278
+ described_class.inspect_object(string_to_inspect, as_lines: false)
255
279
  # TODO: Figure out how to represent a colorized string inside of an
256
280
  # already colorized string
257
281
  expect(inspection).to eq(
258
- %("\\e[34mThis is a line\\e[0m\\n\\e[38;5;176mAnd that's a line\\e[0m\\n\\e[38;2;47;59;164mAnd there's a line too\\e[0m"),
282
+ %("\\e[34mThis is a line\\e[0m\\n\\e[38;5;176mAnd that's a line\\e[0m\\n\\e[38;2;47;59;164mAnd there's a line too\\e[0m")
259
283
  )
260
284
  end
261
285
  end
@@ -268,36 +292,40 @@ RSpec.describe SuperDiff, type: :unit do
268
292
  red: 3,
269
293
  green: 8,
270
294
  blue: 4,
271
- layer: :foreground,
295
+ layer: :foreground
272
296
  ),
273
297
  SuperDiff::Csi::TwentyFourBitColor.new(
274
298
  red: 47,
275
299
  green: 164,
276
300
  blue: 59,
277
- layer: :foreground,
278
- ),
301
+ layer: :foreground
302
+ )
279
303
  ]
280
304
  string_to_inspect = [
281
305
  colored("This is a line", colors[0]),
282
306
  colored("And that's a line", colors[1]),
283
- colored("And there's a line too", colors[2]),
307
+ colored("And there's a line too", colors[2])
284
308
  ].join("\n")
285
309
 
286
- tiered_lines = described_class.inspect_object(
287
- string_to_inspect,
288
- as_lines: true,
289
- type: :delete,
290
- indentation_level: 1,
291
- )
310
+ tiered_lines =
311
+ described_class.inspect_object(
312
+ string_to_inspect,
313
+ as_lines: true,
314
+ type: :delete,
315
+ indentation_level: 1
316
+ )
292
317
  # TODO: Figure out how to represent a colorized string inside of an
293
318
  # already colorized string
294
- expect(tiered_lines).to match([
295
- an_object_having_attributes(
296
- type: :delete,
297
- indentation_level: 1,
298
- value: %("\\e[34mThis is a line\\e[0m\\n\\e[38;5;176mAnd that's a line\\e[0m\\n\\e[38;2;47;59;164mAnd there's a line too\\e[0m")
299
- ),
300
- ])
319
+ expect(tiered_lines).to match(
320
+ [
321
+ an_object_having_attributes(
322
+ type: :delete,
323
+ indentation_level: 1,
324
+ value:
325
+ %("\\e[34mThis is a line\\e[0m\\n\\e[38;5;176mAnd that's a line\\e[0m\\n\\e[38;2;47;59;164mAnd there's a line too\\e[0m")
326
+ )
327
+ ]
328
+ )
301
329
  end
302
330
  end
303
331
  end
@@ -307,54 +335,55 @@ RSpec.describe SuperDiff, type: :unit do
307
335
  context "containing only primitive values" do
308
336
  context "given as_lines: false" do
309
337
  it "returns an inspected version of the array" do
310
- string = described_class.inspect_object(
311
- ["foo", 2, :baz],
312
- as_lines: false,
313
- )
338
+ string =
339
+ described_class.inspect_object(["foo", 2, :baz], as_lines: false)
314
340
  expect(string).to eq(%(["foo", 2, :baz]))
315
341
  end
316
342
  end
317
343
 
318
344
  context "given as_lines: true" do
319
345
  it "returns an inspected version of the array as multiple Lines" do
320
- tiered_lines = described_class.inspect_object(
321
- ["foo", 2, :baz],
322
- as_lines: true,
323
- type: :delete,
324
- indentation_level: 1,
325
- )
326
- expect(tiered_lines).to match([
327
- an_object_having_attributes(
328
- type: :delete,
329
- indentation_level: 1,
330
- value: %([),
331
- collection_bookend: :open,
332
- ),
333
- an_object_having_attributes(
334
- type: :delete,
335
- indentation_level: 2,
336
- value: %("foo"),
337
- add_comma: true,
338
- ),
339
- an_object_having_attributes(
340
- type: :delete,
341
- indentation_level: 2,
342
- value: %(2),
343
- add_comma: true,
344
- ),
345
- an_object_having_attributes(
346
- type: :delete,
347
- indentation_level: 2,
348
- value: %(:baz),
349
- add_comma: false,
350
- ),
351
- an_object_having_attributes(
346
+ tiered_lines =
347
+ described_class.inspect_object(
348
+ ["foo", 2, :baz],
349
+ as_lines: true,
352
350
  type: :delete,
353
- indentation_level: 1,
354
- value: %(]),
355
- collection_bookend: :close,
356
- ),
357
- ])
351
+ indentation_level: 1
352
+ )
353
+ expect(tiered_lines).to match(
354
+ [
355
+ an_object_having_attributes(
356
+ type: :delete,
357
+ indentation_level: 1,
358
+ value: "[",
359
+ collection_bookend: :open
360
+ ),
361
+ an_object_having_attributes(
362
+ type: :delete,
363
+ indentation_level: 2,
364
+ value: %("foo"),
365
+ add_comma: true
366
+ ),
367
+ an_object_having_attributes(
368
+ type: :delete,
369
+ indentation_level: 2,
370
+ value: "2",
371
+ add_comma: true
372
+ ),
373
+ an_object_having_attributes(
374
+ type: :delete,
375
+ indentation_level: 2,
376
+ value: ":baz",
377
+ add_comma: false
378
+ ),
379
+ an_object_having_attributes(
380
+ type: :delete,
381
+ indentation_level: 1,
382
+ value: "]",
383
+ collection_bookend: :close
384
+ )
385
+ ]
386
+ )
358
387
  end
359
388
  end
360
389
  end
@@ -362,81 +391,77 @@ RSpec.describe SuperDiff, type: :unit do
362
391
  context "containing other arrays" do
363
392
  context "given as_lines: false" do
364
393
  it "returns an inspected version of the array" do
365
- string = described_class.inspect_object(
366
- [
367
- "foo",
368
- ["bar", "baz"],
369
- "qux",
370
- ],
371
- as_lines: false,
372
- )
394
+ string =
395
+ described_class.inspect_object(
396
+ ["foo", %w[bar baz], "qux"],
397
+ as_lines: false
398
+ )
373
399
  expect(string).to eq(%(["foo", ["bar", "baz"], "qux"]))
374
400
  end
375
401
  end
376
402
 
377
403
  context "given as_lines: true" do
378
404
  it "returns an inspected version of the array as multiple Lines" do
379
- tiered_lines = described_class.inspect_object(
405
+ tiered_lines =
406
+ described_class.inspect_object(
407
+ ["foo", %w[bar baz], "qux"],
408
+ as_lines: true,
409
+ type: :delete,
410
+ indentation_level: 1
411
+ )
412
+ expect(tiered_lines).to match(
380
413
  [
381
- "foo",
382
- ["bar", "baz"],
383
- "qux",
384
- ],
385
- as_lines: true,
386
- type: :delete,
387
- indentation_level: 1,
414
+ an_object_having_attributes(
415
+ type: :delete,
416
+ indentation_level: 1,
417
+ value: "[",
418
+ collection_bookend: :open
419
+ ),
420
+ an_object_having_attributes(
421
+ type: :delete,
422
+ indentation_level: 2,
423
+ value: %("foo"),
424
+ add_comma: true
425
+ ),
426
+ an_object_having_attributes(
427
+ type: :delete,
428
+ indentation_level: 2,
429
+ value: "[",
430
+ collection_bookend: :open
431
+ ),
432
+ an_object_having_attributes(
433
+ type: :delete,
434
+ indentation_level: 3,
435
+ value: %("bar"),
436
+ add_comma: true
437
+ ),
438
+ an_object_having_attributes(
439
+ type: :delete,
440
+ indentation_level: 3,
441
+ value: %("baz"),
442
+ add_comma: false
443
+ ),
444
+ an_object_having_attributes(
445
+ type: :delete,
446
+ indentation_level: 2,
447
+ value: "]",
448
+ add_comma: true,
449
+ collection_bookend: :close
450
+ ),
451
+ an_object_having_attributes(
452
+ type: :delete,
453
+ indentation_level: 2,
454
+ value: %("qux"),
455
+ add_comma: false
456
+ ),
457
+ an_object_having_attributes(
458
+ type: :delete,
459
+ indentation_level: 1,
460
+ value: "]",
461
+ collection_bookend: :close
462
+ )
463
+ ]
388
464
  )
389
- expect(tiered_lines).to match([
390
- an_object_having_attributes(
391
- type: :delete,
392
- indentation_level: 1,
393
- value: %([),
394
- collection_bookend: :open,
395
- ),
396
- an_object_having_attributes(
397
- type: :delete,
398
- indentation_level: 2,
399
- value: %("foo"),
400
- add_comma: true,
401
- ),
402
- an_object_having_attributes(
403
- type: :delete,
404
- indentation_level: 2,
405
- value: %([),
406
- collection_bookend: :open,
407
- ),
408
- an_object_having_attributes(
409
- type: :delete,
410
- indentation_level: 3,
411
- value: %("bar"),
412
- add_comma: true,
413
- ),
414
- an_object_having_attributes(
415
- type: :delete,
416
- indentation_level: 3,
417
- value: %("baz"),
418
- add_comma: false,
419
- ),
420
- an_object_having_attributes(
421
- type: :delete,
422
- indentation_level: 2,
423
- value: %(]),
424
- add_comma: true,
425
- collection_bookend: :close,
426
- ),
427
- an_object_having_attributes(
428
- type: :delete,
429
- indentation_level: 2,
430
- value: %("qux"),
431
- add_comma: false,
432
- ),
433
- an_object_having_attributes(
434
- type: :delete,
435
- indentation_level: 1,
436
- value: %(]),
437
- collection_bookend: :close,
438
- ),
439
- ])
440
465
  end
441
466
  end
442
467
  end
@@ -445,25 +470,28 @@ RSpec.describe SuperDiff, type: :unit do
445
470
  context "given as_lines: false" do
446
471
  it "returns an inspected version of the array" do
447
472
  string = described_class.inspect_object([], as_lines: false)
448
- expect(string).to eq(%([]))
473
+ expect(string).to eq("[]")
449
474
  end
450
475
  end
451
476
 
452
477
  context "given as_lines: true" do
453
478
  it "returns an inspected version of the array as multiple Lines" do
454
- tiered_lines = described_class.inspect_object(
455
- [],
456
- as_lines: true,
457
- type: :delete,
458
- indentation_level: 1,
459
- )
460
- expect(tiered_lines).to match([
461
- an_object_having_attributes(
479
+ tiered_lines =
480
+ described_class.inspect_object(
481
+ [],
482
+ as_lines: true,
462
483
  type: :delete,
463
- indentation_level: 1,
464
- value: %([]),
465
- ),
466
- ])
484
+ indentation_level: 1
485
+ )
486
+ expect(tiered_lines).to match(
487
+ [
488
+ an_object_having_attributes(
489
+ type: :delete,
490
+ indentation_level: 1,
491
+ value: "[]"
492
+ )
493
+ ]
494
+ )
467
495
  end
468
496
  end
469
497
  end
@@ -474,252 +502,1035 @@ RSpec.describe SuperDiff, type: :unit do
474
502
  context "where all of the keys are symbols" do
475
503
  context "given as_lines: false" do
476
504
  it "returns an inspected version of the hash" do
477
- string = described_class.inspect_object(
478
- # rubocop:disable Style/HashSyntax
479
- { :foo => "bar", :baz => "qux" },
480
- # rubocop:enable Style/HashSyntax
481
- as_lines: false,
482
- )
505
+ string =
506
+ described_class.inspect_object(
507
+ # rubocop:disable Style/HashSyntax
508
+ { foo: "bar", baz: "qux" },
509
+ # rubocop:enable Style/HashSyntax
510
+ as_lines: false
511
+ )
483
512
  expect(string).to eq(%({ foo: "bar", baz: "qux" }))
484
513
  end
485
514
  end
486
515
 
487
516
  context "given as_lines: true" do
488
517
  it "returns an inspected version of the hash as multiple Lines" do
489
- tiered_lines = described_class.inspect_object(
490
- # rubocop:disable Style/HashSyntax
491
- { :foo => "bar", :baz => "qux" },
492
- # rubocop:enable Style/HashSyntax
493
- as_lines: true,
494
- type: :delete,
495
- indentation_level: 1,
496
- )
497
- expect(tiered_lines).to match([
498
- an_object_having_attributes(
499
- type: :delete,
500
- indentation_level: 1,
501
- value: %({),
502
- collection_bookend: :open,
503
- ),
504
- an_object_having_attributes(
518
+ tiered_lines =
519
+ described_class.inspect_object(
520
+ # rubocop:disable Style/HashSyntax
521
+ { foo: "bar", baz: "qux" },
522
+ # rubocop:enable Style/HashSyntax
523
+ as_lines: true,
505
524
  type: :delete,
506
- indentation_level: 2,
507
- prefix: %(foo: ),
508
- value: %("bar"),
525
+ indentation_level: 1
526
+ )
527
+ expect(tiered_lines).to match(
528
+ [
529
+ an_object_having_attributes(
530
+ type: :delete,
531
+ indentation_level: 1,
532
+ value: "{",
533
+ collection_bookend: :open
534
+ ),
535
+ an_object_having_attributes(
536
+ type: :delete,
537
+ indentation_level: 2,
538
+ prefix: "foo: ",
539
+ value: %("bar"),
540
+ add_comma: true
541
+ ),
542
+ an_object_having_attributes(
543
+ type: :delete,
544
+ indentation_level: 2,
545
+ prefix: "baz: ",
546
+ value: %("qux"),
547
+ add_comma: false
548
+ ),
549
+ an_object_having_attributes(
550
+ type: :delete,
551
+ indentation_level: 1,
552
+ value: "}",
553
+ collection_bookend: :close
554
+ )
555
+ ]
556
+ )
557
+ end
558
+ end
559
+ end
560
+
561
+ context "where only some of the keys are symbols" do
562
+ context "given as_lines: false" do
563
+ it "returns an inspected version of the hash" do
564
+ string =
565
+ described_class.inspect_object(
566
+ { :foo => "bar", 2 => "baz" },
567
+ as_lines: false
568
+ )
569
+ expect(string).to eq(%({ :foo => "bar", 2 => "baz" }))
570
+ end
571
+ end
572
+
573
+ context "given as_lines: true" do
574
+ it "returns an inspected version of the hash as multiple Lines" do
575
+ tiered_lines =
576
+ described_class.inspect_object(
577
+ { :foo => "bar", 2 => "baz" },
578
+ as_lines: true,
579
+ type: :delete,
580
+ indentation_level: 1
581
+ )
582
+ expect(tiered_lines).to match(
583
+ [
584
+ an_object_having_attributes(
585
+ type: :delete,
586
+ indentation_level: 1,
587
+ value: "{",
588
+ collection_bookend: :open
589
+ ),
590
+ an_object_having_attributes(
591
+ type: :delete,
592
+ indentation_level: 2,
593
+ prefix: ":foo => ",
594
+ value: %("bar"),
595
+ add_comma: true
596
+ ),
597
+ an_object_having_attributes(
598
+ type: :delete,
599
+ indentation_level: 2,
600
+ prefix: "2 => ",
601
+ value: %("baz"),
602
+ add_comma: false
603
+ ),
604
+ an_object_having_attributes(
605
+ type: :delete,
606
+ indentation_level: 1,
607
+ value: "}",
608
+ collection_bookend: :close
609
+ )
610
+ ]
611
+ )
612
+ end
613
+ end
614
+ end
615
+ end
616
+
617
+ context "containing other hashes" do
618
+ context "given as_lines: false" do
619
+ it "returns an inspected version of the hash" do
620
+ value_to_inspect = {
621
+ # rubocop:disable Style/HashSyntax
622
+ category_name: "Appliances",
623
+ products_by_sku: {
624
+ "EMDL-2934" => {
625
+ id: 4,
626
+ name: "Jordan Air"
627
+ },
628
+ "KDS-3912" => {
629
+ id: 8,
630
+ name: "Chevy Impala"
631
+ }
632
+ },
633
+ number_of_products: 2
634
+ # rubocop:enable Style/HashSyntax
635
+ }
636
+ string =
637
+ described_class.inspect_object(value_to_inspect, as_lines: false)
638
+ # rubocop:disable Metrics/LineLength
639
+ expect(string).to eq(
640
+ %({ category_name: "Appliances", products_by_sku: { "EMDL-2934" => { id: 4, name: "Jordan Air" }, "KDS-3912" => { id: 8, name: "Chevy Impala" } }, number_of_products: 2 })
641
+ )
642
+ # rubocop:enable Metrics/LineLength
643
+ end
644
+ end
645
+
646
+ context "given as_lines: true" do
647
+ it "returns an inspected version of the array as multiple Lines" do
648
+ value_to_inspect = {
649
+ # rubocop:disable Style/HashSyntax
650
+ category_name: "Appliances",
651
+ products_by_sku: {
652
+ "EMDL-2934" => {
653
+ id: 4,
654
+ name: "George Foreman Grill"
655
+ },
656
+ "KDS-3912" => {
657
+ id: 8,
658
+ name: "Magic Bullet"
659
+ }
660
+ },
661
+ number_of_products: 2
662
+ # rubocop:enable Style/HashSyntax
663
+ }
664
+ tiered_lines =
665
+ described_class.inspect_object(
666
+ value_to_inspect,
667
+ as_lines: true,
668
+ type: :delete,
669
+ indentation_level: 1
670
+ )
671
+ expect(tiered_lines).to match(
672
+ [
673
+ an_object_having_attributes(
674
+ type: :delete,
675
+ indentation_level: 1,
676
+ value: "{",
677
+ collection_bookend: :open
678
+ ),
679
+ an_object_having_attributes(
680
+ type: :delete,
681
+ indentation_level: 2,
682
+ prefix: "category_name: ",
683
+ value: %("Appliances"),
684
+ add_comma: true
685
+ ),
686
+ an_object_having_attributes(
687
+ type: :delete,
688
+ indentation_level: 2,
689
+ prefix: "products_by_sku: ",
690
+ value: "{",
691
+ collection_bookend: :open
692
+ ),
693
+ an_object_having_attributes(
694
+ type: :delete,
695
+ indentation_level: 3,
696
+ prefix: %("EMDL-2934" => ),
697
+ value: "{",
698
+ collection_bookend: :open
699
+ ),
700
+ an_object_having_attributes(
701
+ type: :delete,
702
+ indentation_level: 4,
703
+ prefix: "id: ",
704
+ value: "4",
705
+ add_comma: true
706
+ ),
707
+ an_object_having_attributes(
708
+ type: :delete,
709
+ indentation_level: 4,
710
+ prefix: "name: ",
711
+ value: %("George Foreman Grill"),
712
+ add_comma: false
713
+ ),
714
+ an_object_having_attributes(
715
+ type: :delete,
716
+ indentation_level: 3,
717
+ prefix: "",
718
+ value: "}",
509
719
  add_comma: true,
720
+ collection_bookend: :close
721
+ ),
722
+ an_object_having_attributes(
723
+ type: :delete,
724
+ indentation_level: 3,
725
+ prefix: %("KDS-3912" => ),
726
+ value: "{",
727
+ collection_bookend: :open
728
+ ),
729
+ an_object_having_attributes(
730
+ type: :delete,
731
+ indentation_level: 4,
732
+ prefix: "id: ",
733
+ value: "8",
734
+ add_comma: true
735
+ ),
736
+ an_object_having_attributes(
737
+ type: :delete,
738
+ indentation_level: 4,
739
+ prefix: "name: ",
740
+ value: %("Magic Bullet"),
741
+ add_comma: false
742
+ ),
743
+ an_object_having_attributes(
744
+ type: :delete,
745
+ indentation_level: 3,
746
+ prefix: "",
747
+ value: "}",
748
+ collection_bookend: :close
510
749
  ),
511
750
  an_object_having_attributes(
512
751
  type: :delete,
513
752
  indentation_level: 2,
514
- prefix: %(baz: ),
515
- value: %("qux"),
516
- add_comma: false,
753
+ prefix: "",
754
+ value: "}",
755
+ add_comma: true,
756
+ collection_bookend: :close
517
757
  ),
518
758
  an_object_having_attributes(
519
759
  type: :delete,
520
- indentation_level: 1,
521
- value: %(}),
522
- collection_bookend: :close,
760
+ indentation_level: 2,
761
+ prefix: "number_of_products: ",
762
+ value: "2"
523
763
  ),
524
- ])
525
- end
764
+ an_object_having_attributes(
765
+ type: :delete,
766
+ indentation_level: 1,
767
+ prefix: "",
768
+ value: "}"
769
+ )
770
+ ]
771
+ )
526
772
  end
527
773
  end
774
+ end
528
775
 
529
- context "where only some of the keys are symbols" do
530
- context "given as_lines: false" do
531
- it "returns an inspected version of the hash" do
532
- string = described_class.inspect_object(
533
- { :foo => "bar", 2 => "baz" },
534
- as_lines: false,
776
+ context "which is empty" do
777
+ context "given as_lines: false" do
778
+ it "returns an inspected version of the array" do
779
+ string = described_class.inspect_object({}, as_lines: false)
780
+ expect(string).to eq("{}")
781
+ end
782
+ end
783
+
784
+ context "given as_lines: true" do
785
+ it "returns an inspected version of the array" do
786
+ tiered_lines =
787
+ described_class.inspect_object(
788
+ {},
789
+ as_lines: true,
790
+ type: :delete,
791
+ indentation_level: 1
535
792
  )
536
- expect(string).to eq(%({ :foo => "bar", 2 => "baz" }))
537
- end
793
+ expect(tiered_lines).to match(
794
+ [
795
+ an_object_having_attributes(
796
+ type: :delete,
797
+ indentation_level: 1,
798
+ value: "{}"
799
+ )
800
+ ]
801
+ )
538
802
  end
803
+ end
804
+ end
805
+ end
539
806
 
540
- context "given as_lines: true" do
541
- it "returns an inspected version of the hash as multiple Lines" do
542
- tiered_lines = described_class.inspect_object(
543
- { :foo => "bar", 2 => "baz" },
807
+ context "given a Time object" do
808
+ context "that does not have an associated time zone" do
809
+ context "given as_lines: false" do
810
+ it "returns a representation of the time on a single line" do
811
+ inspection =
812
+ described_class.inspect_object(
813
+ Time.new(2021, 5, 5, 10, 23, 28.1234567891, "-05:00"),
814
+ as_lines: false
815
+ )
816
+ expect(inspection).to eq(
817
+ "#<Time 2021-05-05 10:23:28+(34749996836695/281474976710656) -05:00>"
818
+ )
819
+ end
820
+ end
821
+
822
+ context "given as_lines: true" do
823
+ it "returns a representation of the time across multiple lines" do
824
+ inspection =
825
+ described_class.inspect_object(
826
+ Time.new(2021, 5, 5, 10, 23, 28.1234567891, "-05:00"),
544
827
  as_lines: true,
545
828
  type: :delete,
546
- indentation_level: 1,
829
+ indentation_level: 1
547
830
  )
548
- expect(tiered_lines).to match([
831
+ expect(inspection).to match(
832
+ [
549
833
  an_object_having_attributes(
550
834
  type: :delete,
551
835
  indentation_level: 1,
552
- value: %({),
553
- collection_bookend: :open,
836
+ value: "#<Time {",
837
+ add_comma: false,
838
+ collection_bookend: :open
554
839
  ),
555
840
  an_object_having_attributes(
556
841
  type: :delete,
557
842
  indentation_level: 2,
558
- prefix: %(:foo => ),
559
- value: %("bar"),
843
+ value: "year: 2021",
560
844
  add_comma: true,
845
+ collection_bookend: nil
561
846
  ),
562
847
  an_object_having_attributes(
563
848
  type: :delete,
564
849
  indentation_level: 2,
565
- prefix: %(2 => ),
566
- value: %("baz"),
850
+ value: "month: 5",
851
+ add_comma: true,
852
+ collection_bookend: nil
853
+ ),
854
+ an_object_having_attributes(
855
+ type: :delete,
856
+ indentation_level: 2,
857
+ value: "day: 5",
858
+ add_comma: true,
859
+ collection_bookend: nil
860
+ ),
861
+ an_object_having_attributes(
862
+ type: :delete,
863
+ indentation_level: 2,
864
+ value: "hour: 10",
865
+ add_comma: true,
866
+ collection_bookend: nil
867
+ ),
868
+ an_object_having_attributes(
869
+ type: :delete,
870
+ indentation_level: 2,
871
+ value: "min: 23",
872
+ add_comma: true,
873
+ collection_bookend: nil
874
+ ),
875
+ an_object_having_attributes(
876
+ type: :delete,
877
+ indentation_level: 2,
878
+ value: "sec: 28",
879
+ add_comma: true,
880
+ collection_bookend: nil
881
+ ),
882
+ an_object_having_attributes(
883
+ type: :delete,
884
+ indentation_level: 2,
885
+ value: "subsec: (34749996836695/281474976710656)",
886
+ add_comma: true,
887
+ collection_bookend: nil
888
+ ),
889
+ an_object_having_attributes(
890
+ type: :delete,
891
+ indentation_level: 2,
892
+ value: "zone: nil",
893
+ add_comma: true,
894
+ collection_bookend: nil
895
+ ),
896
+ an_object_having_attributes(
897
+ type: :delete,
898
+ indentation_level: 2,
899
+ value: "utc_offset: -18000",
567
900
  add_comma: false,
901
+ collection_bookend: nil
568
902
  ),
569
903
  an_object_having_attributes(
570
904
  type: :delete,
571
905
  indentation_level: 1,
572
- value: %(}),
573
- collection_bookend: :close,
574
- ),
575
- ])
576
- end
906
+ value: "}>",
907
+ add_comma: false,
908
+ collection_bookend: :close
909
+ )
910
+ ]
911
+ )
577
912
  end
578
913
  end
579
914
  end
580
915
 
581
- context "containing other hashes" do
916
+ context "that has an associated time zone" do
917
+ around do |example|
918
+ ClimateControl.modify(TZ: "America/Chicago", &example)
919
+ end
920
+
582
921
  context "given as_lines: false" do
583
- it "returns an inspected version of the hash" do
584
- value_to_inspect = {
585
- # rubocop:disable Style/HashSyntax
586
- :category_name => "Appliances",
587
- :products_by_sku => {
588
- "EMDL-2934" => { :id => 4, :name => "Jordan Air" },
589
- "KDS-3912" => { :id => 8, :name => "Chevy Impala" },
590
- },
591
- :number_of_products => 2,
592
- # rubocop:enable Style/HashSyntax
593
- }
594
- string = described_class.inspect_object(
595
- value_to_inspect,
596
- as_lines: false,
597
- )
598
- # rubocop:disable Metrics/LineLength
599
- expect(string).to eq(
600
- %({ category_name: "Appliances", products_by_sku: { "EMDL-2934" => { id: 4, name: "Jordan Air" }, "KDS-3912" => { id: 8, name: "Chevy Impala" } }, number_of_products: 2 }),
922
+ it "returns a representation of the time on a single line" do
923
+ inspection =
924
+ described_class.inspect_object(
925
+ Time.new(2021, 5, 5, 10, 23, 28.1234567891),
926
+ as_lines: false
927
+ )
928
+ expect(inspection).to eq(
929
+ "#<Time 2021-05-05 10:23:28+(34749996836695/281474976710656) -05:00 (CDT)>"
601
930
  )
602
- # rubocop:enable Metrics/LineLength
603
931
  end
604
932
  end
605
933
 
606
934
  context "given as_lines: true" do
607
- it "returns an inspected version of the array as multiple Lines" do
608
- value_to_inspect = {
609
- # rubocop:disable Style/HashSyntax
610
- :category_name => "Appliances",
611
- :products_by_sku => {
612
- "EMDL-2934" => { :id => 4, :name => "George Foreman Grill" },
613
- "KDS-3912" => { :id => 8, :name => "Magic Bullet" },
614
- },
615
- :number_of_products => 2,
616
- # rubocop:enable Style/HashSyntax
617
- }
618
- tiered_lines = described_class.inspect_object(
619
- value_to_inspect,
620
- as_lines: true,
621
- type: :delete,
622
- indentation_level: 1,
623
- )
624
- expect(tiered_lines).to match([
625
- an_object_having_attributes(
626
- type: :delete,
627
- indentation_level: 1,
628
- value: %({),
629
- collection_bookend: :open,
630
- ),
631
- an_object_having_attributes(
632
- type: :delete,
633
- indentation_level: 2,
634
- prefix: %(category_name: ),
635
- value: %("Appliances"),
636
- add_comma: true,
637
- ),
638
- an_object_having_attributes(
639
- type: :delete,
640
- indentation_level: 2,
641
- prefix: %(products_by_sku: ),
642
- value: %({),
643
- collection_bookend: :open,
644
- ),
645
- an_object_having_attributes(
646
- type: :delete,
647
- indentation_level: 3,
648
- prefix: %("EMDL-2934" => ),
649
- value: %({),
650
- collection_bookend: :open,
651
- ),
652
- an_object_having_attributes(
653
- type: :delete,
654
- indentation_level: 4,
655
- prefix: %(id: ),
656
- value: %(4),
657
- add_comma: true,
658
- ),
659
- an_object_having_attributes(
660
- type: :delete,
661
- indentation_level: 4,
662
- prefix: %(name: ),
663
- value: %("George Foreman Grill"),
664
- add_comma: false,
665
- ),
666
- an_object_having_attributes(
667
- type: :delete,
668
- indentation_level: 3,
669
- prefix: "",
670
- value: %(}),
671
- add_comma: true,
672
- collection_bookend: :close,
673
- ),
674
- an_object_having_attributes(
675
- type: :delete,
676
- indentation_level: 3,
677
- prefix: %("KDS-3912" => ),
678
- value: %({),
679
- collection_bookend: :open,
680
- ),
681
- an_object_having_attributes(
682
- type: :delete,
683
- indentation_level: 4,
684
- prefix: %(id: ),
685
- value: %(8),
686
- add_comma: true,
687
- ),
688
- an_object_having_attributes(
935
+ it "returns a representation of the time across multiple lines" do
936
+ inspection =
937
+ described_class.inspect_object(
938
+ Time.new(2021, 5, 5, 10, 23, 28.1234567891),
939
+ as_lines: true,
689
940
  type: :delete,
690
- indentation_level: 4,
691
- prefix: %(name: ),
692
- value: %("Magic Bullet"),
941
+ indentation_level: 1
942
+ )
943
+ expect(inspection).to match(
944
+ [
945
+ an_object_having_attributes(
946
+ type: :delete,
947
+ indentation_level: 1,
948
+ value: "#<Time {",
949
+ add_comma: false,
950
+ collection_bookend: :open
951
+ ),
952
+ an_object_having_attributes(
953
+ type: :delete,
954
+ indentation_level: 2,
955
+ value: "year: 2021",
956
+ add_comma: true,
957
+ collection_bookend: nil
958
+ ),
959
+ an_object_having_attributes(
960
+ type: :delete,
961
+ indentation_level: 2,
962
+ value: "month: 5",
963
+ add_comma: true,
964
+ collection_bookend: nil
965
+ ),
966
+ an_object_having_attributes(
967
+ type: :delete,
968
+ indentation_level: 2,
969
+ value: "day: 5",
970
+ add_comma: true,
971
+ collection_bookend: nil
972
+ ),
973
+ an_object_having_attributes(
974
+ type: :delete,
975
+ indentation_level: 2,
976
+ value: "hour: 10",
977
+ add_comma: true,
978
+ collection_bookend: nil
979
+ ),
980
+ an_object_having_attributes(
981
+ type: :delete,
982
+ indentation_level: 2,
983
+ value: "min: 23",
984
+ add_comma: true,
985
+ collection_bookend: nil
986
+ ),
987
+ an_object_having_attributes(
988
+ type: :delete,
989
+ indentation_level: 2,
990
+ value: "sec: 28",
991
+ add_comma: true,
992
+ collection_bookend: nil
993
+ ),
994
+ an_object_having_attributes(
995
+ type: :delete,
996
+ indentation_level: 2,
997
+ value: "subsec: (34749996836695/281474976710656)",
998
+ add_comma: true,
999
+ collection_bookend: nil
1000
+ ),
1001
+ an_object_having_attributes(
1002
+ type: :delete,
1003
+ indentation_level: 2,
1004
+ value: %(zone: "CDT"),
1005
+ add_comma: true,
1006
+ collection_bookend: nil
1007
+ ),
1008
+ an_object_having_attributes(
1009
+ type: :delete,
1010
+ indentation_level: 2,
1011
+ value: "utc_offset: -18000",
1012
+ add_comma: false,
1013
+ collection_bookend: nil
1014
+ ),
1015
+ an_object_having_attributes(
1016
+ type: :delete,
1017
+ indentation_level: 1,
1018
+ value: "}>",
1019
+ add_comma: false,
1020
+ collection_bookend: :close
1021
+ )
1022
+ ]
1023
+ )
1024
+ end
1025
+ end
1026
+ end
1027
+ end
1028
+
1029
+ context "given a Date object" do
1030
+ context "given as_lines: false" do
1031
+ it "returns a representation of the date on a single line" do
1032
+ inspection =
1033
+ described_class.inspect_object(
1034
+ Date.new(2023, 10, 14),
1035
+ as_lines: false
1036
+ )
1037
+ expect(inspection).to eq("#<Date 2023-10-14>")
1038
+ end
1039
+ end
1040
+
1041
+ context "given as_lines: true" do
1042
+ it "returns a representation of the date across multiple lines" do
1043
+ inspection =
1044
+ described_class.inspect_object(
1045
+ Date.new(2023, 10, 14),
1046
+ as_lines: true,
1047
+ type: :delete,
1048
+ indentation_level: 1
1049
+ )
1050
+ expect(inspection).to match(
1051
+ [
1052
+ an_object_having_attributes(
1053
+ type: :delete,
1054
+ indentation_level: 1,
1055
+ value: "#<Date {",
693
1056
  add_comma: false,
1057
+ collection_bookend: :open
694
1058
  ),
695
1059
  an_object_having_attributes(
696
1060
  type: :delete,
697
- indentation_level: 3,
698
- prefix: "",
699
- value: %(}),
700
- collection_bookend: :close,
1061
+ indentation_level: 2,
1062
+ value: "year: 2023",
1063
+ add_comma: true,
1064
+ collection_bookend: nil
701
1065
  ),
702
1066
  an_object_having_attributes(
703
1067
  type: :delete,
704
1068
  indentation_level: 2,
705
- prefix: "",
706
- value: %(}),
1069
+ value: "month: 10",
707
1070
  add_comma: true,
708
- collection_bookend: :close,
1071
+ collection_bookend: nil
709
1072
  ),
710
1073
  an_object_having_attributes(
711
1074
  type: :delete,
712
1075
  indentation_level: 2,
713
- prefix: %(number_of_products: ),
714
- value: %(2),
1076
+ value: "day: 14",
1077
+ add_comma: false,
1078
+ collection_bookend: nil
715
1079
  ),
716
1080
  an_object_having_attributes(
717
1081
  type: :delete,
718
1082
  indentation_level: 1,
719
- prefix: "",
720
- value: %(}),
721
- ),
722
- ])
1083
+ value: "}>",
1084
+ add_comma: false,
1085
+ collection_bookend: :close
1086
+ )
1087
+ ]
1088
+ )
1089
+ end
1090
+ end
1091
+ end
1092
+
1093
+ context "given a class" do
1094
+ context "given as_lines: false" do
1095
+ it "returns an inspected version of the object" do
1096
+ string =
1097
+ described_class.inspect_object(
1098
+ SuperDiff::Test::Person,
1099
+ as_lines: false
1100
+ )
1101
+ expect(string).to eq("SuperDiff::Test::Person")
1102
+ end
1103
+ end
1104
+
1105
+ context "given as_lines: true" do
1106
+ it "returns an inspected version of the object" do
1107
+ tiered_lines =
1108
+ described_class.inspect_object(
1109
+ SuperDiff::Test::Person,
1110
+ as_lines: true,
1111
+ type: :delete,
1112
+ indentation_level: 1
1113
+ )
1114
+ expect(tiered_lines).to match(
1115
+ [
1116
+ an_object_having_attributes(
1117
+ type: :delete,
1118
+ indentation_level: 1,
1119
+ value: "SuperDiff::Test::Person"
1120
+ )
1121
+ ]
1122
+ )
1123
+ end
1124
+ end
1125
+ end
1126
+
1127
+ # TODO: Add when empty
1128
+ context "given a custom object" do
1129
+ context "containing only primitive values" do
1130
+ context "given as_lines: false" do
1131
+ it "returns an inspected version of the object" do
1132
+ string =
1133
+ described_class.inspect_object(
1134
+ SuperDiff::Test::Person.new(name: "Doc", age: 58),
1135
+ as_lines: false
1136
+ )
1137
+ expect(string).to eq(
1138
+ %(#<SuperDiff::Test::Person name: "Doc", age: 58>)
1139
+ )
1140
+ end
1141
+ end
1142
+
1143
+ context "given as_lines: true" do
1144
+ it "returns an inspected version of the object as multiple Lines" do
1145
+ tiered_lines =
1146
+ described_class.inspect_object(
1147
+ SuperDiff::Test::Person.new(name: "Doc", age: 58),
1148
+ as_lines: true,
1149
+ type: :delete,
1150
+ indentation_level: 1
1151
+ )
1152
+ expect(tiered_lines).to match(
1153
+ [
1154
+ an_object_having_attributes(
1155
+ type: :delete,
1156
+ indentation_level: 1,
1157
+ value: "#<SuperDiff::Test::Person {"
1158
+ ),
1159
+ an_object_having_attributes(
1160
+ type: :delete,
1161
+ indentation_level: 2,
1162
+ prefix: "name: ",
1163
+ value: %("Doc"),
1164
+ add_comma: true
1165
+ ),
1166
+ an_object_having_attributes(
1167
+ type: :delete,
1168
+ indentation_level: 2,
1169
+ prefix: "age: ",
1170
+ value: "58",
1171
+ add_comma: false
1172
+ ),
1173
+ an_object_having_attributes(
1174
+ type: :delete,
1175
+ indentation_level: 1,
1176
+ value: "}>"
1177
+ )
1178
+ ]
1179
+ )
1180
+ end
1181
+ end
1182
+ end
1183
+
1184
+ context "containing other custom objects" do
1185
+ context "given as_lines: false" do
1186
+ it "returns an inspected version of the object" do
1187
+ string =
1188
+ described_class.inspect_object(
1189
+ SuperDiff::Test::Customer.new(
1190
+ name: "Marty McFly",
1191
+ shipping_address:
1192
+ SuperDiff::Test::ShippingAddress.new(
1193
+ line_1: "123 Main St.",
1194
+ line_2: "",
1195
+ city: "Hill Valley",
1196
+ state: "CA",
1197
+ zip: "90382"
1198
+ ),
1199
+ phone: "111-222-3333"
1200
+ ),
1201
+ as_lines: false
1202
+ )
1203
+ expect(string).to eq(
1204
+ # rubocop:disable Metrics/LineLength
1205
+ %(#<SuperDiff::Test::Customer name: "Marty McFly", shipping_address: #<SuperDiff::Test::ShippingAddress line_1: "123 Main St.", line_2: "", city: "Hill Valley", state: "CA", zip: "90382">, phone: "111-222-3333">)
1206
+ # rubocop:enable Metrics/LineLength
1207
+ )
1208
+ end
1209
+ end
1210
+
1211
+ context "given as_lines: true" do
1212
+ it "returns an inspected version of the object as multiple Lines" do
1213
+ tiered_lines =
1214
+ described_class.inspect_object(
1215
+ SuperDiff::Test::Customer.new(
1216
+ name: "Marty McFly",
1217
+ shipping_address:
1218
+ SuperDiff::Test::ShippingAddress.new(
1219
+ line_1: "123 Main St.",
1220
+ line_2: "",
1221
+ city: "Hill Valley",
1222
+ state: "CA",
1223
+ zip: "90382"
1224
+ ),
1225
+ phone: "111-222-3333"
1226
+ ),
1227
+ as_lines: true,
1228
+ type: :delete,
1229
+ indentation_level: 1
1230
+ )
1231
+ expect(tiered_lines).to match(
1232
+ [
1233
+ an_object_having_attributes(
1234
+ type: :delete,
1235
+ indentation_level: 1,
1236
+ value: "#<SuperDiff::Test::Customer {",
1237
+ collection_bookend: :open
1238
+ ),
1239
+ an_object_having_attributes(
1240
+ type: :delete,
1241
+ indentation_level: 2,
1242
+ prefix: "name: ",
1243
+ value: %("Marty McFly"),
1244
+ add_comma: true
1245
+ ),
1246
+ an_object_having_attributes(
1247
+ type: :delete,
1248
+ indentation_level: 2,
1249
+ prefix: "shipping_address: ",
1250
+ value: "#<SuperDiff::Test::ShippingAddress {",
1251
+ add_comma: false,
1252
+ collection_bookend: :open
1253
+ ),
1254
+ an_object_having_attributes(
1255
+ type: :delete,
1256
+ indentation_level: 3,
1257
+ prefix: "line_1: ",
1258
+ value: %("123 Main St.")
1259
+ ),
1260
+ an_object_having_attributes(
1261
+ type: :delete,
1262
+ indentation_level: 3,
1263
+ prefix: "line_2: ",
1264
+ value: %(""),
1265
+ add_comma: true
1266
+ ),
1267
+ an_object_having_attributes(
1268
+ type: :delete,
1269
+ indentation_level: 3,
1270
+ prefix: "city: ",
1271
+ value: %("Hill Valley"),
1272
+ add_comma: true
1273
+ ),
1274
+ an_object_having_attributes(
1275
+ type: :delete,
1276
+ indentation_level: 3,
1277
+ prefix: "state: ",
1278
+ value: %("CA"),
1279
+ add_comma: true
1280
+ ),
1281
+ an_object_having_attributes(
1282
+ type: :delete,
1283
+ indentation_level: 3,
1284
+ prefix: "zip: ",
1285
+ value: %("90382"),
1286
+ add_comma: false
1287
+ ),
1288
+ an_object_having_attributes(
1289
+ type: :delete,
1290
+ indentation_level: 2,
1291
+ value: "}>",
1292
+ add_comma: true,
1293
+ collection_bookend: :close
1294
+ ),
1295
+ an_object_having_attributes(
1296
+ type: :delete,
1297
+ indentation_level: 2,
1298
+ prefix: "phone: ",
1299
+ value: %("111-222-3333"),
1300
+ add_comma: false
1301
+ ),
1302
+ an_object_having_attributes(
1303
+ type: :delete,
1304
+ indentation_level: 1,
1305
+ value: "}>",
1306
+ add_comma: false,
1307
+ collection_bookend: :close
1308
+ )
1309
+ ]
1310
+ )
1311
+ end
1312
+ end
1313
+ end
1314
+ end
1315
+
1316
+ context "given a non-custom object" do
1317
+ context "containing only primitive values" do
1318
+ context "given as_lines: false" do
1319
+ it "returns an inspected version of the object" do
1320
+ string =
1321
+ described_class.inspect_object(
1322
+ SuperDiff::Test::Item.new(name: "mac and cheese", quantity: 2),
1323
+ as_lines: false
1324
+ )
1325
+ expect(string).to match(
1326
+ /\A#<SuperDiff::Test::Item:0x[a-z0-9]+ @name="mac and cheese", @quantity=2>\Z/
1327
+ )
1328
+ end
1329
+ end
1330
+
1331
+ context "given as_lines: true" do
1332
+ it "returns an inspected version of the object as multiple Lines" do
1333
+ tiered_lines =
1334
+ described_class.inspect_object(
1335
+ SuperDiff::Test::Item.new(name: "mac and cheese", quantity: 2),
1336
+ as_lines: true,
1337
+ type: :delete,
1338
+ indentation_level: 1
1339
+ )
1340
+ expect(tiered_lines).to match(
1341
+ [
1342
+ an_object_having_attributes(
1343
+ type: :delete,
1344
+ indentation_level: 1,
1345
+ value:
1346
+ a_string_matching(/#<SuperDiff::Test::Item:0x[a-f0-9]+ \{/),
1347
+ collection_bookend: :open
1348
+ ),
1349
+ an_object_having_attributes(
1350
+ type: :delete,
1351
+ indentation_level: 2,
1352
+ prefix: "@name=",
1353
+ value: %("mac and cheese"),
1354
+ add_comma: true
1355
+ ),
1356
+ an_object_having_attributes(
1357
+ type: :delete,
1358
+ indentation_level: 2,
1359
+ prefix: "@quantity=",
1360
+ value: "2",
1361
+ add_comma: false
1362
+ ),
1363
+ an_object_having_attributes(
1364
+ type: :delete,
1365
+ indentation_level: 1,
1366
+ value: "}>",
1367
+ collection_bookend: :close
1368
+ )
1369
+ ]
1370
+ )
1371
+ end
1372
+ end
1373
+ end
1374
+
1375
+ context "containing other custom objects" do
1376
+ context "given as_lines: false" do
1377
+ it "returns an inspected version of the object" do
1378
+ string =
1379
+ described_class.inspect_object(
1380
+ SuperDiff::Test::Order.new(
1381
+ [
1382
+ SuperDiff::Test::Item.new(name: "ham", quantity: 1),
1383
+ SuperDiff::Test::Item.new(name: "eggs", quantity: 2),
1384
+ SuperDiff::Test::Item.new(name: "cheese", quantity: 1)
1385
+ ]
1386
+ ),
1387
+ as_lines: false
1388
+ )
1389
+ expect(string).to match(
1390
+ # rubocop:disable Metrics/LineLength
1391
+ /\A#<SuperDiff::Test::Order:0x[a-z0-9]+ @items=\[#<SuperDiff::Test::Item:0x[a-z0-9]+ @name="ham", @quantity=1>, #<SuperDiff::Test::Item:0x[a-z0-9]+ @name="eggs", @quantity=2>, #<SuperDiff::Test::Item:0x[a-z0-9]+ @name="cheese", @quantity=1>\]>\Z/
1392
+ # rubocop:enable Metrics/LineLength
1393
+ )
1394
+ end
1395
+ end
1396
+
1397
+ context "given as_lines: true" do
1398
+ it "returns an inspected version of the object as multiple Lines" do
1399
+ tiered_lines =
1400
+ described_class.inspect_object(
1401
+ SuperDiff::Test::Order.new(
1402
+ [
1403
+ SuperDiff::Test::Item.new(name: "ham", quantity: 1),
1404
+ SuperDiff::Test::Item.new(name: "eggs", quantity: 2),
1405
+ SuperDiff::Test::Item.new(name: "cheese", quantity: 1)
1406
+ ]
1407
+ ),
1408
+ as_lines: true,
1409
+ type: :delete,
1410
+ indentation_level: 1
1411
+ )
1412
+ expect(tiered_lines).to match(
1413
+ [
1414
+ an_object_having_attributes(
1415
+ type: :delete,
1416
+ indentation_level: 1,
1417
+ value:
1418
+ a_string_matching(
1419
+ /#<SuperDiff::Test::Order:0x[a-f0-9]+ \{/
1420
+ ),
1421
+ collection_bookend: :open
1422
+ ),
1423
+ an_object_having_attributes(
1424
+ type: :delete,
1425
+ indentation_level: 2,
1426
+ prefix: "@items=",
1427
+ value: "[",
1428
+ add_comma: false,
1429
+ collection_bookend: :open
1430
+ ),
1431
+ an_object_having_attributes(
1432
+ type: :delete,
1433
+ indentation_level: 3,
1434
+ value:
1435
+ a_string_matching(/#<SuperDiff::Test::Item:0x[a-f0-9]+ \{/),
1436
+ add_comma: false,
1437
+ collection_bookend: :open
1438
+ ),
1439
+ an_object_having_attributes(
1440
+ type: :delete,
1441
+ indentation_level: 4,
1442
+ prefix: "@name=",
1443
+ value: %("ham"),
1444
+ add_comma: true
1445
+ ),
1446
+ an_object_having_attributes(
1447
+ type: :delete,
1448
+ indentation_level: 4,
1449
+ prefix: "@quantity=",
1450
+ value: "1",
1451
+ add_comma: false
1452
+ ),
1453
+ an_object_having_attributes(
1454
+ type: :delete,
1455
+ indentation_level: 3,
1456
+ value: "}>",
1457
+ add_comma: true,
1458
+ collection_bookend: :close
1459
+ ),
1460
+ an_object_having_attributes(
1461
+ type: :delete,
1462
+ indentation_level: 3,
1463
+ value:
1464
+ a_string_matching(/#<SuperDiff::Test::Item:0x[a-f0-9]+ \{/),
1465
+ add_comma: false,
1466
+ collection_bookend: :open
1467
+ ),
1468
+ an_object_having_attributes(
1469
+ type: :delete,
1470
+ indentation_level: 4,
1471
+ prefix: "@name=",
1472
+ value: %("eggs"),
1473
+ add_comma: true
1474
+ ),
1475
+ an_object_having_attributes(
1476
+ type: :delete,
1477
+ indentation_level: 4,
1478
+ prefix: "@quantity=",
1479
+ value: "2",
1480
+ add_comma: false
1481
+ ),
1482
+ an_object_having_attributes(
1483
+ type: :delete,
1484
+ indentation_level: 3,
1485
+ value: "}>",
1486
+ add_comma: true,
1487
+ collection_bookend: :close
1488
+ ),
1489
+ an_object_having_attributes(
1490
+ type: :delete,
1491
+ indentation_level: 3,
1492
+ value:
1493
+ a_string_matching(/#<SuperDiff::Test::Item:0x[a-f0-9]+ \{/),
1494
+ add_comma: false,
1495
+ collection_bookend: :open
1496
+ ),
1497
+ an_object_having_attributes(
1498
+ type: :delete,
1499
+ indentation_level: 4,
1500
+ prefix: "@name=",
1501
+ value: %("cheese"),
1502
+ add_comma: true
1503
+ ),
1504
+ an_object_having_attributes(
1505
+ type: :delete,
1506
+ indentation_level: 4,
1507
+ prefix: "@quantity=",
1508
+ value: "1",
1509
+ add_comma: false
1510
+ ),
1511
+ an_object_having_attributes(
1512
+ type: :delete,
1513
+ indentation_level: 3,
1514
+ value: "}>",
1515
+ add_comma: false,
1516
+ collection_bookend: :close
1517
+ ),
1518
+ an_object_having_attributes(
1519
+ type: :delete,
1520
+ indentation_level: 2,
1521
+ value: "]",
1522
+ add_comma: false,
1523
+ collection_bookend: :close
1524
+ ),
1525
+ an_object_having_attributes(
1526
+ type: :delete,
1527
+ indentation_level: 1,
1528
+ value: "}>",
1529
+ add_comma: false,
1530
+ collection_bookend: :close
1531
+ )
1532
+ ]
1533
+ )
723
1534
  end
724
1535
  end
725
1536
  end
@@ -727,1166 +1538,509 @@ RSpec.describe SuperDiff, type: :unit do
727
1538
  context "which is empty" do
728
1539
  context "given as_lines: false" do
729
1540
  it "returns an inspected version of the array" do
730
- string = described_class.inspect_object({}, as_lines: false)
731
- expect(string).to eq(%({}))
1541
+ string =
1542
+ described_class.inspect_object(
1543
+ SuperDiff::Test::EmptyClass.new,
1544
+ as_lines: false
1545
+ )
1546
+ expect(string).to match(
1547
+ /#<SuperDiff::Test::EmptyClass:0x[a-z0-9]+>/
1548
+ )
732
1549
  end
733
1550
  end
734
1551
 
735
1552
  context "given as_lines: true" do
736
1553
  it "returns an inspected version of the array" do
737
- tiered_lines = described_class.inspect_object(
738
- {},
739
- as_lines: true,
740
- type: :delete,
741
- indentation_level: 1,
742
- )
743
- expect(tiered_lines).to match([
744
- an_object_having_attributes(
1554
+ inspection =
1555
+ described_class.inspect_object(
1556
+ SuperDiff::Test::EmptyClass.new,
1557
+ as_lines: true,
745
1558
  type: :delete,
746
- indentation_level: 1,
747
- value: %({}),
748
- ),
749
- ])
1559
+ indentation_level: 1
1560
+ )
1561
+ expect(inspection).to match(
1562
+ [
1563
+ an_object_having_attributes(
1564
+ type: :delete,
1565
+ indentation_level: 1,
1566
+ value:
1567
+ a_string_matching(
1568
+ /#<SuperDiff::Test::EmptyClass:0x[a-z0-9]+>/
1569
+ )
1570
+ )
1571
+ ]
1572
+ )
750
1573
  end
751
1574
  end
752
1575
  end
753
1576
  end
754
1577
 
755
- context "given a Time object" do
756
- context "that does not have an associated time zone" do
757
- context "given as_lines: false" do
758
- it "returns a representation of the time on a single line" do
759
- inspection = described_class.inspect_object(
760
- Time.new(2021, 5, 5, 10, 23, 28.1234567891, "-05:00"),
1578
+ context "given a combination of all kinds of values" do
1579
+ context "given as_lines: false" do
1580
+ it "returns an inspected version of the object" do
1581
+ string =
1582
+ described_class.inspect_object(
1583
+ {
1584
+ state: :down,
1585
+ errors: [
1586
+ "Container A-234 is partially damaged",
1587
+ "Vessel B042 was attacked by raccoons",
1588
+ "Product FDK-3429 is out of stock"
1589
+ ],
1590
+ mission_critical: true,
1591
+ serviceable: false,
1592
+ outstanding_orders: [
1593
+ SuperDiff::Test::Order.new(
1594
+ [
1595
+ SuperDiff::Test::Item.new(name: "ham", quantity: 1),
1596
+ SuperDiff::Test::Item.new(name: "eggs", quantity: 2),
1597
+ SuperDiff::Test::Item.new(name: "cheese", quantity: 1)
1598
+ ]
1599
+ )
1600
+ ],
1601
+ customers: [
1602
+ SuperDiff::Test::Customer.new(
1603
+ name: "Marty McFly",
1604
+ shipping_address:
1605
+ SuperDiff::Test::ShippingAddress.new(
1606
+ line_1: "123 Baltic Ave.",
1607
+ line_2: "",
1608
+ city: "Hill Valley",
1609
+ state: "CA",
1610
+ zip: "90382"
1611
+ ),
1612
+ phone: "111-111-1111"
1613
+ ),
1614
+ SuperDiff::Test::Customer.new(
1615
+ name: "Doc Brown",
1616
+ shipping_address:
1617
+ SuperDiff::Test::ShippingAddress.new(
1618
+ line_1: "456 Park Place",
1619
+ line_2: "",
1620
+ city: "Beverly Hills",
1621
+ state: "CA",
1622
+ zip: "90210"
1623
+ ),
1624
+ phone: "222-222-2222"
1625
+ )
1626
+ ]
1627
+ },
761
1628
  as_lines: false
762
1629
  )
763
- expect(inspection).to eq(
764
- "#<Time 2021-05-05 10:23:28+(34749996836695/281474976710656) -05:00>"
765
- )
766
- end
1630
+ expect(string).to match(
1631
+ # rubocop:disable Metrics/LineLength
1632
+ /\A\{ state: :down, errors: \["Container A-234 is partially damaged", "Vessel B042 was attacked by raccoons", "Product FDK-3429 is out of stock"\], mission_critical: true, serviceable: false, outstanding_orders: \[#<SuperDiff::Test::Order:0x[a-z0-9]+ @items=\[#<SuperDiff::Test::Item:0x[a-z0-9]+ @name="ham", @quantity=1>, #<SuperDiff::Test::Item:0x[a-z0-9]+ @name="eggs", @quantity=2>, #<SuperDiff::Test::Item:0x[a-z0-9]+ @name="cheese", @quantity=1>\]>\], customers: \[#<SuperDiff::Test::Customer name: "Marty McFly", shipping_address: #<SuperDiff::Test::ShippingAddress line_1: "123 Baltic Ave.", line_2: "", city: "Hill Valley", state: "CA", zip: "90382">, phone: "111-111-1111">, #<SuperDiff::Test::Customer name: "Doc Brown", shipping_address: #<SuperDiff::Test::ShippingAddress line_1: "456 Park Place", line_2: "", city: "Beverly Hills", state: "CA", zip: "90210">, phone: "222-222-2222">\] \}\Z/
1633
+ # rubocop:enable Metrics/LineLength
1634
+ )
767
1635
  end
1636
+ end
768
1637
 
769
- context "given as_lines: true" do
770
- it "returns a representation of the time across multiple lines" do
771
- inspection = described_class.inspect_object(
772
- Time.new(2021, 5, 5, 10, 23, 28.1234567891, "-05:00"),
1638
+ context "given as_lines: true" do
1639
+ it "returns an inspected version of the object as multiple Lines" do
1640
+ tiered_lines =
1641
+ described_class.inspect_object(
1642
+ {
1643
+ state: :down,
1644
+ errors: [
1645
+ "Container A-234 is partially damaged",
1646
+ "Vessel B042 was attacked by raccoons",
1647
+ "Product FDK-3429 is out of stock"
1648
+ ],
1649
+ mission_critical: true,
1650
+ serviceable: false,
1651
+ outstanding_orders: [
1652
+ SuperDiff::Test::Order.new(
1653
+ [
1654
+ SuperDiff::Test::Item.new(name: "ham", quantity: 1),
1655
+ SuperDiff::Test::Item.new(name: "eggs", quantity: 2),
1656
+ SuperDiff::Test::Item.new(name: "cheese", quantity: 1)
1657
+ ]
1658
+ )
1659
+ ],
1660
+ customers: [
1661
+ SuperDiff::Test::Customer.new(
1662
+ name: "Marty McFly",
1663
+ shipping_address:
1664
+ SuperDiff::Test::ShippingAddress.new(
1665
+ line_1: "123 Baltic Ave.",
1666
+ line_2: "",
1667
+ city: "Hill Valley",
1668
+ state: "CA",
1669
+ zip: "90382"
1670
+ ),
1671
+ phone: "111-111-1111"
1672
+ ),
1673
+ SuperDiff::Test::Customer.new(
1674
+ name: "Doc Brown",
1675
+ shipping_address:
1676
+ SuperDiff::Test::ShippingAddress.new(
1677
+ line_1: "456 Park Place",
1678
+ line_2: "",
1679
+ city: "Beverly Hills",
1680
+ state: "CA",
1681
+ zip: "90210"
1682
+ ),
1683
+ phone: "222-222-2222"
1684
+ )
1685
+ ]
1686
+ },
773
1687
  as_lines: true,
774
1688
  type: :delete,
775
1689
  indentation_level: 1
776
1690
  )
777
- expect(inspection).to match([
1691
+ expect(tiered_lines).to match(
1692
+ [
778
1693
  an_object_having_attributes(
779
1694
  type: :delete,
780
1695
  indentation_level: 1,
781
- value: %(#<Time {),
782
- add_comma: false,
783
- collection_bookend: :open,
784
- ),
785
- an_object_having_attributes(
786
- type: :delete,
787
- indentation_level: 2,
788
- value: %(year: 2021),
789
- add_comma: true,
790
- collection_bookend: nil,
791
- ),
792
- an_object_having_attributes(
793
- type: :delete,
794
- indentation_level: 2,
795
- value: %(month: 5),
796
- add_comma: true,
797
- collection_bookend: nil,
798
- ),
799
- an_object_having_attributes(
800
- type: :delete,
801
- indentation_level: 2,
802
- value: %(day: 5),
803
- add_comma: true,
804
- collection_bookend: nil,
805
- ),
806
- an_object_having_attributes(
807
- type: :delete,
808
- indentation_level: 2,
809
- value: %(hour: 10),
810
- add_comma: true,
811
- collection_bookend: nil,
812
- ),
813
- an_object_having_attributes(
814
- type: :delete,
815
- indentation_level: 2,
816
- value: %(min: 23),
817
- add_comma: true,
818
- collection_bookend: nil,
819
- ),
820
- an_object_having_attributes(
821
- type: :delete,
822
- indentation_level: 2,
823
- value: %(sec: 28),
824
- add_comma: true,
825
- collection_bookend: nil,
826
- ),
827
- an_object_having_attributes(
828
- type: :delete,
829
- indentation_level: 2,
830
- value: %(subsec: (34749996836695/281474976710656)),
831
- add_comma: true,
832
- collection_bookend: nil,
1696
+ value: "{",
1697
+ collection_bookend: :open
833
1698
  ),
834
1699
  an_object_having_attributes(
835
1700
  type: :delete,
836
1701
  indentation_level: 2,
837
- value: %(zone: nil),
838
- add_comma: true,
839
- collection_bookend: nil,
1702
+ prefix: "state: ",
1703
+ value: ":down",
1704
+ add_comma: true
840
1705
  ),
841
1706
  an_object_having_attributes(
842
1707
  type: :delete,
843
1708
  indentation_level: 2,
844
- value: %(utc_offset: -18000),
845
- add_comma: false,
846
- collection_bookend: nil,
847
- ),
848
- an_object_having_attributes(
849
- type: :delete,
850
- indentation_level: 1,
851
- value: %(}>),
852
- add_comma: false,
853
- collection_bookend: :close,
1709
+ prefix: "errors: ",
1710
+ value: "[",
1711
+ collection_bookend: :open
854
1712
  ),
855
- ])
856
- end
857
- end
858
- end
859
-
860
- context "that has an associated time zone" do
861
- around do |example|
862
- ClimateControl.modify(TZ: 'America/Chicago', &example)
863
- end
864
-
865
- context "given as_lines: false" do
866
- it "returns a representation of the time on a single line" do
867
- inspection = described_class.inspect_object(
868
- Time.new(2021, 5, 5, 10, 23, 28.1234567891),
869
- as_lines: false
870
- )
871
- expect(inspection).to eq(
872
- "#<Time 2021-05-05 10:23:28+(34749996836695/281474976710656) -05:00 (CDT)>"
873
- )
874
- end
875
- end
876
-
877
- context "given as_lines: true" do
878
- it "returns a representation of the time across multiple lines" do
879
- inspection = described_class.inspect_object(
880
- Time.new(2021, 5, 5, 10, 23, 28.1234567891),
881
- as_lines: true,
882
- type: :delete,
883
- indentation_level: 1
884
- )
885
- expect(inspection).to match([
886
1713
  an_object_having_attributes(
887
1714
  type: :delete,
888
- indentation_level: 1,
889
- value: %(#<Time {),
890
- add_comma: false,
891
- collection_bookend: :open,
1715
+ indentation_level: 3,
1716
+ value: %("Container A-234 is partially damaged"),
1717
+ add_comma: true
892
1718
  ),
893
1719
  an_object_having_attributes(
894
1720
  type: :delete,
895
- indentation_level: 2,
896
- value: %(year: 2021),
897
- add_comma: true,
898
- collection_bookend: nil,
1721
+ indentation_level: 3,
1722
+ value: %("Vessel B042 was attacked by raccoons"),
1723
+ add_comma: true
899
1724
  ),
900
1725
  an_object_having_attributes(
901
1726
  type: :delete,
902
- indentation_level: 2,
903
- value: %(month: 5),
904
- add_comma: true,
905
- collection_bookend: nil,
1727
+ indentation_level: 3,
1728
+ value: %("Product FDK-3429 is out of stock"),
1729
+ add_comma: false
906
1730
  ),
907
1731
  an_object_having_attributes(
908
1732
  type: :delete,
909
1733
  indentation_level: 2,
910
- value: %(day: 5),
911
- add_comma: true,
912
- collection_bookend: nil,
1734
+ value: "]",
1735
+ collection_bookend: :close
913
1736
  ),
914
1737
  an_object_having_attributes(
915
1738
  type: :delete,
916
1739
  indentation_level: 2,
917
- value: %(hour: 10),
918
- add_comma: true,
919
- collection_bookend: nil,
1740
+ prefix: "mission_critical: ",
1741
+ value: "true",
1742
+ add_comma: true
920
1743
  ),
921
1744
  an_object_having_attributes(
922
1745
  type: :delete,
923
1746
  indentation_level: 2,
924
- value: %(min: 23),
925
- add_comma: true,
926
- collection_bookend: nil,
1747
+ prefix: "serviceable: ",
1748
+ value: "false",
1749
+ add_comma: true
927
1750
  ),
928
1751
  an_object_having_attributes(
929
1752
  type: :delete,
930
1753
  indentation_level: 2,
931
- value: %(sec: 28),
932
- add_comma: true,
933
- collection_bookend: nil,
1754
+ prefix: "outstanding_orders: ",
1755
+ value: "[",
1756
+ collection_bookend: :open
934
1757
  ),
935
1758
  an_object_having_attributes(
936
1759
  type: :delete,
937
- indentation_level: 2,
938
- value: %(subsec: (34749996836695/281474976710656)),
939
- add_comma: true,
940
- collection_bookend: nil,
1760
+ indentation_level: 3,
1761
+ value:
1762
+ a_string_matching(/#<SuperDiff::Test::Order:0x[a-f0-9]+ \{/),
1763
+ collection_bookend: :open
941
1764
  ),
942
1765
  an_object_having_attributes(
943
1766
  type: :delete,
944
- indentation_level: 2,
945
- value: %(zone: "CDT"),
946
- add_comma: true,
947
- collection_bookend: nil,
1767
+ indentation_level: 4,
1768
+ prefix: "@items=",
1769
+ value: "[",
1770
+ collection_bookend: :open
948
1771
  ),
949
1772
  an_object_having_attributes(
950
1773
  type: :delete,
951
- indentation_level: 2,
952
- value: %(utc_offset: -18000),
953
- add_comma: false,
954
- collection_bookend: nil,
1774
+ indentation_level: 5,
1775
+ value:
1776
+ a_string_matching(/#<SuperDiff::Test::Item:0x[a-f0-9]+ \{/),
1777
+ collection_bookend: :open
955
1778
  ),
956
1779
  an_object_having_attributes(
957
1780
  type: :delete,
958
- indentation_level: 1,
959
- value: %(}>),
960
- add_comma: false,
961
- collection_bookend: :close,
1781
+ indentation_level: 6,
1782
+ prefix: "@name=",
1783
+ value: %("ham"),
1784
+ add_comma: true
962
1785
  ),
963
- ])
964
- end
965
- end
966
- end
967
- end
968
-
969
- context "given a class" do
970
- context "given as_lines: false" do
971
- it "returns an inspected version of the object" do
972
- string = described_class.inspect_object(
973
- SuperDiff::Test::Person,
974
- as_lines: false,
975
- )
976
- expect(string).to eq("SuperDiff::Test::Person")
977
- end
978
- end
979
-
980
- context "given as_lines: true" do
981
- it "returns an inspected version of the object" do
982
- tiered_lines = described_class.inspect_object(
983
- SuperDiff::Test::Person,
984
- as_lines: true,
985
- type: :delete,
986
- indentation_level: 1,
987
- )
988
- expect(tiered_lines).to match([
989
- an_object_having_attributes(
990
- type: :delete,
991
- indentation_level: 1,
992
- value: %(SuperDiff::Test::Person),
993
- ),
994
- ])
995
- end
996
- end
997
- end
998
-
999
- # TODO: Add when empty
1000
- context "given a custom object" do
1001
- context "containing only primitive values" do
1002
- context "given as_lines: false" do
1003
- it "returns an inspected version of the object" do
1004
- string = described_class.inspect_object(
1005
- SuperDiff::Test::Person.new(name: "Doc", age: 58),
1006
- as_lines: false,
1007
- )
1008
- expect(string).to eq(
1009
- %(#<SuperDiff::Test::Person name: "Doc", age: 58>),
1010
- )
1011
- end
1012
- end
1013
-
1014
- context "given as_lines: true" do
1015
- it "returns an inspected version of the object as multiple Lines" do
1016
- tiered_lines = described_class.inspect_object(
1017
- SuperDiff::Test::Person.new(name: "Doc", age: 58),
1018
- as_lines: true,
1019
- type: :delete,
1020
- indentation_level: 1,
1021
- )
1022
- expect(tiered_lines).to match([
1023
1786
  an_object_having_attributes(
1024
1787
  type: :delete,
1025
- indentation_level: 1,
1026
- value: %(#<SuperDiff::Test::Person {),
1788
+ indentation_level: 6,
1789
+ prefix: "@quantity=",
1790
+ value: "1",
1791
+ add_comma: false
1027
1792
  ),
1028
1793
  an_object_having_attributes(
1029
1794
  type: :delete,
1030
- indentation_level: 2,
1031
- prefix: %(name: ),
1032
- value: %("Doc"),
1033
- add_comma: true,
1795
+ indentation_level: 5,
1796
+ value: "}>",
1797
+ collection_bookend: :close
1034
1798
  ),
1035
1799
  an_object_having_attributes(
1036
1800
  type: :delete,
1037
- indentation_level: 2,
1038
- prefix: %(age: ),
1039
- value: %(58),
1040
- add_comma: false,
1801
+ indentation_level: 5,
1802
+ value:
1803
+ a_string_matching(/#<SuperDiff::Test::Item:0x[a-f0-9]+ \{/),
1804
+ collection_bookend: :open
1041
1805
  ),
1042
1806
  an_object_having_attributes(
1043
1807
  type: :delete,
1044
- indentation_level: 1,
1045
- value: %(}>),
1046
- ),
1047
- ])
1048
- end
1049
- end
1050
- end
1051
-
1052
- context "containing other custom objects" do
1053
- context "given as_lines: false" do
1054
- it "returns an inspected version of the object" do
1055
- string = described_class.inspect_object(
1056
- SuperDiff::Test::Customer.new(
1057
- name: "Marty McFly",
1058
- shipping_address: SuperDiff::Test::ShippingAddress.new(
1059
- line_1: "123 Main St.",
1060
- line_2: "",
1061
- city: "Hill Valley",
1062
- state: "CA",
1063
- zip: "90382",
1064
- ),
1065
- phone: "111-222-3333",
1066
- ),
1067
- as_lines: false,
1068
- )
1069
- expect(string).to eq(
1070
- # rubocop:disable Metrics/LineLength
1071
- %(#<SuperDiff::Test::Customer name: "Marty McFly", shipping_address: #<SuperDiff::Test::ShippingAddress line_1: "123 Main St.", line_2: "", city: "Hill Valley", state: "CA", zip: "90382">, phone: "111-222-3333">),
1072
- # rubocop:enable Metrics/LineLength
1073
- )
1074
- end
1075
- end
1076
-
1077
- context "given as_lines: true" do
1078
- it "returns an inspected version of the object as multiple Lines" do
1079
- tiered_lines = described_class.inspect_object(
1080
- SuperDiff::Test::Customer.new(
1081
- name: "Marty McFly",
1082
- shipping_address: SuperDiff::Test::ShippingAddress.new(
1083
- line_1: "123 Main St.",
1084
- line_2: "",
1085
- city: "Hill Valley",
1086
- state: "CA",
1087
- zip: "90382",
1088
- ),
1089
- phone: "111-222-3333",
1808
+ indentation_level: 6,
1809
+ prefix: "@name=",
1810
+ value: %("eggs"),
1811
+ add_comma: true
1090
1812
  ),
1091
- as_lines: true,
1092
- type: :delete,
1093
- indentation_level: 1,
1094
- )
1095
- expect(tiered_lines).to match([
1096
1813
  an_object_having_attributes(
1097
1814
  type: :delete,
1098
- indentation_level: 1,
1099
- value: %(#<SuperDiff::Test::Customer {),
1100
- collection_bookend: :open,
1815
+ indentation_level: 6,
1816
+ prefix: "@quantity=",
1817
+ value: "2",
1818
+ add_comma: false
1101
1819
  ),
1102
1820
  an_object_having_attributes(
1103
1821
  type: :delete,
1104
- indentation_level: 2,
1105
- prefix: %(name: ),
1106
- value: %("Marty McFly"),
1107
- add_comma: true,
1822
+ indentation_level: 5,
1823
+ value: "}>",
1824
+ collection_bookend: :close
1108
1825
  ),
1109
1826
  an_object_having_attributes(
1110
1827
  type: :delete,
1111
- indentation_level: 2,
1112
- prefix: %(shipping_address: ),
1113
- value: %(#<SuperDiff::Test::ShippingAddress {),
1114
- add_comma: false,
1115
- collection_bookend: :open,
1828
+ indentation_level: 5,
1829
+ value:
1830
+ a_string_matching(/#<SuperDiff::Test::Item:0x[a-f0-9]+ \{/),
1831
+ collection_bookend: :open
1116
1832
  ),
1117
1833
  an_object_having_attributes(
1118
1834
  type: :delete,
1119
- indentation_level: 3,
1120
- prefix: %(line_1: ),
1121
- value: %("123 Main St."),
1835
+ indentation_level: 6,
1836
+ prefix: "@name=",
1837
+ value: %("cheese"),
1838
+ add_comma: true
1122
1839
  ),
1123
1840
  an_object_having_attributes(
1124
1841
  type: :delete,
1125
- indentation_level: 3,
1126
- prefix: %(line_2: ),
1127
- value: %(""),
1128
- add_comma: true,
1842
+ indentation_level: 6,
1843
+ prefix: "@quantity=",
1844
+ value: "1",
1845
+ add_comma: false
1129
1846
  ),
1130
1847
  an_object_having_attributes(
1131
1848
  type: :delete,
1132
- indentation_level: 3,
1133
- prefix: %(city: ),
1134
- value: %("Hill Valley"),
1135
- add_comma: true,
1849
+ indentation_level: 5,
1850
+ value: "}>",
1851
+ collection_bookend: :close
1136
1852
  ),
1137
1853
  an_object_having_attributes(
1138
1854
  type: :delete,
1139
- indentation_level: 3,
1140
- prefix: %(state: ),
1141
- value: %("CA"),
1142
- add_comma: true,
1855
+ indentation_level: 4,
1856
+ value: "]",
1857
+ collection_bookend: :close
1143
1858
  ),
1144
1859
  an_object_having_attributes(
1145
1860
  type: :delete,
1146
1861
  indentation_level: 3,
1147
- prefix: %(zip: ),
1148
- value: %("90382"),
1149
- add_comma: false,
1862
+ value: "}>",
1863
+ collection_bookend: :close
1150
1864
  ),
1151
1865
  an_object_having_attributes(
1152
1866
  type: :delete,
1153
1867
  indentation_level: 2,
1154
- value: %(}>),
1155
- add_comma: true,
1156
- collection_bookend: :close,
1868
+ value: "]",
1869
+ collection_bookend: :close
1157
1870
  ),
1158
1871
  an_object_having_attributes(
1159
1872
  type: :delete,
1160
1873
  indentation_level: 2,
1161
- prefix: %(phone: ),
1162
- value: %("111-222-3333"),
1163
- add_comma: false,
1874
+ prefix: "customers: ",
1875
+ value: "[",
1876
+ collection_bookend: :open
1164
1877
  ),
1165
1878
  an_object_having_attributes(
1166
1879
  type: :delete,
1167
- indentation_level: 1,
1168
- value: %(}>),
1169
- add_comma: false,
1170
- collection_bookend: :close,
1171
- ),
1172
- ])
1173
- end
1174
- end
1175
- end
1176
- end
1177
-
1178
- context "given a non-custom object" do
1179
- context "containing only primitive values" do
1180
- context "given as_lines: false" do
1181
- it "returns an inspected version of the object" do
1182
- string = described_class.inspect_object(
1183
- SuperDiff::Test::Item.new(
1184
- name: "mac and cheese",
1185
- quantity: 2,
1186
- ),
1187
- as_lines: false,
1188
- )
1189
- expect(string).to match(
1190
- /\A#<SuperDiff::Test::Item:0x[a-z0-9]+ @name="mac and cheese", @quantity=2>\Z/,
1191
- )
1192
- end
1193
- end
1194
-
1195
- context "given as_lines: true" do
1196
- it "returns an inspected version of the object as multiple Lines" do
1197
- tiered_lines = described_class.inspect_object(
1198
- SuperDiff::Test::Item.new(
1199
- name: "mac and cheese",
1200
- quantity: 2,
1880
+ indentation_level: 3,
1881
+ value: "#<SuperDiff::Test::Customer {",
1882
+ collection_bookend: :open
1201
1883
  ),
1202
- as_lines: true,
1203
- type: :delete,
1204
- indentation_level: 1,
1205
- )
1206
- expect(tiered_lines).to match([
1207
1884
  an_object_having_attributes(
1208
1885
  type: :delete,
1209
- indentation_level: 1,
1210
- value: a_string_matching(
1211
- %r(#<SuperDiff::Test::Item:0x[a-f0-9]+ \{),
1212
- ),
1213
- collection_bookend: :open,
1886
+ indentation_level: 4,
1887
+ prefix: "name: ",
1888
+ value: %("Marty McFly"),
1889
+ add_comma: true
1214
1890
  ),
1215
1891
  an_object_having_attributes(
1216
1892
  type: :delete,
1217
- indentation_level: 2,
1218
- prefix: %(@name=),
1219
- value: %("mac and cheese"),
1220
- add_comma: true,
1893
+ indentation_level: 4,
1894
+ prefix: "shipping_address: ",
1895
+ value: "#<SuperDiff::Test::ShippingAddress {",
1896
+ collection_bookend: :open
1221
1897
  ),
1222
1898
  an_object_having_attributes(
1223
1899
  type: :delete,
1224
- indentation_level: 2,
1225
- prefix: %(@quantity=),
1226
- value: %(2),
1227
- add_comma: false,
1900
+ indentation_level: 5,
1901
+ prefix: "line_1: ",
1902
+ value: %("123 Baltic Ave."),
1903
+ add_comma: true
1228
1904
  ),
1229
1905
  an_object_having_attributes(
1230
1906
  type: :delete,
1231
- indentation_level: 1,
1232
- value: %(}>),
1233
- collection_bookend: :close,
1907
+ indentation_level: 5,
1908
+ prefix: "line_2: ",
1909
+ value: %(""),
1910
+ add_comma: true
1234
1911
  ),
1235
- ])
1236
- end
1237
- end
1238
- end
1239
-
1240
- context "containing other custom objects" do
1241
- context "given as_lines: false" do
1242
- it "returns an inspected version of the object" do
1243
- string = described_class.inspect_object(
1244
- SuperDiff::Test::Order.new([
1245
- SuperDiff::Test::Item.new(name: "ham", quantity: 1),
1246
- SuperDiff::Test::Item.new(name: "eggs", quantity: 2),
1247
- SuperDiff::Test::Item.new(name: "cheese", quantity: 1),
1248
- ]),
1249
- as_lines: false,
1250
- )
1251
- expect(string).to match(
1252
- # rubocop:disable Metrics/LineLength
1253
- /\A#<SuperDiff::Test::Order:0x[a-z0-9]+ @items=\[#<SuperDiff::Test::Item:0x[a-z0-9]+ @name="ham", @quantity=1>, #<SuperDiff::Test::Item:0x[a-z0-9]+ @name="eggs", @quantity=2>, #<SuperDiff::Test::Item:0x[a-z0-9]+ @name="cheese", @quantity=1>\]>\Z/,
1254
- # rubocop:enable Metrics/LineLength
1255
- )
1256
- end
1257
- end
1258
-
1259
- context "given as_lines: true" do
1260
- it "returns an inspected version of the object as multiple Lines" do
1261
- tiered_lines = described_class.inspect_object(
1262
- SuperDiff::Test::Order.new([
1263
- SuperDiff::Test::Item.new(name: "ham", quantity: 1),
1264
- SuperDiff::Test::Item.new(name: "eggs", quantity: 2),
1265
- SuperDiff::Test::Item.new(name: "cheese", quantity: 1),
1266
- ]),
1267
- as_lines: true,
1268
- type: :delete,
1269
- indentation_level: 1,
1270
- )
1271
- expect(tiered_lines).to match([
1272
1912
  an_object_having_attributes(
1273
1913
  type: :delete,
1274
- indentation_level: 1,
1275
- value: a_string_matching(
1276
- %r(#<SuperDiff::Test::Order:0x[a-f0-9]+ \{),
1277
- ),
1278
- collection_bookend: :open,
1914
+ indentation_level: 5,
1915
+ prefix: "city: ",
1916
+ value: %("Hill Valley"),
1917
+ add_comma: true
1279
1918
  ),
1280
1919
  an_object_having_attributes(
1281
1920
  type: :delete,
1282
- indentation_level: 2,
1283
- prefix: %(@items=),
1284
- value: %([),
1285
- add_comma: false,
1286
- collection_bookend: :open,
1921
+ indentation_level: 5,
1922
+ prefix: "state: ",
1923
+ value: %("CA"),
1924
+ add_comma: true
1287
1925
  ),
1288
1926
  an_object_having_attributes(
1289
1927
  type: :delete,
1290
- indentation_level: 3,
1291
- value: a_string_matching(
1292
- %r(#<SuperDiff::Test::Item:0x[a-f0-9]+ \{),
1293
- ),
1294
- add_comma: false,
1295
- collection_bookend: :open,
1928
+ indentation_level: 5,
1929
+ prefix: "zip: ",
1930
+ value: %("90382"),
1931
+ add_comma: false
1296
1932
  ),
1297
1933
  an_object_having_attributes(
1298
1934
  type: :delete,
1299
1935
  indentation_level: 4,
1300
- prefix: %(@name=),
1301
- value: %("ham"),
1936
+ value: "}>",
1302
1937
  add_comma: true,
1938
+ collection_bookend: :close
1303
1939
  ),
1304
1940
  an_object_having_attributes(
1305
1941
  type: :delete,
1306
1942
  indentation_level: 4,
1307
- prefix: %(@quantity=),
1308
- value: %(1),
1309
- add_comma: false,
1943
+ prefix: "phone: ",
1944
+ value: %("111-111-1111"),
1945
+ add_comma: false
1310
1946
  ),
1311
1947
  an_object_having_attributes(
1312
1948
  type: :delete,
1313
1949
  indentation_level: 3,
1314
- value: %(}>),
1315
- add_comma: true,
1316
- collection_bookend: :close,
1950
+ value: "}>",
1951
+ add_comma: true
1317
1952
  ),
1318
1953
  an_object_having_attributes(
1319
1954
  type: :delete,
1320
1955
  indentation_level: 3,
1321
- value: a_string_matching(
1322
- %r(#<SuperDiff::Test::Item:0x[a-f0-9]+ \{),
1323
- ),
1324
- add_comma: false,
1325
- collection_bookend: :open,
1956
+ value: "#<SuperDiff::Test::Customer {",
1957
+ collection_bookend: :open
1326
1958
  ),
1327
1959
  an_object_having_attributes(
1328
1960
  type: :delete,
1329
1961
  indentation_level: 4,
1330
- prefix: %(@name=),
1331
- value: %("eggs"),
1332
- add_comma: true,
1962
+ prefix: "name: ",
1963
+ value: %("Doc Brown"),
1964
+ add_comma: true
1333
1965
  ),
1334
1966
  an_object_having_attributes(
1335
1967
  type: :delete,
1336
1968
  indentation_level: 4,
1337
- prefix: %(@quantity=),
1338
- value: %(2),
1339
- add_comma: false,
1969
+ prefix: "shipping_address: ",
1970
+ value: "#<SuperDiff::Test::ShippingAddress {",
1971
+ collection_bookend: :open
1340
1972
  ),
1341
1973
  an_object_having_attributes(
1342
1974
  type: :delete,
1343
- indentation_level: 3,
1344
- value: %(}>),
1345
- add_comma: true,
1346
- collection_bookend: :close,
1975
+ indentation_level: 5,
1976
+ prefix: "line_1: ",
1977
+ value: %("456 Park Place"),
1978
+ add_comma: true
1347
1979
  ),
1348
1980
  an_object_having_attributes(
1349
1981
  type: :delete,
1350
- indentation_level: 3,
1351
- value: a_string_matching(
1352
- %r(#<SuperDiff::Test::Item:0x[a-f0-9]+ \{),
1353
- ),
1354
- add_comma: false,
1355
- collection_bookend: :open,
1982
+ indentation_level: 5,
1983
+ prefix: "line_2: ",
1984
+ value: %(""),
1985
+ add_comma: true
1986
+ ),
1987
+ an_object_having_attributes(
1988
+ type: :delete,
1989
+ indentation_level: 5,
1990
+ prefix: "city: ",
1991
+ value: %("Beverly Hills"),
1992
+ add_comma: true
1993
+ ),
1994
+ an_object_having_attributes(
1995
+ type: :delete,
1996
+ indentation_level: 5,
1997
+ prefix: "state: ",
1998
+ value: %("CA"),
1999
+ add_comma: true
2000
+ ),
2001
+ an_object_having_attributes(
2002
+ type: :delete,
2003
+ indentation_level: 5,
2004
+ prefix: "zip: ",
2005
+ value: %("90210"),
2006
+ add_comma: false
1356
2007
  ),
1357
2008
  an_object_having_attributes(
1358
2009
  type: :delete,
1359
2010
  indentation_level: 4,
1360
- prefix: %(@name=),
1361
- value: %("cheese"),
2011
+ value: "}>",
1362
2012
  add_comma: true,
2013
+ collection_bookend: :close
1363
2014
  ),
1364
2015
  an_object_having_attributes(
1365
2016
  type: :delete,
1366
2017
  indentation_level: 4,
1367
- prefix: %(@quantity=),
1368
- value: %(1),
1369
- add_comma: false,
2018
+ prefix: "phone: ",
2019
+ value: %("222-222-2222"),
2020
+ add_comma: false
1370
2021
  ),
1371
2022
  an_object_having_attributes(
1372
2023
  type: :delete,
1373
2024
  indentation_level: 3,
1374
- value: %(}>),
2025
+ value: "}>",
1375
2026
  add_comma: false,
1376
- collection_bookend: :close,
2027
+ collection_bookend: :close
1377
2028
  ),
1378
2029
  an_object_having_attributes(
1379
2030
  type: :delete,
1380
2031
  indentation_level: 2,
1381
- value: %(]),
1382
- add_comma: false,
1383
- collection_bookend: :close,
1384
- ),
1385
- an_object_having_attributes(
1386
- type: :delete,
1387
- indentation_level: 1,
1388
- value: %(}>),
2032
+ value: "]",
1389
2033
  add_comma: false,
1390
- collection_bookend: :close,
2034
+ collection_bookend: :close
1391
2035
  ),
1392
- ])
1393
- end
1394
- end
1395
- end
1396
-
1397
- context "which is empty" do
1398
- context "given as_lines: false" do
1399
- it "returns an inspected version of the array" do
1400
- string = described_class.inspect_object(
1401
- SuperDiff::Test::EmptyClass.new,
1402
- as_lines: false,
1403
- )
1404
- expect(string).to match(
1405
- /#<SuperDiff::Test::EmptyClass:0x[a-z0-9]+>/,
1406
- )
1407
- end
1408
- end
1409
-
1410
- context "given as_lines: true" do
1411
- it "returns an inspected version of the array" do
1412
- inspection = described_class.inspect_object(
1413
- SuperDiff::Test::EmptyClass.new,
1414
- as_lines: true,
1415
- type: :delete,
1416
- indentation_level: 1
1417
- )
1418
- expect(inspection).to match([
1419
2036
  an_object_having_attributes(
1420
2037
  type: :delete,
1421
2038
  indentation_level: 1,
1422
- value: a_string_matching(
1423
- /#<SuperDiff::Test::EmptyClass:0x[a-z0-9]+>/
1424
- ),
2039
+ value: "}",
2040
+ collection_bookend: :close
1425
2041
  )
1426
- ])
1427
- end
1428
- end
1429
- end
1430
- end
1431
-
1432
- context "given a combination of all kinds of values" do
1433
- context "given as_lines: false" do
1434
- it "returns an inspected version of the object" do
1435
- string = described_class.inspect_object(
1436
- {
1437
- state: :down,
1438
- errors: [
1439
- "Container A-234 is partially damaged",
1440
- "Vessel B042 was attacked by raccoons",
1441
- "Product FDK-3429 is out of stock",
1442
- ],
1443
- mission_critical: true,
1444
- serviceable: false,
1445
- outstanding_orders: [
1446
- SuperDiff::Test::Order.new([
1447
- SuperDiff::Test::Item.new(name: "ham", quantity: 1),
1448
- SuperDiff::Test::Item.new(name: "eggs", quantity: 2),
1449
- SuperDiff::Test::Item.new(name: "cheese", quantity: 1),
1450
- ]),
1451
- ],
1452
- customers: [
1453
- SuperDiff::Test::Customer.new(
1454
- name: "Marty McFly",
1455
- shipping_address: SuperDiff::Test::ShippingAddress.new(
1456
- line_1: "123 Baltic Ave.",
1457
- line_2: "",
1458
- city: "Hill Valley",
1459
- state: "CA",
1460
- zip: "90382",
1461
- ),
1462
- phone: "111-111-1111",
1463
- ),
1464
- SuperDiff::Test::Customer.new(
1465
- name: "Doc Brown",
1466
- shipping_address: SuperDiff::Test::ShippingAddress.new(
1467
- line_1: "456 Park Place",
1468
- line_2: "",
1469
- city: "Beverly Hills",
1470
- state: "CA",
1471
- zip: "90210",
1472
- ),
1473
- phone: "222-222-2222",
1474
- ),
1475
- ],
1476
- },
1477
- as_lines: false,
1478
- )
1479
- expect(string).to match(
1480
- # rubocop:disable Metrics/LineLength
1481
- /\A\{ state: :down, errors: \["Container A-234 is partially damaged", "Vessel B042 was attacked by raccoons", "Product FDK-3429 is out of stock"\], mission_critical: true, serviceable: false, outstanding_orders: \[#<SuperDiff::Test::Order:0x[a-z0-9]+ @items=\[#<SuperDiff::Test::Item:0x[a-z0-9]+ @name="ham", @quantity=1>, #<SuperDiff::Test::Item:0x[a-z0-9]+ @name="eggs", @quantity=2>, #<SuperDiff::Test::Item:0x[a-z0-9]+ @name="cheese", @quantity=1>\]>\], customers: \[#<SuperDiff::Test::Customer name: "Marty McFly", shipping_address: #<SuperDiff::Test::ShippingAddress line_1: "123 Baltic Ave.", line_2: "", city: "Hill Valley", state: "CA", zip: "90382">, phone: "111-111-1111">, #<SuperDiff::Test::Customer name: "Doc Brown", shipping_address: #<SuperDiff::Test::ShippingAddress line_1: "456 Park Place", line_2: "", city: "Beverly Hills", state: "CA", zip: "90210">, phone: "222-222-2222">\] \}\Z/,
1482
- # rubocop:enable Metrics/LineLength
1483
- )
1484
- end
1485
- end
1486
-
1487
- context "given as_lines: true" do
1488
- it "returns an inspected version of the object as multiple Lines" do
1489
- tiered_lines = described_class.inspect_object(
1490
- {
1491
- state: :down,
1492
- errors: [
1493
- "Container A-234 is partially damaged",
1494
- "Vessel B042 was attacked by raccoons",
1495
- "Product FDK-3429 is out of stock",
1496
- ],
1497
- mission_critical: true,
1498
- serviceable: false,
1499
- outstanding_orders: [
1500
- SuperDiff::Test::Order.new([
1501
- SuperDiff::Test::Item.new(name: "ham", quantity: 1),
1502
- SuperDiff::Test::Item.new(name: "eggs", quantity: 2),
1503
- SuperDiff::Test::Item.new(name: "cheese", quantity: 1),
1504
- ]),
1505
- ],
1506
- customers: [
1507
- SuperDiff::Test::Customer.new(
1508
- name: "Marty McFly",
1509
- shipping_address: SuperDiff::Test::ShippingAddress.new(
1510
- line_1: "123 Baltic Ave.",
1511
- line_2: "",
1512
- city: "Hill Valley",
1513
- state: "CA",
1514
- zip: "90382",
1515
- ),
1516
- phone: "111-111-1111",
1517
- ),
1518
- SuperDiff::Test::Customer.new(
1519
- name: "Doc Brown",
1520
- shipping_address: SuperDiff::Test::ShippingAddress.new(
1521
- line_1: "456 Park Place",
1522
- line_2: "",
1523
- city: "Beverly Hills",
1524
- state: "CA",
1525
- zip: "90210",
1526
- ),
1527
- phone: "222-222-2222",
1528
- ),
1529
- ],
1530
- },
1531
- as_lines: true,
1532
- type: :delete,
1533
- indentation_level: 1,
2042
+ ]
1534
2043
  )
1535
- expect(tiered_lines).to match([
1536
- an_object_having_attributes(
1537
- type: :delete,
1538
- indentation_level: 1,
1539
- value: %({),
1540
- collection_bookend: :open,
1541
- ),
1542
- an_object_having_attributes(
1543
- type: :delete,
1544
- indentation_level: 2,
1545
- prefix: %(state: ),
1546
- value: %(:down),
1547
- add_comma: true,
1548
- ),
1549
- an_object_having_attributes(
1550
- type: :delete,
1551
- indentation_level: 2,
1552
- prefix: %(errors: ),
1553
- value: %([),
1554
- collection_bookend: :open,
1555
- ),
1556
- an_object_having_attributes(
1557
- type: :delete,
1558
- indentation_level: 3,
1559
- value: %("Container A-234 is partially damaged"),
1560
- add_comma: true,
1561
- ),
1562
- an_object_having_attributes(
1563
- type: :delete,
1564
- indentation_level: 3,
1565
- value: %("Vessel B042 was attacked by raccoons"),
1566
- add_comma: true,
1567
- ),
1568
- an_object_having_attributes(
1569
- type: :delete,
1570
- indentation_level: 3,
1571
- value: %("Product FDK-3429 is out of stock"),
1572
- add_comma: false,
1573
- ),
1574
- an_object_having_attributes(
1575
- type: :delete,
1576
- indentation_level: 2,
1577
- value: %(]),
1578
- collection_bookend: :close,
1579
- ),
1580
- an_object_having_attributes(
1581
- type: :delete,
1582
- indentation_level: 2,
1583
- prefix: %(mission_critical: ),
1584
- value: %(true),
1585
- add_comma: true,
1586
- ),
1587
- an_object_having_attributes(
1588
- type: :delete,
1589
- indentation_level: 2,
1590
- prefix: %(serviceable: ),
1591
- value: %(false),
1592
- add_comma: true,
1593
- ),
1594
- an_object_having_attributes(
1595
- type: :delete,
1596
- indentation_level: 2,
1597
- prefix: %(outstanding_orders: ),
1598
- value: %([),
1599
- collection_bookend: :open,
1600
- ),
1601
- an_object_having_attributes(
1602
- type: :delete,
1603
- indentation_level: 3,
1604
- value: a_string_matching(
1605
- %r(#<SuperDiff::Test::Order:0x[a-f0-9]+ \{),
1606
- ),
1607
- collection_bookend: :open,
1608
- ),
1609
- an_object_having_attributes(
1610
- type: :delete,
1611
- indentation_level: 4,
1612
- prefix: %(@items=),
1613
- value: %([),
1614
- collection_bookend: :open,
1615
- ),
1616
- an_object_having_attributes(
1617
- type: :delete,
1618
- indentation_level: 5,
1619
- value: a_string_matching(
1620
- %r(#<SuperDiff::Test::Item:0x[a-f0-9]+ \{),
1621
- ),
1622
- collection_bookend: :open,
1623
- ),
1624
- an_object_having_attributes(
1625
- type: :delete,
1626
- indentation_level: 6,
1627
- prefix: %(@name=),
1628
- value: %("ham"),
1629
- add_comma: true,
1630
- ),
1631
- an_object_having_attributes(
1632
- type: :delete,
1633
- indentation_level: 6,
1634
- prefix: %(@quantity=),
1635
- value: %(1),
1636
- add_comma: false,
1637
- ),
1638
- an_object_having_attributes(
1639
- type: :delete,
1640
- indentation_level: 5,
1641
- value: %(}>),
1642
- collection_bookend: :close,
1643
- ),
1644
- an_object_having_attributes(
1645
- type: :delete,
1646
- indentation_level: 5,
1647
- value: a_string_matching(
1648
- %r(#<SuperDiff::Test::Item:0x[a-f0-9]+ \{),
1649
- ),
1650
- collection_bookend: :open,
1651
- ),
1652
- an_object_having_attributes(
1653
- type: :delete,
1654
- indentation_level: 6,
1655
- prefix: %(@name=),
1656
- value: %("eggs"),
1657
- add_comma: true,
1658
- ),
1659
- an_object_having_attributes(
1660
- type: :delete,
1661
- indentation_level: 6,
1662
- prefix: %(@quantity=),
1663
- value: %(2),
1664
- add_comma: false,
1665
- ),
1666
- an_object_having_attributes(
1667
- type: :delete,
1668
- indentation_level: 5,
1669
- value: %(}>),
1670
- collection_bookend: :close,
1671
- ),
1672
- an_object_having_attributes(
1673
- type: :delete,
1674
- indentation_level: 5,
1675
- value: a_string_matching(
1676
- %r(#<SuperDiff::Test::Item:0x[a-f0-9]+ \{),
1677
- ),
1678
- collection_bookend: :open,
1679
- ),
1680
- an_object_having_attributes(
1681
- type: :delete,
1682
- indentation_level: 6,
1683
- prefix: %(@name=),
1684
- value: %("cheese"),
1685
- add_comma: true,
1686
- ),
1687
- an_object_having_attributes(
1688
- type: :delete,
1689
- indentation_level: 6,
1690
- prefix: %(@quantity=),
1691
- value: %(1),
1692
- add_comma: false,
1693
- ),
1694
- an_object_having_attributes(
1695
- type: :delete,
1696
- indentation_level: 5,
1697
- value: %(}>),
1698
- collection_bookend: :close,
1699
- ),
1700
- an_object_having_attributes(
1701
- type: :delete,
1702
- indentation_level: 4,
1703
- value: %(]),
1704
- collection_bookend: :close,
1705
- ),
1706
- an_object_having_attributes(
1707
- type: :delete,
1708
- indentation_level: 3,
1709
- value: %(}>),
1710
- collection_bookend: :close,
1711
- ),
1712
- an_object_having_attributes(
1713
- type: :delete,
1714
- indentation_level: 2,
1715
- value: %(]),
1716
- collection_bookend: :close,
1717
- ),
1718
- an_object_having_attributes(
1719
- type: :delete,
1720
- indentation_level: 2,
1721
- prefix: %(customers: ),
1722
- value: %([),
1723
- collection_bookend: :open,
1724
- ),
1725
- an_object_having_attributes(
1726
- type: :delete,
1727
- indentation_level: 3,
1728
- value: %(#<SuperDiff::Test::Customer {),
1729
- collection_bookend: :open,
1730
- ),
1731
- an_object_having_attributes(
1732
- type: :delete,
1733
- indentation_level: 4,
1734
- prefix: %(name: ),
1735
- value: %("Marty McFly"),
1736
- add_comma: true,
1737
- ),
1738
- an_object_having_attributes(
1739
- type: :delete,
1740
- indentation_level: 4,
1741
- prefix: %(shipping_address: ),
1742
- value: %(#<SuperDiff::Test::ShippingAddress {),
1743
- collection_bookend: :open,
1744
- ),
1745
- an_object_having_attributes(
1746
- type: :delete,
1747
- indentation_level: 5,
1748
- prefix: %(line_1: ),
1749
- value: %("123 Baltic Ave."),
1750
- add_comma: true,
1751
- ),
1752
- an_object_having_attributes(
1753
- type: :delete,
1754
- indentation_level: 5,
1755
- prefix: %(line_2: ),
1756
- value: %(""),
1757
- add_comma: true,
1758
- ),
1759
- an_object_having_attributes(
1760
- type: :delete,
1761
- indentation_level: 5,
1762
- prefix: %(city: ),
1763
- value: %("Hill Valley"),
1764
- add_comma: true,
1765
- ),
1766
- an_object_having_attributes(
1767
- type: :delete,
1768
- indentation_level: 5,
1769
- prefix: %(state: ),
1770
- value: %("CA"),
1771
- add_comma: true,
1772
- ),
1773
- an_object_having_attributes(
1774
- type: :delete,
1775
- indentation_level: 5,
1776
- prefix: %(zip: ),
1777
- value: %("90382"),
1778
- add_comma: false,
1779
- ),
1780
- an_object_having_attributes(
1781
- type: :delete,
1782
- indentation_level: 4,
1783
- value: %(}>),
1784
- add_comma: true,
1785
- collection_bookend: :close,
1786
- ),
1787
- an_object_having_attributes(
1788
- type: :delete,
1789
- indentation_level: 4,
1790
- prefix: %(phone: ),
1791
- value: %("111-111-1111"),
1792
- add_comma: false,
1793
- ),
1794
- an_object_having_attributes(
1795
- type: :delete,
1796
- indentation_level: 3,
1797
- value: %(}>),
1798
- add_comma: true,
1799
- ),
1800
- an_object_having_attributes(
1801
- type: :delete,
1802
- indentation_level: 3,
1803
- value: %(#<SuperDiff::Test::Customer {),
1804
- collection_bookend: :open,
1805
- ),
1806
- an_object_having_attributes(
1807
- type: :delete,
1808
- indentation_level: 4,
1809
- prefix: %(name: ),
1810
- value: %("Doc Brown"),
1811
- add_comma: true,
1812
- ),
1813
- an_object_having_attributes(
1814
- type: :delete,
1815
- indentation_level: 4,
1816
- prefix: %(shipping_address: ),
1817
- value: %(#<SuperDiff::Test::ShippingAddress {),
1818
- collection_bookend: :open,
1819
- ),
1820
- an_object_having_attributes(
1821
- type: :delete,
1822
- indentation_level: 5,
1823
- prefix: %(line_1: ),
1824
- value: %("456 Park Place"),
1825
- add_comma: true,
1826
- ),
1827
- an_object_having_attributes(
1828
- type: :delete,
1829
- indentation_level: 5,
1830
- prefix: %(line_2: ),
1831
- value: %(""),
1832
- add_comma: true,
1833
- ),
1834
- an_object_having_attributes(
1835
- type: :delete,
1836
- indentation_level: 5,
1837
- prefix: %(city: ),
1838
- value: %("Beverly Hills"),
1839
- add_comma: true,
1840
- ),
1841
- an_object_having_attributes(
1842
- type: :delete,
1843
- indentation_level: 5,
1844
- prefix: %(state: ),
1845
- value: %("CA"),
1846
- add_comma: true,
1847
- ),
1848
- an_object_having_attributes(
1849
- type: :delete,
1850
- indentation_level: 5,
1851
- prefix: %(zip: ),
1852
- value: %("90210"),
1853
- add_comma: false,
1854
- ),
1855
- an_object_having_attributes(
1856
- type: :delete,
1857
- indentation_level: 4,
1858
- value: %(}>),
1859
- add_comma: true,
1860
- collection_bookend: :close,
1861
- ),
1862
- an_object_having_attributes(
1863
- type: :delete,
1864
- indentation_level: 4,
1865
- prefix: %(phone: ),
1866
- value: %("222-222-2222"),
1867
- add_comma: false,
1868
- ),
1869
- an_object_having_attributes(
1870
- type: :delete,
1871
- indentation_level: 3,
1872
- value: %(}>),
1873
- add_comma: false,
1874
- collection_bookend: :close,
1875
- ),
1876
- an_object_having_attributes(
1877
- type: :delete,
1878
- indentation_level: 2,
1879
- value: %(]),
1880
- add_comma: false,
1881
- collection_bookend: :close,
1882
- ),
1883
- an_object_having_attributes(
1884
- type: :delete,
1885
- indentation_level: 1,
1886
- value: %(}),
1887
- collection_bookend: :close,
1888
- ),
1889
- ])
1890
2044
  end
1891
2045
  end
1892
2046
  end
@@ -1894,7 +2048,7 @@ RSpec.describe SuperDiff, type: :unit do
1894
2048
  context "given a data structure that refers to itself somewhere inside of it" do
1895
2049
  context "given as_lines: false" do
1896
2050
  it "replaces the reference with ∙∙∙" do
1897
- value = ["a", "b", "c"]
2051
+ value = %w[a b c]
1898
2052
  value.insert(1, value)
1899
2053
  string = described_class.inspect_object(value, as_lines: false)
1900
2054
  expect(string).to eq(%(["a", ∙∙∙, "b", "c"]))
@@ -1903,52 +2057,55 @@ RSpec.describe SuperDiff, type: :unit do
1903
2057
 
1904
2058
  context "given as_lines: true" do
1905
2059
  it "replaces the reference with ∙∙∙" do
1906
- value = ["a", "b", "c"]
2060
+ value = %w[a b c]
1907
2061
  value.insert(1, value)
1908
- tiered_lines = described_class.inspect_object(
1909
- value,
1910
- as_lines: true,
1911
- type: :delete,
1912
- indentation_level: 1,
1913
- )
1914
- expect(tiered_lines).to match([
1915
- an_object_having_attributes(
1916
- type: :delete,
1917
- indentation_level: 1,
1918
- value: %([),
1919
- collection_bookend: :open,
1920
- ),
1921
- an_object_having_attributes(
1922
- type: :delete,
1923
- indentation_level: 2,
1924
- value: %("a"),
1925
- add_comma: true,
1926
- ),
1927
- an_object_having_attributes(
1928
- type: :delete,
1929
- indentation_level: 2,
1930
- value: %(∙∙∙),
1931
- add_comma: true,
1932
- ),
1933
- an_object_having_attributes(
1934
- type: :delete,
1935
- indentation_level: 2,
1936
- value: %("b"),
1937
- add_comma: true,
1938
- ),
1939
- an_object_having_attributes(
1940
- type: :delete,
1941
- indentation_level: 2,
1942
- value: %("c"),
1943
- add_comma: false,
1944
- ),
1945
- an_object_having_attributes(
2062
+ tiered_lines =
2063
+ described_class.inspect_object(
2064
+ value,
2065
+ as_lines: true,
1946
2066
  type: :delete,
1947
- indentation_level: 1,
1948
- value: %(]),
1949
- collection_bookend: :close,
1950
- ),
1951
- ])
2067
+ indentation_level: 1
2068
+ )
2069
+ expect(tiered_lines).to match(
2070
+ [
2071
+ an_object_having_attributes(
2072
+ type: :delete,
2073
+ indentation_level: 1,
2074
+ value: "[",
2075
+ collection_bookend: :open
2076
+ ),
2077
+ an_object_having_attributes(
2078
+ type: :delete,
2079
+ indentation_level: 2,
2080
+ value: %("a"),
2081
+ add_comma: true
2082
+ ),
2083
+ an_object_having_attributes(
2084
+ type: :delete,
2085
+ indentation_level: 2,
2086
+ value: "∙∙∙",
2087
+ add_comma: true
2088
+ ),
2089
+ an_object_having_attributes(
2090
+ type: :delete,
2091
+ indentation_level: 2,
2092
+ value: %("b"),
2093
+ add_comma: true
2094
+ ),
2095
+ an_object_having_attributes(
2096
+ type: :delete,
2097
+ indentation_level: 2,
2098
+ value: %("c"),
2099
+ add_comma: false
2100
+ ),
2101
+ an_object_having_attributes(
2102
+ type: :delete,
2103
+ indentation_level: 1,
2104
+ value: "]",
2105
+ collection_bookend: :close
2106
+ )
2107
+ ]
2108
+ )
1952
2109
  end
1953
2110
  end
1954
2111
  end