terminal-shop 1.7.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 (235) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -1
  3. data/lib/terminal-shop/base_client.rb +47 -56
  4. data/lib/terminal-shop/base_model.rb +300 -352
  5. data/lib/terminal-shop/base_page.rb +30 -31
  6. data/lib/terminal-shop/client.rb +2 -3
  7. data/lib/terminal-shop/errors.rb +12 -17
  8. data/lib/terminal-shop/extern.rb +1 -4
  9. data/lib/terminal-shop/models/product.rb +7 -3
  10. data/lib/terminal-shop/models/region.rb +7 -3
  11. data/lib/terminal-shop/models/subscription.rb +7 -3
  12. data/lib/terminal-shop/pooled_net_requester.rb +30 -21
  13. data/lib/terminal-shop/request_options.rb +5 -12
  14. data/lib/terminal-shop/resources/address.rb +0 -5
  15. data/lib/terminal-shop/resources/app.rb +0 -5
  16. data/lib/terminal-shop/resources/card.rb +0 -6
  17. data/lib/terminal-shop/resources/cart.rb +0 -7
  18. data/lib/terminal-shop/resources/email.rb +0 -2
  19. data/lib/terminal-shop/resources/order.rb +0 -4
  20. data/lib/terminal-shop/resources/product.rb +0 -3
  21. data/lib/terminal-shop/resources/profile.rb +0 -3
  22. data/lib/terminal-shop/resources/subscription.rb +0 -5
  23. data/lib/terminal-shop/resources/token.rb +0 -5
  24. data/lib/terminal-shop/resources/view.rb +0 -2
  25. data/lib/terminal-shop/util.rb +59 -77
  26. data/lib/terminal-shop/version.rb +1 -1
  27. data/lib/terminal-shop.rb +16 -0
  28. data/manifest.yaml +1 -0
  29. data/rbi/lib/terminal-shop/base_client.rbi +63 -41
  30. data/rbi/lib/terminal-shop/base_model.rbi +278 -129
  31. data/rbi/lib/terminal-shop/base_page.rbi +1 -4
  32. data/rbi/lib/terminal-shop/client.rbi +29 -30
  33. data/rbi/lib/terminal-shop/errors.rbi +12 -14
  34. data/rbi/lib/terminal-shop/extern.rbi +1 -1
  35. data/rbi/lib/terminal-shop/models/address.rbi +25 -51
  36. data/rbi/lib/terminal-shop/models/address_create_params.rbi +23 -46
  37. data/rbi/lib/terminal-shop/models/address_create_response.rbi +2 -6
  38. data/rbi/lib/terminal-shop/models/address_delete_params.rbi +1 -1
  39. data/rbi/lib/terminal-shop/models/address_delete_response.rbi +1 -6
  40. data/rbi/lib/terminal-shop/models/address_get_params.rbi +1 -1
  41. data/rbi/lib/terminal-shop/models/address_get_response.rbi +8 -6
  42. data/rbi/lib/terminal-shop/models/address_list_params.rbi +1 -1
  43. data/rbi/lib/terminal-shop/models/address_list_response.rbi +5 -6
  44. data/rbi/lib/terminal-shop/models/app.rbi +9 -24
  45. data/rbi/lib/terminal-shop/models/app_create_params.rbi +3 -13
  46. data/rbi/lib/terminal-shop/models/app_create_response.rbi +10 -20
  47. data/rbi/lib/terminal-shop/models/app_delete_params.rbi +1 -1
  48. data/rbi/lib/terminal-shop/models/app_delete_response.rbi +1 -6
  49. data/rbi/lib/terminal-shop/models/app_get_params.rbi +1 -1
  50. data/rbi/lib/terminal-shop/models/app_get_response.rbi +5 -6
  51. data/rbi/lib/terminal-shop/models/app_list_params.rbi +1 -1
  52. data/rbi/lib/terminal-shop/models/app_list_response.rbi +5 -6
  53. data/rbi/lib/terminal-shop/models/card.rbi +22 -36
  54. data/rbi/lib/terminal-shop/models/card_collect_params.rbi +1 -1
  55. data/rbi/lib/terminal-shop/models/card_collect_response.rbi +11 -14
  56. data/rbi/lib/terminal-shop/models/card_create_params.rbi +4 -7
  57. data/rbi/lib/terminal-shop/models/card_create_response.rbi +2 -6
  58. data/rbi/lib/terminal-shop/models/card_delete_params.rbi +1 -1
  59. data/rbi/lib/terminal-shop/models/card_delete_response.rbi +1 -6
  60. data/rbi/lib/terminal-shop/models/card_get_params.rbi +1 -1
  61. data/rbi/lib/terminal-shop/models/card_get_response.rbi +5 -6
  62. data/rbi/lib/terminal-shop/models/card_list_params.rbi +1 -1
  63. data/rbi/lib/terminal-shop/models/card_list_response.rbi +5 -6
  64. data/rbi/lib/terminal-shop/models/cart.rbi +53 -88
  65. data/rbi/lib/terminal-shop/models/cart_clear_params.rbi +1 -1
  66. data/rbi/lib/terminal-shop/models/cart_clear_response.rbi +1 -6
  67. data/rbi/lib/terminal-shop/models/cart_convert_params.rbi +1 -1
  68. data/rbi/lib/terminal-shop/models/cart_convert_response.rbi +5 -6
  69. data/rbi/lib/terminal-shop/models/cart_get_params.rbi +1 -1
  70. data/rbi/lib/terminal-shop/models/cart_get_response.rbi +5 -6
  71. data/rbi/lib/terminal-shop/models/cart_set_address_params.rbi +3 -7
  72. data/rbi/lib/terminal-shop/models/cart_set_address_response.rbi +1 -6
  73. data/rbi/lib/terminal-shop/models/cart_set_card_params.rbi +3 -7
  74. data/rbi/lib/terminal-shop/models/cart_set_card_response.rbi +1 -6
  75. data/rbi/lib/terminal-shop/models/cart_set_item_params.rbi +5 -13
  76. data/rbi/lib/terminal-shop/models/cart_set_item_response.rbi +5 -6
  77. data/rbi/lib/terminal-shop/models/email_create_params.rbi +3 -7
  78. data/rbi/lib/terminal-shop/models/email_create_response.rbi +1 -6
  79. data/rbi/lib/terminal-shop/models/order.rbi +80 -139
  80. data/rbi/lib/terminal-shop/models/order_create_params.rbi +7 -19
  81. data/rbi/lib/terminal-shop/models/order_create_response.rbi +2 -6
  82. data/rbi/lib/terminal-shop/models/order_get_params.rbi +1 -1
  83. data/rbi/lib/terminal-shop/models/order_get_response.rbi +5 -6
  84. data/rbi/lib/terminal-shop/models/order_list_params.rbi +1 -1
  85. data/rbi/lib/terminal-shop/models/order_list_response.rbi +5 -6
  86. data/rbi/lib/terminal-shop/models/product.rbi +52 -80
  87. data/rbi/lib/terminal-shop/models/product_get_params.rbi +1 -1
  88. data/rbi/lib/terminal-shop/models/product_get_response.rbi +8 -6
  89. data/rbi/lib/terminal-shop/models/product_list_params.rbi +1 -1
  90. data/rbi/lib/terminal-shop/models/product_list_response.rbi +5 -6
  91. data/rbi/lib/terminal-shop/models/product_variant.rbi +7 -18
  92. data/rbi/lib/terminal-shop/models/profile.rbi +20 -36
  93. data/rbi/lib/terminal-shop/models/profile_me_params.rbi +1 -1
  94. data/rbi/lib/terminal-shop/models/profile_me_response.rbi +8 -6
  95. data/rbi/lib/terminal-shop/models/profile_update_params.rbi +3 -13
  96. data/rbi/lib/terminal-shop/models/profile_update_response.rbi +8 -6
  97. data/rbi/lib/terminal-shop/models/region.rbi +10 -8
  98. data/rbi/lib/terminal-shop/models/subscription.rbi +35 -75
  99. data/rbi/lib/terminal-shop/models/subscription_create_params.rbi +1 -1
  100. data/rbi/lib/terminal-shop/models/subscription_create_response.rbi +1 -6
  101. data/rbi/lib/terminal-shop/models/subscription_delete_params.rbi +1 -1
  102. data/rbi/lib/terminal-shop/models/subscription_delete_response.rbi +1 -6
  103. data/rbi/lib/terminal-shop/models/subscription_get_params.rbi +1 -1
  104. data/rbi/lib/terminal-shop/models/subscription_get_response.rbi +8 -6
  105. data/rbi/lib/terminal-shop/models/subscription_list_params.rbi +1 -1
  106. data/rbi/lib/terminal-shop/models/subscription_list_response.rbi +4 -8
  107. data/rbi/lib/terminal-shop/models/token.rbi +8 -18
  108. data/rbi/lib/terminal-shop/models/token_create_params.rbi +1 -1
  109. data/rbi/lib/terminal-shop/models/token_create_response.rbi +11 -20
  110. data/rbi/lib/terminal-shop/models/token_delete_params.rbi +1 -1
  111. data/rbi/lib/terminal-shop/models/token_delete_response.rbi +1 -6
  112. data/rbi/lib/terminal-shop/models/token_get_params.rbi +1 -1
  113. data/rbi/lib/terminal-shop/models/token_get_response.rbi +6 -6
  114. data/rbi/lib/terminal-shop/models/token_list_params.rbi +1 -1
  115. data/rbi/lib/terminal-shop/models/token_list_response.rbi +5 -6
  116. data/rbi/lib/terminal-shop/models/view_init_params.rbi +1 -1
  117. data/rbi/lib/terminal-shop/models/view_init_response.rbi +37 -81
  118. data/rbi/lib/terminal-shop/pooled_net_requester.rbi +24 -6
  119. data/rbi/lib/terminal-shop/request_options.rbi +32 -57
  120. data/rbi/lib/terminal-shop/resources/address.rbi +26 -6
  121. data/rbi/lib/terminal-shop/resources/app.rbi +18 -6
  122. data/rbi/lib/terminal-shop/resources/card.rbi +27 -8
  123. data/rbi/lib/terminal-shop/resources/cart.rbi +29 -9
  124. data/rbi/lib/terminal-shop/resources/email.rbi +7 -2
  125. data/rbi/lib/terminal-shop/resources/order.rbi +20 -5
  126. data/rbi/lib/terminal-shop/resources/product.rbi +9 -3
  127. data/rbi/lib/terminal-shop/resources/profile.rbi +4 -2
  128. data/rbi/lib/terminal-shop/resources/subscription.rbi +26 -6
  129. data/rbi/lib/terminal-shop/resources/token.rbi +18 -6
  130. data/rbi/lib/terminal-shop/resources/view.rbi +3 -1
  131. data/rbi/lib/terminal-shop/util.rbi +78 -20
  132. data/rbi/lib/terminal-shop/version.rbi +1 -1
  133. data/sig/terminal-shop/base_client.rbs +20 -15
  134. data/sig/terminal-shop/base_model.rbs +36 -18
  135. data/sig/terminal-shop/client.rbs +8 -8
  136. data/sig/terminal-shop/errors.rbs +21 -21
  137. data/sig/terminal-shop/models/address.rbs +11 -15
  138. data/sig/terminal-shop/models/address_create_params.rbs +11 -16
  139. data/sig/terminal-shop/models/address_create_response.rbs +1 -6
  140. data/sig/terminal-shop/models/address_delete_params.rbs +1 -6
  141. data/sig/terminal-shop/models/address_delete_response.rbs +1 -6
  142. data/sig/terminal-shop/models/address_get_params.rbs +1 -6
  143. data/sig/terminal-shop/models/address_get_response.rbs +1 -6
  144. data/sig/terminal-shop/models/address_list_params.rbs +1 -6
  145. data/sig/terminal-shop/models/address_list_response.rbs +1 -6
  146. data/sig/terminal-shop/models/app.rbs +6 -5
  147. data/sig/terminal-shop/models/app_create_params.rbs +5 -10
  148. data/sig/terminal-shop/models/app_create_response.rbs +4 -12
  149. data/sig/terminal-shop/models/app_delete_params.rbs +1 -6
  150. data/sig/terminal-shop/models/app_delete_response.rbs +1 -6
  151. data/sig/terminal-shop/models/app_get_params.rbs +1 -5
  152. data/sig/terminal-shop/models/app_get_response.rbs +1 -5
  153. data/sig/terminal-shop/models/app_list_params.rbs +1 -5
  154. data/sig/terminal-shop/models/app_list_response.rbs +1 -6
  155. data/sig/terminal-shop/models/card.rbs +7 -16
  156. data/sig/terminal-shop/models/card_collect_params.rbs +1 -6
  157. data/sig/terminal-shop/models/card_collect_response.rbs +4 -12
  158. data/sig/terminal-shop/models/card_create_params.rbs +4 -6
  159. data/sig/terminal-shop/models/card_create_response.rbs +1 -6
  160. data/sig/terminal-shop/models/card_delete_params.rbs +1 -6
  161. data/sig/terminal-shop/models/card_delete_response.rbs +1 -6
  162. data/sig/terminal-shop/models/card_get_params.rbs +1 -5
  163. data/sig/terminal-shop/models/card_get_response.rbs +1 -6
  164. data/sig/terminal-shop/models/card_list_params.rbs +1 -5
  165. data/sig/terminal-shop/models/card_list_response.rbs +1 -6
  166. data/sig/terminal-shop/models/cart.rbs +20 -34
  167. data/sig/terminal-shop/models/cart_clear_params.rbs +1 -6
  168. data/sig/terminal-shop/models/cart_clear_response.rbs +1 -6
  169. data/sig/terminal-shop/models/cart_convert_params.rbs +1 -6
  170. data/sig/terminal-shop/models/cart_convert_response.rbs +1 -6
  171. data/sig/terminal-shop/models/cart_get_params.rbs +1 -5
  172. data/sig/terminal-shop/models/cart_get_response.rbs +1 -6
  173. data/sig/terminal-shop/models/cart_set_address_params.rbs +4 -9
  174. data/sig/terminal-shop/models/cart_set_address_response.rbs +1 -6
  175. data/sig/terminal-shop/models/cart_set_card_params.rbs +4 -6
  176. data/sig/terminal-shop/models/cart_set_card_response.rbs +1 -6
  177. data/sig/terminal-shop/models/cart_set_item_params.rbs +5 -10
  178. data/sig/terminal-shop/models/cart_set_item_response.rbs +1 -6
  179. data/sig/terminal-shop/models/email_create_params.rbs +4 -6
  180. data/sig/terminal-shop/models/email_create_response.rbs +1 -6
  181. data/sig/terminal-shop/models/order.rbs +31 -50
  182. data/sig/terminal-shop/models/order_create_params.rbs +6 -11
  183. data/sig/terminal-shop/models/order_create_response.rbs +1 -6
  184. data/sig/terminal-shop/models/order_get_params.rbs +1 -5
  185. data/sig/terminal-shop/models/order_get_response.rbs +1 -6
  186. data/sig/terminal-shop/models/order_list_params.rbs +1 -6
  187. data/sig/terminal-shop/models/order_list_response.rbs +1 -6
  188. data/sig/terminal-shop/models/product.rbs +20 -27
  189. data/sig/terminal-shop/models/product_get_params.rbs +1 -6
  190. data/sig/terminal-shop/models/product_get_response.rbs +1 -6
  191. data/sig/terminal-shop/models/product_list_params.rbs +1 -6
  192. data/sig/terminal-shop/models/product_list_response.rbs +1 -6
  193. data/sig/terminal-shop/models/product_variant.rbs +1 -5
  194. data/sig/terminal-shop/models/profile.rbs +8 -17
  195. data/sig/terminal-shop/models/profile_me_params.rbs +1 -6
  196. data/sig/terminal-shop/models/profile_me_response.rbs +1 -6
  197. data/sig/terminal-shop/models/profile_update_params.rbs +5 -10
  198. data/sig/terminal-shop/models/profile_update_response.rbs +1 -6
  199. data/sig/terminal-shop/models/region.rbs +4 -2
  200. data/sig/terminal-shop/models/subscription.rbs +15 -27
  201. data/sig/terminal-shop/models/subscription_create_params.rbs +1 -6
  202. data/sig/terminal-shop/models/subscription_create_response.rbs +1 -6
  203. data/sig/terminal-shop/models/subscription_delete_params.rbs +1 -6
  204. data/sig/terminal-shop/models/subscription_delete_response.rbs +1 -6
  205. data/sig/terminal-shop/models/subscription_get_params.rbs +1 -6
  206. data/sig/terminal-shop/models/subscription_get_response.rbs +1 -6
  207. data/sig/terminal-shop/models/subscription_list_params.rbs +1 -6
  208. data/sig/terminal-shop/models/subscription_list_response.rbs +3 -6
  209. data/sig/terminal-shop/models/token.rbs +1 -5
  210. data/sig/terminal-shop/models/token_create_params.rbs +1 -6
  211. data/sig/terminal-shop/models/token_create_response.rbs +4 -12
  212. data/sig/terminal-shop/models/token_delete_params.rbs +1 -6
  213. data/sig/terminal-shop/models/token_delete_response.rbs +1 -6
  214. data/sig/terminal-shop/models/token_get_params.rbs +1 -5
  215. data/sig/terminal-shop/models/token_get_response.rbs +1 -6
  216. data/sig/terminal-shop/models/token_list_params.rbs +1 -6
  217. data/sig/terminal-shop/models/token_list_response.rbs +1 -6
  218. data/sig/terminal-shop/models/view_init_params.rbs +1 -5
  219. data/sig/terminal-shop/models/view_init_response.rbs +15 -23
  220. data/sig/terminal-shop/pooled_net_requester.rbs +10 -3
  221. data/sig/terminal-shop/request_options.rbs +2 -2
  222. data/sig/terminal-shop/resources/address.rbs +22 -41
  223. data/sig/terminal-shop/resources/app.rbs +16 -34
  224. data/sig/terminal-shop/resources/card.rbs +18 -40
  225. data/sig/terminal-shop/resources/cart.rbs +22 -47
  226. data/sig/terminal-shop/resources/email.rbs +4 -8
  227. data/sig/terminal-shop/resources/order.rbs +13 -26
  228. data/sig/terminal-shop/resources/product.rbs +7 -16
  229. data/sig/terminal-shop/resources/profile.rbs +8 -16
  230. data/sig/terminal-shop/resources/subscription.rbs +21 -43
  231. data/sig/terminal-shop/resources/token.rbs +14 -32
  232. data/sig/terminal-shop/resources/view.rbs +3 -7
  233. data/sig/terminal-shop/util.rbs +9 -9
  234. data/sig/terminal-shop/version.rbs +1 -1
  235. metadata +4 -4
@@ -1,41 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TerminalShop
4
- # @private
5
- #
6
- # @abstract
7
- #
4
+ # @api private
8
5
  module Converter
9
6
  # rubocop:disable Lint/UnusedMethodArgument
10
7
 
11
- # @private
8
+ # @api private
12
9
  #
13
10
  # @param value [Object]
14
11
  #
15
12
  # @return [Object]
16
- #
17
13
  def coerce(value) = value
18
14
 
19
- # @private
15
+ # @api private
20
16
  #
21
17
  # @param value [Object]
22
18
  #
23
19
  # @return [Object]
24
- #
25
20
  def dump(value) = value
26
21
 
27
- # @private
22
+ # @api private
28
23
  #
29
24
  # @param value [Object]
30
25
  #
31
26
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
32
- #
33
27
  def try_strict_coerce(value) = (raise NotImplementedError)
34
28
 
35
29
  # rubocop:enable Lint/UnusedMethodArgument
36
30
 
37
31
  class << self
38
- # @private
32
+ # @api private
39
33
  #
40
34
  # @param spec [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class] .
41
35
  #
@@ -48,14 +42,13 @@ 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
55
48
  type_info(spec.slice(:const, :enum, :union).first&.last)
56
49
  in Proc
57
50
  spec
58
- in TerminalShop::Converter | Class | Symbol
51
+ in TerminalShop::Converter | Module | Symbol
59
52
  -> { spec }
60
53
  in true | false
61
54
  -> { TerminalShop::BooleanModel }
@@ -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
@@ -89,7 +81,7 @@ module TerminalShop
89
81
  else
90
82
  value
91
83
  end
92
- in Class
84
+ in Module
93
85
  case target
94
86
  in -> { _1 <= NilClass }
95
87
  nil
@@ -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
@@ -154,7 +144,7 @@ module TerminalShop
154
144
  else
155
145
  [false, false, 0]
156
146
  end
157
- in Class
147
+ in Module
158
148
  case [target, value]
159
149
  in [-> { _1 <= NilClass }, _]
160
150
  [true, nil, value.nil? ? 1 : 0]
@@ -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
  #
@@ -192,45 +182,38 @@ module TerminalShop
192
182
 
193
183
  # rubocop:disable Lint/UnusedMethodArgument
194
184
 
195
- private_class_method :new
196
-
197
185
  # @param other [Object]
198
186
  #
199
187
  # @return [Boolean]
200
- #
201
188
  def self.===(other) = true
202
189
 
203
190
  # @param other [Object]
204
191
  #
205
192
  # @return [Boolean]
206
- #
207
193
  def self.==(other) = other.is_a?(Class) && other <= TerminalShop::Unknown
208
194
 
209
195
  class << self
210
196
  # @!parse
211
- # # @private
197
+ # # @api private
212
198
  # #
213
199
  # # @param value [Object]
214
200
  # #
215
201
  # # @return [Object]
216
- # #
217
202
  # def coerce(value) = super
218
203
 
219
204
  # @!parse
220
- # # @private
205
+ # # @api private
221
206
  # #
222
207
  # # @param value [Object]
223
208
  # #
224
209
  # # @return [Object]
225
- # #
226
210
  # def dump(value) = super
227
211
 
228
- # @private
212
+ # @api private
229
213
  #
230
214
  # @param value [Object]
231
215
  #
232
216
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
233
- #
234
217
  def try_strict_coerce(value)
235
218
  # prevent unknown variant from being chosen during the first coercion pass
236
219
  [false, true, 0]
@@ -240,7 +223,7 @@ module TerminalShop
240
223
  # rubocop:enable Lint/UnusedMethodArgument
241
224
  end
242
225
 
243
- # @private
226
+ # @api private
244
227
  #
245
228
  # @abstract
246
229
  #
@@ -248,45 +231,38 @@ module TerminalShop
248
231
  class BooleanModel
249
232
  extend TerminalShop::Converter
250
233
 
251
- private_class_method :new
252
-
253
234
  # @param other [Object]
254
235
  #
255
236
  # @return [Boolean]
256
- #
257
237
  def self.===(other) = other == true || other == false
258
238
 
259
239
  # @param other [Object]
260
240
  #
261
241
  # @return [Boolean]
262
- #
263
242
  def self.==(other) = other.is_a?(Class) && other <= TerminalShop::BooleanModel
264
243
 
265
244
  class << self
266
245
  # @!parse
267
- # # @private
246
+ # # @api private
268
247
  # #
269
248
  # # @param value [Boolean, Object]
270
249
  # #
271
250
  # # @return [Boolean, Object]
272
- # #
273
251
  # def coerce(value) = super
274
252
 
275
253
  # @!parse
276
- # # @private
254
+ # # @api private
277
255
  # #
278
256
  # # @param value [Boolean, Object]
279
257
  # #
280
258
  # # @return [Boolean, Object]
281
- # #
282
259
  # def dump(value) = super
283
260
 
284
- # @private
261
+ # @api private
285
262
  #
286
263
  # @param value [Object]
287
264
  #
288
265
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
289
- #
290
266
  def try_strict_coerce(value)
291
267
  case value
292
268
  in true | false
@@ -298,9 +274,7 @@ module TerminalShop
298
274
  end
299
275
  end
300
276
 
301
- # @private
302
- #
303
- # @abstract
277
+ # @api private
304
278
  #
305
279
  # A value from among a specified list of options. OpenAPI enum values map to Ruby
306
280
  # values in the SDK as follows:
@@ -314,211 +288,186 @@ module TerminalShop
314
288
  # values safely.
315
289
  #
316
290
  # @example
317
- # ```ruby
318
- # # `region` is a `TerminalShop::Models::Region`
319
- # case region
320
- # when TerminalShop::Models::Region::EU
321
- # # ...
322
- # when TerminalShop::Models::Region::NA
323
- # # ...
324
- # else
325
- # # ...
326
- # end
327
- # ```
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
328
300
  #
329
301
  # @example
330
- # ```ruby
331
- # case region
332
- # in :eu
333
- # # ...
334
- # in :na
335
- # # ...
336
- # else
337
- # # ...
338
- # end
339
- # ```
340
- class Enum
341
- extend TerminalShop::Converter
342
-
343
- class << self
344
- # All of the valid Symbol values for this enum.
345
- #
346
- # @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
347
- #
348
- 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
349
312
 
350
- # @private
351
- #
352
- # Guard against thread safety issues by instantiating `@values`.
353
- #
354
- private def finalize! = values
355
- 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) })
356
317
 
357
- private_class_method :new
318
+ # @api private
319
+ #
320
+ # Guard against thread safety issues by instantiating `@values`.
321
+ private def finalize! = values
358
322
 
359
323
  # @param other [Object]
360
324
  #
361
325
  # @return [Boolean]
362
- #
363
- def self.===(other) = values.include?(other)
326
+ def ===(other) = values.include?(other)
364
327
 
365
328
  # @param other [Object]
366
329
  #
367
330
  # @return [Boolean]
368
- #
369
- def self.==(other)
370
- 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
371
333
  end
372
334
 
373
- class << self
374
- # @private
375
- #
376
- # @param value [String, Symbol, Object]
377
- #
378
- # @return [Symbol, Object]
379
- #
380
- def coerce(value)
381
- case value
382
- in Symbol | String if values.include?(val = value.to_sym)
383
- val
384
- else
385
- value
386
- 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
387
346
  end
347
+ end
388
348
 
389
- # @!parse
390
- # # @private
391
- # #
392
- # # @param value [Symbol, Object]
393
- # #
394
- # # @return [Symbol, Object]
395
- # #
396
- # 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
397
356
 
398
- # @private
399
- #
400
- # @param value [Object]
401
- #
402
- # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
403
- #
404
- def try_strict_coerce(value)
405
- 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)
406
364
 
407
- case value
408
- in Symbol | String if values.include?(val = value.to_sym)
409
- [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]
410
372
  else
411
- case [value, values.first]
412
- in [true | false, true | false] | [Integer, Integer] | [Symbol | String, Symbol]
413
- [false, true, 0]
414
- else
415
- [false, false, 0]
416
- end
373
+ [false, false, 0]
417
374
  end
418
375
  end
419
376
  end
420
377
  end
421
378
 
422
- # @private
423
- #
424
- # @abstract
425
- #
426
- class Union
427
- extend TerminalShop::Converter
379
+ # @api private
380
+ module Union
381
+ include TerminalShop::Converter
428
382
 
429
- class << self
430
- # @private
431
- #
432
- # All of the specified variant info for this union.
433
- #
434
- # @return [Array<Array(Symbol, Proc)>]
435
- #
436
- 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 ||= [])
437
389
 
438
- # @private
439
- #
440
- # All of the specified variants for this union.
441
- #
442
- # @return [Array<Array(Symbol, Object)>]
443
- #
444
- protected def variants
445
- @known_variants.map { |key, variant_fn| [key, variant_fn.call] }
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
396
+
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
446
411
  end
412
+ end
447
413
 
448
- # @private
449
- #
450
- # @param property [Symbol]
451
- #
452
- private def discriminator(property)
453
- 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
454
430
  in Symbol
455
- @discriminator = property
431
+ [key, TerminalShop::Converter.type_info(spec)]
432
+ in Proc | TerminalShop::Converter | Module | Hash
433
+ [nil, TerminalShop::Converter.type_info(key)]
456
434
  end
457
- end
458
435
 
459
- # @private
460
- #
461
- # @param key [Symbol, Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
462
- #
463
- # @param spec [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class] .
464
- #
465
- # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
466
- #
467
- # @option spec [Proc] :enum
468
- #
469
- # @option spec [Proc] :union
470
- #
471
- # @option spec [Boolean] :"nil?"
472
- #
473
- private def variant(key, spec = nil)
474
- variant_info =
475
- case key
476
- in Symbol
477
- [key, TerminalShop::Converter.type_info(spec)]
478
- in Proc | TerminalShop::Converter | Class | Hash
479
- [nil, TerminalShop::Converter.type_info(key)]
480
- end
481
-
482
- known_variants << variant_info
483
- end
436
+ known_variants << variant_info
437
+ end
484
438
 
485
- # @private
486
- #
487
- # @param value [Object]
488
- #
489
- # @return [TerminalShop::Converter, Class, nil]
490
- #
491
- private def resolve_variant(value)
492
- case [@discriminator, value]
493
- in [_, TerminalShop::BaseModel]
494
- value.class
495
- in [Symbol, Hash]
496
- key =
497
- if value.key?(@discriminator)
498
- value.fetch(@discriminator)
499
- elsif value.key?((discriminator = @discriminator.to_s))
500
- value.fetch(discriminator)
501
- 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
502
455
 
503
- key = key.to_sym if key.is_a?(String)
504
- _, resolved = known_variants.find { |k,| k == key }
505
- resolved.nil? ? TerminalShop::Unknown : resolved.call
506
- else
507
- nil
508
- 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
509
461
  end
510
462
  end
511
463
 
512
464
  # rubocop:disable Style/HashEachMethods
513
465
  # rubocop:disable Style/CaseEquality
514
466
 
515
- private_class_method :new
516
-
517
467
  # @param other [Object]
518
468
  #
519
469
  # @return [Boolean]
520
- #
521
- def self.===(other)
470
+ def ===(other)
522
471
  known_variants.any? do |_, variant_fn|
523
472
  variant_fn.call === other
524
473
  end
@@ -527,101 +476,95 @@ module TerminalShop
527
476
  # @param other [Object]
528
477
  #
529
478
  # @return [Boolean]
530
- #
531
- def self.==(other)
532
- other.is_a?(Class) && other <= TerminalShop::Union && other.variants == variants
479
+ def ==(other)
480
+ other.is_a?(Module) && other.singleton_class.ancestors.include?(TerminalShop::Union) && other.derefed_variants == derefed_variants
533
481
  end
534
482
 
535
- class << self
536
- # @private
537
- #
538
- # @param value [Object]
539
- #
540
- # @return [Object]
541
- #
542
- def coerce(value)
543
- if (variant = resolve_variant(value))
544
- return TerminalShop::Converter.coerce(variant, value)
545
- 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
546
492
 
547
- matches = []
493
+ matches = []
548
494
 
549
- known_variants.each do |_, variant_fn|
550
- variant = variant_fn.call
495
+ known_variants.each do |_, variant_fn|
496
+ variant = variant_fn.call
551
497
 
552
- case TerminalShop::Converter.try_strict_coerce(variant, value)
553
- in [true, coerced, _]
554
- return coerced
555
- in [false, true, score]
556
- matches << [score, variant]
557
- in [false, false, _]
558
- nil
559
- 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
560
505
  end
506
+ end
507
+
508
+ _, variant = matches.sort! { _2.first <=> _1.first }.find { |score,| !score.zero? }
509
+ variant.nil? ? value : TerminalShop::Converter.coerce(variant, value)
510
+ end
561
511
 
562
- _, variant = matches.sort! { _2.first <=> _1.first }.find { |score,| !score.zero? }
563
- variant.nil? ? value : TerminalShop::Converter.coerce(variant, value)
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)
564
520
  end
565
521
 
566
- # @private
567
- #
568
- # @param value [Object]
569
- #
570
- # @return [Object]
571
- #
572
- def dump(value)
573
- if (variant = resolve_variant(value))
522
+ known_variants.each do |_, variant_fn|
523
+ variant = variant_fn.call
524
+ if variant === value
574
525
  return TerminalShop::Converter.dump(variant, value)
575
526
  end
576
-
577
- known_variants.each do |_, variant_fn|
578
- variant = variant_fn.call
579
- if variant === value
580
- return TerminalShop::Converter.dump(variant, value)
581
- end
582
- end
583
- value
584
527
  end
528
+ value
529
+ end
585
530
 
586
- # @private
587
- #
588
- # @param value [Object]
589
- #
590
- # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
591
- #
592
- def try_strict_coerce(value)
593
- # TODO(ruby) this will result in super linear decoding behaviour for nested unions
594
- # follow up with a decoding context that captures current strictness levels
595
- if (variant = resolve_variant(value))
596
- return Converter.try_strict_coerce(variant, value)
597
- 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
598
542
 
599
- coercible = false
600
- max_score = 0
543
+ coercible = false
544
+ max_score = 0
601
545
 
602
- known_variants.each do |_, variant_fn|
603
- variant = variant_fn.call
546
+ known_variants.each do |_, variant_fn|
547
+ variant = variant_fn.call
604
548
 
605
- case TerminalShop::Converter.try_strict_coerce(variant, value)
606
- in [true, coerced, score]
607
- return [true, coerced, score]
608
- in [false, true, score]
609
- coercible = true
610
- max_score = [max_score, score].max
611
- in [false, false, _]
612
- nil
613
- 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
614
557
  end
615
-
616
- [false, coercible, max_score]
617
558
  end
559
+
560
+ [false, coercible, max_score]
618
561
  end
619
562
 
620
563
  # rubocop:enable Style/CaseEquality
621
564
  # rubocop:enable Style/HashEachMethods
622
565
  end
623
566
 
624
- # @private
567
+ # @api private
625
568
  #
626
569
  # @abstract
627
570
  #
@@ -629,14 +572,22 @@ module TerminalShop
629
572
  class ArrayOf
630
573
  include TerminalShop::Converter
631
574
 
632
- private_class_method :new
633
-
634
- 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)
635
587
 
636
588
  # @param other [Object]
637
589
  #
638
590
  # @return [Boolean]
639
- #
640
591
  def ===(other)
641
592
  type = item_type
642
593
  case other
@@ -652,15 +603,13 @@ module TerminalShop
652
603
  # @param other [Object]
653
604
  #
654
605
  # @return [Boolean]
655
- #
656
606
  def ==(other) = other.is_a?(TerminalShop::ArrayOf) && other.item_type == item_type
657
607
 
658
- # @private
608
+ # @api private
659
609
  #
660
610
  # @param value [Enumerable, Object]
661
611
  #
662
612
  # @return [Array<Object>, Object]
663
- #
664
613
  def coerce(value)
665
614
  type = item_type
666
615
  case value
@@ -671,12 +620,11 @@ module TerminalShop
671
620
  end
672
621
  end
673
622
 
674
- # @private
623
+ # @api private
675
624
  #
676
625
  # @param value [Enumerable, Object]
677
626
  #
678
627
  # @return [Array<Object>, Object]
679
- #
680
628
  def dump(value)
681
629
  type = item_type
682
630
  case value
@@ -687,12 +635,11 @@ module TerminalShop
687
635
  end
688
636
  end
689
637
 
690
- # @private
638
+ # @api private
691
639
  #
692
640
  # @param value [Object]
693
641
  #
694
642
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
695
- #
696
643
  def try_strict_coerce(value)
697
644
  case value
698
645
  in Array
@@ -726,13 +673,12 @@ module TerminalShop
726
673
  end
727
674
  end
728
675
 
729
- # @private
676
+ # @api private
730
677
  #
731
678
  # @return [TerminalShop::Converter, Class]
732
- #
733
679
  protected def item_type = @item_type_fn.call
734
680
 
735
- # @private
681
+ # @api private
736
682
  #
737
683
  # @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
738
684
  #
@@ -745,13 +691,12 @@ module TerminalShop
745
691
  # @option spec [Proc] :union
746
692
  #
747
693
  # @option spec [Boolean] :"nil?"
748
- #
749
694
  def initialize(type_info, spec = {})
750
695
  @item_type_fn = TerminalShop::Converter.type_info(type_info || spec)
751
696
  end
752
697
  end
753
698
 
754
- # @private
699
+ # @api private
755
700
  #
756
701
  # @abstract
757
702
  #
@@ -759,14 +704,22 @@ module TerminalShop
759
704
  class HashOf
760
705
  include TerminalShop::Converter
761
706
 
762
- private_class_method :new
763
-
764
- 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)
765
719
 
766
720
  # @param other [Object]
767
721
  #
768
722
  # @return [Boolean]
769
- #
770
723
  def ===(other)
771
724
  type = item_type
772
725
  case other
@@ -787,15 +740,13 @@ module TerminalShop
787
740
  # @param other [Object]
788
741
  #
789
742
  # @return [Boolean]
790
- #
791
743
  def ==(other) = other.is_a?(TerminalShop::HashOf) && other.item_type == item_type
792
744
 
793
- # @private
745
+ # @api private
794
746
  #
795
747
  # @param value [Hash{Object=>Object}, Object]
796
748
  #
797
749
  # @return [Hash{Symbol=>Object}, Object]
798
- #
799
750
  def coerce(value)
800
751
  type = item_type
801
752
  case value
@@ -809,12 +760,11 @@ module TerminalShop
809
760
  end
810
761
  end
811
762
 
812
- # @private
763
+ # @api private
813
764
  #
814
765
  # @param value [Hash{Object=>Object}, Object]
815
766
  #
816
767
  # @return [Hash{Symbol=>Object}, Object]
817
- #
818
768
  def dump(value)
819
769
  type = item_type
820
770
  case value
@@ -827,12 +777,11 @@ module TerminalShop
827
777
  end
828
778
  end
829
779
 
830
- # @private
780
+ # @api private
831
781
  #
832
782
  # @param value [Object]
833
783
  #
834
784
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
835
- #
836
785
  def try_strict_coerce(value)
837
786
  case value
838
787
  in Hash
@@ -866,13 +815,12 @@ module TerminalShop
866
815
  end
867
816
  end
868
817
 
869
- # @private
818
+ # @api private
870
819
  #
871
820
  # @return [TerminalShop::Converter, Class]
872
- #
873
821
  protected def item_type = @item_type_fn.call
874
822
 
875
- # @private
823
+ # @api private
876
824
  #
877
825
  # @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Converter, Class]
878
826
  #
@@ -885,55 +833,56 @@ module TerminalShop
885
833
  # @option spec [Proc] :union
886
834
  #
887
835
  # @option spec [Boolean] :"nil?"
888
- #
889
836
  def initialize(type_info, spec = {})
890
837
  @item_type_fn = TerminalShop::Converter.type_info(type_info || spec)
891
838
  end
892
839
  end
893
840
 
894
- # @private
895
- #
896
841
  # @abstract
897
842
  #
898
843
  # @example
899
- # ```ruby
900
- # # `product_api` is a `TerminalShop::Models::ProductAPI`
901
- # product_api => {
902
- # id: id,
903
- # description: description,
904
- # name: name
905
- # }
906
- # ```
844
+ # # `product_api` is a `TerminalShop::Models::ProductAPI`
845
+ # product_api => {
846
+ # id: id,
847
+ # description: description,
848
+ # name: name
849
+ # }
907
850
  class BaseModel
908
851
  extend TerminalShop::Converter
909
852
 
910
853
  class << self
911
- # @private
854
+ # @api private
912
855
  #
913
856
  # Assumes superclass fields are totally defined before fields are accessed /
914
857
  # defined on subclasses.
915
858
  #
916
859
  # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
917
- #
918
860
  def known_fields
919
861
  @known_fields ||= (self < TerminalShop::BaseModel ? superclass.known_fields.dup : {})
920
862
  end
921
863
 
922
- # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
864
+ # @api private
923
865
  #
866
+ # @return [Hash{Symbol=>Symbol}]
867
+ def reverse_map
868
+ @reverse_map ||= (self < TerminalShop::BaseModel ? superclass.reverse_map.dup : {})
869
+ end
870
+
871
+ # @api private
872
+ #
873
+ # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
924
874
  def fields
925
875
  known_fields.transform_values do |field|
926
876
  {**field.except(:type_fn), type: field.fetch(:type_fn).call}
927
877
  end
928
878
  end
929
879
 
930
- # @private
880
+ # @api private
931
881
  #
932
882
  # @return [Hash{Symbol=>Proc}]
933
- #
934
883
  def defaults = (@defaults ||= {})
935
884
 
936
- # @private
885
+ # @api private
937
886
  #
938
887
  # @param name_sym [Symbol]
939
888
  #
@@ -950,11 +899,10 @@ module TerminalShop
950
899
  # @option spec [Proc] :union
951
900
  #
952
901
  # @option spec [Boolean] :"nil?"
953
- #
954
902
  private def add_field(name_sym, required:, type_info:, spec:)
955
903
  type_fn, info =
956
904
  case type_info
957
- in Proc | Class | TerminalShop::Converter
905
+ in Proc | Module | TerminalShop::Converter
958
906
  [TerminalShop::Converter.type_info({**spec, union: type_info}), spec]
959
907
  in Hash
960
908
  [TerminalShop::Converter.type_info(type_info), type_info]
@@ -963,7 +911,7 @@ module TerminalShop
963
911
  fallback = info[:const]
964
912
  defaults[name_sym] = fallback if required && !info[:nil?] && info.key?(:const)
965
913
 
966
- key = info.fetch(:api_name, name_sym)
914
+ key = info[:api_name]&.tap { reverse_map[_1] = name_sym } || name_sym
967
915
  setter = "#{name_sym}="
968
916
 
969
917
  if known_fields.key?(name_sym)
@@ -989,7 +937,7 @@ module TerminalShop
989
937
  end
990
938
  end
991
939
 
992
- # @private
940
+ # @api private
993
941
  #
994
942
  # @param name_sym [Symbol]
995
943
  #
@@ -1004,12 +952,11 @@ module TerminalShop
1004
952
  # @option spec [Proc] :union
1005
953
  #
1006
954
  # @option spec [Boolean] :"nil?"
1007
- #
1008
955
  def required(name_sym, type_info, spec = {})
1009
956
  add_field(name_sym, required: true, type_info: type_info, spec: spec)
1010
957
  end
1011
958
 
1012
- # @private
959
+ # @api private
1013
960
  #
1014
961
  # @param name_sym [Symbol]
1015
962
  #
@@ -1024,18 +971,16 @@ module TerminalShop
1024
971
  # @option spec [Proc] :union
1025
972
  #
1026
973
  # @option spec [Boolean] :"nil?"
1027
- #
1028
974
  def optional(name_sym, type_info, spec = {})
1029
975
  add_field(name_sym, required: false, type_info: type_info, spec: spec)
1030
976
  end
1031
977
 
1032
- # @private
978
+ # @api private
1033
979
  #
1034
980
  # `request_only` attributes not excluded from `.#coerce` when receiving responses
1035
981
  # even if well behaved servers should not send them
1036
982
  #
1037
983
  # @param blk [Proc]
1038
- #
1039
984
  private def request_only(&blk)
1040
985
  @mode = :dump
1041
986
  blk.call
@@ -1043,12 +988,11 @@ module TerminalShop
1043
988
  @mode = nil
1044
989
  end
1045
990
 
1046
- # @private
991
+ # @api private
1047
992
  #
1048
993
  # `response_only` attributes are omitted from `.#dump` when making requests
1049
994
  #
1050
995
  # @param blk [Proc]
1051
- #
1052
996
  private def response_only(&blk)
1053
997
  @mode = :coerce
1054
998
  blk.call
@@ -1060,7 +1004,6 @@ module TerminalShop
1060
1004
  # @param other [Object]
1061
1005
  #
1062
1006
  # @return [Boolean]
1063
- #
1064
1007
  def ==(other)
1065
1008
  case other
1066
1009
  in TerminalShop::BaseModel
@@ -1071,12 +1014,11 @@ module TerminalShop
1071
1014
  end
1072
1015
 
1073
1016
  class << self
1074
- # @private
1017
+ # @api private
1075
1018
  #
1076
1019
  # @param value [TerminalShop::BaseModel, Hash{Object=>Object}, Object]
1077
1020
  #
1078
1021
  # @return [TerminalShop::BaseModel, Object]
1079
- #
1080
1022
  def coerce(value)
1081
1023
  case TerminalShop::Util.coerce_hash(value)
1082
1024
  in Hash => coerced
@@ -1086,12 +1028,11 @@ module TerminalShop
1086
1028
  end
1087
1029
  end
1088
1030
 
1089
- # @private
1031
+ # @api private
1090
1032
  #
1091
1033
  # @param value [TerminalShop::BaseModel, Object]
1092
1034
  #
1093
1035
  # @return [Hash{Object=>Object}, Object]
1094
- #
1095
1036
  def dump(value)
1096
1037
  unless (coerced = TerminalShop::Util.coerce_hash(value)).is_a?(Hash)
1097
1038
  return value
@@ -1123,12 +1064,11 @@ module TerminalShop
1123
1064
  values
1124
1065
  end
1125
1066
 
1126
- # @private
1067
+ # @api private
1127
1068
  #
1128
1069
  # @param value [Object]
1129
1070
  #
1130
1071
  # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
1131
- #
1132
1072
  def try_strict_coerce(value)
1133
1073
  case value
1134
1074
  in Hash | TerminalShop::BaseModel
@@ -1186,7 +1126,6 @@ module TerminalShop
1186
1126
  # @param key [Symbol]
1187
1127
  #
1188
1128
  # @return [Object, nil]
1189
- #
1190
1129
  def [](key)
1191
1130
  unless key.instance_of?(Symbol)
1192
1131
  raise ArgumentError.new("Expected symbol key for lookup, got #{key.inspect}")
@@ -1205,7 +1144,6 @@ module TerminalShop
1205
1144
  # should not be mutated.
1206
1145
  #
1207
1146
  # @return [Hash{Symbol=>Object}]
1208
- #
1209
1147
  def to_h = @data
1210
1148
 
1211
1149
  alias_method :to_hash, :to_h
@@ -1213,7 +1151,6 @@ module TerminalShop
1213
1151
  # @param keys [Array<Symbol>, nil]
1214
1152
  #
1215
1153
  # @return [Hash{Symbol=>Object}]
1216
- #
1217
1154
  def deconstruct_keys(keys)
1218
1155
  (keys || self.class.known_fields.keys).filter_map do |k|
1219
1156
  unless self.class.known_fields.key?(k)
@@ -1228,22 +1165,33 @@ module TerminalShop
1228
1165
  # Create a new instance of a model.
1229
1166
  #
1230
1167
  # @param data [Hash{Symbol=>Object}, TerminalShop::BaseModel]
1231
- #
1232
1168
  def initialize(data = {})
1233
1169
  case TerminalShop::Util.coerce_hash(data)
1234
1170
  in Hash => coerced
1235
- @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
1236
1186
  else
1237
1187
  raise ArgumentError.new("Expected a #{Hash} or #{TerminalShop::BaseModel}, got #{data.inspect}")
1238
1188
  end
1239
1189
  end
1240
1190
 
1241
1191
  # @return [String]
1242
- #
1243
1192
  def to_s = @data.to_s
1244
1193
 
1245
1194
  # @return [String]
1246
- #
1247
1195
  def inspect
1248
1196
  "#<#{self.class.name}:0x#{object_id.to_s(16)} #{deconstruct_keys(nil).map do |k, v|
1249
1197
  "#{k}=#{v.inspect}"