terminal-shop 1.8.0 → 2.0.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 +14 -0
- data/lib/terminal-shop/base_client.rb +11 -10
- data/lib/terminal-shop/base_model.rb +257 -244
- data/lib/terminal-shop/base_page.rb +19 -20
- data/lib/terminal-shop/client.rb +1 -0
- data/lib/terminal-shop/models/product.rb +7 -3
- data/lib/terminal-shop/models/region.rb +7 -3
- data/lib/terminal-shop/models/subscription.rb +5 -7
- data/lib/terminal-shop/pooled_net_requester.rb +12 -1
- data/lib/terminal-shop/request_options.rb +1 -1
- data/lib/terminal-shop/util.rb +16 -7
- data/lib/terminal-shop/version.rb +1 -1
- data/lib/terminal-shop.rb +15 -0
- data/rbi/lib/terminal-shop/base_client.rbi +40 -41
- data/rbi/lib/terminal-shop/base_model.rbi +139 -116
- data/rbi/lib/terminal-shop/base_page.rbi +0 -2
- data/rbi/lib/terminal-shop/client.rbi +18 -30
- data/rbi/lib/terminal-shop/errors.rbi +7 -42
- data/rbi/lib/terminal-shop/models/address.rbi +15 -51
- data/rbi/lib/terminal-shop/models/address_create_params.rbi +15 -46
- data/rbi/lib/terminal-shop/models/address_create_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/address_delete_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/address_delete_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/address_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/address_get_response.rbi +7 -6
- data/rbi/lib/terminal-shop/models/address_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/address_list_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/app.rbi +4 -24
- data/rbi/lib/terminal-shop/models/app_create_params.rbi +3 -13
- data/rbi/lib/terminal-shop/models/app_create_response.rbi +8 -20
- data/rbi/lib/terminal-shop/models/app_delete_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/app_delete_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/app_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/app_get_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/app_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/app_list_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/card.rbi +14 -36
- data/rbi/lib/terminal-shop/models/card_collect_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/card_collect_response.rbi +7 -14
- data/rbi/lib/terminal-shop/models/card_create_params.rbi +2 -7
- data/rbi/lib/terminal-shop/models/card_create_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/card_delete_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/card_delete_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/card_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/card_get_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/card_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/card_list_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/cart.rbi +34 -88
- data/rbi/lib/terminal-shop/models/cart_clear_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/cart_clear_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/cart_convert_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/cart_convert_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/cart_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/cart_get_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/cart_set_address_params.rbi +2 -7
- data/rbi/lib/terminal-shop/models/cart_set_address_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/cart_set_card_params.rbi +2 -7
- data/rbi/lib/terminal-shop/models/cart_set_card_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/cart_set_item_params.rbi +3 -13
- data/rbi/lib/terminal-shop/models/cart_set_item_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/email_create_params.rbi +2 -7
- data/rbi/lib/terminal-shop/models/email_create_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/order.rbi +52 -139
- data/rbi/lib/terminal-shop/models/order_create_params.rbi +4 -19
- data/rbi/lib/terminal-shop/models/order_create_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/order_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/order_get_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/order_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/order_list_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/product.rbi +43 -77
- data/rbi/lib/terminal-shop/models/product_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/product_get_response.rbi +7 -6
- data/rbi/lib/terminal-shop/models/product_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/product_list_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/product_variant.rbi +3 -18
- data/rbi/lib/terminal-shop/models/profile.rbi +12 -36
- data/rbi/lib/terminal-shop/models/profile_me_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/profile_me_response.rbi +7 -6
- data/rbi/lib/terminal-shop/models/profile_update_params.rbi +3 -13
- data/rbi/lib/terminal-shop/models/profile_update_response.rbi +7 -6
- data/rbi/lib/terminal-shop/models/region.rbi +10 -5
- data/rbi/lib/terminal-shop/models/subscription.rbi +28 -75
- data/rbi/lib/terminal-shop/models/subscription_create_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/subscription_create_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/subscription_delete_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/subscription_delete_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/subscription_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/subscription_get_response.rbi +7 -6
- data/rbi/lib/terminal-shop/models/subscription_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/subscription_list_response.rbi +3 -8
- data/rbi/lib/terminal-shop/models/token.rbi +3 -18
- data/rbi/lib/terminal-shop/models/token_create_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/token_create_response.rbi +8 -20
- data/rbi/lib/terminal-shop/models/token_delete_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/token_delete_response.rbi +1 -6
- data/rbi/lib/terminal-shop/models/token_get_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/token_get_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/token_list_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/token_list_response.rbi +4 -6
- data/rbi/lib/terminal-shop/models/view_init_params.rbi +1 -1
- data/rbi/lib/terminal-shop/models/view_init_response.rbi +32 -81
- data/rbi/lib/terminal-shop/pooled_net_requester.rbi +14 -3
- data/rbi/lib/terminal-shop/request_options.rbi +11 -55
- data/rbi/lib/terminal-shop/resources/address.rbi +4 -4
- data/rbi/lib/terminal-shop/resources/app.rbi +4 -4
- data/rbi/lib/terminal-shop/resources/card.rbi +5 -5
- data/rbi/lib/terminal-shop/resources/cart.rbi +6 -6
- data/rbi/lib/terminal-shop/resources/email.rbi +1 -1
- data/rbi/lib/terminal-shop/resources/order.rbi +3 -3
- data/rbi/lib/terminal-shop/resources/product.rbi +2 -2
- data/rbi/lib/terminal-shop/resources/profile.rbi +2 -2
- data/rbi/lib/terminal-shop/resources/subscription.rbi +5 -4
- data/rbi/lib/terminal-shop/resources/token.rbi +4 -4
- data/rbi/lib/terminal-shop/resources/view.rbi +1 -1
- data/rbi/lib/terminal-shop/util.rbi +24 -13
- data/rbi/lib/terminal-shop/version.rbi +1 -1
- data/sig/terminal-shop/base_client.rbs +14 -14
- data/sig/terminal-shop/base_model.rbs +34 -18
- data/sig/terminal-shop/client.rbs +8 -8
- data/sig/terminal-shop/errors.rbs +17 -17
- data/sig/terminal-shop/models/address.rbs +11 -15
- data/sig/terminal-shop/models/address_create_params.rbs +11 -16
- data/sig/terminal-shop/models/address_create_response.rbs +1 -6
- data/sig/terminal-shop/models/address_delete_params.rbs +1 -6
- data/sig/terminal-shop/models/address_delete_response.rbs +1 -6
- data/sig/terminal-shop/models/address_get_params.rbs +1 -6
- data/sig/terminal-shop/models/address_get_response.rbs +1 -6
- data/sig/terminal-shop/models/address_list_params.rbs +1 -6
- data/sig/terminal-shop/models/address_list_response.rbs +1 -6
- data/sig/terminal-shop/models/app.rbs +6 -5
- data/sig/terminal-shop/models/app_create_params.rbs +5 -10
- data/sig/terminal-shop/models/app_create_response.rbs +4 -12
- data/sig/terminal-shop/models/app_delete_params.rbs +1 -6
- data/sig/terminal-shop/models/app_delete_response.rbs +1 -6
- data/sig/terminal-shop/models/app_get_params.rbs +1 -5
- data/sig/terminal-shop/models/app_get_response.rbs +1 -5
- data/sig/terminal-shop/models/app_list_params.rbs +1 -5
- data/sig/terminal-shop/models/app_list_response.rbs +1 -6
- data/sig/terminal-shop/models/card.rbs +7 -16
- data/sig/terminal-shop/models/card_collect_params.rbs +1 -6
- data/sig/terminal-shop/models/card_collect_response.rbs +4 -12
- data/sig/terminal-shop/models/card_create_params.rbs +4 -6
- data/sig/terminal-shop/models/card_create_response.rbs +1 -6
- data/sig/terminal-shop/models/card_delete_params.rbs +1 -6
- data/sig/terminal-shop/models/card_delete_response.rbs +1 -6
- data/sig/terminal-shop/models/card_get_params.rbs +1 -5
- data/sig/terminal-shop/models/card_get_response.rbs +1 -6
- data/sig/terminal-shop/models/card_list_params.rbs +1 -5
- data/sig/terminal-shop/models/card_list_response.rbs +1 -6
- data/sig/terminal-shop/models/cart.rbs +20 -34
- data/sig/terminal-shop/models/cart_clear_params.rbs +1 -6
- data/sig/terminal-shop/models/cart_clear_response.rbs +1 -6
- data/sig/terminal-shop/models/cart_convert_params.rbs +1 -6
- data/sig/terminal-shop/models/cart_convert_response.rbs +1 -6
- data/sig/terminal-shop/models/cart_get_params.rbs +1 -5
- data/sig/terminal-shop/models/cart_get_response.rbs +1 -6
- data/sig/terminal-shop/models/cart_set_address_params.rbs +4 -9
- data/sig/terminal-shop/models/cart_set_address_response.rbs +1 -6
- data/sig/terminal-shop/models/cart_set_card_params.rbs +4 -6
- data/sig/terminal-shop/models/cart_set_card_response.rbs +1 -6
- data/sig/terminal-shop/models/cart_set_item_params.rbs +5 -10
- data/sig/terminal-shop/models/cart_set_item_response.rbs +1 -6
- data/sig/terminal-shop/models/email_create_params.rbs +4 -6
- data/sig/terminal-shop/models/email_create_response.rbs +1 -6
- data/sig/terminal-shop/models/order.rbs +31 -50
- data/sig/terminal-shop/models/order_create_params.rbs +6 -11
- data/sig/terminal-shop/models/order_create_response.rbs +1 -6
- data/sig/terminal-shop/models/order_get_params.rbs +1 -5
- data/sig/terminal-shop/models/order_get_response.rbs +1 -6
- data/sig/terminal-shop/models/order_list_params.rbs +1 -6
- data/sig/terminal-shop/models/order_list_response.rbs +1 -6
- data/sig/terminal-shop/models/product.rbs +20 -27
- data/sig/terminal-shop/models/product_get_params.rbs +1 -6
- data/sig/terminal-shop/models/product_get_response.rbs +1 -6
- data/sig/terminal-shop/models/product_list_params.rbs +1 -6
- data/sig/terminal-shop/models/product_list_response.rbs +1 -6
- data/sig/terminal-shop/models/product_variant.rbs +1 -5
- data/sig/terminal-shop/models/profile.rbs +8 -17
- data/sig/terminal-shop/models/profile_me_params.rbs +1 -6
- data/sig/terminal-shop/models/profile_me_response.rbs +1 -6
- data/sig/terminal-shop/models/profile_update_params.rbs +5 -10
- data/sig/terminal-shop/models/profile_update_response.rbs +1 -6
- data/sig/terminal-shop/models/region.rbs +4 -2
- data/sig/terminal-shop/models/subscription.rbs +15 -27
- data/sig/terminal-shop/models/subscription_create_params.rbs +1 -6
- data/sig/terminal-shop/models/subscription_create_response.rbs +1 -6
- data/sig/terminal-shop/models/subscription_delete_params.rbs +1 -6
- data/sig/terminal-shop/models/subscription_delete_response.rbs +1 -6
- data/sig/terminal-shop/models/subscription_get_params.rbs +1 -6
- data/sig/terminal-shop/models/subscription_get_response.rbs +1 -6
- data/sig/terminal-shop/models/subscription_list_params.rbs +1 -6
- data/sig/terminal-shop/models/subscription_list_response.rbs +3 -6
- data/sig/terminal-shop/models/token.rbs +1 -5
- data/sig/terminal-shop/models/token_create_params.rbs +1 -6
- data/sig/terminal-shop/models/token_create_response.rbs +4 -12
- data/sig/terminal-shop/models/token_delete_params.rbs +1 -6
- data/sig/terminal-shop/models/token_delete_response.rbs +1 -6
- data/sig/terminal-shop/models/token_get_params.rbs +1 -5
- data/sig/terminal-shop/models/token_get_response.rbs +1 -6
- data/sig/terminal-shop/models/token_list_params.rbs +1 -6
- data/sig/terminal-shop/models/token_list_response.rbs +1 -6
- data/sig/terminal-shop/models/view_init_params.rbs +1 -5
- data/sig/terminal-shop/models/view_init_response.rbs +15 -23
- data/sig/terminal-shop/pooled_net_requester.rbs +3 -1
- data/sig/terminal-shop/request_options.rbs +2 -2
- data/sig/terminal-shop/resources/address.rbs +22 -41
- data/sig/terminal-shop/resources/app.rbs +16 -34
- data/sig/terminal-shop/resources/card.rbs +18 -40
- data/sig/terminal-shop/resources/cart.rbs +22 -47
- data/sig/terminal-shop/resources/email.rbs +4 -8
- data/sig/terminal-shop/resources/order.rbs +13 -26
- data/sig/terminal-shop/resources/product.rbs +7 -16
- data/sig/terminal-shop/resources/profile.rbs +8 -16
- data/sig/terminal-shop/resources/subscription.rbs +21 -43
- data/sig/terminal-shop/resources/token.rbs +14 -32
- data/sig/terminal-shop/resources/view.rbs +3 -7
- data/sig/terminal-shop/util.rbs +5 -5
- data/sig/terminal-shop/version.rbs +1 -1
- metadata +2 -2
@@ -48,7 +48,7 @@ module TerminalShop
|
|
48
48
|
type_info(spec.slice(:const, :enum, :union).first&.last)
|
49
49
|
in Proc
|
50
50
|
spec
|
51
|
-
in TerminalShop::Converter |
|
51
|
+
in TerminalShop::Converter | Module | Symbol
|
52
52
|
-> { spec }
|
53
53
|
in true | false
|
54
54
|
-> { TerminalShop::BooleanModel }
|
@@ -81,7 +81,7 @@ module TerminalShop
|
|
81
81
|
else
|
82
82
|
value
|
83
83
|
end
|
84
|
-
in
|
84
|
+
in Module
|
85
85
|
case target
|
86
86
|
in -> { _1 <= NilClass }
|
87
87
|
nil
|
@@ -144,7 +144,7 @@ module TerminalShop
|
|
144
144
|
else
|
145
145
|
[false, false, 0]
|
146
146
|
end
|
147
|
-
in
|
147
|
+
in Module
|
148
148
|
case [target, value]
|
149
149
|
in [-> { _1 <= NilClass }, _]
|
150
150
|
[true, nil, value.nil? ? 1 : 0]
|
@@ -182,8 +182,6 @@ module TerminalShop
|
|
182
182
|
|
183
183
|
# rubocop:disable Lint/UnusedMethodArgument
|
184
184
|
|
185
|
-
private_class_method :new
|
186
|
-
|
187
185
|
# @param other [Object]
|
188
186
|
#
|
189
187
|
# @return [Boolean]
|
@@ -233,8 +231,6 @@ module TerminalShop
|
|
233
231
|
class BooleanModel
|
234
232
|
extend TerminalShop::Converter
|
235
233
|
|
236
|
-
private_class_method :new
|
237
|
-
|
238
234
|
# @param other [Object]
|
239
235
|
#
|
240
236
|
# @return [Boolean]
|
@@ -280,8 +276,6 @@ module TerminalShop
|
|
280
276
|
|
281
277
|
# @api private
|
282
278
|
#
|
283
|
-
# @abstract
|
284
|
-
#
|
285
279
|
# A value from among a specified list of options. OpenAPI enum values map to Ruby
|
286
280
|
# values in the SDK as follows:
|
287
281
|
#
|
@@ -294,202 +288,186 @@ module TerminalShop
|
|
294
288
|
# values safely.
|
295
289
|
#
|
296
290
|
# @example
|
297
|
-
#
|
298
|
-
#
|
299
|
-
#
|
300
|
-
#
|
301
|
-
#
|
302
|
-
#
|
303
|
-
#
|
304
|
-
#
|
305
|
-
#
|
306
|
-
# end
|
307
|
-
# ```
|
291
|
+
# # `region` is a `TerminalShop::Models::Region`
|
292
|
+
# case region
|
293
|
+
# when TerminalShop::Models::Region::EU
|
294
|
+
# # ...
|
295
|
+
# when TerminalShop::Models::Region::NA
|
296
|
+
# # ...
|
297
|
+
# else
|
298
|
+
# puts(region)
|
299
|
+
# end
|
308
300
|
#
|
309
301
|
# @example
|
310
|
-
#
|
311
|
-
#
|
312
|
-
#
|
313
|
-
#
|
314
|
-
#
|
315
|
-
#
|
316
|
-
#
|
317
|
-
#
|
318
|
-
|
319
|
-
|
320
|
-
class Enum
|
321
|
-
extend TerminalShop::Converter
|
322
|
-
|
323
|
-
class << self
|
324
|
-
# All of the valid Symbol values for this enum.
|
325
|
-
#
|
326
|
-
# @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
|
327
|
-
def values = (@values ||= constants.map { const_get(_1) })
|
302
|
+
# case region
|
303
|
+
# in :eu
|
304
|
+
# # ...
|
305
|
+
# in :na
|
306
|
+
# # ...
|
307
|
+
# else
|
308
|
+
# puts(region)
|
309
|
+
# end
|
310
|
+
module Enum
|
311
|
+
include TerminalShop::Converter
|
328
312
|
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
end
|
313
|
+
# All of the valid Symbol values for this enum.
|
314
|
+
#
|
315
|
+
# @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
|
316
|
+
def values = (@values ||= constants.map { const_get(_1) })
|
334
317
|
|
335
|
-
|
318
|
+
# @api private
|
319
|
+
#
|
320
|
+
# Guard against thread safety issues by instantiating `@values`.
|
321
|
+
private def finalize! = values
|
336
322
|
|
337
323
|
# @param other [Object]
|
338
324
|
#
|
339
325
|
# @return [Boolean]
|
340
|
-
def
|
326
|
+
def ===(other) = values.include?(other)
|
341
327
|
|
342
328
|
# @param other [Object]
|
343
329
|
#
|
344
330
|
# @return [Boolean]
|
345
|
-
def
|
346
|
-
other.is_a?(
|
331
|
+
def ==(other)
|
332
|
+
other.is_a?(Module) && other.singleton_class.ancestors.include?(TerminalShop::Enum) && other.values.to_set == values.to_set
|
347
333
|
end
|
348
334
|
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
value
|
361
|
-
end
|
335
|
+
# @api private
|
336
|
+
#
|
337
|
+
# @param value [String, Symbol, Object]
|
338
|
+
#
|
339
|
+
# @return [Symbol, Object]
|
340
|
+
def coerce(value)
|
341
|
+
case value
|
342
|
+
in Symbol | String if values.include?(val = value.to_sym)
|
343
|
+
val
|
344
|
+
else
|
345
|
+
value
|
362
346
|
end
|
347
|
+
end
|
363
348
|
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
349
|
+
# @!parse
|
350
|
+
# # @api private
|
351
|
+
# #
|
352
|
+
# # @param value [Symbol, Object]
|
353
|
+
# #
|
354
|
+
# # @return [Symbol, Object]
|
355
|
+
# def dump(value) = super
|
371
356
|
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
357
|
+
# @api private
|
358
|
+
#
|
359
|
+
# @param value [Object]
|
360
|
+
#
|
361
|
+
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
362
|
+
def try_strict_coerce(value)
|
363
|
+
return [true, value, 1] if values.include?(value)
|
379
364
|
|
380
|
-
|
381
|
-
|
382
|
-
|
365
|
+
case value
|
366
|
+
in Symbol | String if values.include?(val = value.to_sym)
|
367
|
+
[true, val, 1]
|
368
|
+
else
|
369
|
+
case [value, values.first]
|
370
|
+
in [true | false, true | false] | [Integer, Integer] | [Symbol | String, Symbol]
|
371
|
+
[false, true, 0]
|
383
372
|
else
|
384
|
-
|
385
|
-
in [true | false, true | false] | [Integer, Integer] | [Symbol | String, Symbol]
|
386
|
-
[false, true, 0]
|
387
|
-
else
|
388
|
-
[false, false, 0]
|
389
|
-
end
|
373
|
+
[false, false, 0]
|
390
374
|
end
|
391
375
|
end
|
392
376
|
end
|
393
377
|
end
|
394
378
|
|
395
379
|
# @api private
|
396
|
-
|
397
|
-
|
398
|
-
class Union
|
399
|
-
extend TerminalShop::Converter
|
380
|
+
module Union
|
381
|
+
include TerminalShop::Converter
|
400
382
|
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
private def known_variants = (@known_variants ||= [])
|
383
|
+
# @api private
|
384
|
+
#
|
385
|
+
# All of the specified variant info for this union.
|
386
|
+
#
|
387
|
+
# @return [Array<Array(Symbol, Proc)>]
|
388
|
+
private def known_variants = (@known_variants ||= [])
|
408
389
|
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
390
|
+
# @api private
|
391
|
+
#
|
392
|
+
# @return [Array<Array(Symbol, Object)>]
|
393
|
+
protected def derefed_variants
|
394
|
+
@known_variants.map { |key, variant_fn| [key, variant_fn.call] }
|
395
|
+
end
|
415
396
|
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
397
|
+
# All of the specified variants for this union.
|
398
|
+
#
|
399
|
+
# @return [Array<Object>]
|
400
|
+
def variants
|
401
|
+
derefed_variants.map(&:last)
|
402
|
+
end
|
403
|
+
|
404
|
+
# @api private
|
405
|
+
#
|
406
|
+
# @param property [Symbol]
|
407
|
+
private def discriminator(property)
|
408
|
+
case property
|
409
|
+
in Symbol
|
410
|
+
@discriminator = property
|
421
411
|
end
|
412
|
+
end
|
422
413
|
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
414
|
+
# @api private
|
415
|
+
#
|
416
|
+
# @param key [Symbol, Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
417
|
+
#
|
418
|
+
# @param spec [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class] .
|
419
|
+
#
|
420
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
421
|
+
#
|
422
|
+
# @option spec [Proc] :enum
|
423
|
+
#
|
424
|
+
# @option spec [Proc] :union
|
425
|
+
#
|
426
|
+
# @option spec [Boolean] :"nil?"
|
427
|
+
private def variant(key, spec = nil)
|
428
|
+
variant_info =
|
429
|
+
case key
|
428
430
|
in Symbol
|
429
|
-
|
431
|
+
[key, TerminalShop::Converter.type_info(spec)]
|
432
|
+
in Proc | TerminalShop::Converter | Module | Hash
|
433
|
+
[nil, TerminalShop::Converter.type_info(key)]
|
430
434
|
end
|
431
|
-
end
|
432
|
-
|
433
|
-
# @api private
|
434
|
-
#
|
435
|
-
# @param key [Symbol, Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
436
|
-
#
|
437
|
-
# @param spec [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class] .
|
438
|
-
#
|
439
|
-
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
440
|
-
#
|
441
|
-
# @option spec [Proc] :enum
|
442
|
-
#
|
443
|
-
# @option spec [Proc] :union
|
444
|
-
#
|
445
|
-
# @option spec [Boolean] :"nil?"
|
446
|
-
private def variant(key, spec = nil)
|
447
|
-
variant_info =
|
448
|
-
case key
|
449
|
-
in Symbol
|
450
|
-
[key, TerminalShop::Converter.type_info(spec)]
|
451
|
-
in Proc | TerminalShop::Converter | Class | Hash
|
452
|
-
[nil, TerminalShop::Converter.type_info(key)]
|
453
|
-
end
|
454
435
|
|
455
|
-
|
456
|
-
|
436
|
+
known_variants << variant_info
|
437
|
+
end
|
457
438
|
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
439
|
+
# @api private
|
440
|
+
#
|
441
|
+
# @param value [Object]
|
442
|
+
#
|
443
|
+
# @return [TerminalShop::Converter, Class, nil]
|
444
|
+
private def resolve_variant(value)
|
445
|
+
case [@discriminator, value]
|
446
|
+
in [_, TerminalShop::BaseModel]
|
447
|
+
value.class
|
448
|
+
in [Symbol, Hash]
|
449
|
+
key =
|
450
|
+
if value.key?(@discriminator)
|
451
|
+
value.fetch(@discriminator)
|
452
|
+
elsif value.key?((discriminator = @discriminator.to_s))
|
453
|
+
value.fetch(discriminator)
|
454
|
+
end
|
474
455
|
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
end
|
456
|
+
key = key.to_sym if key.is_a?(String)
|
457
|
+
_, resolved = known_variants.find { |k,| k == key }
|
458
|
+
resolved.nil? ? TerminalShop::Unknown : resolved.call
|
459
|
+
else
|
460
|
+
nil
|
481
461
|
end
|
482
462
|
end
|
483
463
|
|
484
464
|
# rubocop:disable Style/HashEachMethods
|
485
465
|
# rubocop:disable Style/CaseEquality
|
486
466
|
|
487
|
-
private_class_method :new
|
488
|
-
|
489
467
|
# @param other [Object]
|
490
468
|
#
|
491
469
|
# @return [Boolean]
|
492
|
-
def
|
470
|
+
def ===(other)
|
493
471
|
known_variants.any? do |_, variant_fn|
|
494
472
|
variant_fn.call === other
|
495
473
|
end
|
@@ -498,90 +476,88 @@ module TerminalShop
|
|
498
476
|
# @param other [Object]
|
499
477
|
#
|
500
478
|
# @return [Boolean]
|
501
|
-
def
|
502
|
-
other.is_a?(
|
479
|
+
def ==(other)
|
480
|
+
other.is_a?(Module) && other.singleton_class.ancestors.include?(TerminalShop::Union) && other.derefed_variants == derefed_variants
|
503
481
|
end
|
504
482
|
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
end
|
483
|
+
# @api private
|
484
|
+
#
|
485
|
+
# @param value [Object]
|
486
|
+
#
|
487
|
+
# @return [Object]
|
488
|
+
def coerce(value)
|
489
|
+
if (variant = resolve_variant(value))
|
490
|
+
return TerminalShop::Converter.coerce(variant, value)
|
491
|
+
end
|
515
492
|
|
516
|
-
|
493
|
+
matches = []
|
517
494
|
|
518
|
-
|
519
|
-
|
495
|
+
known_variants.each do |_, variant_fn|
|
496
|
+
variant = variant_fn.call
|
520
497
|
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
end
|
498
|
+
case TerminalShop::Converter.try_strict_coerce(variant, value)
|
499
|
+
in [true, coerced, _]
|
500
|
+
return coerced
|
501
|
+
in [false, true, score]
|
502
|
+
matches << [score, variant]
|
503
|
+
in [false, false, _]
|
504
|
+
nil
|
529
505
|
end
|
506
|
+
end
|
530
507
|
|
531
|
-
|
532
|
-
|
508
|
+
_, variant = matches.sort! { _2.first <=> _1.first }.find { |score,| !score.zero? }
|
509
|
+
variant.nil? ? value : TerminalShop::Converter.coerce(variant, value)
|
510
|
+
end
|
511
|
+
|
512
|
+
# @api private
|
513
|
+
#
|
514
|
+
# @param value [Object]
|
515
|
+
#
|
516
|
+
# @return [Object]
|
517
|
+
def dump(value)
|
518
|
+
if (variant = resolve_variant(value))
|
519
|
+
return TerminalShop::Converter.dump(variant, value)
|
533
520
|
end
|
534
521
|
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
#
|
539
|
-
# @return [Object]
|
540
|
-
def dump(value)
|
541
|
-
if (variant = resolve_variant(value))
|
522
|
+
known_variants.each do |_, variant_fn|
|
523
|
+
variant = variant_fn.call
|
524
|
+
if variant === value
|
542
525
|
return TerminalShop::Converter.dump(variant, value)
|
543
526
|
end
|
544
|
-
|
545
|
-
known_variants.each do |_, variant_fn|
|
546
|
-
variant = variant_fn.call
|
547
|
-
if variant === value
|
548
|
-
return TerminalShop::Converter.dump(variant, value)
|
549
|
-
end
|
550
|
-
end
|
551
|
-
value
|
552
527
|
end
|
528
|
+
value
|
529
|
+
end
|
553
530
|
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
531
|
+
# @api private
|
532
|
+
#
|
533
|
+
# @param value [Object]
|
534
|
+
#
|
535
|
+
# @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
|
536
|
+
def try_strict_coerce(value)
|
537
|
+
# TODO(ruby) this will result in super linear decoding behaviour for nested unions
|
538
|
+
# follow up with a decoding context that captures current strictness levels
|
539
|
+
if (variant = resolve_variant(value))
|
540
|
+
return Converter.try_strict_coerce(variant, value)
|
541
|
+
end
|
565
542
|
|
566
|
-
|
567
|
-
|
543
|
+
coercible = false
|
544
|
+
max_score = 0
|
568
545
|
|
569
|
-
|
570
|
-
|
546
|
+
known_variants.each do |_, variant_fn|
|
547
|
+
variant = variant_fn.call
|
571
548
|
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
end
|
549
|
+
case TerminalShop::Converter.try_strict_coerce(variant, value)
|
550
|
+
in [true, coerced, score]
|
551
|
+
return [true, coerced, score]
|
552
|
+
in [false, true, score]
|
553
|
+
coercible = true
|
554
|
+
max_score = [max_score, score].max
|
555
|
+
in [false, false, _]
|
556
|
+
nil
|
581
557
|
end
|
582
|
-
|
583
|
-
[false, coercible, max_score]
|
584
558
|
end
|
559
|
+
|
560
|
+
[false, coercible, max_score]
|
585
561
|
end
|
586
562
|
|
587
563
|
# rubocop:enable Style/CaseEquality
|
@@ -596,9 +572,18 @@ module TerminalShop
|
|
596
572
|
class ArrayOf
|
597
573
|
include TerminalShop::Converter
|
598
574
|
|
599
|
-
|
600
|
-
|
601
|
-
|
575
|
+
# @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
576
|
+
#
|
577
|
+
# @param spec [Hash{Symbol=>Object}] .
|
578
|
+
#
|
579
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
580
|
+
#
|
581
|
+
# @option spec [Proc] :enum
|
582
|
+
#
|
583
|
+
# @option spec [Proc] :union
|
584
|
+
#
|
585
|
+
# @option spec [Boolean] :"nil?"
|
586
|
+
def self.[](type_info, spec = {}) = new(type_info, spec)
|
602
587
|
|
603
588
|
# @param other [Object]
|
604
589
|
#
|
@@ -719,9 +704,18 @@ module TerminalShop
|
|
719
704
|
class HashOf
|
720
705
|
include TerminalShop::Converter
|
721
706
|
|
722
|
-
|
723
|
-
|
724
|
-
|
707
|
+
# @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
|
708
|
+
#
|
709
|
+
# @param spec [Hash{Symbol=>Object}] .
|
710
|
+
#
|
711
|
+
# @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
|
712
|
+
#
|
713
|
+
# @option spec [Proc] :enum
|
714
|
+
#
|
715
|
+
# @option spec [Proc] :union
|
716
|
+
#
|
717
|
+
# @option spec [Boolean] :"nil?"
|
718
|
+
def self.[](type_info, spec = {}) = new(type_info, spec)
|
725
719
|
|
726
720
|
# @param other [Object]
|
727
721
|
#
|
@@ -847,14 +841,12 @@ module TerminalShop
|
|
847
841
|
# @abstract
|
848
842
|
#
|
849
843
|
# @example
|
850
|
-
#
|
851
|
-
#
|
852
|
-
#
|
853
|
-
#
|
854
|
-
#
|
855
|
-
#
|
856
|
-
# }
|
857
|
-
# ```
|
844
|
+
# # `product_api` is a `TerminalShop::Models::ProductAPI`
|
845
|
+
# product_api => {
|
846
|
+
# id: id,
|
847
|
+
# description: description,
|
848
|
+
# name: name
|
849
|
+
# }
|
858
850
|
class BaseModel
|
859
851
|
extend TerminalShop::Converter
|
860
852
|
|
@@ -869,6 +861,13 @@ module TerminalShop
|
|
869
861
|
@known_fields ||= (self < TerminalShop::BaseModel ? superclass.known_fields.dup : {})
|
870
862
|
end
|
871
863
|
|
864
|
+
# @api private
|
865
|
+
#
|
866
|
+
# @return [Hash{Symbol=>Symbol}]
|
867
|
+
def reverse_map
|
868
|
+
@reverse_map ||= (self < TerminalShop::BaseModel ? superclass.reverse_map.dup : {})
|
869
|
+
end
|
870
|
+
|
872
871
|
# @api private
|
873
872
|
#
|
874
873
|
# @return [Hash{Symbol=>Hash{Symbol=>Object}}]
|
@@ -903,7 +902,7 @@ module TerminalShop
|
|
903
902
|
private def add_field(name_sym, required:, type_info:, spec:)
|
904
903
|
type_fn, info =
|
905
904
|
case type_info
|
906
|
-
in Proc |
|
905
|
+
in Proc | Module | TerminalShop::Converter
|
907
906
|
[TerminalShop::Converter.type_info({**spec, union: type_info}), spec]
|
908
907
|
in Hash
|
909
908
|
[TerminalShop::Converter.type_info(type_info), type_info]
|
@@ -912,7 +911,7 @@ module TerminalShop
|
|
912
911
|
fallback = info[:const]
|
913
912
|
defaults[name_sym] = fallback if required && !info[:nil?] && info.key?(:const)
|
914
913
|
|
915
|
-
key = info
|
914
|
+
key = info[:api_name]&.tap { reverse_map[_1] = name_sym } || name_sym
|
916
915
|
setter = "#{name_sym}="
|
917
916
|
|
918
917
|
if known_fields.key?(name_sym)
|
@@ -1169,7 +1168,21 @@ module TerminalShop
|
|
1169
1168
|
def initialize(data = {})
|
1170
1169
|
case TerminalShop::Util.coerce_hash(data)
|
1171
1170
|
in Hash => coerced
|
1172
|
-
@data = coerced.
|
1171
|
+
@data = coerced.to_h do |key, value|
|
1172
|
+
name = key.to_sym
|
1173
|
+
mapped = self.class.reverse_map.fetch(name, name)
|
1174
|
+
type = self.class.fields[mapped]&.fetch(:type)
|
1175
|
+
stored =
|
1176
|
+
case [type, value]
|
1177
|
+
in [Module, Hash] if type <= TerminalShop::BaseModel
|
1178
|
+
type.new(value)
|
1179
|
+
in [TerminalShop::ArrayOf, Array] | [TerminalShop::HashOf, Hash]
|
1180
|
+
type.coerce(value)
|
1181
|
+
else
|
1182
|
+
value
|
1183
|
+
end
|
1184
|
+
[name, stored]
|
1185
|
+
end
|
1173
1186
|
else
|
1174
1187
|
raise ArgumentError.new("Expected a #{Hash} or #{TerminalShop::BaseModel}, got #{data.inspect}")
|
1175
1188
|
end
|