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
@@ -1,456 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module TerminalShop
4
- # @api private
5
- #
6
- # @abstract
7
- class BaseClient
8
- # from whatwg fetch spec
9
- MAX_REDIRECTS = 20
10
-
11
- # rubocop:disable Style/MutableConstant
12
- PLATFORM_HEADERS = {
13
- "x-stainless-arch" => TerminalShop::Util.arch,
14
- "x-stainless-lang" => "ruby",
15
- "x-stainless-os" => TerminalShop::Util.os,
16
- "x-stainless-package-version" => TerminalShop::VERSION,
17
- "x-stainless-runtime" => ::RUBY_ENGINE,
18
- "x-stainless-runtime-version" => ::RUBY_ENGINE_VERSION
19
- }
20
- # rubocop:enable Style/MutableConstant
21
-
22
- class << self
23
- # @api private
24
- #
25
- # @param req [Hash{Symbol=>Object}]
26
- #
27
- # @raise [ArgumentError]
28
- def validate!(req)
29
- keys = [:method, :path, :query, :headers, :body, :unwrap, :page, :stream, :model, :options]
30
- case req
31
- in Hash
32
- req.each_key do |k|
33
- unless keys.include?(k)
34
- raise ArgumentError.new("Request `req` keys must be one of #{keys}, got #{k.inspect}")
35
- end
36
- end
37
- else
38
- raise ArgumentError.new("Request `req` must be a Hash or RequestOptions, got #{req.inspect}")
39
- end
40
- end
41
-
42
- # @api private
43
- #
44
- # @param status [Integer]
45
- # @param headers [Hash{String=>String}, Net::HTTPHeader]
46
- #
47
- # @return [Boolean]
48
- def should_retry?(status, headers:)
49
- coerced = TerminalShop::Util.coerce_boolean(headers["x-should-retry"])
50
- case [coerced, status]
51
- in [true | false, _]
52
- coerced
53
- in [_, 408 | 409 | 429 | (500..)]
54
- # retry on:
55
- # 408: timeouts
56
- # 409: locks
57
- # 429: rate limits
58
- # 500+: unknown errors
59
- true
60
- else
61
- false
62
- end
63
- end
64
-
65
- # @api private
66
- #
67
- # @param request [Hash{Symbol=>Object}] .
68
- #
69
- # @option request [Symbol] :method
70
- #
71
- # @option request [URI::Generic] :url
72
- #
73
- # @option request [Hash{String=>String}] :headers
74
- #
75
- # @option request [Object] :body
76
- #
77
- # @option request [Integer] :max_retries
78
- #
79
- # @option request [Float] :timeout
80
- #
81
- # @param status [Integer]
82
- #
83
- # @param response_headers [Hash{String=>String}, Net::HTTPHeader]
84
- #
85
- # @return [Hash{Symbol=>Object}]
86
- def follow_redirect(request, status:, response_headers:)
87
- method, url, headers = request.fetch_values(:method, :url, :headers)
88
- location =
89
- Kernel.then do
90
- URI.join(url, response_headers["location"])
91
- rescue ArgumentError
92
- message = "Server responded with status #{status} but no valid location header."
93
- raise TerminalShop::APIConnectionError.new(url: url, message: message)
94
- end
95
-
96
- request = {**request, url: location}
97
-
98
- case [url.scheme, location.scheme]
99
- in ["https", "http"]
100
- message = "Tried to redirect to a insecure URL"
101
- raise TerminalShop::APIConnectionError.new(url: url, message: message)
102
- else
103
- nil
104
- end
105
-
106
- # from whatwg fetch spec
107
- case [status, method]
108
- in [301 | 302, :post] | [303, _]
109
- drop = %w[content-encoding content-language content-length content-location content-type]
110
- request = {
111
- **request,
112
- method: method == :head ? :head : :get,
113
- headers: headers.except(*drop),
114
- body: nil
115
- }
116
- else
117
- end
118
-
119
- # from undici
120
- if TerminalShop::Util.uri_origin(url) != TerminalShop::Util.uri_origin(location)
121
- drop = %w[authorization cookie host proxy-authorization]
122
- request = {**request, headers: request.fetch(:headers).except(*drop)}
123
- end
124
-
125
- request
126
- end
127
-
128
- # @api private
129
- #
130
- # @param status [Integer, TerminalShop::APIConnectionError]
131
- # @param stream [Enumerable, nil]
132
- def reap_connection!(status, stream:)
133
- case status
134
- in (..199) | (300..499)
135
- stream&.each { next }
136
- in TerminalShop::APIConnectionError | (500..)
137
- TerminalShop::Util.close_fused!(stream)
138
- else
139
- end
140
- end
141
- end
142
-
143
- # @api private
144
- # @return [TerminalShop::PooledNetRequester]
145
- attr_accessor :requester
146
-
147
- # @api private
148
- #
149
- # @param base_url [String]
150
- # @param timeout [Float]
151
- # @param max_retries [Integer]
152
- # @param initial_retry_delay [Float]
153
- # @param max_retry_delay [Float]
154
- # @param headers [Hash{String=>String, Integer, Array<String, Integer, nil>, nil}]
155
- # @param idempotency_header [String, nil]
156
- def initialize(
157
- base_url:,
158
- timeout: 0.0,
159
- max_retries: 0,
160
- initial_retry_delay: 0.0,
161
- max_retry_delay: 0.0,
162
- headers: {},
163
- idempotency_header: nil
164
- )
165
- @requester = TerminalShop::PooledNetRequester.new
166
- @headers = TerminalShop::Util.normalized_headers(
167
- self.class::PLATFORM_HEADERS,
168
- {
169
- "accept" => "application/json",
170
- "content-type" => "application/json"
171
- },
172
- headers
173
- )
174
- @base_url = TerminalShop::Util.parse_uri(base_url)
175
- @idempotency_header = idempotency_header&.to_s&.downcase
176
- @max_retries = max_retries
177
- @timeout = timeout
178
- @initial_retry_delay = initial_retry_delay
179
- @max_retry_delay = max_retry_delay
180
- end
181
-
182
- # @api private
183
- #
184
- # @return [Hash{String=>String}]
185
- private def auth_headers = {}
186
-
187
- # @api private
188
- #
189
- # @return [String]
190
- private def generate_idempotency_key = "stainless-ruby-retry-#{SecureRandom.uuid}"
191
-
192
- # @api private
193
- #
194
- # @param req [Hash{Symbol=>Object}] .
195
- #
196
- # @option req [Symbol] :method
197
- #
198
- # @option req [String, Array<String>] :path
199
- #
200
- # @option req [Hash{String=>Array<String>, String, nil}, nil] :query
201
- #
202
- # @option req [Hash{String=>String, Integer, Array<String, Integer, nil>, nil}, nil] :headers
203
- #
204
- # @option req [Object, nil] :body
205
- #
206
- # @option req [Symbol, nil] :unwrap
207
- #
208
- # @option req [Class, nil] :page
209
- #
210
- # @option req [Class, nil] :stream
211
- #
212
- # @option req [TerminalShop::Converter, Class, nil] :model
213
- #
214
- # @param opts [Hash{Symbol=>Object}] .
215
- #
216
- # @option opts [String, nil] :idempotency_key
217
- #
218
- # @option opts [Hash{String=>Array<String>, String, nil}, nil] :extra_query
219
- #
220
- # @option opts [Hash{String=>String, nil}, nil] :extra_headers
221
- #
222
- # @option opts [Hash{Symbol=>Object}, nil] :extra_body
223
- #
224
- # @option opts [Integer, nil] :max_retries
225
- #
226
- # @option opts [Float, nil] :timeout
227
- #
228
- # @return [Hash{Symbol=>Object}]
229
- private def build_request(req, opts)
230
- method, uninterpolated_path = req.fetch_values(:method, :path)
231
-
232
- path = TerminalShop::Util.interpolate_path(uninterpolated_path)
233
-
234
- query = TerminalShop::Util.deep_merge(req[:query].to_h, opts[:extra_query].to_h)
235
-
236
- headers = TerminalShop::Util.normalized_headers(
237
- @headers,
238
- auth_headers,
239
- req[:headers].to_h,
240
- opts[:extra_headers].to_h
241
- )
242
-
243
- if @idempotency_header &&
244
- !headers.key?(@idempotency_header) &&
245
- !Net::HTTP::IDEMPOTENT_METHODS_.include?(method.to_s.upcase)
246
- headers[@idempotency_header] = opts.fetch(:idempotency_key) { generate_idempotency_key }
247
- end
248
-
249
- unless headers.key?("x-stainless-retry-count")
250
- headers["x-stainless-retry-count"] = "0"
251
- end
252
-
253
- timeout = opts.fetch(:timeout, @timeout).to_f.clamp((0..))
254
- unless headers.key?("x-stainless-timeout") || timeout.zero?
255
- headers["x-stainless-timeout"] = timeout.to_s
256
- end
257
-
258
- headers.reject! { |_, v| v.to_s.empty? }
259
-
260
- body =
261
- case method
262
- in :get | :head | :options | :trace
263
- nil
264
- else
265
- TerminalShop::Util.deep_merge(*[req[:body], opts[:extra_body]].compact)
266
- end
267
-
268
- headers, encoded = TerminalShop::Util.encode_content(headers, body)
269
- {
270
- method: method,
271
- url: TerminalShop::Util.join_parsed_uri(@base_url, {**req, path: path, query: query}),
272
- headers: headers,
273
- body: encoded,
274
- max_retries: opts.fetch(:max_retries, @max_retries),
275
- timeout: timeout
276
- }
277
- end
278
-
279
- # @api private
280
- #
281
- # @param headers [Hash{String=>String}]
282
- # @param retry_count [Integer]
283
- #
284
- # @return [Float]
285
- private def retry_delay(headers, retry_count:)
286
- # Non-standard extension
287
- span = Float(headers["retry-after-ms"], exception: false)&.then { _1 / 1000 }
288
- return span if span
289
-
290
- retry_header = headers["retry-after"]
291
- return span if (span = Float(retry_header, exception: false))
292
-
293
- span = retry_header&.then do
294
- Time.httpdate(_1) - Time.now
295
- rescue ArgumentError
296
- nil
297
- end
298
- return span if span
299
-
300
- scale = retry_count**2
301
- jitter = 1 - (0.25 * rand)
302
- (@initial_retry_delay * scale * jitter).clamp(0, @max_retry_delay)
303
- end
304
-
305
- # @api private
306
- #
307
- # @param request [Hash{Symbol=>Object}] .
308
- #
309
- # @option request [Symbol] :method
310
- #
311
- # @option request [URI::Generic] :url
312
- #
313
- # @option request [Hash{String=>String}] :headers
314
- #
315
- # @option request [Object] :body
316
- #
317
- # @option request [Integer] :max_retries
318
- #
319
- # @option request [Float] :timeout
320
- #
321
- # @param redirect_count [Integer]
322
- #
323
- # @param retry_count [Integer]
324
- #
325
- # @param send_retry_header [Boolean]
326
- #
327
- # @raise [TerminalShop::APIError]
328
- # @return [Array(Integer, Net::HTTPResponse, Enumerable)]
329
- private def send_request(request, redirect_count:, retry_count:, send_retry_header:)
330
- url, headers, max_retries, timeout = request.fetch_values(:url, :headers, :max_retries, :timeout)
331
- input = {**request.except(:timeout), deadline: TerminalShop::Util.monotonic_secs + timeout}
332
-
333
- if send_retry_header
334
- headers["x-stainless-retry-count"] = retry_count.to_s
335
- end
336
-
337
- begin
338
- status, response, stream = @requester.execute(input)
339
- rescue TerminalShop::APIConnectionError => e
340
- status = e
341
- end
342
-
343
- case status
344
- in ..299
345
- [status, response, stream]
346
- in 300..399 if redirect_count >= self.class::MAX_REDIRECTS
347
- self.class.reap_connection!(status, stream: stream)
348
-
349
- message = "Failed to complete the request within #{self.class::MAX_REDIRECTS} redirects."
350
- raise TerminalShop::APIConnectionError.new(url: url, message: message)
351
- in 300..399
352
- self.class.reap_connection!(status, stream: stream)
353
-
354
- request = self.class.follow_redirect(request, status: status, response_headers: response)
355
- send_request(
356
- request,
357
- redirect_count: redirect_count + 1,
358
- retry_count: retry_count,
359
- send_retry_header: send_retry_header
360
- )
361
- in TerminalShop::APIConnectionError if retry_count >= max_retries
362
- raise status
363
- in (400..) if retry_count >= max_retries || !self.class.should_retry?(status, headers: response)
364
- decoded = Kernel.then do
365
- TerminalShop::Util.decode_content(response, stream: stream, suppress_error: true)
366
- ensure
367
- self.class.reap_connection!(status, stream: stream)
368
- end
369
-
370
- raise TerminalShop::APIStatusError.for(
371
- url: url,
372
- status: status,
373
- body: decoded,
374
- request: nil,
375
- response: response
376
- )
377
- in (400..) | TerminalShop::APIConnectionError
378
- self.class.reap_connection!(status, stream: stream)
379
-
380
- delay = retry_delay(response, retry_count: retry_count)
381
- sleep(delay)
382
-
383
- send_request(
384
- request,
385
- redirect_count: redirect_count,
386
- retry_count: retry_count + 1,
387
- send_retry_header: send_retry_header
388
- )
389
- end
390
- end
391
-
392
- # Execute the request specified by `req`. This is the method that all resource
393
- # methods call into.
394
- #
395
- # @param req [Hash{Symbol=>Object}] .
396
- #
397
- # @option req [Symbol] :method
398
- #
399
- # @option req [String, Array<String>] :path
400
- #
401
- # @option req [Hash{String=>Array<String>, String, nil}, nil] :query
402
- #
403
- # @option req [Hash{String=>String, Integer, Array<String, Integer, nil>, nil}, nil] :headers
404
- #
405
- # @option req [Object, nil] :body
406
- #
407
- # @option req [Symbol, nil] :unwrap
408
- #
409
- # @option req [Class, nil] :page
410
- #
411
- # @option req [Class, nil] :stream
412
- #
413
- # @option req [TerminalShop::Converter, Class, nil] :model
414
- #
415
- # @option req [TerminalShop::RequestOptions, Hash{Symbol=>Object}, nil] :options
416
- #
417
- # @raise [TerminalShop::APIError]
418
- # @return [Object]
419
- def request(req)
420
- self.class.validate!(req)
421
- model = req.fetch(:model) { TerminalShop::Unknown }
422
- opts = req[:options].to_h
423
- TerminalShop::RequestOptions.validate!(opts)
424
- request = build_request(req.except(:options), opts)
425
- url = request.fetch(:url)
426
-
427
- # Don't send the current retry count in the headers if the caller modified the header defaults.
428
- send_retry_header = request.fetch(:headers)["x-stainless-retry-count"] == "0"
429
- status, response, stream = send_request(
430
- request,
431
- redirect_count: 0,
432
- retry_count: 0,
433
- send_retry_header: send_retry_header
434
- )
435
-
436
- decoded = TerminalShop::Util.decode_content(response, stream: stream)
437
- case req
438
- in { stream: Class => st }
439
- st.new(model: model, url: url, status: status, response: response, messages: decoded)
440
- in { page: Class => page }
441
- page.new(client: self, req: req, headers: response, page_data: decoded)
442
- else
443
- unwrapped = TerminalShop::Util.dig(decoded, req[:unwrap])
444
- TerminalShop::Converter.coerce(model, unwrapped)
445
- end
446
- end
447
-
448
- # @return [String]
449
- def inspect
450
- # rubocop:disable Layout/LineLength
451
- base_url = TerminalShop::Util.unparse_uri(@base_url)
452
- "#<#{self.class.name}:0x#{object_id.to_s(16)} base_url=#{base_url} max_retries=#{@max_retries} timeout=#{@timeout}>"
453
- # rubocop:enable Layout/LineLength
454
- end
455
- end
456
- end