terminal-shop 1.6.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 +88 -128
- 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/region.rb +15 -0
- data/lib/terminal-shop/models/subscription.rb +6 -0
- data/lib/terminal-shop/models/view_init_response.rb +3 -13
- 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 +2 -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 +15 -0
- 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 -13
- 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/region.rbs +12 -0
- data/sig/terminal-shop/models/subscription.rbs +1 -1
- data/sig/terminal-shop/models/view_init_response.rbs +3 -12
- 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 +7 -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
|
#
|
@@ -312,6 +292,31 @@ module TerminalShop
|
|
312
292
|
#
|
313
293
|
# We can therefore convert string values to Symbols, but can't convert other
|
314
294
|
# values safely.
|
295
|
+
#
|
296
|
+
# @example
|
297
|
+
# ```ruby
|
298
|
+
# # `region` is a `TerminalShop::Models::Region`
|
299
|
+
# case region
|
300
|
+
# when TerminalShop::Models::Region::EU
|
301
|
+
# # ...
|
302
|
+
# when TerminalShop::Models::Region::NA
|
303
|
+
# # ...
|
304
|
+
# else
|
305
|
+
# puts(region)
|
306
|
+
# end
|
307
|
+
# ```
|
308
|
+
#
|
309
|
+
# @example
|
310
|
+
# ```ruby
|
311
|
+
# case region
|
312
|
+
# in :eu
|
313
|
+
# # ...
|
314
|
+
# in :na
|
315
|
+
# # ...
|
316
|
+
# else
|
317
|
+
# puts(region)
|
318
|
+
# end
|
319
|
+
# ```
|
315
320
|
class Enum
|
316
321
|
extend TerminalShop::Converter
|
317
322
|
|
@@ -319,13 +324,11 @@ module TerminalShop
|
|
319
324
|
# All of the valid Symbol values for this enum.
|
320
325
|
#
|
321
326
|
# @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
|
322
|
-
#
|
323
327
|
def values = (@values ||= constants.map { const_get(_1) })
|
324
328
|
|
325
|
-
# @private
|
329
|
+
# @api private
|
326
330
|
#
|
327
331
|
# Guard against thread safety issues by instantiating `@values`.
|
328
|
-
#
|
329
332
|
private def finalize! = values
|
330
333
|
end
|
331
334
|
|
@@ -334,24 +337,21 @@ module TerminalShop
|
|
334
337
|
# @param other [Object]
|
335
338
|
#
|
336
339
|
# @return [Boolean]
|
337
|
-
#
|
338
340
|
def self.===(other) = values.include?(other)
|
339
341
|
|
340
342
|
# @param other [Object]
|
341
343
|
#
|
342
344
|
# @return [Boolean]
|
343
|
-
#
|
344
345
|
def self.==(other)
|
345
346
|
other.is_a?(Class) && other <= TerminalShop::Enum && other.values.to_set == values.to_set
|
346
347
|
end
|
347
348
|
|
348
349
|
class << self
|
349
|
-
# @private
|
350
|
+
# @api private
|
350
351
|
#
|
351
352
|
# @param value [String, Symbol, Object]
|
352
353
|
#
|
353
354
|
# @return [Symbol, Object]
|
354
|
-
#
|
355
355
|
def coerce(value)
|
356
356
|
case value
|
357
357
|
in Symbol | String if values.include?(val = value.to_sym)
|
@@ -362,20 +362,18 @@ module TerminalShop
|
|
362
362
|
end
|
363
363
|
|
364
364
|
# @!parse
|
365
|
-
# # @private
|
365
|
+
# # @api private
|
366
366
|
# #
|
367
367
|
# # @param value [Symbol, Object]
|
368
368
|
# #
|
369
369
|
# # @return [Symbol, Object]
|
370
|
-
# #
|
371
370
|
# def dump(value) = super
|
372
371
|
|
373
|
-
# @private
|
372
|
+
# @api private
|
374
373
|
#
|
375
374
|
# @param value [Object]
|
376
375
|
#
|
377
376
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
378
|
-
#
|
379
377
|
def try_strict_coerce(value)
|
380
378
|
return [true, value, 1] if values.include?(value)
|
381
379
|
|
@@ -394,36 +392,37 @@ module TerminalShop
|
|
394
392
|
end
|
395
393
|
end
|
396
394
|
|
397
|
-
# @private
|
395
|
+
# @api private
|
398
396
|
#
|
399
397
|
# @abstract
|
400
|
-
#
|
401
398
|
class Union
|
402
399
|
extend TerminalShop::Converter
|
403
400
|
|
404
401
|
class << self
|
405
|
-
# @private
|
402
|
+
# @api private
|
406
403
|
#
|
407
404
|
# All of the specified variant info for this union.
|
408
405
|
#
|
409
406
|
# @return [Array<Array(Symbol, Proc)>]
|
410
|
-
#
|
411
407
|
private def known_variants = (@known_variants ||= [])
|
412
408
|
|
413
|
-
# @private
|
414
|
-
#
|
415
|
-
# All of the specified variants for this union.
|
409
|
+
# @api private
|
416
410
|
#
|
417
411
|
# @return [Array<Array(Symbol, Object)>]
|
418
|
-
|
419
|
-
protected def variants
|
412
|
+
protected def derefed_variants
|
420
413
|
@known_variants.map { |key, variant_fn| [key, variant_fn.call] }
|
421
414
|
end
|
422
415
|
|
423
|
-
#
|
416
|
+
# All of the specified variants for this union.
|
424
417
|
#
|
425
|
-
# @
|
418
|
+
# @return [Array<Object>]
|
419
|
+
def variants
|
420
|
+
derefed_variants.map(&:last)
|
421
|
+
end
|
422
|
+
|
423
|
+
# @api private
|
426
424
|
#
|
425
|
+
# @param property [Symbol]
|
427
426
|
private def discriminator(property)
|
428
427
|
case property
|
429
428
|
in Symbol
|
@@ -431,7 +430,7 @@ module TerminalShop
|
|
431
430
|
end
|
432
431
|
end
|
433
432
|
|
434
|
-
# @private
|
433
|
+
# @api private
|
435
434
|
#
|
436
435
|
# @param key [Symbol, Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
437
436
|
#
|
@@ -444,7 +443,6 @@ module TerminalShop
|
|
444
443
|
# @option spec [Proc] :union
|
445
444
|
#
|
446
445
|
# @option spec [Boolean] :"nil?"
|
447
|
-
#
|
448
446
|
private def variant(key, spec = nil)
|
449
447
|
variant_info =
|
450
448
|
case key
|
@@ -457,12 +455,11 @@ module TerminalShop
|
|
457
455
|
known_variants << variant_info
|
458
456
|
end
|
459
457
|
|
460
|
-
# @private
|
458
|
+
# @api private
|
461
459
|
#
|
462
460
|
# @param value [Object]
|
463
461
|
#
|
464
462
|
# @return [TerminalShop::Converter, Class, nil]
|
465
|
-
#
|
466
463
|
private def resolve_variant(value)
|
467
464
|
case [@discriminator, value]
|
468
465
|
in [_, TerminalShop::BaseModel]
|
@@ -492,7 +489,6 @@ module TerminalShop
|
|
492
489
|
# @param other [Object]
|
493
490
|
#
|
494
491
|
# @return [Boolean]
|
495
|
-
#
|
496
492
|
def self.===(other)
|
497
493
|
known_variants.any? do |_, variant_fn|
|
498
494
|
variant_fn.call === other
|
@@ -502,18 +498,16 @@ module TerminalShop
|
|
502
498
|
# @param other [Object]
|
503
499
|
#
|
504
500
|
# @return [Boolean]
|
505
|
-
#
|
506
501
|
def self.==(other)
|
507
|
-
other.is_a?(Class) && other <= TerminalShop::Union && other.
|
502
|
+
other.is_a?(Class) && other <= TerminalShop::Union && other.derefed_variants == derefed_variants
|
508
503
|
end
|
509
504
|
|
510
505
|
class << self
|
511
|
-
# @private
|
506
|
+
# @api private
|
512
507
|
#
|
513
508
|
# @param value [Object]
|
514
509
|
#
|
515
510
|
# @return [Object]
|
516
|
-
#
|
517
511
|
def coerce(value)
|
518
512
|
if (variant = resolve_variant(value))
|
519
513
|
return TerminalShop::Converter.coerce(variant, value)
|
@@ -538,12 +532,11 @@ module TerminalShop
|
|
538
532
|
variant.nil? ? value : TerminalShop::Converter.coerce(variant, value)
|
539
533
|
end
|
540
534
|
|
541
|
-
# @private
|
535
|
+
# @api private
|
542
536
|
#
|
543
537
|
# @param value [Object]
|
544
538
|
#
|
545
539
|
# @return [Object]
|
546
|
-
#
|
547
540
|
def dump(value)
|
548
541
|
if (variant = resolve_variant(value))
|
549
542
|
return TerminalShop::Converter.dump(variant, value)
|
@@ -558,12 +551,11 @@ module TerminalShop
|
|
558
551
|
value
|
559
552
|
end
|
560
553
|
|
561
|
-
# @private
|
554
|
+
# @api private
|
562
555
|
#
|
563
556
|
# @param value [Object]
|
564
557
|
#
|
565
558
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
566
|
-
#
|
567
559
|
def try_strict_coerce(value)
|
568
560
|
# TODO(ruby) this will result in super linear decoding behaviour for nested unions
|
569
561
|
# follow up with a decoding context that captures current strictness levels
|
@@ -596,7 +588,7 @@ module TerminalShop
|
|
596
588
|
# rubocop:enable Style/HashEachMethods
|
597
589
|
end
|
598
590
|
|
599
|
-
# @private
|
591
|
+
# @api private
|
600
592
|
#
|
601
593
|
# @abstract
|
602
594
|
#
|
@@ -611,7 +603,6 @@ module TerminalShop
|
|
611
603
|
# @param other [Object]
|
612
604
|
#
|
613
605
|
# @return [Boolean]
|
614
|
-
#
|
615
606
|
def ===(other)
|
616
607
|
type = item_type
|
617
608
|
case other
|
@@ -627,15 +618,13 @@ module TerminalShop
|
|
627
618
|
# @param other [Object]
|
628
619
|
#
|
629
620
|
# @return [Boolean]
|
630
|
-
#
|
631
621
|
def ==(other) = other.is_a?(TerminalShop::ArrayOf) && other.item_type == item_type
|
632
622
|
|
633
|
-
# @private
|
623
|
+
# @api private
|
634
624
|
#
|
635
625
|
# @param value [Enumerable, Object]
|
636
626
|
#
|
637
627
|
# @return [Array<Object>, Object]
|
638
|
-
#
|
639
628
|
def coerce(value)
|
640
629
|
type = item_type
|
641
630
|
case value
|
@@ -646,12 +635,11 @@ module TerminalShop
|
|
646
635
|
end
|
647
636
|
end
|
648
637
|
|
649
|
-
# @private
|
638
|
+
# @api private
|
650
639
|
#
|
651
640
|
# @param value [Enumerable, Object]
|
652
641
|
#
|
653
642
|
# @return [Array<Object>, Object]
|
654
|
-
#
|
655
643
|
def dump(value)
|
656
644
|
type = item_type
|
657
645
|
case value
|
@@ -662,12 +650,11 @@ module TerminalShop
|
|
662
650
|
end
|
663
651
|
end
|
664
652
|
|
665
|
-
# @private
|
653
|
+
# @api private
|
666
654
|
#
|
667
655
|
# @param value [Object]
|
668
656
|
#
|
669
657
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
670
|
-
#
|
671
658
|
def try_strict_coerce(value)
|
672
659
|
case value
|
673
660
|
in Array
|
@@ -701,13 +688,12 @@ module TerminalShop
|
|
701
688
|
end
|
702
689
|
end
|
703
690
|
|
704
|
-
# @private
|
691
|
+
# @api private
|
705
692
|
#
|
706
693
|
# @return [TerminalShop::Converter, Class]
|
707
|
-
#
|
708
694
|
protected def item_type = @item_type_fn.call
|
709
695
|
|
710
|
-
# @private
|
696
|
+
# @api private
|
711
697
|
#
|
712
698
|
# @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
713
699
|
#
|
@@ -720,13 +706,12 @@ module TerminalShop
|
|
720
706
|
# @option spec [Proc] :union
|
721
707
|
#
|
722
708
|
# @option spec [Boolean] :"nil?"
|
723
|
-
#
|
724
709
|
def initialize(type_info, spec = {})
|
725
710
|
@item_type_fn = TerminalShop::Converter.type_info(type_info || spec)
|
726
711
|
end
|
727
712
|
end
|
728
713
|
|
729
|
-
# @private
|
714
|
+
# @api private
|
730
715
|
#
|
731
716
|
# @abstract
|
732
717
|
#
|
@@ -741,7 +726,6 @@ module TerminalShop
|
|
741
726
|
# @param other [Object]
|
742
727
|
#
|
743
728
|
# @return [Boolean]
|
744
|
-
#
|
745
729
|
def ===(other)
|
746
730
|
type = item_type
|
747
731
|
case other
|
@@ -762,15 +746,13 @@ module TerminalShop
|
|
762
746
|
# @param other [Object]
|
763
747
|
#
|
764
748
|
# @return [Boolean]
|
765
|
-
#
|
766
749
|
def ==(other) = other.is_a?(TerminalShop::HashOf) && other.item_type == item_type
|
767
750
|
|
768
|
-
# @private
|
751
|
+
# @api private
|
769
752
|
#
|
770
753
|
# @param value [Hash{Object=>Object}, Object]
|
771
754
|
#
|
772
755
|
# @return [Hash{Symbol=>Object}, Object]
|
773
|
-
#
|
774
756
|
def coerce(value)
|
775
757
|
type = item_type
|
776
758
|
case value
|
@@ -784,12 +766,11 @@ module TerminalShop
|
|
784
766
|
end
|
785
767
|
end
|
786
768
|
|
787
|
-
# @private
|
769
|
+
# @api private
|
788
770
|
#
|
789
771
|
# @param value [Hash{Object=>Object}, Object]
|
790
772
|
#
|
791
773
|
# @return [Hash{Symbol=>Object}, Object]
|
792
|
-
#
|
793
774
|
def dump(value)
|
794
775
|
type = item_type
|
795
776
|
case value
|
@@ -802,12 +783,11 @@ module TerminalShop
|
|
802
783
|
end
|
803
784
|
end
|
804
785
|
|
805
|
-
# @private
|
786
|
+
# @api private
|
806
787
|
#
|
807
788
|
# @param value [Object]
|
808
789
|
#
|
809
790
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
810
|
-
#
|
811
791
|
def try_strict_coerce(value)
|
812
792
|
case value
|
813
793
|
in Hash
|
@@ -841,13 +821,12 @@ module TerminalShop
|
|
841
821
|
end
|
842
822
|
end
|
843
823
|
|
844
|
-
# @private
|
824
|
+
# @api private
|
845
825
|
#
|
846
826
|
# @return [TerminalShop::Converter, Class]
|
847
|
-
#
|
848
827
|
protected def item_type = @item_type_fn.call
|
849
828
|
|
850
|
-
# @private
|
829
|
+
# @api private
|
851
830
|
#
|
852
831
|
# @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
853
832
|
#
|
@@ -860,14 +839,11 @@ module TerminalShop
|
|
860
839
|
# @option spec [Proc] :union
|
861
840
|
#
|
862
841
|
# @option spec [Boolean] :"nil?"
|
863
|
-
#
|
864
842
|
def initialize(type_info, spec = {})
|
865
843
|
@item_type_fn = TerminalShop::Converter.type_info(type_info || spec)
|
866
844
|
end
|
867
845
|
end
|
868
846
|
|
869
|
-
# @private
|
870
|
-
#
|
871
847
|
# @abstract
|
872
848
|
#
|
873
849
|
# @example
|
@@ -883,32 +859,31 @@ module TerminalShop
|
|
883
859
|
extend TerminalShop::Converter
|
884
860
|
|
885
861
|
class << self
|
886
|
-
# @private
|
862
|
+
# @api private
|
887
863
|
#
|
888
864
|
# Assumes superclass fields are totally defined before fields are accessed /
|
889
865
|
# defined on subclasses.
|
890
866
|
#
|
891
867
|
# @return [Hash{Symbol=>Hash{Symbol=>Object}}]
|
892
|
-
#
|
893
868
|
def known_fields
|
894
869
|
@known_fields ||= (self < TerminalShop::BaseModel ? superclass.known_fields.dup : {})
|
895
870
|
end
|
896
871
|
|
897
|
-
# @
|
872
|
+
# @api private
|
898
873
|
#
|
874
|
+
# @return [Hash{Symbol=>Hash{Symbol=>Object}}]
|
899
875
|
def fields
|
900
876
|
known_fields.transform_values do |field|
|
901
877
|
{**field.except(:type_fn), type: field.fetch(:type_fn).call}
|
902
878
|
end
|
903
879
|
end
|
904
880
|
|
905
|
-
# @private
|
881
|
+
# @api private
|
906
882
|
#
|
907
883
|
# @return [Hash{Symbol=>Proc}]
|
908
|
-
#
|
909
884
|
def defaults = (@defaults ||= {})
|
910
885
|
|
911
|
-
# @private
|
886
|
+
# @api private
|
912
887
|
#
|
913
888
|
# @param name_sym [Symbol]
|
914
889
|
#
|
@@ -925,7 +900,6 @@ module TerminalShop
|
|
925
900
|
# @option spec [Proc] :union
|
926
901
|
#
|
927
902
|
# @option spec [Boolean] :"nil?"
|
928
|
-
#
|
929
903
|
private def add_field(name_sym, required:, type_info:, spec:)
|
930
904
|
type_fn, info =
|
931
905
|
case type_info
|
@@ -964,7 +938,7 @@ module TerminalShop
|
|
964
938
|
end
|
965
939
|
end
|
966
940
|
|
967
|
-
# @private
|
941
|
+
# @api private
|
968
942
|
#
|
969
943
|
# @param name_sym [Symbol]
|
970
944
|
#
|
@@ -979,12 +953,11 @@ module TerminalShop
|
|
979
953
|
# @option spec [Proc] :union
|
980
954
|
#
|
981
955
|
# @option spec [Boolean] :"nil?"
|
982
|
-
#
|
983
956
|
def required(name_sym, type_info, spec = {})
|
984
957
|
add_field(name_sym, required: true, type_info: type_info, spec: spec)
|
985
958
|
end
|
986
959
|
|
987
|
-
# @private
|
960
|
+
# @api private
|
988
961
|
#
|
989
962
|
# @param name_sym [Symbol]
|
990
963
|
#
|
@@ -999,18 +972,16 @@ module TerminalShop
|
|
999
972
|
# @option spec [Proc] :union
|
1000
973
|
#
|
1001
974
|
# @option spec [Boolean] :"nil?"
|
1002
|
-
#
|
1003
975
|
def optional(name_sym, type_info, spec = {})
|
1004
976
|
add_field(name_sym, required: false, type_info: type_info, spec: spec)
|
1005
977
|
end
|
1006
978
|
|
1007
|
-
# @private
|
979
|
+
# @api private
|
1008
980
|
#
|
1009
981
|
# `request_only` attributes not excluded from `.#coerce` when receiving responses
|
1010
982
|
# even if well behaved servers should not send them
|
1011
983
|
#
|
1012
984
|
# @param blk [Proc]
|
1013
|
-
#
|
1014
985
|
private def request_only(&blk)
|
1015
986
|
@mode = :dump
|
1016
987
|
blk.call
|
@@ -1018,12 +989,11 @@ module TerminalShop
|
|
1018
989
|
@mode = nil
|
1019
990
|
end
|
1020
991
|
|
1021
|
-
# @private
|
992
|
+
# @api private
|
1022
993
|
#
|
1023
994
|
# `response_only` attributes are omitted from `.#dump` when making requests
|
1024
995
|
#
|
1025
996
|
# @param blk [Proc]
|
1026
|
-
#
|
1027
997
|
private def response_only(&blk)
|
1028
998
|
@mode = :coerce
|
1029
999
|
blk.call
|
@@ -1035,7 +1005,6 @@ module TerminalShop
|
|
1035
1005
|
# @param other [Object]
|
1036
1006
|
#
|
1037
1007
|
# @return [Boolean]
|
1038
|
-
#
|
1039
1008
|
def ==(other)
|
1040
1009
|
case other
|
1041
1010
|
in TerminalShop::BaseModel
|
@@ -1046,12 +1015,11 @@ module TerminalShop
|
|
1046
1015
|
end
|
1047
1016
|
|
1048
1017
|
class << self
|
1049
|
-
# @private
|
1018
|
+
# @api private
|
1050
1019
|
#
|
1051
1020
|
# @param value [TerminalShop::BaseModel, Hash{Object=>Object}, Object]
|
1052
1021
|
#
|
1053
1022
|
# @return [TerminalShop::BaseModel, Object]
|
1054
|
-
#
|
1055
1023
|
def coerce(value)
|
1056
1024
|
case TerminalShop::Util.coerce_hash(value)
|
1057
1025
|
in Hash => coerced
|
@@ -1061,12 +1029,11 @@ module TerminalShop
|
|
1061
1029
|
end
|
1062
1030
|
end
|
1063
1031
|
|
1064
|
-
# @private
|
1032
|
+
# @api private
|
1065
1033
|
#
|
1066
1034
|
# @param value [TerminalShop::BaseModel, Object]
|
1067
1035
|
#
|
1068
1036
|
# @return [Hash{Object=>Object}, Object]
|
1069
|
-
#
|
1070
1037
|
def dump(value)
|
1071
1038
|
unless (coerced = TerminalShop::Util.coerce_hash(value)).is_a?(Hash)
|
1072
1039
|
return value
|
@@ -1098,12 +1065,11 @@ module TerminalShop
|
|
1098
1065
|
values
|
1099
1066
|
end
|
1100
1067
|
|
1101
|
-
# @private
|
1068
|
+
# @api private
|
1102
1069
|
#
|
1103
1070
|
# @param value [Object]
|
1104
1071
|
#
|
1105
1072
|
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
1106
|
-
#
|
1107
1073
|
def try_strict_coerce(value)
|
1108
1074
|
case value
|
1109
1075
|
in Hash | TerminalShop::BaseModel
|
@@ -1161,7 +1127,6 @@ module TerminalShop
|
|
1161
1127
|
# @param key [Symbol]
|
1162
1128
|
#
|
1163
1129
|
# @return [Object, nil]
|
1164
|
-
#
|
1165
1130
|
def [](key)
|
1166
1131
|
unless key.instance_of?(Symbol)
|
1167
1132
|
raise ArgumentError.new("Expected symbol key for lookup, got #{key.inspect}")
|
@@ -1180,7 +1145,6 @@ module TerminalShop
|
|
1180
1145
|
# should not be mutated.
|
1181
1146
|
#
|
1182
1147
|
# @return [Hash{Symbol=>Object}]
|
1183
|
-
#
|
1184
1148
|
def to_h = @data
|
1185
1149
|
|
1186
1150
|
alias_method :to_hash, :to_h
|
@@ -1188,7 +1152,6 @@ module TerminalShop
|
|
1188
1152
|
# @param keys [Array<Symbol>, nil]
|
1189
1153
|
#
|
1190
1154
|
# @return [Hash{Symbol=>Object}]
|
1191
|
-
#
|
1192
1155
|
def deconstruct_keys(keys)
|
1193
1156
|
(keys || self.class.known_fields.keys).filter_map do |k|
|
1194
1157
|
unless self.class.known_fields.key?(k)
|
@@ -1203,7 +1166,6 @@ module TerminalShop
|
|
1203
1166
|
# Create a new instance of a model.
|
1204
1167
|
#
|
1205
1168
|
# @param data [Hash{Symbol=>Object}, TerminalShop::BaseModel]
|
1206
|
-
#
|
1207
1169
|
def initialize(data = {})
|
1208
1170
|
case TerminalShop::Util.coerce_hash(data)
|
1209
1171
|
in Hash => coerced
|
@@ -1214,11 +1176,9 @@ module TerminalShop
|
|
1214
1176
|
end
|
1215
1177
|
|
1216
1178
|
# @return [String]
|
1217
|
-
#
|
1218
1179
|
def to_s = @data.to_s
|
1219
1180
|
|
1220
1181
|
# @return [String]
|
1221
|
-
#
|
1222
1182
|
def inspect
|
1223
1183
|
"#<#{self.class.name}:0x#{object_id.to_s(16)} #{deconstruct_keys(nil).map do |k, v|
|
1224
1184
|
"#{k}=#{v.inspect}"
|