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.
Files changed (220) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -0
  3. data/lib/terminal-shop/base_client.rb +11 -10
  4. data/lib/terminal-shop/base_model.rb +257 -244
  5. data/lib/terminal-shop/base_page.rb +19 -20
  6. data/lib/terminal-shop/client.rb +1 -0
  7. data/lib/terminal-shop/models/product.rb +7 -3
  8. data/lib/terminal-shop/models/region.rb +7 -3
  9. data/lib/terminal-shop/models/subscription.rb +5 -7
  10. data/lib/terminal-shop/pooled_net_requester.rb +12 -1
  11. data/lib/terminal-shop/request_options.rb +1 -1
  12. data/lib/terminal-shop/util.rb +16 -7
  13. data/lib/terminal-shop/version.rb +1 -1
  14. data/lib/terminal-shop.rb +15 -0
  15. data/rbi/lib/terminal-shop/base_client.rbi +40 -41
  16. data/rbi/lib/terminal-shop/base_model.rbi +139 -116
  17. data/rbi/lib/terminal-shop/base_page.rbi +0 -2
  18. data/rbi/lib/terminal-shop/client.rbi +18 -30
  19. data/rbi/lib/terminal-shop/errors.rbi +7 -42
  20. data/rbi/lib/terminal-shop/models/address.rbi +15 -51
  21. data/rbi/lib/terminal-shop/models/address_create_params.rbi +15 -46
  22. data/rbi/lib/terminal-shop/models/address_create_response.rbi +1 -6
  23. data/rbi/lib/terminal-shop/models/address_delete_params.rbi +1 -1
  24. data/rbi/lib/terminal-shop/models/address_delete_response.rbi +1 -6
  25. data/rbi/lib/terminal-shop/models/address_get_params.rbi +1 -1
  26. data/rbi/lib/terminal-shop/models/address_get_response.rbi +7 -6
  27. data/rbi/lib/terminal-shop/models/address_list_params.rbi +1 -1
  28. data/rbi/lib/terminal-shop/models/address_list_response.rbi +4 -6
  29. data/rbi/lib/terminal-shop/models/app.rbi +4 -24
  30. data/rbi/lib/terminal-shop/models/app_create_params.rbi +3 -13
  31. data/rbi/lib/terminal-shop/models/app_create_response.rbi +8 -20
  32. data/rbi/lib/terminal-shop/models/app_delete_params.rbi +1 -1
  33. data/rbi/lib/terminal-shop/models/app_delete_response.rbi +1 -6
  34. data/rbi/lib/terminal-shop/models/app_get_params.rbi +1 -1
  35. data/rbi/lib/terminal-shop/models/app_get_response.rbi +4 -6
  36. data/rbi/lib/terminal-shop/models/app_list_params.rbi +1 -1
  37. data/rbi/lib/terminal-shop/models/app_list_response.rbi +4 -6
  38. data/rbi/lib/terminal-shop/models/card.rbi +14 -36
  39. data/rbi/lib/terminal-shop/models/card_collect_params.rbi +1 -1
  40. data/rbi/lib/terminal-shop/models/card_collect_response.rbi +7 -14
  41. data/rbi/lib/terminal-shop/models/card_create_params.rbi +2 -7
  42. data/rbi/lib/terminal-shop/models/card_create_response.rbi +1 -6
  43. data/rbi/lib/terminal-shop/models/card_delete_params.rbi +1 -1
  44. data/rbi/lib/terminal-shop/models/card_delete_response.rbi +1 -6
  45. data/rbi/lib/terminal-shop/models/card_get_params.rbi +1 -1
  46. data/rbi/lib/terminal-shop/models/card_get_response.rbi +4 -6
  47. data/rbi/lib/terminal-shop/models/card_list_params.rbi +1 -1
  48. data/rbi/lib/terminal-shop/models/card_list_response.rbi +4 -6
  49. data/rbi/lib/terminal-shop/models/cart.rbi +34 -88
  50. data/rbi/lib/terminal-shop/models/cart_clear_params.rbi +1 -1
  51. data/rbi/lib/terminal-shop/models/cart_clear_response.rbi +1 -6
  52. data/rbi/lib/terminal-shop/models/cart_convert_params.rbi +1 -1
  53. data/rbi/lib/terminal-shop/models/cart_convert_response.rbi +4 -6
  54. data/rbi/lib/terminal-shop/models/cart_get_params.rbi +1 -1
  55. data/rbi/lib/terminal-shop/models/cart_get_response.rbi +4 -6
  56. data/rbi/lib/terminal-shop/models/cart_set_address_params.rbi +2 -7
  57. data/rbi/lib/terminal-shop/models/cart_set_address_response.rbi +1 -6
  58. data/rbi/lib/terminal-shop/models/cart_set_card_params.rbi +2 -7
  59. data/rbi/lib/terminal-shop/models/cart_set_card_response.rbi +1 -6
  60. data/rbi/lib/terminal-shop/models/cart_set_item_params.rbi +3 -13
  61. data/rbi/lib/terminal-shop/models/cart_set_item_response.rbi +4 -6
  62. data/rbi/lib/terminal-shop/models/email_create_params.rbi +2 -7
  63. data/rbi/lib/terminal-shop/models/email_create_response.rbi +1 -6
  64. data/rbi/lib/terminal-shop/models/order.rbi +52 -139
  65. data/rbi/lib/terminal-shop/models/order_create_params.rbi +4 -19
  66. data/rbi/lib/terminal-shop/models/order_create_response.rbi +1 -6
  67. data/rbi/lib/terminal-shop/models/order_get_params.rbi +1 -1
  68. data/rbi/lib/terminal-shop/models/order_get_response.rbi +4 -6
  69. data/rbi/lib/terminal-shop/models/order_list_params.rbi +1 -1
  70. data/rbi/lib/terminal-shop/models/order_list_response.rbi +4 -6
  71. data/rbi/lib/terminal-shop/models/product.rbi +43 -77
  72. data/rbi/lib/terminal-shop/models/product_get_params.rbi +1 -1
  73. data/rbi/lib/terminal-shop/models/product_get_response.rbi +7 -6
  74. data/rbi/lib/terminal-shop/models/product_list_params.rbi +1 -1
  75. data/rbi/lib/terminal-shop/models/product_list_response.rbi +4 -6
  76. data/rbi/lib/terminal-shop/models/product_variant.rbi +3 -18
  77. data/rbi/lib/terminal-shop/models/profile.rbi +12 -36
  78. data/rbi/lib/terminal-shop/models/profile_me_params.rbi +1 -1
  79. data/rbi/lib/terminal-shop/models/profile_me_response.rbi +7 -6
  80. data/rbi/lib/terminal-shop/models/profile_update_params.rbi +3 -13
  81. data/rbi/lib/terminal-shop/models/profile_update_response.rbi +7 -6
  82. data/rbi/lib/terminal-shop/models/region.rbi +10 -5
  83. data/rbi/lib/terminal-shop/models/subscription.rbi +28 -75
  84. data/rbi/lib/terminal-shop/models/subscription_create_params.rbi +1 -1
  85. data/rbi/lib/terminal-shop/models/subscription_create_response.rbi +1 -6
  86. data/rbi/lib/terminal-shop/models/subscription_delete_params.rbi +1 -1
  87. data/rbi/lib/terminal-shop/models/subscription_delete_response.rbi +1 -6
  88. data/rbi/lib/terminal-shop/models/subscription_get_params.rbi +1 -1
  89. data/rbi/lib/terminal-shop/models/subscription_get_response.rbi +7 -6
  90. data/rbi/lib/terminal-shop/models/subscription_list_params.rbi +1 -1
  91. data/rbi/lib/terminal-shop/models/subscription_list_response.rbi +3 -8
  92. data/rbi/lib/terminal-shop/models/token.rbi +3 -18
  93. data/rbi/lib/terminal-shop/models/token_create_params.rbi +1 -1
  94. data/rbi/lib/terminal-shop/models/token_create_response.rbi +8 -20
  95. data/rbi/lib/terminal-shop/models/token_delete_params.rbi +1 -1
  96. data/rbi/lib/terminal-shop/models/token_delete_response.rbi +1 -6
  97. data/rbi/lib/terminal-shop/models/token_get_params.rbi +1 -1
  98. data/rbi/lib/terminal-shop/models/token_get_response.rbi +4 -6
  99. data/rbi/lib/terminal-shop/models/token_list_params.rbi +1 -1
  100. data/rbi/lib/terminal-shop/models/token_list_response.rbi +4 -6
  101. data/rbi/lib/terminal-shop/models/view_init_params.rbi +1 -1
  102. data/rbi/lib/terminal-shop/models/view_init_response.rbi +32 -81
  103. data/rbi/lib/terminal-shop/pooled_net_requester.rbi +14 -3
  104. data/rbi/lib/terminal-shop/request_options.rbi +11 -55
  105. data/rbi/lib/terminal-shop/resources/address.rbi +4 -4
  106. data/rbi/lib/terminal-shop/resources/app.rbi +4 -4
  107. data/rbi/lib/terminal-shop/resources/card.rbi +5 -5
  108. data/rbi/lib/terminal-shop/resources/cart.rbi +6 -6
  109. data/rbi/lib/terminal-shop/resources/email.rbi +1 -1
  110. data/rbi/lib/terminal-shop/resources/order.rbi +3 -3
  111. data/rbi/lib/terminal-shop/resources/product.rbi +2 -2
  112. data/rbi/lib/terminal-shop/resources/profile.rbi +2 -2
  113. data/rbi/lib/terminal-shop/resources/subscription.rbi +5 -4
  114. data/rbi/lib/terminal-shop/resources/token.rbi +4 -4
  115. data/rbi/lib/terminal-shop/resources/view.rbi +1 -1
  116. data/rbi/lib/terminal-shop/util.rbi +24 -13
  117. data/rbi/lib/terminal-shop/version.rbi +1 -1
  118. data/sig/terminal-shop/base_client.rbs +14 -14
  119. data/sig/terminal-shop/base_model.rbs +34 -18
  120. data/sig/terminal-shop/client.rbs +8 -8
  121. data/sig/terminal-shop/errors.rbs +17 -17
  122. data/sig/terminal-shop/models/address.rbs +11 -15
  123. data/sig/terminal-shop/models/address_create_params.rbs +11 -16
  124. data/sig/terminal-shop/models/address_create_response.rbs +1 -6
  125. data/sig/terminal-shop/models/address_delete_params.rbs +1 -6
  126. data/sig/terminal-shop/models/address_delete_response.rbs +1 -6
  127. data/sig/terminal-shop/models/address_get_params.rbs +1 -6
  128. data/sig/terminal-shop/models/address_get_response.rbs +1 -6
  129. data/sig/terminal-shop/models/address_list_params.rbs +1 -6
  130. data/sig/terminal-shop/models/address_list_response.rbs +1 -6
  131. data/sig/terminal-shop/models/app.rbs +6 -5
  132. data/sig/terminal-shop/models/app_create_params.rbs +5 -10
  133. data/sig/terminal-shop/models/app_create_response.rbs +4 -12
  134. data/sig/terminal-shop/models/app_delete_params.rbs +1 -6
  135. data/sig/terminal-shop/models/app_delete_response.rbs +1 -6
  136. data/sig/terminal-shop/models/app_get_params.rbs +1 -5
  137. data/sig/terminal-shop/models/app_get_response.rbs +1 -5
  138. data/sig/terminal-shop/models/app_list_params.rbs +1 -5
  139. data/sig/terminal-shop/models/app_list_response.rbs +1 -6
  140. data/sig/terminal-shop/models/card.rbs +7 -16
  141. data/sig/terminal-shop/models/card_collect_params.rbs +1 -6
  142. data/sig/terminal-shop/models/card_collect_response.rbs +4 -12
  143. data/sig/terminal-shop/models/card_create_params.rbs +4 -6
  144. data/sig/terminal-shop/models/card_create_response.rbs +1 -6
  145. data/sig/terminal-shop/models/card_delete_params.rbs +1 -6
  146. data/sig/terminal-shop/models/card_delete_response.rbs +1 -6
  147. data/sig/terminal-shop/models/card_get_params.rbs +1 -5
  148. data/sig/terminal-shop/models/card_get_response.rbs +1 -6
  149. data/sig/terminal-shop/models/card_list_params.rbs +1 -5
  150. data/sig/terminal-shop/models/card_list_response.rbs +1 -6
  151. data/sig/terminal-shop/models/cart.rbs +20 -34
  152. data/sig/terminal-shop/models/cart_clear_params.rbs +1 -6
  153. data/sig/terminal-shop/models/cart_clear_response.rbs +1 -6
  154. data/sig/terminal-shop/models/cart_convert_params.rbs +1 -6
  155. data/sig/terminal-shop/models/cart_convert_response.rbs +1 -6
  156. data/sig/terminal-shop/models/cart_get_params.rbs +1 -5
  157. data/sig/terminal-shop/models/cart_get_response.rbs +1 -6
  158. data/sig/terminal-shop/models/cart_set_address_params.rbs +4 -9
  159. data/sig/terminal-shop/models/cart_set_address_response.rbs +1 -6
  160. data/sig/terminal-shop/models/cart_set_card_params.rbs +4 -6
  161. data/sig/terminal-shop/models/cart_set_card_response.rbs +1 -6
  162. data/sig/terminal-shop/models/cart_set_item_params.rbs +5 -10
  163. data/sig/terminal-shop/models/cart_set_item_response.rbs +1 -6
  164. data/sig/terminal-shop/models/email_create_params.rbs +4 -6
  165. data/sig/terminal-shop/models/email_create_response.rbs +1 -6
  166. data/sig/terminal-shop/models/order.rbs +31 -50
  167. data/sig/terminal-shop/models/order_create_params.rbs +6 -11
  168. data/sig/terminal-shop/models/order_create_response.rbs +1 -6
  169. data/sig/terminal-shop/models/order_get_params.rbs +1 -5
  170. data/sig/terminal-shop/models/order_get_response.rbs +1 -6
  171. data/sig/terminal-shop/models/order_list_params.rbs +1 -6
  172. data/sig/terminal-shop/models/order_list_response.rbs +1 -6
  173. data/sig/terminal-shop/models/product.rbs +20 -27
  174. data/sig/terminal-shop/models/product_get_params.rbs +1 -6
  175. data/sig/terminal-shop/models/product_get_response.rbs +1 -6
  176. data/sig/terminal-shop/models/product_list_params.rbs +1 -6
  177. data/sig/terminal-shop/models/product_list_response.rbs +1 -6
  178. data/sig/terminal-shop/models/product_variant.rbs +1 -5
  179. data/sig/terminal-shop/models/profile.rbs +8 -17
  180. data/sig/terminal-shop/models/profile_me_params.rbs +1 -6
  181. data/sig/terminal-shop/models/profile_me_response.rbs +1 -6
  182. data/sig/terminal-shop/models/profile_update_params.rbs +5 -10
  183. data/sig/terminal-shop/models/profile_update_response.rbs +1 -6
  184. data/sig/terminal-shop/models/region.rbs +4 -2
  185. data/sig/terminal-shop/models/subscription.rbs +15 -27
  186. data/sig/terminal-shop/models/subscription_create_params.rbs +1 -6
  187. data/sig/terminal-shop/models/subscription_create_response.rbs +1 -6
  188. data/sig/terminal-shop/models/subscription_delete_params.rbs +1 -6
  189. data/sig/terminal-shop/models/subscription_delete_response.rbs +1 -6
  190. data/sig/terminal-shop/models/subscription_get_params.rbs +1 -6
  191. data/sig/terminal-shop/models/subscription_get_response.rbs +1 -6
  192. data/sig/terminal-shop/models/subscription_list_params.rbs +1 -6
  193. data/sig/terminal-shop/models/subscription_list_response.rbs +3 -6
  194. data/sig/terminal-shop/models/token.rbs +1 -5
  195. data/sig/terminal-shop/models/token_create_params.rbs +1 -6
  196. data/sig/terminal-shop/models/token_create_response.rbs +4 -12
  197. data/sig/terminal-shop/models/token_delete_params.rbs +1 -6
  198. data/sig/terminal-shop/models/token_delete_response.rbs +1 -6
  199. data/sig/terminal-shop/models/token_get_params.rbs +1 -5
  200. data/sig/terminal-shop/models/token_get_response.rbs +1 -6
  201. data/sig/terminal-shop/models/token_list_params.rbs +1 -6
  202. data/sig/terminal-shop/models/token_list_response.rbs +1 -6
  203. data/sig/terminal-shop/models/view_init_params.rbs +1 -5
  204. data/sig/terminal-shop/models/view_init_response.rbs +15 -23
  205. data/sig/terminal-shop/pooled_net_requester.rbs +3 -1
  206. data/sig/terminal-shop/request_options.rbs +2 -2
  207. data/sig/terminal-shop/resources/address.rbs +22 -41
  208. data/sig/terminal-shop/resources/app.rbs +16 -34
  209. data/sig/terminal-shop/resources/card.rbs +18 -40
  210. data/sig/terminal-shop/resources/cart.rbs +22 -47
  211. data/sig/terminal-shop/resources/email.rbs +4 -8
  212. data/sig/terminal-shop/resources/order.rbs +13 -26
  213. data/sig/terminal-shop/resources/product.rbs +7 -16
  214. data/sig/terminal-shop/resources/profile.rbs +8 -16
  215. data/sig/terminal-shop/resources/subscription.rbs +21 -43
  216. data/sig/terminal-shop/resources/token.rbs +14 -32
  217. data/sig/terminal-shop/resources/view.rbs +3 -7
  218. data/sig/terminal-shop/util.rbs +5 -5
  219. data/sig/terminal-shop/version.rbs +1 -1
  220. 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 | Class | Symbol
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 Class
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 Class
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
- # ```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
- # ```
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
- # ```ruby
311
- # case region
312
- # in :eu
313
- # # ...
314
- # in :na
315
- # # ...
316
- # else
317
- # puts(region)
318
- # end
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
- # @api private
330
- #
331
- # Guard against thread safety issues by instantiating `@values`.
332
- private def finalize! = values
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
- private_class_method :new
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 self.===(other) = values.include?(other)
326
+ def ===(other) = values.include?(other)
341
327
 
342
328
  # @param other [Object]
343
329
  #
344
330
  # @return [Boolean]
345
- def self.==(other)
346
- other.is_a?(Class) && other <= TerminalShop::Enum && other.values.to_set == values.to_set
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
- class << self
350
- # @api private
351
- #
352
- # @param value [String, Symbol, Object]
353
- #
354
- # @return [Symbol, Object]
355
- def coerce(value)
356
- case value
357
- in Symbol | String if values.include?(val = value.to_sym)
358
- val
359
- else
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
- # @!parse
365
- # # @api private
366
- # #
367
- # # @param value [Symbol, Object]
368
- # #
369
- # # @return [Symbol, Object]
370
- # def dump(value) = super
349
+ # @!parse
350
+ # # @api private
351
+ # #
352
+ # # @param value [Symbol, Object]
353
+ # #
354
+ # # @return [Symbol, Object]
355
+ # def dump(value) = super
371
356
 
372
- # @api private
373
- #
374
- # @param value [Object]
375
- #
376
- # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
377
- def try_strict_coerce(value)
378
- return [true, value, 1] if values.include?(value)
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
- case value
381
- in Symbol | String if values.include?(val = value.to_sym)
382
- [true, val, 1]
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
- case [value, values.first]
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
- # @abstract
398
- class Union
399
- extend TerminalShop::Converter
380
+ module Union
381
+ include TerminalShop::Converter
400
382
 
401
- class << self
402
- # @api private
403
- #
404
- # All of the specified variant info for this union.
405
- #
406
- # @return [Array<Array(Symbol, Proc)>]
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
- # @api private
410
- #
411
- # @return [Array<Array(Symbol, Object)>]
412
- protected def derefed_variants
413
- @known_variants.map { |key, variant_fn| [key, variant_fn.call] }
414
- end
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
- # All of the specified variants for this union.
417
- #
418
- # @return [Array<Object>]
419
- def variants
420
- derefed_variants.map(&:last)
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
- # @api private
424
- #
425
- # @param property [Symbol]
426
- private def discriminator(property)
427
- case property
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
- @discriminator = property
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
- known_variants << variant_info
456
- end
436
+ known_variants << variant_info
437
+ end
457
438
 
458
- # @api private
459
- #
460
- # @param value [Object]
461
- #
462
- # @return [TerminalShop::Converter, Class, nil]
463
- private def resolve_variant(value)
464
- case [@discriminator, value]
465
- in [_, TerminalShop::BaseModel]
466
- value.class
467
- in [Symbol, Hash]
468
- key =
469
- if value.key?(@discriminator)
470
- value.fetch(@discriminator)
471
- elsif value.key?((discriminator = @discriminator.to_s))
472
- value.fetch(discriminator)
473
- end
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
- key = key.to_sym if key.is_a?(String)
476
- _, resolved = known_variants.find { |k,| k == key }
477
- resolved.nil? ? TerminalShop::Unknown : resolved.call
478
- else
479
- nil
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 self.===(other)
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 self.==(other)
502
- other.is_a?(Class) && other <= TerminalShop::Union && other.derefed_variants == derefed_variants
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
- class << self
506
- # @api private
507
- #
508
- # @param value [Object]
509
- #
510
- # @return [Object]
511
- def coerce(value)
512
- if (variant = resolve_variant(value))
513
- return TerminalShop::Converter.coerce(variant, value)
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
- matches = []
493
+ matches = []
517
494
 
518
- known_variants.each do |_, variant_fn|
519
- variant = variant_fn.call
495
+ known_variants.each do |_, variant_fn|
496
+ variant = variant_fn.call
520
497
 
521
- case TerminalShop::Converter.try_strict_coerce(variant, value)
522
- in [true, coerced, _]
523
- return coerced
524
- in [false, true, score]
525
- matches << [score, variant]
526
- in [false, false, _]
527
- nil
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
- _, variant = matches.sort! { _2.first <=> _1.first }.find { |score,| !score.zero? }
532
- variant.nil? ? value : TerminalShop::Converter.coerce(variant, value)
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
- # @api private
536
- #
537
- # @param value [Object]
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
- # @api private
555
- #
556
- # @param value [Object]
557
- #
558
- # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
559
- def try_strict_coerce(value)
560
- # TODO(ruby) this will result in super linear decoding behaviour for nested unions
561
- # follow up with a decoding context that captures current strictness levels
562
- if (variant = resolve_variant(value))
563
- return Converter.try_strict_coerce(variant, value)
564
- end
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
- coercible = false
567
- max_score = 0
543
+ coercible = false
544
+ max_score = 0
568
545
 
569
- known_variants.each do |_, variant_fn|
570
- variant = variant_fn.call
546
+ known_variants.each do |_, variant_fn|
547
+ variant = variant_fn.call
571
548
 
572
- case TerminalShop::Converter.try_strict_coerce(variant, value)
573
- in [true, coerced, score]
574
- return [true, coerced, score]
575
- in [false, true, score]
576
- coercible = true
577
- max_score = [max_score, score].max
578
- in [false, false, _]
579
- nil
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
- private_class_method :new
600
-
601
- def self.[](...) = new(...)
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
- private_class_method :new
723
-
724
- def self.[](...) = new(...)
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
- # ```ruby
851
- # # `product_api` is a `TerminalShop::Models::ProductAPI`
852
- # product_api => {
853
- # id: id,
854
- # description: description,
855
- # name: name
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 | Class | TerminalShop::Converter
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.fetch(:api_name, name_sym)
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.transform_keys(&:to_sym)
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