@@ -19,16 +19,24 @@ module SuperDiff
19
19
Try ::Value
20
20
] . freeze
21
21
22
- EXTRACT_VALUE = {
22
+ EXTRACT_VALUE_MAP = {
23
23
Result ::Success => lambda ( &:value! ) ,
24
24
Result ::Failure => lambda ( &:failure ) ,
25
25
Maybe ::Some => lambda ( &:value! ) ,
26
26
Maybe ::None => lambda { |_ | Unit } ,
27
27
Try ::Value => lambda ( &:value! )
28
28
} . freeze
29
29
30
+ EXTRACT_VALUE = lambda do |v |
31
+ EXTRACT_VALUE_MAP [ v . class ] . ( v )
32
+ end
33
+
30
34
IS_ARRAY = lambda do |v |
31
- EXTRACT_VALUE [ v . class ] . ( v ) . is_a? ( ::Array )
35
+ EXTRACT_VALUE . ( v ) . is_a? ( ::Array )
36
+ end
37
+
38
+ IS_HASH = lambda do |v |
39
+ EXTRACT_VALUE . ( v ) . is_a? ( ::Hash )
32
40
end
33
41
34
42
TOKEN_MAP = {
@@ -39,30 +47,18 @@ module SuperDiff
39
47
Try ::Value => "Value"
40
48
} . freeze
41
49
42
- class Array < ::SimpleDelegator
43
- def is_a? ( klass ) = klass <= Array
50
+ class Tuple < ::SimpleDelegator
51
+ def is_a? ( klass ) = klass <= Tuple
44
52
end
45
53
46
- module OTFlatteners
47
- class RegularConstructor < ::SuperDiff ::Basic ::OperationTreeFlatteners ::CustomObject
48
- private
49
-
50
- def initialize ( ...)
51
- super
52
-
53
- @klass = operation_tree . underlying_object . class
54
- end
55
-
56
- protected
57
-
58
- def open_token = "#{ TOKEN_MAP [ @klass ] } ("
59
-
60
- def close_token = ")"
54
+ class Dict < ::SimpleDelegator
55
+ def is_a? ( klass ) = klass <= Dict
56
+ end
61
57
62
- def item_prefix_for ( _ ) = ""
63
- end
58
+ module OTFlatteners
59
+ module MonasAsCollectionConstructor
60
+ def call = tiered_lines
64
61
65
- class Array < ::SuperDiff ::Basic ::OperationTreeFlatteners ::Array
66
62
protected
67
63
68
64
def build_tiered_lines = inner_lines
@@ -81,13 +77,37 @@ def open_token = ""
81
77
def close_token = ""
82
78
end
83
79
84
- class ArrayConstructor < RegularConstructor
80
+ class RegularConstructor < ::SuperDiff ::Basic ::OperationTreeFlatteners ::CustomObject
81
+ private
82
+
83
+ def initialize ( ...)
84
+ super
85
+
86
+ @klass = operation_tree . underlying_object . class
87
+ end
88
+
89
+ def open_token = "#{ TOKEN_MAP [ @klass ] } ("
90
+
91
+ def close_token = ")"
92
+
93
+ def item_prefix_for ( _ ) = ""
94
+ end
95
+
96
+ class TupleConstructor < RegularConstructor
85
97
private
86
98
87
99
def open_token = "#{ TOKEN_MAP [ @klass ] } ["
88
100
89
101
def close_token = "]"
90
102
end
103
+
104
+ class Tuple < ::SuperDiff ::Basic ::OperationTreeFlatteners ::Array
105
+ include MonasAsCollectionConstructor
106
+ end
107
+
108
+ class Dict < ::SuperDiff ::Basic ::OperationTreeFlatteners ::Hash
109
+ include MonasAsCollectionConstructor
110
+ end
91
111
end
92
112
93
113
module OT
@@ -97,21 +117,27 @@ def self.applies_to?(value) = VALUES.include?(value.class)
97
117
def operation_tree_flattener_class = OTFlatteners ::RegularConstructor
98
118
end
99
119
100
- class ArrayConstructor < RegularConstructor
120
+ class TupleConstructor < RegularConstructor
101
121
def self . applies_to? ( value ) = super && IS_ARRAY . call ( value )
102
122
103
- def operation_tree_flattener_class = OTFlatteners ::ArrayConstructor
123
+ def operation_tree_flattener_class = OTFlatteners ::TupleConstructor
124
+ end
125
+
126
+ class Tuple < ::SuperDiff ::Basic ::OperationTrees ::Array
127
+ def self . applies_to? ( value ) = value . is_a? ( ::Dry ::Monads ::SuperDiff ::Tuple )
128
+
129
+ def operation_tree_flattener_class = OTFlatteners ::Tuple
104
130
end
105
131
106
- class Array < ::SuperDiff ::Basic ::OperationTrees ::Array
107
- def self . applies_to? ( value ) = value . is_a? ( ::Dry ::Monads ::SuperDiff ::Array )
132
+ class Dict < ::SuperDiff ::Basic ::OperationTrees ::Hash
133
+ def self . applies_to? ( value ) = value . is_a? ( ::Dry ::Monads ::SuperDiff ::Dict )
108
134
109
- def operation_tree_flattener_class = OTFlatteners ::Array
135
+ def operation_tree_flattener_class = OTFlatteners ::Dict
110
136
end
111
137
end
112
138
113
139
module OTBuilders
114
- class RegularConstructors < ::SuperDiff ::Basic ::OperationTreeBuilders ::CustomObject
140
+ class CompareDefault < ::SuperDiff ::Basic ::OperationTreeBuilders ::CustomObject
115
141
def self . applies_to? ( expected , actual )
116
142
VALUES . include? ( expected . class ) &&
117
143
actual . instance_of? ( expected . class )
@@ -133,7 +159,7 @@ def establish_expected_and_actual_attributes
133
159
end
134
160
135
161
def get_value ( object )
136
- v = EXTRACT_VALUE [ object . class ] . ( object )
162
+ v = EXTRACT_VALUE . ( object )
137
163
138
164
if Unit . equal? ( v )
139
165
EMPTY_HASH
@@ -143,59 +169,92 @@ def get_value(object)
143
169
end
144
170
end
145
171
146
- class Array < ::SuperDiff ::Basic ::OperationTreeBuilders ::Array
172
+ class Tuple < ::SuperDiff ::Basic ::OperationTreeBuilders ::Array
147
173
def self . applies_to? ( expected , actual )
148
- expected . is_a? ( ::Dry ::Monads ::SuperDiff ::Array ) &&
174
+ expected . is_a? ( ::Dry ::Monads ::SuperDiff ::Tuple ) &&
149
175
actual . instance_of? ( expected . class )
150
176
end
151
177
152
178
private
153
179
154
180
def operation_tree
155
- @operation_tree ||= OT ::Array . new ( [ ] )
181
+ @operation_tree ||= OT ::Tuple . new ( [ ] )
156
182
end
157
183
end
158
184
159
- class ArrayConstructors < RegularConstructors
185
+ class Dict < ::SuperDiff ::Basic ::OperationTreeBuilders ::Hash
186
+ def self . applies_to? ( expected , actual )
187
+ expected . is_a? ( ::Dry ::Monads ::SuperDiff ::Dict ) &&
188
+ actual . instance_of? ( expected . class )
189
+ end
190
+
191
+ private
192
+
193
+ def build_operation_tree = OT ::Dict . new ( [ ] )
194
+ end
195
+
196
+ class CompareTuples < CompareDefault
160
197
def self . applies_to? ( expected , actual )
161
198
super && IS_ARRAY . call ( expected ) && IS_ARRAY . call ( actual )
162
199
end
163
200
164
201
private
165
202
166
203
def get_value ( object )
167
- v = EXTRACT_VALUE [ object . class ] . ( object )
204
+ v = EXTRACT_VALUE . ( object )
168
205
169
- { value : ::Dry ::Monads ::SuperDiff ::Array . new ( v ) }
206
+ { value : ::Dry ::Monads ::SuperDiff ::Tuple . new ( v ) }
170
207
end
171
208
172
209
def build_operation_tree
173
- OT ::ArrayConstructor . new ( [ ] , underlying_object : actual )
210
+ OT ::TupleConstructor . new ( [ ] , underlying_object : actual )
211
+ end
212
+ end
213
+
214
+ class CompareDicts < CompareDefault
215
+ def self . applies_to? ( expected , actual )
216
+ super && IS_HASH . call ( expected ) && IS_HASH . call ( actual )
217
+ end
218
+
219
+ private
220
+
221
+ def get_value ( object )
222
+ v = EXTRACT_VALUE . ( object )
223
+
224
+ { value : ::Dry ::Monads ::SuperDiff ::Dict . new ( v ) }
174
225
end
175
226
end
176
227
end
177
228
178
229
module Differs
179
- class RegularConstructors < ::SuperDiff ::Basic ::Differs ::CustomObject
230
+ class CompareDefault < ::SuperDiff ::Basic ::Differs ::CustomObject
180
231
def self . applies_to? ( expected , actual )
181
232
VALUES . include? ( expected . class ) &&
182
233
expected . instance_of? ( actual . class )
183
234
end
184
235
185
- def operation_tree_builder_class = OTBuilders ::RegularConstructors
236
+ def operation_tree_builder_class = OTBuilders ::CompareDefault
186
237
end
187
238
188
- class ArrayConstructors < RegularConstructors
239
+ class CompareTuples < CompareDefault
189
240
def self . applies_to? ( expected , actual )
190
241
super && IS_ARRAY . call ( expected ) && IS_ARRAY . call ( actual )
191
242
end
192
243
193
- def operation_tree_builder_class = OTBuilders ::ArrayConstructors
244
+ def operation_tree_builder_class = OTBuilders ::CompareTuples
245
+ end
246
+
247
+ class CompareDicts < CompareDefault
248
+ def self . applies_to? ( expected , actual )
249
+ super && IS_HASH . call ( expected ) && IS_HASH . call ( actual )
250
+ end
251
+
252
+ def operation_tree_builder_class = OTBuilders ::CompareDicts
194
253
end
195
254
end
196
255
197
256
module ITBuilders
198
- class RegularConstructors < ::SuperDiff ::Basic ::InspectionTreeBuilders ::CustomObject
257
+ class RegularConstructor < ::SuperDiff ::Basic ::InspectionTreeBuilders ::CustomObject
199
258
def self . applies_to? ( object )
200
259
VALUES . include? ( object . class )
201
260
end
@@ -204,7 +263,7 @@ def call
204
263
build_tree do |t2 |
205
264
t2 . add_text ( "#{ TOKEN_MAP [ object . class ] } (" )
206
265
207
- v = EXTRACT_VALUE [ object . class ] . ( object )
266
+ v = EXTRACT_VALUE . ( object )
208
267
209
268
unless Unit . equal? ( v )
210
269
t2 . nested do |t3 |
@@ -227,15 +286,53 @@ def build_tree(&block)
227
286
end
228
287
end
229
288
230
- class ArrayConstructors < RegularConstructors
289
+ class TupleConstructor < RegularConstructor
231
290
def self . applies_to? ( object ) = super && IS_ARRAY . call ( object )
232
291
233
292
def call
234
293
build_tree do |t2 |
235
294
t2 . add_text ( TOKEN_MAP [ object . class ] )
236
295
237
296
t2 . nested do |t3 |
238
- t3 . add_inspection_of EXTRACT_VALUE [ object . class ] . ( object )
297
+ t3 . add_inspection_of EXTRACT_VALUE . ( object )
298
+ end
299
+ end
300
+ end
301
+ end
302
+
303
+ class DictConstructor < RegularConstructor
304
+ def self . applies_to? ( object ) = super && IS_HASH . call ( object )
305
+
306
+ def call
307
+ build_tree do |t2 |
308
+ t2 . add_text ( "#{ TOKEN_MAP [ object . class ] } (" )
309
+
310
+ t2 . nested do |t3 |
311
+ t3 . add_inspection_of ::Dry ::Monads ::SuperDiff ::Dict . new (
312
+ EXTRACT_VALUE . ( object )
313
+ )
314
+ end
315
+
316
+ t2 . add_text ( ")" )
317
+ end
318
+ end
319
+ end
320
+
321
+ class Dict < ::SuperDiff ::Basic ::InspectionTreeBuilders ::Hash
322
+ def self . applies_to? ( object ) = object . is_a? ( ::Dry ::Monads ::SuperDiff ::Dict )
323
+
324
+ def call
325
+ ::SuperDiff ::Core ::InspectionTree . new do |t1 |
326
+ t1 . only_when empty do |t2 |
327
+ t2 . as_lines_when_rendering_to_lines do |t3 |
328
+ t3 . add_text "{}"
329
+ end
330
+ end
331
+
332
+ t1 . only_when nonempty do |t2 |
333
+ t2 . nested do |t3 |
334
+ t3 . insert_hash_inspection_of ( object )
335
+ end
239
336
end
240
337
end
241
338
end
@@ -247,14 +344,18 @@ def call
247
344
248
345
SuperDiff . configuration . tap do |config |
249
346
config . prepend_extra_differ_classes (
250
- Dry ::Monads ::SuperDiff ::Differs ::ArrayConstructors ,
251
- Dry ::Monads ::SuperDiff ::Differs ::RegularConstructors
347
+ Dry ::Monads ::SuperDiff ::Differs ::CompareTuples ,
348
+ Dry ::Monads ::SuperDiff ::Differs ::CompareDicts ,
349
+ Dry ::Monads ::SuperDiff ::Differs ::CompareDefault
252
350
)
253
351
config . prepend_extra_inspection_tree_builder_classes (
254
- Dry ::Monads ::SuperDiff ::ITBuilders ::ArrayConstructors ,
255
- Dry ::Monads ::SuperDiff ::ITBuilders ::RegularConstructors
352
+ Dry ::Monads ::SuperDiff ::ITBuilders ::TupleConstructor ,
353
+ Dry ::Monads ::SuperDiff ::ITBuilders ::DictConstructor ,
354
+ Dry ::Monads ::SuperDiff ::ITBuilders ::RegularConstructor ,
355
+ Dry ::Monads ::SuperDiff ::ITBuilders ::Dict
256
356
)
257
357
config . prepend_extra_operation_tree_builder_classes (
258
- Dry ::Monads ::SuperDiff ::OTBuilders ::Array
358
+ Dry ::Monads ::SuperDiff ::OTBuilders ::Tuple ,
359
+ Dry ::Monads ::SuperDiff ::OTBuilders ::Dict
259
360
)
260
361
end
0 commit comments