terminal-shop 1.7.0 → 1.8.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.
- checksums.yaml +4 -4
- data/README.md +3 -1
- data/lib/terminal-shop/base_client.rb +36 -46
- data/lib/terminal-shop/base_model.rb +65 -130
- data/lib/terminal-shop/base_page.rb +18 -18
- data/lib/terminal-shop/client.rb +1 -3
- data/lib/terminal-shop/errors.rb +12 -17
- data/lib/terminal-shop/extern.rb +1 -4
- data/lib/terminal-shop/models/subscription.rb +6 -0
- data/lib/terminal-shop/pooled_net_requester.rb +19 -21
- data/lib/terminal-shop/request_options.rb +4 -11
- data/lib/terminal-shop/resources/address.rb +0 -5
- data/lib/terminal-shop/resources/app.rb +0 -5
- data/lib/terminal-shop/resources/card.rb +0 -6
- data/lib/terminal-shop/resources/cart.rb +0 -7
- data/lib/terminal-shop/resources/email.rb +0 -2
- data/lib/terminal-shop/resources/order.rb +0 -4
- data/lib/terminal-shop/resources/product.rb +0 -3
- data/lib/terminal-shop/resources/profile.rb +0 -3
- data/lib/terminal-shop/resources/subscription.rb +0 -5
- data/lib/terminal-shop/resources/token.rb +0 -5
- data/lib/terminal-shop/resources/view.rb +0 -2
- data/lib/terminal-shop/util.rb +44 -71
- data/lib/terminal-shop/version.rb +1 -1
- data/lib/terminal-shop.rb +1 -0
- data/manifest.yaml +1 -0
- data/rbi/lib/terminal-shop/base_client.rbi +23 -0
- data/rbi/lib/terminal-shop/base_model.rbi +178 -52
- data/rbi/lib/terminal-shop/base_page.rbi +1 -2
- data/rbi/lib/terminal-shop/client.rbi +11 -0
- data/rbi/lib/terminal-shop/errors.rbi +33 -0
- data/rbi/lib/terminal-shop/extern.rbi +1 -1
- data/rbi/lib/terminal-shop/models/address.rbi +10 -0
- data/rbi/lib/terminal-shop/models/address_create_params.rbi +8 -0
- data/rbi/lib/terminal-shop/models/address_create_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/address_get_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/address_list_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/app.rbi +5 -0
- data/rbi/lib/terminal-shop/models/app_create_response.rbi +2 -0
- data/rbi/lib/terminal-shop/models/app_get_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/app_list_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/card.rbi +8 -0
- data/rbi/lib/terminal-shop/models/card_collect_response.rbi +4 -0
- data/rbi/lib/terminal-shop/models/card_create_params.rbi +2 -0
- data/rbi/lib/terminal-shop/models/card_create_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/card_get_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/card_list_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/cart.rbi +19 -0
- data/rbi/lib/terminal-shop/models/cart_convert_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/cart_get_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/cart_set_address_params.rbi +1 -0
- data/rbi/lib/terminal-shop/models/cart_set_card_params.rbi +1 -0
- data/rbi/lib/terminal-shop/models/cart_set_item_params.rbi +2 -0
- data/rbi/lib/terminal-shop/models/cart_set_item_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/email_create_params.rbi +1 -0
- data/rbi/lib/terminal-shop/models/order.rbi +28 -0
- data/rbi/lib/terminal-shop/models/order_create_params.rbi +3 -0
- data/rbi/lib/terminal-shop/models/order_create_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/order_get_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/order_list_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/product.rbi +12 -6
- data/rbi/lib/terminal-shop/models/product_get_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/product_list_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/product_variant.rbi +4 -0
- data/rbi/lib/terminal-shop/models/profile.rbi +8 -0
- data/rbi/lib/terminal-shop/models/profile_me_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/profile_update_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/region.rbi +3 -6
- data/rbi/lib/terminal-shop/models/subscription.rbi +18 -11
- data/rbi/lib/terminal-shop/models/subscription_get_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/subscription_list_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/token.rbi +5 -0
- data/rbi/lib/terminal-shop/models/token_create_response.rbi +3 -0
- data/rbi/lib/terminal-shop/models/token_get_response.rbi +2 -0
- data/rbi/lib/terminal-shop/models/token_list_response.rbi +1 -0
- data/rbi/lib/terminal-shop/models/view_init_response.rbi +5 -0
- data/rbi/lib/terminal-shop/pooled_net_requester.rbi +10 -3
- data/rbi/lib/terminal-shop/request_options.rbi +21 -2
- data/rbi/lib/terminal-shop/resources/address.rbi +22 -2
- data/rbi/lib/terminal-shop/resources/app.rbi +14 -2
- data/rbi/lib/terminal-shop/resources/card.rbi +22 -3
- data/rbi/lib/terminal-shop/resources/cart.rbi +23 -3
- data/rbi/lib/terminal-shop/resources/email.rbi +6 -1
- data/rbi/lib/terminal-shop/resources/order.rbi +17 -2
- data/rbi/lib/terminal-shop/resources/product.rbi +7 -1
- data/rbi/lib/terminal-shop/resources/profile.rbi +2 -0
- data/rbi/lib/terminal-shop/resources/subscription.rbi +21 -2
- data/rbi/lib/terminal-shop/resources/token.rbi +14 -2
- data/rbi/lib/terminal-shop/resources/view.rbi +2 -0
- data/rbi/lib/terminal-shop/util.rbi +55 -8
- data/rbi/lib/terminal-shop/version.rbi +1 -1
- data/sig/terminal-shop/base_client.rbs +6 -1
- data/sig/terminal-shop/base_model.rbs +8 -6
- data/sig/terminal-shop/errors.rbs +4 -4
- data/sig/terminal-shop/models/subscription.rbs +1 -1
- data/sig/terminal-shop/pooled_net_requester.rbs +7 -2
- data/sig/terminal-shop/util.rbs +4 -4
- data/sig/terminal-shop/version.rbs +1 -1
- metadata +4 -4
@@ -1,41 +1,35 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module TerminalShop
|
4
|
-
# @private
|
5
|
-
#
|
6
|
-
# @abstract
|
7
|
-
#
|
4
|
+
# @api private
|
8
5
|
module Converter
|
9
6
|
# rubocop:disable Lint/UnusedMethodArgument
|
10
7
|
|
11
|
-
# @private
|
8
|
+
# @api private
|
12
9
|
#
|
13
10
|
# @param value [Object]
|
14
11
|
#
|
15
12
|
# @return [Object]
|
16
|
-
#
|
17
13
|
def coerce(value) = value
|
18
14
|
|
19
|
-
# @private
|
15
|
+
# @api private
|
20
16
|
#
|
21
17
|
# @param value [Object]
|
22
18
|
#
|
23
19
|
# @return [Object]
|
24
|
-
#
|
25
20
|
def dump(value) = value
|
26
21
|
|
27
|
-
# @private
|
22
|
+
# @api private
|
28
23
|
#
|
29
24
|
# @param value [Object]
|
30
25
|
#
|
31
26
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
32
|
-
#
|
33
27
|
def try_strict_coerce(value) = (raise NotImplementedError)
|
34
28
|
|
35
29
|
# rubocop:enable Lint/UnusedMethodArgument
|
36
30
|
|
37
31
|
class << self
|
38
|
-
# @private
|
32
|
+
# @api private
|
39
33
|
#
|
40
34
|
# @param spec [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class] .
|
41
35
|
#
|
@@ -48,7 +42,6 @@ module TerminalShop
|
|
48
42
|
# @option spec [Boolean] :"nil?"
|
49
43
|
#
|
50
44
|
# @return [Proc]
|
51
|
-
#
|
52
45
|
def type_info(spec)
|
53
46
|
case spec
|
54
47
|
in Hash
|
@@ -64,7 +57,7 @@ module TerminalShop
|
|
64
57
|
end
|
65
58
|
end
|
66
59
|
|
67
|
-
# @private
|
60
|
+
# @api private
|
68
61
|
#
|
69
62
|
# Based on `target`, transform `value` into `target`, to the extent possible:
|
70
63
|
#
|
@@ -77,7 +70,6 @@ module TerminalShop
|
|
77
70
|
# @param value [Object]
|
78
71
|
#
|
79
72
|
# @return [Object]
|
80
|
-
#
|
81
73
|
def coerce(target, value)
|
82
74
|
case target
|
83
75
|
in TerminalShop::Converter
|
@@ -111,13 +103,12 @@ module TerminalShop
|
|
111
103
|
end
|
112
104
|
end
|
113
105
|
|
114
|
-
# @private
|
106
|
+
# @api private
|
115
107
|
#
|
116
108
|
# @param target [TerminalShop::Converter, Class]
|
117
109
|
# @param value [Object]
|
118
110
|
#
|
119
111
|
# @return [Object]
|
120
|
-
#
|
121
112
|
def dump(target, value)
|
122
113
|
case target
|
123
114
|
in TerminalShop::Converter
|
@@ -127,7 +118,7 @@ module TerminalShop
|
|
127
118
|
end
|
128
119
|
end
|
129
120
|
|
130
|
-
# @private
|
121
|
+
# @api private
|
131
122
|
#
|
132
123
|
# The underlying algorithm for computing maximal compatibility is subject to
|
133
124
|
# future improvements.
|
@@ -142,7 +133,6 @@ module TerminalShop
|
|
142
133
|
# @param value [Object]
|
143
134
|
#
|
144
135
|
# @return [Object]
|
145
|
-
#
|
146
136
|
def try_strict_coerce(target, value)
|
147
137
|
case target
|
148
138
|
in TerminalShop::Converter
|
@@ -182,7 +172,7 @@ module TerminalShop
|
|
182
172
|
end
|
183
173
|
end
|
184
174
|
|
185
|
-
# @private
|
175
|
+
# @api private
|
186
176
|
#
|
187
177
|
# @abstract
|
188
178
|
#
|
@@ -197,40 +187,35 @@ module TerminalShop
|
|
197
187
|
# @param other [Object]
|
198
188
|
#
|
199
189
|
# @return [Boolean]
|
200
|
-
#
|
201
190
|
def self.===(other) = true
|
202
191
|
|
203
192
|
# @param other [Object]
|
204
193
|
#
|
205
194
|
# @return [Boolean]
|
206
|
-
#
|
207
195
|
def self.==(other) = other.is_a?(Class) && other <= TerminalShop::Unknown
|
208
196
|
|
209
197
|
class << self
|
210
198
|
# @!parse
|
211
|
-
# # @private
|
199
|
+
# # @api private
|
212
200
|
# #
|
213
201
|
# # @param value [Object]
|
214
202
|
# #
|
215
203
|
# # @return [Object]
|
216
|
-
# #
|
217
204
|
# def coerce(value) = super
|
218
205
|
|
219
206
|
# @!parse
|
220
|
-
# # @private
|
207
|
+
# # @api private
|
221
208
|
# #
|
222
209
|
# # @param value [Object]
|
223
210
|
# #
|
224
211
|
# # @return [Object]
|
225
|
-
# #
|
226
212
|
# def dump(value) = super
|
227
213
|
|
228
|
-
# @private
|
214
|
+
# @api private
|
229
215
|
#
|
230
216
|
# @param value [Object]
|
231
217
|
#
|
232
218
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
233
|
-
#
|
234
219
|
def try_strict_coerce(value)
|
235
220
|
# prevent unknown variant from being chosen during the first coercion pass
|
236
221
|
[false, true, 0]
|
@@ -240,7 +225,7 @@ module TerminalShop
|
|
240
225
|
# rubocop:enable Lint/UnusedMethodArgument
|
241
226
|
end
|
242
227
|
|
243
|
-
# @private
|
228
|
+
# @api private
|
244
229
|
#
|
245
230
|
# @abstract
|
246
231
|
#
|
@@ -253,40 +238,35 @@ module TerminalShop
|
|
253
238
|
# @param other [Object]
|
254
239
|
#
|
255
240
|
# @return [Boolean]
|
256
|
-
#
|
257
241
|
def self.===(other) = other == true || other == false
|
258
242
|
|
259
243
|
# @param other [Object]
|
260
244
|
#
|
261
245
|
# @return [Boolean]
|
262
|
-
#
|
263
246
|
def self.==(other) = other.is_a?(Class) && other <= TerminalShop::BooleanModel
|
264
247
|
|
265
248
|
class << self
|
266
249
|
# @!parse
|
267
|
-
# # @private
|
250
|
+
# # @api private
|
268
251
|
# #
|
269
252
|
# # @param value [Boolean, Object]
|
270
253
|
# #
|
271
254
|
# # @return [Boolean, Object]
|
272
|
-
# #
|
273
255
|
# def coerce(value) = super
|
274
256
|
|
275
257
|
# @!parse
|
276
|
-
# # @private
|
258
|
+
# # @api private
|
277
259
|
# #
|
278
260
|
# # @param value [Boolean, Object]
|
279
261
|
# #
|
280
262
|
# # @return [Boolean, Object]
|
281
|
-
# #
|
282
263
|
# def dump(value) = super
|
283
264
|
|
284
|
-
# @private
|
265
|
+
# @api private
|
285
266
|
#
|
286
267
|
# @param value [Object]
|
287
268
|
#
|
288
269
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
289
|
-
#
|
290
270
|
def try_strict_coerce(value)
|
291
271
|
case value
|
292
272
|
in true | false
|
@@ -298,7 +278,7 @@ module TerminalShop
|
|
298
278
|
end
|
299
279
|
end
|
300
280
|
|
301
|
-
# @private
|
281
|
+
# @api private
|
302
282
|
#
|
303
283
|
# @abstract
|
304
284
|
#
|
@@ -322,7 +302,7 @@ module TerminalShop
|
|
322
302
|
# when TerminalShop::Models::Region::NA
|
323
303
|
# # ...
|
324
304
|
# else
|
325
|
-
#
|
305
|
+
# puts(region)
|
326
306
|
# end
|
327
307
|
# ```
|
328
308
|
#
|
@@ -334,7 +314,7 @@ module TerminalShop
|
|
334
314
|
# in :na
|
335
315
|
# # ...
|
336
316
|
# else
|
337
|
-
#
|
317
|
+
# puts(region)
|
338
318
|
# end
|
339
319
|
# ```
|
340
320
|
class Enum
|
@@ -344,13 +324,11 @@ module TerminalShop
|
|
344
324
|
# All of the valid Symbol values for this enum.
|
345
325
|
#
|
346
326
|
# @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
|
347
|
-
#
|
348
327
|
def values = (@values ||= constants.map { const_get(_1) })
|
349
328
|
|
350
|
-
# @private
|
329
|
+
# @api private
|
351
330
|
#
|
352
331
|
# Guard against thread safety issues by instantiating `@values`.
|
353
|
-
#
|
354
332
|
private def finalize! = values
|
355
333
|
end
|
356
334
|
|
@@ -359,24 +337,21 @@ module TerminalShop
|
|
359
337
|
# @param other [Object]
|
360
338
|
#
|
361
339
|
# @return [Boolean]
|
362
|
-
#
|
363
340
|
def self.===(other) = values.include?(other)
|
364
341
|
|
365
342
|
# @param other [Object]
|
366
343
|
#
|
367
344
|
# @return [Boolean]
|
368
|
-
#
|
369
345
|
def self.==(other)
|
370
346
|
other.is_a?(Class) && other <= TerminalShop::Enum && other.values.to_set == values.to_set
|
371
347
|
end
|
372
348
|
|
373
349
|
class << self
|
374
|
-
# @private
|
350
|
+
# @api private
|
375
351
|
#
|
376
352
|
# @param value [String, Symbol, Object]
|
377
353
|
#
|
378
354
|
# @return [Symbol, Object]
|
379
|
-
#
|
380
355
|
def coerce(value)
|
381
356
|
case value
|
382
357
|
in Symbol | String if values.include?(val = value.to_sym)
|
@@ -387,20 +362,18 @@ module TerminalShop
|
|
387
362
|
end
|
388
363
|
|
389
364
|
# @!parse
|
390
|
-
# # @private
|
365
|
+
# # @api private
|
391
366
|
# #
|
392
367
|
# # @param value [Symbol, Object]
|
393
368
|
# #
|
394
369
|
# # @return [Symbol, Object]
|
395
|
-
# #
|
396
370
|
# def dump(value) = super
|
397
371
|
|
398
|
-
# @private
|
372
|
+
# @api private
|
399
373
|
#
|
400
374
|
# @param value [Object]
|
401
375
|
#
|
402
376
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
403
|
-
#
|
404
377
|
def try_strict_coerce(value)
|
405
378
|
return [true, value, 1] if values.include?(value)
|
406
379
|
|
@@ -419,36 +392,37 @@ module TerminalShop
|
|
419
392
|
end
|
420
393
|
end
|
421
394
|
|
422
|
-
# @private
|
395
|
+
# @api private
|
423
396
|
#
|
424
397
|
# @abstract
|
425
|
-
#
|
426
398
|
class Union
|
427
399
|
extend TerminalShop::Converter
|
428
400
|
|
429
401
|
class << self
|
430
|
-
# @private
|
402
|
+
# @api private
|
431
403
|
#
|
432
404
|
# All of the specified variant info for this union.
|
433
405
|
#
|
434
406
|
# @return [Array<Array(Symbol, Proc)>]
|
435
|
-
#
|
436
407
|
private def known_variants = (@known_variants ||= [])
|
437
408
|
|
438
|
-
# @private
|
439
|
-
#
|
440
|
-
# All of the specified variants for this union.
|
409
|
+
# @api private
|
441
410
|
#
|
442
411
|
# @return [Array<Array(Symbol, Object)>]
|
443
|
-
|
444
|
-
protected def variants
|
412
|
+
protected def derefed_variants
|
445
413
|
@known_variants.map { |key, variant_fn| [key, variant_fn.call] }
|
446
414
|
end
|
447
415
|
|
448
|
-
#
|
416
|
+
# All of the specified variants for this union.
|
417
|
+
#
|
418
|
+
# @return [Array<Object>]
|
419
|
+
def variants
|
420
|
+
derefed_variants.map(&:last)
|
421
|
+
end
|
422
|
+
|
423
|
+
# @api private
|
449
424
|
#
|
450
425
|
# @param property [Symbol]
|
451
|
-
#
|
452
426
|
private def discriminator(property)
|
453
427
|
case property
|
454
428
|
in Symbol
|
@@ -456,7 +430,7 @@ module TerminalShop
|
|
456
430
|
end
|
457
431
|
end
|
458
432
|
|
459
|
-
# @private
|
433
|
+
# @api private
|
460
434
|
#
|
461
435
|
# @param key [Symbol, Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
462
436
|
#
|
@@ -469,7 +443,6 @@ module TerminalShop
|
|
469
443
|
# @option spec [Proc] :union
|
470
444
|
#
|
471
445
|
# @option spec [Boolean] :"nil?"
|
472
|
-
#
|
473
446
|
private def variant(key, spec = nil)
|
474
447
|
variant_info =
|
475
448
|
case key
|
@@ -482,12 +455,11 @@ module TerminalShop
|
|
482
455
|
known_variants << variant_info
|
483
456
|
end
|
484
457
|
|
485
|
-
# @private
|
458
|
+
# @api private
|
486
459
|
#
|
487
460
|
# @param value [Object]
|
488
461
|
#
|
489
462
|
# @return [TerminalShop::Converter, Class, nil]
|
490
|
-
#
|
491
463
|
private def resolve_variant(value)
|
492
464
|
case [@discriminator, value]
|
493
465
|
in [_, TerminalShop::BaseModel]
|
@@ -517,7 +489,6 @@ module TerminalShop
|
|
517
489
|
# @param other [Object]
|
518
490
|
#
|
519
491
|
# @return [Boolean]
|
520
|
-
#
|
521
492
|
def self.===(other)
|
522
493
|
known_variants.any? do |_, variant_fn|
|
523
494
|
variant_fn.call === other
|
@@ -527,18 +498,16 @@ module TerminalShop
|
|
527
498
|
# @param other [Object]
|
528
499
|
#
|
529
500
|
# @return [Boolean]
|
530
|
-
#
|
531
501
|
def self.==(other)
|
532
|
-
other.is_a?(Class) && other <= TerminalShop::Union && other.
|
502
|
+
other.is_a?(Class) && other <= TerminalShop::Union && other.derefed_variants == derefed_variants
|
533
503
|
end
|
534
504
|
|
535
505
|
class << self
|
536
|
-
# @private
|
506
|
+
# @api private
|
537
507
|
#
|
538
508
|
# @param value [Object]
|
539
509
|
#
|
540
510
|
# @return [Object]
|
541
|
-
#
|
542
511
|
def coerce(value)
|
543
512
|
if (variant = resolve_variant(value))
|
544
513
|
return TerminalShop::Converter.coerce(variant, value)
|
@@ -563,12 +532,11 @@ module TerminalShop
|
|
563
532
|
variant.nil? ? value : TerminalShop::Converter.coerce(variant, value)
|
564
533
|
end
|
565
534
|
|
566
|
-
# @private
|
535
|
+
# @api private
|
567
536
|
#
|
568
537
|
# @param value [Object]
|
569
538
|
#
|
570
539
|
# @return [Object]
|
571
|
-
#
|
572
540
|
def dump(value)
|
573
541
|
if (variant = resolve_variant(value))
|
574
542
|
return TerminalShop::Converter.dump(variant, value)
|
@@ -583,12 +551,11 @@ module TerminalShop
|
|
583
551
|
value
|
584
552
|
end
|
585
553
|
|
586
|
-
# @private
|
554
|
+
# @api private
|
587
555
|
#
|
588
556
|
# @param value [Object]
|
589
557
|
#
|
590
558
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
591
|
-
#
|
592
559
|
def try_strict_coerce(value)
|
593
560
|
# TODO(ruby) this will result in super linear decoding behaviour for nested unions
|
594
561
|
# follow up with a decoding context that captures current strictness levels
|
@@ -621,7 +588,7 @@ module TerminalShop
|
|
621
588
|
# rubocop:enable Style/HashEachMethods
|
622
589
|
end
|
623
590
|
|
624
|
-
# @private
|
591
|
+
# @api private
|
625
592
|
#
|
626
593
|
# @abstract
|
627
594
|
#
|
@@ -636,7 +603,6 @@ module TerminalShop
|
|
636
603
|
# @param other [Object]
|
637
604
|
#
|
638
605
|
# @return [Boolean]
|
639
|
-
#
|
640
606
|
def ===(other)
|
641
607
|
type = item_type
|
642
608
|
case other
|
@@ -652,15 +618,13 @@ module TerminalShop
|
|
652
618
|
# @param other [Object]
|
653
619
|
#
|
654
620
|
# @return [Boolean]
|
655
|
-
#
|
656
621
|
def ==(other) = other.is_a?(TerminalShop::ArrayOf) && other.item_type == item_type
|
657
622
|
|
658
|
-
# @private
|
623
|
+
# @api private
|
659
624
|
#
|
660
625
|
# @param value [Enumerable, Object]
|
661
626
|
#
|
662
627
|
# @return [Array<Object>, Object]
|
663
|
-
#
|
664
628
|
def coerce(value)
|
665
629
|
type = item_type
|
666
630
|
case value
|
@@ -671,12 +635,11 @@ module TerminalShop
|
|
671
635
|
end
|
672
636
|
end
|
673
637
|
|
674
|
-
# @private
|
638
|
+
# @api private
|
675
639
|
#
|
676
640
|
# @param value [Enumerable, Object]
|
677
641
|
#
|
678
642
|
# @return [Array<Object>, Object]
|
679
|
-
#
|
680
643
|
def dump(value)
|
681
644
|
type = item_type
|
682
645
|
case value
|
@@ -687,12 +650,11 @@ module TerminalShop
|
|
687
650
|
end
|
688
651
|
end
|
689
652
|
|
690
|
-
# @private
|
653
|
+
# @api private
|
691
654
|
#
|
692
655
|
# @param value [Object]
|
693
656
|
#
|
694
657
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
695
|
-
#
|
696
658
|
def try_strict_coerce(value)
|
697
659
|
case value
|
698
660
|
in Array
|
@@ -726,13 +688,12 @@ module TerminalShop
|
|
726
688
|
end
|
727
689
|
end
|
728
690
|
|
729
|
-
# @private
|
691
|
+
# @api private
|
730
692
|
#
|
731
693
|
# @return [TerminalShop::Converter, Class]
|
732
|
-
#
|
733
694
|
protected def item_type = @item_type_fn.call
|
734
695
|
|
735
|
-
# @private
|
696
|
+
# @api private
|
736
697
|
#
|
737
698
|
# @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
738
699
|
#
|
@@ -745,13 +706,12 @@ module TerminalShop
|
|
745
706
|
# @option spec [Proc] :union
|
746
707
|
#
|
747
708
|
# @option spec [Boolean] :"nil?"
|
748
|
-
#
|
749
709
|
def initialize(type_info, spec = {})
|
750
710
|
@item_type_fn = TerminalShop::Converter.type_info(type_info || spec)
|
751
711
|
end
|
752
712
|
end
|
753
713
|
|
754
|
-
# @private
|
714
|
+
# @api private
|
755
715
|
#
|
756
716
|
# @abstract
|
757
717
|
#
|
@@ -766,7 +726,6 @@ module TerminalShop
|
|
766
726
|
# @param other [Object]
|
767
727
|
#
|
768
728
|
# @return [Boolean]
|
769
|
-
#
|
770
729
|
def ===(other)
|
771
730
|
type = item_type
|
772
731
|
case other
|
@@ -787,15 +746,13 @@ module TerminalShop
|
|
787
746
|
# @param other [Object]
|
788
747
|
#
|
789
748
|
# @return [Boolean]
|
790
|
-
#
|
791
749
|
def ==(other) = other.is_a?(TerminalShop::HashOf) && other.item_type == item_type
|
792
750
|
|
793
|
-
# @private
|
751
|
+
# @api private
|
794
752
|
#
|
795
753
|
# @param value [Hash{Object=>Object}, Object]
|
796
754
|
#
|
797
755
|
# @return [Hash{Symbol=>Object}, Object]
|
798
|
-
#
|
799
756
|
def coerce(value)
|
800
757
|
type = item_type
|
801
758
|
case value
|
@@ -809,12 +766,11 @@ module TerminalShop
|
|
809
766
|
end
|
810
767
|
end
|
811
768
|
|
812
|
-
# @private
|
769
|
+
# @api private
|
813
770
|
#
|
814
771
|
# @param value [Hash{Object=>Object}, Object]
|
815
772
|
#
|
816
773
|
# @return [Hash{Symbol=>Object}, Object]
|
817
|
-
#
|
818
774
|
def dump(value)
|
819
775
|
type = item_type
|
820
776
|
case value
|
@@ -827,12 +783,11 @@ module TerminalShop
|
|
827
783
|
end
|
828
784
|
end
|
829
785
|
|
830
|
-
# @private
|
786
|
+
# @api private
|
831
787
|
#
|
832
788
|
# @param value [Object]
|
833
789
|
#
|
834
790
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
835
|
-
#
|
836
791
|
def try_strict_coerce(value)
|
837
792
|
case value
|
838
793
|
in Hash
|
@@ -866,13 +821,12 @@ module TerminalShop
|
|
866
821
|
end
|
867
822
|
end
|
868
823
|
|
869
|
-
# @private
|
824
|
+
# @api private
|
870
825
|
#
|
871
826
|
# @return [TerminalShop::Converter, Class]
|
872
|
-
#
|
873
827
|
protected def item_type = @item_type_fn.call
|
874
828
|
|
875
|
-
# @private
|
829
|
+
# @api private
|
876
830
|
#
|
877
831
|
# @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
878
832
|
#
|
@@ -885,14 +839,11 @@ module TerminalShop
|
|
885
839
|
# @option spec [Proc] :union
|
886
840
|
#
|
887
841
|
# @option spec [Boolean] :"nil?"
|
888
|
-
#
|
889
842
|
def initialize(type_info, spec = {})
|
890
843
|
@item_type_fn = TerminalShop::Converter.type_info(type_info || spec)
|
891
844
|
end
|
892
845
|
end
|
893
846
|
|
894
|
-
# @private
|
895
|
-
#
|
896
847
|
# @abstract
|
897
848
|
#
|
898
849
|
# @example
|
@@ -908,32 +859,31 @@ module TerminalShop
|
|
908
859
|
extend TerminalShop::Converter
|
909
860
|
|
910
861
|
class << self
|
911
|
-
# @private
|
862
|
+
# @api private
|
912
863
|
#
|
913
864
|
# Assumes superclass fields are totally defined before fields are accessed /
|
914
865
|
# defined on subclasses.
|
915
866
|
#
|
916
867
|
# @return [Hash{Symbol=>Hash{Symbol=>Object}}]
|
917
|
-
#
|
918
868
|
def known_fields
|
919
869
|
@known_fields ||= (self < TerminalShop::BaseModel ? superclass.known_fields.dup : {})
|
920
870
|
end
|
921
871
|
|
922
|
-
# @
|
872
|
+
# @api private
|
923
873
|
#
|
874
|
+
# @return [Hash{Symbol=>Hash{Symbol=>Object}}]
|
924
875
|
def fields
|
925
876
|
known_fields.transform_values do |field|
|
926
877
|
{**field.except(:type_fn), type: field.fetch(:type_fn).call}
|
927
878
|
end
|
928
879
|
end
|
929
880
|
|
930
|
-
# @private
|
881
|
+
# @api private
|
931
882
|
#
|
932
883
|
# @return [Hash{Symbol=>Proc}]
|
933
|
-
#
|
934
884
|
def defaults = (@defaults ||= {})
|
935
885
|
|
936
|
-
# @private
|
886
|
+
# @api private
|
937
887
|
#
|
938
888
|
# @param name_sym [Symbol]
|
939
889
|
#
|
@@ -950,7 +900,6 @@ module TerminalShop
|
|
950
900
|
# @option spec [Proc] :union
|
951
901
|
#
|
952
902
|
# @option spec [Boolean] :"nil?"
|
953
|
-
#
|
954
903
|
private def add_field(name_sym, required:, type_info:, spec:)
|
955
904
|
type_fn, info =
|
956
905
|
case type_info
|
@@ -989,7 +938,7 @@ module TerminalShop
|
|
989
938
|
end
|
990
939
|
end
|
991
940
|
|
992
|
-
# @private
|
941
|
+
# @api private
|
993
942
|
#
|
994
943
|
# @param name_sym [Symbol]
|
995
944
|
#
|
@@ -1004,12 +953,11 @@ module TerminalShop
|
|
1004
953
|
# @option spec [Proc] :union
|
1005
954
|
#
|
1006
955
|
# @option spec [Boolean] :"nil?"
|
1007
|
-
#
|
1008
956
|
def required(name_sym, type_info, spec = {})
|
1009
957
|
add_field(name_sym, required: true, type_info: type_info, spec: spec)
|
1010
958
|
end
|
1011
959
|
|
1012
|
-
# @private
|
960
|
+
# @api private
|
1013
961
|
#
|
1014
962
|
# @param name_sym [Symbol]
|
1015
963
|
#
|
@@ -1024,18 +972,16 @@ module TerminalShop
|
|
1024
972
|
# @option spec [Proc] :union
|
1025
973
|
#
|
1026
974
|
# @option spec [Boolean] :"nil?"
|
1027
|
-
#
|
1028
975
|
def optional(name_sym, type_info, spec = {})
|
1029
976
|
add_field(name_sym, required: false, type_info: type_info, spec: spec)
|
1030
977
|
end
|
1031
978
|
|
1032
|
-
# @private
|
979
|
+
# @api private
|
1033
980
|
#
|
1034
981
|
# `request_only` attributes not excluded from `.#coerce` when receiving responses
|
1035
982
|
# even if well behaved servers should not send them
|
1036
983
|
#
|
1037
984
|
# @param blk [Proc]
|
1038
|
-
#
|
1039
985
|
private def request_only(&blk)
|
1040
986
|
@mode = :dump
|
1041
987
|
blk.call
|
@@ -1043,12 +989,11 @@ module TerminalShop
|
|
1043
989
|
@mode = nil
|
1044
990
|
end
|
1045
991
|
|
1046
|
-
# @private
|
992
|
+
# @api private
|
1047
993
|
#
|
1048
994
|
# `response_only` attributes are omitted from `.#dump` when making requests
|
1049
995
|
#
|
1050
996
|
# @param blk [Proc]
|
1051
|
-
#
|
1052
997
|
private def response_only(&blk)
|
1053
998
|
@mode = :coerce
|
1054
999
|
blk.call
|
@@ -1060,7 +1005,6 @@ module TerminalShop
|
|
1060
1005
|
# @param other [Object]
|
1061
1006
|
#
|
1062
1007
|
# @return [Boolean]
|
1063
|
-
#
|
1064
1008
|
def ==(other)
|
1065
1009
|
case other
|
1066
1010
|
in TerminalShop::BaseModel
|
@@ -1071,12 +1015,11 @@ module TerminalShop
|
|
1071
1015
|
end
|
1072
1016
|
|
1073
1017
|
class << self
|
1074
|
-
# @private
|
1018
|
+
# @api private
|
1075
1019
|
#
|
1076
1020
|
# @param value [TerminalShop::BaseModel, Hash{Object=>Object}, Object]
|
1077
1021
|
#
|
1078
1022
|
# @return [TerminalShop::BaseModel, Object]
|
1079
|
-
#
|
1080
1023
|
def coerce(value)
|
1081
1024
|
case TerminalShop::Util.coerce_hash(value)
|
1082
1025
|
in Hash => coerced
|
@@ -1086,12 +1029,11 @@ module TerminalShop
|
|
1086
1029
|
end
|
1087
1030
|
end
|
1088
1031
|
|
1089
|
-
# @private
|
1032
|
+
# @api private
|
1090
1033
|
#
|
1091
1034
|
# @param value [TerminalShop::BaseModel, Object]
|
1092
1035
|
#
|
1093
1036
|
# @return [Hash{Object=>Object}, Object]
|
1094
|
-
#
|
1095
1037
|
def dump(value)
|
1096
1038
|
unless (coerced = TerminalShop::Util.coerce_hash(value)).is_a?(Hash)
|
1097
1039
|
return value
|
@@ -1123,12 +1065,11 @@ module TerminalShop
|
|
1123
1065
|
values
|
1124
1066
|
end
|
1125
1067
|
|
1126
|
-
# @private
|
1068
|
+
# @api private
|
1127
1069
|
#
|
1128
1070
|
# @param value [Object]
|
1129
1071
|
#
|
1130
1072
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
1131
|
-
#
|
1132
1073
|
def try_strict_coerce(value)
|
1133
1074
|
case value
|
1134
1075
|
in Hash | TerminalShop::BaseModel
|
@@ -1186,7 +1127,6 @@ module TerminalShop
|
|
1186
1127
|
# @param key [Symbol]
|
1187
1128
|
#
|
1188
1129
|
# @return [Object, nil]
|
1189
|
-
#
|
1190
1130
|
def [](key)
|
1191
1131
|
unless key.instance_of?(Symbol)
|
1192
1132
|
raise ArgumentError.new("Expected symbol key for lookup, got #{key.inspect}")
|
@@ -1205,7 +1145,6 @@ module TerminalShop
|
|
1205
1145
|
# should not be mutated.
|
1206
1146
|
#
|
1207
1147
|
# @return [Hash{Symbol=>Object}]
|
1208
|
-
#
|
1209
1148
|
def to_h = @data
|
1210
1149
|
|
1211
1150
|
alias_method :to_hash, :to_h
|
@@ -1213,7 +1152,6 @@ module TerminalShop
|
|
1213
1152
|
# @param keys [Array<Symbol>, nil]
|
1214
1153
|
#
|
1215
1154
|
# @return [Hash{Symbol=>Object}]
|
1216
|
-
#
|
1217
1155
|
def deconstruct_keys(keys)
|
1218
1156
|
(keys || self.class.known_fields.keys).filter_map do |k|
|
1219
1157
|
unless self.class.known_fields.key?(k)
|
@@ -1228,7 +1166,6 @@ module TerminalShop
|
|
1228
1166
|
# Create a new instance of a model.
|
1229
1167
|
#
|
1230
1168
|
# @param data [Hash{Symbol=>Object}, TerminalShop::BaseModel]
|
1231
|
-
#
|
1232
1169
|
def initialize(data = {})
|
1233
1170
|
case TerminalShop::Util.coerce_hash(data)
|
1234
1171
|
in Hash => coerced
|
@@ -1239,11 +1176,9 @@ module TerminalShop
|
|
1239
1176
|
end
|
1240
1177
|
|
1241
1178
|
# @return [String]
|
1242
|
-
#
|
1243
1179
|
def to_s = @data.to_s
|
1244
1180
|
|
1245
1181
|
# @return [String]
|
1246
|
-
#
|
1247
1182
|
def inspect
|
1248
1183
|
"#<#{self.class.name}:0x#{object_id.to_s(16)} #{deconstruct_keys(nil).map do |k, v|
|
1249
1184
|
"#{k}=#{v.inspect}"
|