terminal-shop 1.8.0 → 2.1.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 (299) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -8
  3. data/lib/terminal-shop/client.rb +2 -1
  4. data/lib/terminal-shop/models/address_create_params.rb +1 -1
  5. data/lib/terminal-shop/models/address_delete_params.rb +1 -1
  6. data/lib/terminal-shop/models/address_get_params.rb +1 -1
  7. data/lib/terminal-shop/models/address_list_params.rb +1 -1
  8. data/lib/terminal-shop/models/app_create_params.rb +1 -1
  9. data/lib/terminal-shop/models/app_delete_params.rb +1 -1
  10. data/lib/terminal-shop/models/app_get_params.rb +1 -1
  11. data/lib/terminal-shop/models/app_list_params.rb +1 -1
  12. data/lib/terminal-shop/models/card_collect_params.rb +1 -1
  13. data/lib/terminal-shop/models/card_create_params.rb +1 -1
  14. data/lib/terminal-shop/models/card_delete_params.rb +1 -1
  15. data/lib/terminal-shop/models/card_get_params.rb +1 -1
  16. data/lib/terminal-shop/models/card_list_params.rb +1 -1
  17. data/lib/terminal-shop/models/cart_clear_params.rb +1 -1
  18. data/lib/terminal-shop/models/cart_convert_params.rb +1 -1
  19. data/lib/terminal-shop/models/cart_get_params.rb +1 -1
  20. data/lib/terminal-shop/models/cart_set_address_params.rb +1 -1
  21. data/lib/terminal-shop/models/cart_set_card_params.rb +1 -1
  22. data/lib/terminal-shop/models/cart_set_item_params.rb +1 -1
  23. data/lib/terminal-shop/models/email_create_params.rb +1 -1
  24. data/lib/terminal-shop/models/order_create_params.rb +1 -1
  25. data/lib/terminal-shop/models/order_get_params.rb +1 -1
  26. data/lib/terminal-shop/models/order_list_params.rb +1 -1
  27. data/lib/terminal-shop/models/product.rb +7 -3
  28. data/lib/terminal-shop/models/product_get_params.rb +1 -1
  29. data/lib/terminal-shop/models/product_list_params.rb +1 -1
  30. data/lib/terminal-shop/models/profile_me_params.rb +1 -1
  31. data/lib/terminal-shop/models/profile_update_params.rb +1 -1
  32. data/lib/terminal-shop/models/region.rb +7 -3
  33. data/lib/terminal-shop/models/subscription.rb +5 -7
  34. data/lib/terminal-shop/models/subscription_create_params.rb +1 -1
  35. data/lib/terminal-shop/models/subscription_delete_params.rb +1 -1
  36. data/lib/terminal-shop/models/subscription_get_params.rb +1 -1
  37. data/lib/terminal-shop/models/subscription_list_params.rb +1 -1
  38. data/lib/terminal-shop/models/token_create_params.rb +1 -1
  39. data/lib/terminal-shop/models/token_delete_params.rb +1 -1
  40. data/lib/terminal-shop/models/token_get_params.rb +1 -1
  41. data/lib/terminal-shop/models/token_list_params.rb +1 -1
  42. data/lib/terminal-shop/models/view_init_params.rb +1 -1
  43. data/lib/terminal-shop/request_options.rb +1 -34
  44. data/lib/terminal-shop/transport/base_client.rb +459 -0
  45. data/lib/terminal-shop/transport/pooled_net_requester.rb +182 -0
  46. data/lib/terminal-shop/type/array_of.rb +110 -0
  47. data/lib/terminal-shop/type/base_model.rb +362 -0
  48. data/lib/terminal-shop/type/base_page.rb +61 -0
  49. data/lib/terminal-shop/type/boolean_model.rb +52 -0
  50. data/lib/terminal-shop/type/converter.rb +217 -0
  51. data/lib/terminal-shop/type/enum.rb +101 -0
  52. data/lib/terminal-shop/type/hash_of.rb +136 -0
  53. data/lib/terminal-shop/type/request_parameters.rb +38 -0
  54. data/lib/terminal-shop/type/union.rb +183 -0
  55. data/lib/terminal-shop/type/unknown.rb +56 -0
  56. data/lib/terminal-shop/type.rb +23 -0
  57. data/lib/terminal-shop/util.rb +19 -12
  58. data/lib/terminal-shop/version.rb +1 -1
  59. data/lib/terminal-shop.rb +28 -5
  60. data/rbi/lib/terminal-shop/client.rbi +19 -31
  61. data/rbi/lib/terminal-shop/errors.rbi +7 -42
  62. data/rbi/lib/terminal-shop/models/address.rbi +15 -51
  63. data/rbi/lib/terminal-shop/models/address_create_params.rbi +27 -48
  64. data/rbi/lib/terminal-shop/models/address_create_response.rbi +1 -6
  65. data/rbi/lib/terminal-shop/models/address_delete_params.rbi +2 -2
  66. data/rbi/lib/terminal-shop/models/address_delete_response.rbi +1 -6
  67. data/rbi/lib/terminal-shop/models/address_get_params.rbi +2 -2
  68. data/rbi/lib/terminal-shop/models/address_get_response.rbi +7 -6
  69. data/rbi/lib/terminal-shop/models/address_list_params.rbi +2 -2
  70. data/rbi/lib/terminal-shop/models/address_list_response.rbi +4 -6
  71. data/rbi/lib/terminal-shop/models/app.rbi +4 -24
  72. data/rbi/lib/terminal-shop/models/app_create_params.rbi +4 -14
  73. data/rbi/lib/terminal-shop/models/app_create_response.rbi +8 -20
  74. data/rbi/lib/terminal-shop/models/app_delete_params.rbi +2 -2
  75. data/rbi/lib/terminal-shop/models/app_delete_response.rbi +1 -6
  76. data/rbi/lib/terminal-shop/models/app_get_params.rbi +2 -2
  77. data/rbi/lib/terminal-shop/models/app_get_response.rbi +4 -6
  78. data/rbi/lib/terminal-shop/models/app_list_params.rbi +2 -2
  79. data/rbi/lib/terminal-shop/models/app_list_response.rbi +4 -6
  80. data/rbi/lib/terminal-shop/models/card.rbi +14 -36
  81. data/rbi/lib/terminal-shop/models/card_collect_params.rbi +2 -2
  82. data/rbi/lib/terminal-shop/models/card_collect_response.rbi +7 -14
  83. data/rbi/lib/terminal-shop/models/card_create_params.rbi +3 -8
  84. data/rbi/lib/terminal-shop/models/card_create_response.rbi +1 -6
  85. data/rbi/lib/terminal-shop/models/card_delete_params.rbi +2 -2
  86. data/rbi/lib/terminal-shop/models/card_delete_response.rbi +1 -6
  87. data/rbi/lib/terminal-shop/models/card_get_params.rbi +2 -2
  88. data/rbi/lib/terminal-shop/models/card_get_response.rbi +4 -6
  89. data/rbi/lib/terminal-shop/models/card_list_params.rbi +2 -2
  90. data/rbi/lib/terminal-shop/models/card_list_response.rbi +4 -6
  91. data/rbi/lib/terminal-shop/models/cart.rbi +34 -88
  92. data/rbi/lib/terminal-shop/models/cart_clear_params.rbi +2 -2
  93. data/rbi/lib/terminal-shop/models/cart_clear_response.rbi +1 -6
  94. data/rbi/lib/terminal-shop/models/cart_convert_params.rbi +2 -2
  95. data/rbi/lib/terminal-shop/models/cart_convert_response.rbi +4 -6
  96. data/rbi/lib/terminal-shop/models/cart_get_params.rbi +2 -2
  97. data/rbi/lib/terminal-shop/models/cart_get_response.rbi +4 -6
  98. data/rbi/lib/terminal-shop/models/cart_set_address_params.rbi +3 -8
  99. data/rbi/lib/terminal-shop/models/cart_set_address_response.rbi +1 -6
  100. data/rbi/lib/terminal-shop/models/cart_set_card_params.rbi +3 -8
  101. data/rbi/lib/terminal-shop/models/cart_set_card_response.rbi +1 -6
  102. data/rbi/lib/terminal-shop/models/cart_set_item_params.rbi +4 -14
  103. data/rbi/lib/terminal-shop/models/cart_set_item_response.rbi +4 -6
  104. data/rbi/lib/terminal-shop/models/email_create_params.rbi +3 -8
  105. data/rbi/lib/terminal-shop/models/email_create_response.rbi +1 -6
  106. data/rbi/lib/terminal-shop/models/order.rbi +52 -139
  107. data/rbi/lib/terminal-shop/models/order_create_params.rbi +5 -20
  108. data/rbi/lib/terminal-shop/models/order_create_response.rbi +1 -6
  109. data/rbi/lib/terminal-shop/models/order_get_params.rbi +2 -2
  110. data/rbi/lib/terminal-shop/models/order_get_response.rbi +4 -6
  111. data/rbi/lib/terminal-shop/models/order_list_params.rbi +2 -2
  112. data/rbi/lib/terminal-shop/models/order_list_response.rbi +4 -6
  113. data/rbi/lib/terminal-shop/models/product.rbi +43 -77
  114. data/rbi/lib/terminal-shop/models/product_get_params.rbi +2 -2
  115. data/rbi/lib/terminal-shop/models/product_get_response.rbi +7 -6
  116. data/rbi/lib/terminal-shop/models/product_list_params.rbi +2 -2
  117. data/rbi/lib/terminal-shop/models/product_list_response.rbi +4 -6
  118. data/rbi/lib/terminal-shop/models/product_variant.rbi +3 -18
  119. data/rbi/lib/terminal-shop/models/profile.rbi +12 -36
  120. data/rbi/lib/terminal-shop/models/profile_me_params.rbi +2 -2
  121. data/rbi/lib/terminal-shop/models/profile_me_response.rbi +7 -6
  122. data/rbi/lib/terminal-shop/models/profile_update_params.rbi +4 -14
  123. data/rbi/lib/terminal-shop/models/profile_update_response.rbi +7 -6
  124. data/rbi/lib/terminal-shop/models/region.rbi +10 -5
  125. data/rbi/lib/terminal-shop/models/subscription.rbi +28 -75
  126. data/rbi/lib/terminal-shop/models/subscription_create_params.rbi +2 -2
  127. data/rbi/lib/terminal-shop/models/subscription_create_response.rbi +1 -6
  128. data/rbi/lib/terminal-shop/models/subscription_delete_params.rbi +2 -2
  129. data/rbi/lib/terminal-shop/models/subscription_delete_response.rbi +1 -6
  130. data/rbi/lib/terminal-shop/models/subscription_get_params.rbi +2 -2
  131. data/rbi/lib/terminal-shop/models/subscription_get_response.rbi +7 -6
  132. data/rbi/lib/terminal-shop/models/subscription_list_params.rbi +2 -2
  133. data/rbi/lib/terminal-shop/models/subscription_list_response.rbi +3 -8
  134. data/rbi/lib/terminal-shop/models/token.rbi +3 -18
  135. data/rbi/lib/terminal-shop/models/token_create_params.rbi +2 -2
  136. data/rbi/lib/terminal-shop/models/token_create_response.rbi +8 -20
  137. data/rbi/lib/terminal-shop/models/token_delete_params.rbi +2 -2
  138. data/rbi/lib/terminal-shop/models/token_delete_response.rbi +1 -6
  139. data/rbi/lib/terminal-shop/models/token_get_params.rbi +2 -2
  140. data/rbi/lib/terminal-shop/models/token_get_response.rbi +4 -6
  141. data/rbi/lib/terminal-shop/models/token_list_params.rbi +2 -2
  142. data/rbi/lib/terminal-shop/models/token_list_response.rbi +4 -6
  143. data/rbi/lib/terminal-shop/models/view_init_params.rbi +2 -2
  144. data/rbi/lib/terminal-shop/models/view_init_response.rbi +44 -82
  145. data/rbi/lib/terminal-shop/request_options.rbi +8 -67
  146. data/rbi/lib/terminal-shop/resources/address.rbi +4 -4
  147. data/rbi/lib/terminal-shop/resources/app.rbi +4 -4
  148. data/rbi/lib/terminal-shop/resources/card.rbi +5 -5
  149. data/rbi/lib/terminal-shop/resources/cart.rbi +6 -6
  150. data/rbi/lib/terminal-shop/resources/email.rbi +1 -1
  151. data/rbi/lib/terminal-shop/resources/order.rbi +3 -3
  152. data/rbi/lib/terminal-shop/resources/product.rbi +2 -2
  153. data/rbi/lib/terminal-shop/resources/profile.rbi +2 -2
  154. data/rbi/lib/terminal-shop/resources/subscription.rbi +5 -4
  155. data/rbi/lib/terminal-shop/resources/token.rbi +4 -4
  156. data/rbi/lib/terminal-shop/resources/view.rbi +1 -1
  157. data/rbi/lib/terminal-shop/transport/base_client.rbi +208 -0
  158. data/rbi/lib/terminal-shop/transport/pooled_net_requester.rbi +64 -0
  159. data/rbi/lib/terminal-shop/type/array_of.rbi +82 -0
  160. data/rbi/lib/terminal-shop/type/base_model.rbi +194 -0
  161. data/rbi/lib/terminal-shop/type/base_page.rbi +38 -0
  162. data/rbi/lib/terminal-shop/type/boolean_model.rbi +41 -0
  163. data/rbi/lib/terminal-shop/type/converter.rbi +101 -0
  164. data/rbi/lib/terminal-shop/type/enum.rbi +58 -0
  165. data/rbi/lib/terminal-shop/type/hash_of.rbi +85 -0
  166. data/rbi/lib/terminal-shop/type/request_parameters.rbi +20 -0
  167. data/rbi/lib/terminal-shop/type/union.rbi +68 -0
  168. data/rbi/lib/terminal-shop/type/unknown.rbi +37 -0
  169. data/rbi/lib/terminal-shop/type.rbi +23 -0
  170. data/rbi/lib/terminal-shop/util.rbi +24 -13
  171. data/rbi/lib/terminal-shop/version.rbi +1 -1
  172. data/sig/terminal-shop/client.rbs +9 -9
  173. data/sig/terminal-shop/errors.rbs +17 -17
  174. data/sig/terminal-shop/models/address.rbs +11 -15
  175. data/sig/terminal-shop/models/address_create_params.rbs +12 -17
  176. data/sig/terminal-shop/models/address_create_response.rbs +1 -6
  177. data/sig/terminal-shop/models/address_delete_params.rbs +2 -7
  178. data/sig/terminal-shop/models/address_delete_response.rbs +1 -6
  179. data/sig/terminal-shop/models/address_get_params.rbs +2 -7
  180. data/sig/terminal-shop/models/address_get_response.rbs +1 -6
  181. data/sig/terminal-shop/models/address_list_params.rbs +2 -7
  182. data/sig/terminal-shop/models/address_list_response.rbs +1 -6
  183. data/sig/terminal-shop/models/app.rbs +6 -5
  184. data/sig/terminal-shop/models/app_create_params.rbs +6 -11
  185. data/sig/terminal-shop/models/app_create_response.rbs +4 -12
  186. data/sig/terminal-shop/models/app_delete_params.rbs +2 -7
  187. data/sig/terminal-shop/models/app_delete_response.rbs +1 -6
  188. data/sig/terminal-shop/models/app_get_params.rbs +2 -6
  189. data/sig/terminal-shop/models/app_get_response.rbs +1 -5
  190. data/sig/terminal-shop/models/app_list_params.rbs +2 -6
  191. data/sig/terminal-shop/models/app_list_response.rbs +1 -6
  192. data/sig/terminal-shop/models/card.rbs +7 -16
  193. data/sig/terminal-shop/models/card_collect_params.rbs +2 -7
  194. data/sig/terminal-shop/models/card_collect_response.rbs +4 -12
  195. data/sig/terminal-shop/models/card_create_params.rbs +5 -7
  196. data/sig/terminal-shop/models/card_create_response.rbs +1 -6
  197. data/sig/terminal-shop/models/card_delete_params.rbs +2 -7
  198. data/sig/terminal-shop/models/card_delete_response.rbs +1 -6
  199. data/sig/terminal-shop/models/card_get_params.rbs +2 -6
  200. data/sig/terminal-shop/models/card_get_response.rbs +1 -6
  201. data/sig/terminal-shop/models/card_list_params.rbs +2 -6
  202. data/sig/terminal-shop/models/card_list_response.rbs +1 -6
  203. data/sig/terminal-shop/models/cart.rbs +20 -34
  204. data/sig/terminal-shop/models/cart_clear_params.rbs +2 -7
  205. data/sig/terminal-shop/models/cart_clear_response.rbs +1 -6
  206. data/sig/terminal-shop/models/cart_convert_params.rbs +2 -7
  207. data/sig/terminal-shop/models/cart_convert_response.rbs +1 -6
  208. data/sig/terminal-shop/models/cart_get_params.rbs +2 -6
  209. data/sig/terminal-shop/models/cart_get_response.rbs +1 -6
  210. data/sig/terminal-shop/models/cart_set_address_params.rbs +5 -10
  211. data/sig/terminal-shop/models/cart_set_address_response.rbs +1 -6
  212. data/sig/terminal-shop/models/cart_set_card_params.rbs +5 -7
  213. data/sig/terminal-shop/models/cart_set_card_response.rbs +1 -6
  214. data/sig/terminal-shop/models/cart_set_item_params.rbs +6 -11
  215. data/sig/terminal-shop/models/cart_set_item_response.rbs +1 -6
  216. data/sig/terminal-shop/models/email_create_params.rbs +5 -7
  217. data/sig/terminal-shop/models/email_create_response.rbs +1 -6
  218. data/sig/terminal-shop/models/order.rbs +31 -50
  219. data/sig/terminal-shop/models/order_create_params.rbs +7 -12
  220. data/sig/terminal-shop/models/order_create_response.rbs +1 -6
  221. data/sig/terminal-shop/models/order_get_params.rbs +2 -6
  222. data/sig/terminal-shop/models/order_get_response.rbs +1 -6
  223. data/sig/terminal-shop/models/order_list_params.rbs +2 -7
  224. data/sig/terminal-shop/models/order_list_response.rbs +1 -6
  225. data/sig/terminal-shop/models/product.rbs +20 -27
  226. data/sig/terminal-shop/models/product_get_params.rbs +2 -7
  227. data/sig/terminal-shop/models/product_get_response.rbs +1 -6
  228. data/sig/terminal-shop/models/product_list_params.rbs +2 -7
  229. data/sig/terminal-shop/models/product_list_response.rbs +1 -6
  230. data/sig/terminal-shop/models/product_variant.rbs +1 -5
  231. data/sig/terminal-shop/models/profile.rbs +8 -17
  232. data/sig/terminal-shop/models/profile_me_params.rbs +2 -7
  233. data/sig/terminal-shop/models/profile_me_response.rbs +1 -6
  234. data/sig/terminal-shop/models/profile_update_params.rbs +6 -11
  235. data/sig/terminal-shop/models/profile_update_response.rbs +1 -6
  236. data/sig/terminal-shop/models/region.rbs +4 -2
  237. data/sig/terminal-shop/models/subscription.rbs +15 -27
  238. data/sig/terminal-shop/models/subscription_create_params.rbs +2 -7
  239. data/sig/terminal-shop/models/subscription_create_response.rbs +1 -6
  240. data/sig/terminal-shop/models/subscription_delete_params.rbs +2 -7
  241. data/sig/terminal-shop/models/subscription_delete_response.rbs +1 -6
  242. data/sig/terminal-shop/models/subscription_get_params.rbs +2 -7
  243. data/sig/terminal-shop/models/subscription_get_response.rbs +1 -6
  244. data/sig/terminal-shop/models/subscription_list_params.rbs +2 -7
  245. data/sig/terminal-shop/models/subscription_list_response.rbs +3 -6
  246. data/sig/terminal-shop/models/token.rbs +1 -5
  247. data/sig/terminal-shop/models/token_create_params.rbs +2 -7
  248. data/sig/terminal-shop/models/token_create_response.rbs +4 -12
  249. data/sig/terminal-shop/models/token_delete_params.rbs +2 -7
  250. data/sig/terminal-shop/models/token_delete_response.rbs +1 -6
  251. data/sig/terminal-shop/models/token_get_params.rbs +2 -6
  252. data/sig/terminal-shop/models/token_get_response.rbs +1 -6
  253. data/sig/terminal-shop/models/token_list_params.rbs +2 -7
  254. data/sig/terminal-shop/models/token_list_response.rbs +1 -6
  255. data/sig/terminal-shop/models/view_init_params.rbs +2 -6
  256. data/sig/terminal-shop/models/view_init_response.rbs +15 -23
  257. data/sig/terminal-shop/request_options.rbs +2 -12
  258. data/sig/terminal-shop/resources/address.rbs +22 -41
  259. data/sig/terminal-shop/resources/app.rbs +16 -34
  260. data/sig/terminal-shop/resources/card.rbs +18 -40
  261. data/sig/terminal-shop/resources/cart.rbs +22 -47
  262. data/sig/terminal-shop/resources/email.rbs +4 -8
  263. data/sig/terminal-shop/resources/order.rbs +13 -26
  264. data/sig/terminal-shop/resources/product.rbs +7 -16
  265. data/sig/terminal-shop/resources/profile.rbs +8 -16
  266. data/sig/terminal-shop/resources/subscription.rbs +21 -43
  267. data/sig/terminal-shop/resources/token.rbs +14 -32
  268. data/sig/terminal-shop/resources/view.rbs +3 -7
  269. data/sig/terminal-shop/transport/base_client.rbs +110 -0
  270. data/sig/terminal-shop/transport/pooled_net_requester.rbs +39 -0
  271. data/sig/terminal-shop/type/array_of.rbs +36 -0
  272. data/sig/terminal-shop/type/base_model.rbs +73 -0
  273. data/sig/terminal-shop/type/base_page.rbs +22 -0
  274. data/sig/terminal-shop/type/boolean_model.rbs +18 -0
  275. data/sig/terminal-shop/type/converter.rbs +42 -0
  276. data/sig/terminal-shop/type/enum.rbs +22 -0
  277. data/sig/terminal-shop/type/hash_of.rbs +36 -0
  278. data/sig/terminal-shop/type/request_parameters.rbs +13 -0
  279. data/sig/terminal-shop/type/union.rbs +40 -0
  280. data/sig/terminal-shop/type/unknown.rbs +18 -0
  281. data/sig/terminal-shop/type.rbs +22 -0
  282. data/sig/terminal-shop/util.rbs +5 -5
  283. data/sig/terminal-shop/version.rbs +1 -1
  284. metadata +41 -17
  285. data/lib/terminal-shop/base_client.rb +0 -456
  286. data/lib/terminal-shop/base_model.rb +0 -1188
  287. data/lib/terminal-shop/base_page.rb +0 -60
  288. data/lib/terminal-shop/extern.rb +0 -7
  289. data/lib/terminal-shop/pooled_net_requester.rb +0 -169
  290. data/rbi/lib/terminal-shop/base_client.rbi +0 -198
  291. data/rbi/lib/terminal-shop/base_model.rbi +0 -622
  292. data/rbi/lib/terminal-shop/base_page.rbi +0 -38
  293. data/rbi/lib/terminal-shop/extern.rbi +0 -7
  294. data/rbi/lib/terminal-shop/pooled_net_requester.rbi +0 -48
  295. data/sig/terminal-shop/base_client.rbs +0 -108
  296. data/sig/terminal-shop/base_model.rbs +0 -246
  297. data/sig/terminal-shop/base_page.rbs +0 -20
  298. data/sig/terminal-shop/extern.rbs +0 -4
  299. data/sig/terminal-shop/pooled_net_requester.rbs +0 -35
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerminalShop
4
+ module Type
5
+ # @api private
6
+ #
7
+ # @abstract
8
+ #
9
+ # Array of items of a given type.
10
+ class ArrayOf
11
+ include TerminalShop::Type::Converter
12
+
13
+ # @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Type::Converter, Class]
14
+ #
15
+ # @param spec [Hash{Symbol=>Object}] .
16
+ #
17
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
18
+ #
19
+ # @option spec [Proc] :enum
20
+ #
21
+ # @option spec [Proc] :union
22
+ #
23
+ # @option spec [Boolean] :"nil?"
24
+ def self.[](type_info, spec = {}) = new(type_info, spec)
25
+
26
+ # @param other [Object]
27
+ #
28
+ # @return [Boolean]
29
+ def ===(other) = other.is_a?(Array) && other.all?(item_type)
30
+
31
+ # @param other [Object]
32
+ #
33
+ # @return [Boolean]
34
+ def ==(other) = other.is_a?(TerminalShop::ArrayOf) && other.nilable? == nilable? && other.item_type == item_type
35
+
36
+ # @api private
37
+ #
38
+ # @param value [Enumerable, Object]
39
+ #
40
+ # @param state [Hash{Symbol=>Object}] .
41
+ #
42
+ # @option state [Boolean, :strong] :strictness
43
+ #
44
+ # @option state [Hash{Symbol=>Object}] :exactness
45
+ #
46
+ # @option state [Integer] :branched
47
+ #
48
+ # @return [Array<Object>, Object]
49
+ def coerce(value, state:)
50
+ exactness = state.fetch(:exactness)
51
+
52
+ unless value.is_a?(Array)
53
+ exactness[:no] += 1
54
+ return value
55
+ end
56
+
57
+ target = item_type
58
+ exactness[:yes] += 1
59
+ value
60
+ .map do |item|
61
+ case [nilable?, item]
62
+ in [true, nil]
63
+ exactness[:yes] += 1
64
+ nil
65
+ else
66
+ TerminalShop::Type::Converter.coerce(target, item, state: state)
67
+ end
68
+ end
69
+ end
70
+
71
+ # @api private
72
+ #
73
+ # @param value [Enumerable, Object]
74
+ #
75
+ # @return [Array<Object>, Object]
76
+ def dump(value)
77
+ target = item_type
78
+ value.is_a?(Array) ? value.map { TerminalShop::Type::Converter.dump(target, _1) } : super
79
+ end
80
+
81
+ # @api private
82
+ #
83
+ # @return [TerminalShop::Type::Converter, Class]
84
+ protected def item_type = @item_type_fn.call
85
+
86
+ # @api private
87
+ #
88
+ # @return [Boolean]
89
+ protected def nilable? = @nilable
90
+
91
+ # @api private
92
+ #
93
+ # @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Type::Converter, Class]
94
+ #
95
+ # @param spec [Hash{Symbol=>Object}] .
96
+ #
97
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
98
+ #
99
+ # @option spec [Proc] :enum
100
+ #
101
+ # @option spec [Proc] :union
102
+ #
103
+ # @option spec [Boolean] :"nil?"
104
+ def initialize(type_info, spec = {})
105
+ @item_type_fn = TerminalShop::Type::Converter.type_info(type_info || spec)
106
+ @nilable = spec[:nil?]
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,362 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerminalShop
4
+ module Type
5
+ # @abstract
6
+ #
7
+ # @example
8
+ # # `product_api` is a `TerminalShop::Models::ProductAPI`
9
+ # product_api => {
10
+ # id: id,
11
+ # description: description,
12
+ # name: name
13
+ # }
14
+ class BaseModel
15
+ extend TerminalShop::Type::Converter
16
+
17
+ class << self
18
+ # @api private
19
+ #
20
+ # Assumes superclass fields are totally defined before fields are accessed /
21
+ # defined on subclasses.
22
+ #
23
+ # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
24
+ def known_fields
25
+ @known_fields ||= (self < TerminalShop::BaseModel ? superclass.known_fields.dup : {})
26
+ end
27
+
28
+ # @api private
29
+ #
30
+ # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
31
+ def fields
32
+ known_fields.transform_values do |field|
33
+ {**field.except(:type_fn), type: field.fetch(:type_fn).call}
34
+ end
35
+ end
36
+
37
+ # @api private
38
+ #
39
+ # @param name_sym [Symbol]
40
+ #
41
+ # @param required [Boolean]
42
+ #
43
+ # @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Type::Converter, Class]
44
+ #
45
+ # @param spec [Hash{Symbol=>Object}] .
46
+ #
47
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
48
+ #
49
+ # @option spec [Proc] :enum
50
+ #
51
+ # @option spec [Proc] :union
52
+ #
53
+ # @option spec [Boolean] :"nil?"
54
+ private def add_field(name_sym, required:, type_info:, spec:)
55
+ type_fn, info =
56
+ case type_info
57
+ in Proc | TerminalShop::Type::Converter | Class
58
+ [TerminalShop::Type::Converter.type_info({**spec, union: type_info}), spec]
59
+ in Hash
60
+ [TerminalShop::Type::Converter.type_info(type_info), type_info]
61
+ end
62
+
63
+ setter = "#{name_sym}="
64
+ api_name = info.fetch(:api_name, name_sym)
65
+ nilable = info[:nil?]
66
+ const = if required && !nilable
67
+ info.fetch(
68
+ :const,
69
+ TerminalShop::Util::OMIT
70
+ )
71
+ else
72
+ TerminalShop::Util::OMIT
73
+ end
74
+
75
+ [name_sym, setter].each { undef_method(_1) } if known_fields.key?(name_sym)
76
+
77
+ known_fields[name_sym] =
78
+ {
79
+ mode: @mode,
80
+ api_name: api_name,
81
+ required: required,
82
+ nilable: nilable,
83
+ const: const,
84
+ type_fn: type_fn
85
+ }
86
+
87
+ define_method(setter) { @data.store(name_sym, _1) }
88
+
89
+ define_method(name_sym) do
90
+ target = type_fn.call
91
+ value = @data.fetch(name_sym) { const == TerminalShop::Util::OMIT ? nil : const }
92
+ state = {strictness: :strong, exactness: {yes: 0, no: 0, maybe: 0}, branched: 0}
93
+ if (nilable || !required) && value.nil?
94
+ nil
95
+ else
96
+ TerminalShop::Type::Converter.coerce(
97
+ target,
98
+ value,
99
+ state: state
100
+ )
101
+ end
102
+ rescue StandardError
103
+ cls = self.class.name.split("::").last
104
+ message = "Failed to parse #{cls}.#{__method__} from #{value.class} to #{target.inspect}. To get the unparsed API response, use #{cls}[:#{__method__}]."
105
+ raise TerminalShop::ConversionError.new(message)
106
+ end
107
+ end
108
+
109
+ # @api private
110
+ #
111
+ # @param name_sym [Symbol]
112
+ #
113
+ # @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Type::Converter, Class]
114
+ #
115
+ # @param spec [Hash{Symbol=>Object}] .
116
+ #
117
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
118
+ #
119
+ # @option spec [Proc] :enum
120
+ #
121
+ # @option spec [Proc] :union
122
+ #
123
+ # @option spec [Boolean] :"nil?"
124
+ def required(name_sym, type_info, spec = {})
125
+ add_field(name_sym, required: true, type_info: type_info, spec: spec)
126
+ end
127
+
128
+ # @api private
129
+ #
130
+ # @param name_sym [Symbol]
131
+ #
132
+ # @param type_info [Hash{Symbol=>Object}, Proc, TerminalShop::Type::Converter, Class]
133
+ #
134
+ # @param spec [Hash{Symbol=>Object}] .
135
+ #
136
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
137
+ #
138
+ # @option spec [Proc] :enum
139
+ #
140
+ # @option spec [Proc] :union
141
+ #
142
+ # @option spec [Boolean] :"nil?"
143
+ def optional(name_sym, type_info, spec = {})
144
+ add_field(name_sym, required: false, type_info: type_info, spec: spec)
145
+ end
146
+
147
+ # @api private
148
+ #
149
+ # `request_only` attributes not excluded from `.#coerce` when receiving responses
150
+ # even if well behaved servers should not send them
151
+ #
152
+ # @param blk [Proc]
153
+ private def request_only(&blk)
154
+ @mode = :dump
155
+ blk.call
156
+ ensure
157
+ @mode = nil
158
+ end
159
+
160
+ # @api private
161
+ #
162
+ # `response_only` attributes are omitted from `.#dump` when making requests
163
+ #
164
+ # @param blk [Proc]
165
+ private def response_only(&blk)
166
+ @mode = :coerce
167
+ blk.call
168
+ ensure
169
+ @mode = nil
170
+ end
171
+
172
+ # @param other [Object]
173
+ #
174
+ # @return [Boolean]
175
+ def ==(other) = other.is_a?(Class) && other <= TerminalShop::BaseModel && other.fields == fields
176
+ end
177
+
178
+ # @param other [Object]
179
+ #
180
+ # @return [Boolean]
181
+ def ==(other) = self.class == other.class && @data == other.to_h
182
+
183
+ class << self
184
+ # @api private
185
+ #
186
+ # @param value [TerminalShop::BaseModel, Hash{Object=>Object}, Object]
187
+ #
188
+ # @param state [Hash{Symbol=>Object}] .
189
+ #
190
+ # @option state [Boolean, :strong] :strictness
191
+ #
192
+ # @option state [Hash{Symbol=>Object}] :exactness
193
+ #
194
+ # @option state [Integer] :branched
195
+ #
196
+ # @return [TerminalShop::BaseModel, Object]
197
+ def coerce(value, state:)
198
+ exactness = state.fetch(:exactness)
199
+
200
+ if value.is_a?(self.class)
201
+ exactness[:yes] += 1
202
+ return value
203
+ end
204
+
205
+ unless (val = TerminalShop::Util.coerce_hash(value)).is_a?(Hash)
206
+ exactness[:no] += 1
207
+ return value
208
+ end
209
+ exactness[:yes] += 1
210
+
211
+ keys = val.keys.to_set
212
+ instance = new
213
+ data = instance.to_h
214
+
215
+ fields.each do |name, field|
216
+ mode, required, target = field.fetch_values(:mode, :required, :type)
217
+ api_name, nilable, const = field.fetch_values(:api_name, :nilable, :const)
218
+
219
+ unless val.key?(api_name)
220
+ if const != TerminalShop::Util::OMIT
221
+ exactness[:yes] += 1
222
+ elsif required && mode != :dump
223
+ exactness[nilable ? :maybe : :no] += 1
224
+ else
225
+ exactness[:yes] += 1
226
+ end
227
+ next
228
+ end
229
+
230
+ item = val.fetch(api_name)
231
+ keys.delete(api_name)
232
+
233
+ converted =
234
+ if item.nil? && (nilable || !required)
235
+ exactness[nilable ? :yes : :maybe] += 1
236
+ nil
237
+ else
238
+ coerced = TerminalShop::Type::Converter.coerce(target, item, state: state)
239
+ case target
240
+ in TerminalShop::Type::Converter | Symbol
241
+ coerced
242
+ else
243
+ item
244
+ end
245
+ end
246
+ data.store(name, converted)
247
+ end
248
+
249
+ keys.each { data.store(_1, val.fetch(_1)) }
250
+ instance
251
+ end
252
+
253
+ # @api private
254
+ #
255
+ # @param value [TerminalShop::BaseModel, Object]
256
+ #
257
+ # @return [Hash{Object=>Object}, Object]
258
+ def dump(value)
259
+ unless (coerced = TerminalShop::Util.coerce_hash(value)).is_a?(Hash)
260
+ return super
261
+ end
262
+
263
+ acc = {}
264
+
265
+ coerced.each do |key, val|
266
+ name = key.is_a?(String) ? key.to_sym : key
267
+ case (field = known_fields[name])
268
+ in nil
269
+ acc.store(name, super(val))
270
+ else
271
+ mode, api_name, type_fn = field.fetch_values(:mode, :api_name, :type_fn)
272
+ case mode
273
+ in :coerce
274
+ next
275
+ else
276
+ target = type_fn.call
277
+ acc.store(api_name, TerminalShop::Type::Converter.dump(target, val))
278
+ end
279
+ end
280
+ end
281
+
282
+ known_fields.each_value do |field|
283
+ mode, api_name, const = field.fetch_values(:mode, :api_name, :const)
284
+ next if mode == :coerce || acc.key?(api_name) || const == TerminalShop::Util::OMIT
285
+ acc.store(api_name, const)
286
+ end
287
+
288
+ acc
289
+ end
290
+ end
291
+
292
+ # Returns the raw value associated with the given key, if found. Otherwise, nil is
293
+ # returned.
294
+ #
295
+ # It is valid to lookup keys that are not in the API spec, for example to access
296
+ # undocumented features. This method does not parse response data into
297
+ # higher-level types. Lookup by anything other than a Symbol is an ArgumentError.
298
+ #
299
+ # @param key [Symbol]
300
+ #
301
+ # @return [Object, nil]
302
+ def [](key)
303
+ unless key.instance_of?(Symbol)
304
+ raise ArgumentError.new("Expected symbol key for lookup, got #{key.inspect}")
305
+ end
306
+
307
+ @data[key]
308
+ end
309
+
310
+ # Returns a Hash of the data underlying this object. O(1)
311
+ #
312
+ # Keys are Symbols and values are the raw values from the response. The return
313
+ # value indicates which values were ever set on the object. i.e. there will be a
314
+ # key in this hash if they ever were, even if the set value was nil.
315
+ #
316
+ # This method is not recursive. The returned value is shared by the object, so it
317
+ # should not be mutated.
318
+ #
319
+ # @return [Hash{Symbol=>Object}]
320
+ def to_h = @data
321
+
322
+ alias_method :to_hash, :to_h
323
+
324
+ # @param keys [Array<Symbol>, nil]
325
+ #
326
+ # @return [Hash{Symbol=>Object}]
327
+ def deconstruct_keys(keys)
328
+ (keys || self.class.known_fields.keys)
329
+ .filter_map do |k|
330
+ unless self.class.known_fields.key?(k)
331
+ next
332
+ end
333
+
334
+ [k, public_send(k)]
335
+ end
336
+ .to_h
337
+ end
338
+
339
+ # Create a new instance of a model.
340
+ #
341
+ # @param data [Hash{Symbol=>Object}, TerminalShop::BaseModel]
342
+ def initialize(data = {})
343
+ case TerminalShop::Util.coerce_hash(data)
344
+ in Hash => coerced
345
+ @data = coerced
346
+ else
347
+ raise ArgumentError.new("Expected a #{Hash} or #{TerminalShop::BaseModel}, got #{data.inspect}")
348
+ end
349
+ end
350
+
351
+ # @return [String]
352
+ def inspect
353
+ rows = self.class.known_fields.keys.map do
354
+ "#{_1}=#{@data.key?(_1) ? public_send(_1) : ''}"
355
+ rescue TerminalShop::ConversionError
356
+ "#{_1}=#{@data.fetch(_1)}"
357
+ end
358
+ "#<#{self.class.name}:0x#{object_id.to_s(16)} #{rows.join(' ')}>"
359
+ end
360
+ end
361
+ end
362
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerminalShop
4
+ module Type
5
+ # @example
6
+ # if page.has_next?
7
+ # page = page.next_page
8
+ # end
9
+ #
10
+ # @example
11
+ # page.auto_paging_each do |product|
12
+ # puts(product)
13
+ # end
14
+ #
15
+ # @example
16
+ # products =
17
+ # page
18
+ # .to_enum
19
+ # .lazy
20
+ # .select { _1.object_id.even? }
21
+ # .map(&:itself)
22
+ # .take(2)
23
+ # .to_a
24
+ #
25
+ # products => Array
26
+ module BasePage
27
+ # rubocop:disable Lint/UnusedMethodArgument
28
+
29
+ # @return [Boolean]
30
+ def next_page? = (raise NotImplementedError)
31
+
32
+ # @raise [TerminalShop::APIError]
33
+ # @return [TerminalShop::Type::BasePage]
34
+ def next_page = (raise NotImplementedError)
35
+
36
+ # @param blk [Proc]
37
+ #
38
+ # @return [void]
39
+ def auto_paging_each(&) = (raise NotImplementedError)
40
+
41
+ # @return [Enumerable]
42
+ def to_enum = super(:auto_paging_each)
43
+
44
+ alias_method :enum_for, :to_enum
45
+
46
+ # @api private
47
+ #
48
+ # @param client [TerminalShop::Transport::BaseClient]
49
+ # @param req [Hash{Symbol=>Object}]
50
+ # @param headers [Hash{String=>String}, Net::HTTPHeader]
51
+ # @param page_data [Object]
52
+ def initialize(client:, req:, headers:, page_data:)
53
+ @client = client
54
+ @req = req
55
+ super()
56
+ end
57
+
58
+ # rubocop:enable Lint/UnusedMethodArgument
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerminalShop
4
+ module Type
5
+ # @api private
6
+ #
7
+ # @abstract
8
+ #
9
+ # Ruby has no Boolean class; this is something for models to refer to.
10
+ class BooleanModel
11
+ extend TerminalShop::Type::Converter
12
+
13
+ # @param other [Object]
14
+ #
15
+ # @return [Boolean]
16
+ def self.===(other) = other == true || other == false
17
+
18
+ # @param other [Object]
19
+ #
20
+ # @return [Boolean]
21
+ def self.==(other) = other.is_a?(Class) && other <= TerminalShop::BooleanModel
22
+
23
+ class << self
24
+ # @api private
25
+ #
26
+ # @param value [Boolean, Object]
27
+ #
28
+ # @param state [Hash{Symbol=>Object}] .
29
+ #
30
+ # @option state [Boolean, :strong] :strictness
31
+ #
32
+ # @option state [Hash{Symbol=>Object}] :exactness
33
+ #
34
+ # @option state [Integer] :branched
35
+ #
36
+ # @return [Boolean, Object]
37
+ def coerce(value, state:)
38
+ state.fetch(:exactness)[value == true || value == false ? :yes : :no] += 1
39
+ value
40
+ end
41
+
42
+ # @!parse
43
+ # # @api private
44
+ # #
45
+ # # @param value [Boolean, Object]
46
+ # #
47
+ # # @return [Boolean, Object]
48
+ # def dump(value) = super
49
+ end
50
+ end
51
+ end
52
+ end