terminal-shop 2.1.2 → 3.5.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 (534) hide show
  1. checksums.yaml +4 -4
  2. data/.ignore +2 -0
  3. data/CHANGELOG.md +674 -0
  4. data/README.md +88 -28
  5. data/SECURITY.md +27 -0
  6. data/lib/{terminal-shop → terminal_shop}/client.rb +19 -24
  7. data/lib/terminal_shop/errors.rb +192 -0
  8. data/lib/terminal_shop/file_part.rb +55 -0
  9. data/lib/terminal_shop/internal/transport/base_client.rb +486 -0
  10. data/lib/terminal_shop/internal/transport/pooled_net_requester.rb +193 -0
  11. data/lib/terminal_shop/internal/type/array_of.rb +154 -0
  12. data/lib/terminal_shop/internal/type/base_model.rb +443 -0
  13. data/lib/terminal_shop/internal/type/base_page.rb +55 -0
  14. data/lib/terminal_shop/internal/type/boolean.rb +64 -0
  15. data/lib/terminal_shop/internal/type/converter.rb +274 -0
  16. data/lib/terminal_shop/internal/type/enum.rb +133 -0
  17. data/lib/terminal_shop/internal/type/file_input.rb +96 -0
  18. data/lib/terminal_shop/internal/type/hash_of.rb +174 -0
  19. data/lib/terminal_shop/internal/type/request_parameters.rb +48 -0
  20. data/lib/terminal_shop/internal/type/union.rb +220 -0
  21. data/lib/terminal_shop/internal/type/unknown.rb +68 -0
  22. data/lib/terminal_shop/internal/util.rb +790 -0
  23. data/lib/terminal_shop/internal.rb +11 -0
  24. data/lib/terminal_shop/models/address.rb +93 -0
  25. data/lib/terminal_shop/models/address_create_params.rb +78 -0
  26. data/lib/terminal_shop/models/address_create_response.rb +17 -0
  27. data/lib/terminal_shop/models/address_delete_params.rb +14 -0
  28. data/lib/terminal_shop/models/address_delete_response.rb +16 -0
  29. data/lib/terminal_shop/models/address_get_params.rb +14 -0
  30. data/lib/{terminal-shop → terminal_shop}/models/address_get_response.rb +4 -7
  31. data/lib/terminal_shop/models/address_list_params.rb +14 -0
  32. data/lib/terminal_shop/models/address_list_response.rb +17 -0
  33. data/lib/{terminal-shop → terminal_shop}/models/app.rb +14 -12
  34. data/lib/terminal_shop/models/app_create_params.rb +26 -0
  35. data/lib/{terminal-shop → terminal_shop}/models/app_create_response.rb +10 -15
  36. data/lib/terminal_shop/models/app_delete_params.rb +14 -0
  37. data/lib/terminal_shop/models/app_delete_response.rb +16 -0
  38. data/lib/terminal_shop/models/app_get_params.rb +14 -0
  39. data/lib/{terminal-shop → terminal_shop}/models/app_get_response.rb +4 -7
  40. data/lib/terminal_shop/models/app_list_params.rb +14 -0
  41. data/lib/terminal_shop/models/app_list_response.rb +17 -0
  42. data/lib/terminal_shop/models/card.rb +75 -0
  43. data/lib/terminal_shop/models/card_collect_params.rb +14 -0
  44. data/lib/terminal_shop/models/card_collect_response.rb +36 -0
  45. data/lib/terminal_shop/models/card_create_params.rb +27 -0
  46. data/lib/terminal_shop/models/card_create_response.rb +17 -0
  47. data/lib/terminal_shop/models/card_delete_params.rb +14 -0
  48. data/lib/terminal_shop/models/card_delete_response.rb +16 -0
  49. data/lib/terminal_shop/models/card_get_params.rb +14 -0
  50. data/lib/{terminal-shop → terminal_shop}/models/card_get_response.rb +4 -7
  51. data/lib/terminal_shop/models/card_list_params.rb +14 -0
  52. data/lib/terminal_shop/models/card_list_response.rb +17 -0
  53. data/lib/terminal_shop/models/cart.rb +150 -0
  54. data/lib/terminal_shop/models/cart_clear_params.rb +14 -0
  55. data/lib/terminal_shop/models/cart_clear_response.rb +16 -0
  56. data/lib/terminal_shop/models/cart_convert_params.rb +14 -0
  57. data/lib/{terminal-shop → terminal_shop}/models/cart_convert_response.rb +4 -7
  58. data/lib/terminal_shop/models/cart_get_params.rb +14 -0
  59. data/lib/{terminal-shop → terminal_shop}/models/cart_get_response.rb +4 -7
  60. data/lib/terminal_shop/models/cart_set_address_params.rb +22 -0
  61. data/lib/terminal_shop/models/cart_set_address_response.rb +16 -0
  62. data/lib/terminal_shop/models/cart_set_card_params.rb +22 -0
  63. data/lib/terminal_shop/models/cart_set_card_response.rb +16 -0
  64. data/lib/terminal_shop/models/cart_set_item_params.rb +30 -0
  65. data/lib/{terminal-shop → terminal_shop}/models/cart_set_item_response.rb +4 -7
  66. data/lib/terminal_shop/models/email_create_params.rb +22 -0
  67. data/lib/terminal_shop/models/email_create_response.rb +16 -0
  68. data/lib/terminal_shop/models/order.rb +278 -0
  69. data/lib/terminal_shop/models/order_create_params.rb +38 -0
  70. data/lib/terminal_shop/models/order_create_response.rb +17 -0
  71. data/lib/terminal_shop/models/order_get_params.rb +14 -0
  72. data/lib/{terminal-shop → terminal_shop}/models/order_get_response.rb +4 -7
  73. data/lib/terminal_shop/models/order_list_params.rb +14 -0
  74. data/lib/terminal_shop/models/order_list_response.rb +17 -0
  75. data/lib/terminal_shop/models/product.rb +125 -0
  76. data/lib/terminal_shop/models/product_get_params.rb +14 -0
  77. data/lib/{terminal-shop → terminal_shop}/models/product_get_response.rb +4 -7
  78. data/lib/terminal_shop/models/product_list_params.rb +14 -0
  79. data/lib/terminal_shop/models/product_list_response.rb +17 -0
  80. data/lib/terminal_shop/models/product_variant.rb +84 -0
  81. data/lib/{terminal-shop → terminal_shop}/models/profile.rb +22 -22
  82. data/lib/terminal_shop/models/profile_me_params.rb +14 -0
  83. data/lib/{terminal-shop → terminal_shop}/models/profile_me_response.rb +4 -7
  84. data/lib/terminal_shop/models/profile_update_params.rb +26 -0
  85. data/lib/{terminal-shop → terminal_shop}/models/profile_update_response.rb +4 -7
  86. data/lib/{terminal-shop → terminal_shop}/models/region.rb +4 -6
  87. data/lib/terminal_shop/models/subscription.rb +125 -0
  88. data/lib/terminal_shop/models/subscription_create_params.rb +14 -0
  89. data/lib/terminal_shop/models/subscription_create_response.rb +16 -0
  90. data/lib/terminal_shop/models/subscription_delete_params.rb +14 -0
  91. data/lib/terminal_shop/models/subscription_delete_response.rb +16 -0
  92. data/lib/terminal_shop/models/subscription_get_params.rb +14 -0
  93. data/lib/{terminal-shop → terminal_shop}/models/subscription_get_response.rb +4 -7
  94. data/lib/terminal_shop/models/subscription_list_params.rb +14 -0
  95. data/lib/terminal_shop/models/subscription_list_response.rb +17 -0
  96. data/lib/terminal_shop/models/subscription_update_params.rb +76 -0
  97. data/lib/terminal_shop/models/subscription_update_response.rb +17 -0
  98. data/lib/terminal_shop/models/token.rb +38 -0
  99. data/lib/terminal_shop/models/token_create_params.rb +14 -0
  100. data/lib/terminal_shop/models/token_create_response.rb +41 -0
  101. data/lib/terminal_shop/models/token_delete_params.rb +14 -0
  102. data/lib/terminal_shop/models/token_delete_response.rb +16 -0
  103. data/lib/terminal_shop/models/token_get_params.rb +14 -0
  104. data/lib/terminal_shop/models/token_get_response.rb +22 -0
  105. data/lib/terminal_shop/models/token_list_params.rb +14 -0
  106. data/lib/terminal_shop/models/token_list_response.rb +17 -0
  107. data/lib/terminal_shop/models/view_init_params.rb +14 -0
  108. data/lib/terminal_shop/models/view_init_response.rb +97 -0
  109. data/lib/{terminal-shop → terminal_shop}/request_options.rb +14 -15
  110. data/lib/{terminal-shop → terminal_shop}/resources/address.rb +28 -18
  111. data/lib/{terminal-shop → terminal_shop}/resources/app.rb +22 -14
  112. data/lib/{terminal-shop → terminal_shop}/resources/card.rb +30 -15
  113. data/lib/{terminal-shop → terminal_shop}/resources/cart.rb +30 -16
  114. data/lib/{terminal-shop → terminal_shop}/resources/email.rb +7 -3
  115. data/lib/{terminal-shop → terminal_shop}/resources/order.rb +18 -10
  116. data/lib/{terminal-shop → terminal_shop}/resources/product.rb +11 -5
  117. data/lib/{terminal-shop → terminal_shop}/resources/profile.rb +12 -8
  118. data/lib/terminal_shop/resources/subscription.rb +141 -0
  119. data/lib/{terminal-shop → terminal_shop}/resources/token.rb +20 -10
  120. data/lib/{terminal-shop → terminal_shop}/resources/view.rb +7 -3
  121. data/lib/{terminal-shop → terminal_shop}/version.rb +1 -1
  122. data/lib/terminal_shop.rb +144 -0
  123. data/rbi/lib/{terminal-shop → terminal_shop}/client.rbi +18 -19
  124. data/rbi/lib/terminal_shop/errors.rbi +143 -0
  125. data/rbi/lib/terminal_shop/file_part.rbi +34 -0
  126. data/rbi/lib/terminal_shop/internal/transport/base_client.rbi +213 -0
  127. data/rbi/lib/terminal_shop/internal/transport/pooled_net_requester.rbi +60 -0
  128. data/rbi/lib/terminal_shop/internal/type/array_of.rbi +88 -0
  129. data/rbi/lib/terminal_shop/internal/type/base_model.rbi +220 -0
  130. data/rbi/lib/terminal_shop/internal/type/base_page.rbi +38 -0
  131. data/rbi/lib/terminal_shop/internal/type/boolean.rbi +48 -0
  132. data/rbi/lib/terminal_shop/internal/type/converter.rbi +120 -0
  133. data/rbi/lib/terminal_shop/internal/type/enum.rbi +66 -0
  134. data/rbi/lib/terminal_shop/internal/type/file_input.rbi +50 -0
  135. data/rbi/lib/terminal_shop/internal/type/hash_of.rbi +88 -0
  136. data/rbi/lib/terminal_shop/internal/type/request_parameters.rbi +21 -0
  137. data/rbi/lib/terminal_shop/internal/type/union.rbi +80 -0
  138. data/rbi/lib/terminal_shop/internal/type/unknown.rbi +40 -0
  139. data/rbi/lib/terminal_shop/internal/util.rbi +302 -0
  140. data/rbi/lib/terminal_shop/internal.rbi +11 -0
  141. data/rbi/lib/{terminal-shop → terminal_shop}/models/address.rbi +30 -6
  142. data/rbi/lib/{terminal-shop → terminal_shop}/models/address_create_params.rbi +14 -9
  143. data/rbi/lib/{terminal-shop → terminal_shop}/models/address_create_response.rbi +6 -6
  144. data/rbi/lib/terminal_shop/models/address_delete_params.rbi +19 -0
  145. data/rbi/lib/{terminal-shop → terminal_shop}/models/address_delete_response.rbi +3 -5
  146. data/rbi/lib/terminal_shop/models/address_get_params.rbi +19 -0
  147. data/rbi/lib/{terminal-shop → terminal_shop}/models/address_get_response.rbi +8 -8
  148. data/rbi/lib/terminal_shop/models/address_list_params.rbi +19 -0
  149. data/rbi/lib/{terminal-shop → terminal_shop}/models/address_list_response.rbi +7 -7
  150. data/rbi/lib/{terminal-shop → terminal_shop}/models/app.rbi +12 -6
  151. data/rbi/lib/{terminal-shop → terminal_shop}/models/app_create_params.rbi +6 -8
  152. data/rbi/lib/{terminal-shop → terminal_shop}/models/app_create_response.rbi +13 -13
  153. data/rbi/lib/terminal_shop/models/app_delete_params.rbi +19 -0
  154. data/rbi/lib/{terminal-shop → terminal_shop}/models/app_delete_response.rbi +3 -5
  155. data/rbi/lib/terminal_shop/models/app_get_params.rbi +19 -0
  156. data/rbi/lib/terminal_shop/models/app_get_response.rbi +25 -0
  157. data/rbi/lib/terminal_shop/models/app_list_params.rbi +19 -0
  158. data/rbi/lib/{terminal-shop → terminal_shop}/models/app_list_response.rbi +7 -7
  159. data/rbi/lib/{terminal-shop → terminal_shop}/models/card.rbi +32 -15
  160. data/rbi/lib/terminal_shop/models/card_collect_params.rbi +19 -0
  161. data/rbi/lib/{terminal-shop → terminal_shop}/models/card_collect_response.rbi +16 -15
  162. data/rbi/lib/terminal_shop/models/card_create_params.rbi +31 -0
  163. data/rbi/lib/{terminal-shop → terminal_shop}/models/card_create_response.rbi +6 -6
  164. data/rbi/lib/terminal_shop/models/card_delete_params.rbi +19 -0
  165. data/rbi/lib/{terminal-shop → terminal_shop}/models/card_delete_response.rbi +3 -5
  166. data/rbi/lib/terminal_shop/models/card_get_params.rbi +19 -0
  167. data/rbi/lib/terminal_shop/models/card_get_response.rbi +25 -0
  168. data/rbi/lib/terminal_shop/models/card_list_params.rbi +19 -0
  169. data/rbi/lib/{terminal-shop → terminal_shop}/models/card_list_response.rbi +7 -7
  170. data/rbi/lib/{terminal-shop → terminal_shop}/models/cart.rbi +51 -29
  171. data/rbi/lib/terminal_shop/models/cart_clear_params.rbi +19 -0
  172. data/rbi/lib/{terminal-shop → terminal_shop}/models/cart_clear_response.rbi +3 -5
  173. data/rbi/lib/terminal_shop/models/cart_convert_params.rbi +19 -0
  174. data/rbi/lib/terminal_shop/models/cart_convert_response.rbi +25 -0
  175. data/rbi/lib/terminal_shop/models/cart_get_params.rbi +19 -0
  176. data/rbi/lib/terminal_shop/models/cart_get_response.rbi +25 -0
  177. data/rbi/lib/{terminal-shop → terminal_shop}/models/cart_set_address_params.rbi +10 -9
  178. data/rbi/lib/{terminal-shop → terminal_shop}/models/cart_set_address_response.rbi +3 -5
  179. data/rbi/lib/terminal_shop/models/cart_set_card_params.rbi +29 -0
  180. data/rbi/lib/{terminal-shop → terminal_shop}/models/cart_set_card_response.rbi +3 -5
  181. data/rbi/lib/{terminal-shop → terminal_shop}/models/cart_set_item_params.rbi +12 -9
  182. data/rbi/lib/terminal_shop/models/cart_set_item_response.rbi +25 -0
  183. data/rbi/lib/terminal_shop/models/email_create_params.rbi +29 -0
  184. data/rbi/lib/{terminal-shop → terminal_shop}/models/email_create_response.rbi +3 -5
  185. data/rbi/lib/{terminal-shop → terminal_shop}/models/order.rbi +149 -36
  186. data/rbi/lib/{terminal-shop → terminal_shop}/models/order_create_params.rbi +14 -9
  187. data/rbi/lib/{terminal-shop → terminal_shop}/models/order_create_response.rbi +6 -6
  188. data/rbi/lib/terminal_shop/models/order_get_params.rbi +19 -0
  189. data/rbi/lib/terminal_shop/models/order_get_response.rbi +25 -0
  190. data/rbi/lib/terminal_shop/models/order_list_params.rbi +19 -0
  191. data/rbi/lib/{terminal-shop → terminal_shop}/models/order_list_response.rbi +7 -7
  192. data/rbi/lib/{terminal-shop → terminal_shop}/models/product.rbi +44 -24
  193. data/rbi/lib/terminal_shop/models/product_get_params.rbi +19 -0
  194. data/rbi/lib/{terminal-shop → terminal_shop}/models/product_get_response.rbi +8 -8
  195. data/rbi/lib/terminal_shop/models/product_list_params.rbi +19 -0
  196. data/rbi/lib/{terminal-shop → terminal_shop}/models/product_list_response.rbi +7 -7
  197. data/rbi/lib/terminal_shop/models/product_variant.rbi +109 -0
  198. data/rbi/lib/{terminal-shop → terminal_shop}/models/profile.rbi +22 -14
  199. data/rbi/lib/terminal_shop/models/profile_me_params.rbi +19 -0
  200. data/rbi/lib/{terminal-shop → terminal_shop}/models/profile_me_response.rbi +8 -8
  201. data/rbi/lib/{terminal-shop → terminal_shop}/models/profile_update_params.rbi +6 -8
  202. data/rbi/lib/{terminal-shop → terminal_shop}/models/profile_update_response.rbi +8 -8
  203. data/rbi/lib/{terminal-shop → terminal_shop}/models/region.rbi +4 -4
  204. data/rbi/lib/{terminal-shop → terminal_shop}/models/subscription.rbi +44 -21
  205. data/rbi/lib/{terminal-shop → terminal_shop}/models/subscription_create_params.rbi +5 -7
  206. data/rbi/lib/{terminal-shop → terminal_shop}/models/subscription_create_response.rbi +3 -5
  207. data/rbi/lib/terminal_shop/models/subscription_delete_params.rbi +19 -0
  208. data/rbi/lib/{terminal-shop → terminal_shop}/models/subscription_delete_response.rbi +3 -5
  209. data/rbi/lib/terminal_shop/models/subscription_get_params.rbi +19 -0
  210. data/rbi/lib/{terminal-shop → terminal_shop}/models/subscription_get_response.rbi +8 -8
  211. data/rbi/lib/terminal_shop/models/subscription_list_params.rbi +19 -0
  212. data/rbi/lib/{terminal-shop → terminal_shop}/models/subscription_list_response.rbi +7 -7
  213. data/rbi/lib/terminal_shop/models/subscription_update_params.rbi +125 -0
  214. data/rbi/lib/terminal_shop/models/subscription_update_response.rbi +25 -0
  215. data/rbi/lib/{terminal-shop → terminal_shop}/models/token.rbi +11 -7
  216. data/rbi/lib/terminal_shop/models/token_create_params.rbi +19 -0
  217. data/rbi/lib/{terminal-shop → terminal_shop}/models/token_create_response.rbi +15 -14
  218. data/rbi/lib/terminal_shop/models/token_delete_params.rbi +19 -0
  219. data/rbi/lib/{terminal-shop → terminal_shop}/models/token_delete_response.rbi +3 -5
  220. data/rbi/lib/terminal_shop/models/token_get_params.rbi +19 -0
  221. data/rbi/lib/terminal_shop/models/token_get_response.rbi +27 -0
  222. data/rbi/lib/terminal_shop/models/token_list_params.rbi +19 -0
  223. data/rbi/lib/{terminal-shop → terminal_shop}/models/token_list_response.rbi +7 -7
  224. data/rbi/lib/terminal_shop/models/view_init_params.rbi +19 -0
  225. data/rbi/lib/{terminal-shop → terminal_shop}/models/view_init_response.rbi +25 -25
  226. data/rbi/lib/{terminal-shop → terminal_shop}/request_options.rbi +11 -13
  227. data/rbi/lib/{terminal-shop → terminal_shop}/resources/address.rbi +17 -17
  228. data/rbi/lib/{terminal-shop → terminal_shop}/resources/app.rbi +17 -16
  229. data/rbi/lib/{terminal-shop → terminal_shop}/resources/card.rbi +28 -22
  230. data/rbi/lib/{terminal-shop → terminal_shop}/resources/cart.rbi +35 -23
  231. data/rbi/lib/{terminal-shop → terminal_shop}/resources/email.rbi +4 -6
  232. data/rbi/lib/{terminal-shop → terminal_shop}/resources/order.rbi +15 -13
  233. data/rbi/lib/{terminal-shop → terminal_shop}/resources/product.rbi +13 -9
  234. data/rbi/lib/{terminal-shop → terminal_shop}/resources/profile.rbi +13 -8
  235. data/rbi/lib/{terminal-shop → terminal_shop}/resources/subscription.rbi +49 -17
  236. data/rbi/lib/{terminal-shop → terminal_shop}/resources/token.rbi +24 -16
  237. data/rbi/lib/{terminal-shop → terminal_shop}/resources/view.rbi +12 -6
  238. data/rbi/lib/{terminal-shop → terminal_shop}/version.rbi +1 -1
  239. data/sig/{terminal-shop → terminal_shop}/client.rbs +3 -3
  240. data/sig/terminal_shop/errors.rbs +101 -0
  241. data/sig/terminal_shop/file_part.rbs +21 -0
  242. data/sig/terminal_shop/internal/transport/base_client.rbs +116 -0
  243. data/sig/terminal_shop/internal/transport/pooled_net_requester.rbs +41 -0
  244. data/sig/terminal_shop/internal/type/array_of.rbs +45 -0
  245. data/sig/terminal_shop/internal/type/base_model.rbs +96 -0
  246. data/sig/terminal_shop/internal/type/base_page.rbs +24 -0
  247. data/sig/terminal_shop/internal/type/boolean.rbs +23 -0
  248. data/sig/terminal_shop/internal/type/converter.rbs +54 -0
  249. data/sig/terminal_shop/internal/type/enum.rbs +29 -0
  250. data/sig/terminal_shop/internal/type/file_input.rbs +23 -0
  251. data/sig/terminal_shop/internal/type/hash_of.rbs +45 -0
  252. data/sig/terminal_shop/internal/type/request_parameters.rbs +15 -0
  253. data/sig/terminal_shop/internal/type/union.rbs +49 -0
  254. data/sig/terminal_shop/internal/type/unknown.rbs +23 -0
  255. data/sig/terminal_shop/internal/util.rbs +158 -0
  256. data/sig/terminal_shop/internal.rbs +5 -0
  257. data/sig/{terminal-shop → terminal_shop}/models/address.rbs +5 -1
  258. data/sig/{terminal-shop → terminal_shop}/models/address_create_params.rbs +4 -4
  259. data/sig/{terminal-shop → terminal_shop}/models/address_create_response.rbs +1 -1
  260. data/sig/terminal_shop/models/address_delete_params.rbs +15 -0
  261. data/sig/{terminal-shop → terminal_shop}/models/address_delete_response.rbs +1 -1
  262. data/sig/terminal_shop/models/address_get_params.rbs +15 -0
  263. data/sig/{terminal-shop → terminal_shop}/models/address_get_response.rbs +1 -1
  264. data/sig/terminal_shop/models/address_list_params.rbs +15 -0
  265. data/sig/{terminal-shop → terminal_shop}/models/address_list_response.rbs +1 -1
  266. data/sig/{terminal-shop → terminal_shop}/models/app.rbs +1 -1
  267. data/sig/{terminal-shop → terminal_shop}/models/app_create_params.rbs +5 -4
  268. data/sig/{terminal-shop → terminal_shop}/models/app_create_response.rbs +2 -2
  269. data/sig/terminal_shop/models/app_delete_params.rbs +15 -0
  270. data/sig/{terminal-shop → terminal_shop}/models/app_delete_response.rbs +1 -1
  271. data/sig/terminal_shop/models/app_get_params.rbs +15 -0
  272. data/sig/{terminal-shop → terminal_shop}/models/app_get_response.rbs +1 -1
  273. data/sig/terminal_shop/models/app_list_params.rbs +15 -0
  274. data/sig/{terminal-shop → terminal_shop}/models/app_list_response.rbs +1 -1
  275. data/sig/{terminal-shop → terminal_shop}/models/card.rbs +6 -2
  276. data/sig/terminal_shop/models/card_collect_params.rbs +15 -0
  277. data/sig/{terminal-shop → terminal_shop}/models/card_collect_response.rbs +2 -2
  278. data/sig/{terminal-shop → terminal_shop}/models/card_create_params.rbs +4 -4
  279. data/sig/{terminal-shop → terminal_shop}/models/card_create_response.rbs +1 -1
  280. data/sig/terminal_shop/models/card_delete_params.rbs +15 -0
  281. data/sig/{terminal-shop → terminal_shop}/models/card_delete_response.rbs +1 -1
  282. data/sig/terminal_shop/models/card_get_params.rbs +15 -0
  283. data/sig/{terminal-shop → terminal_shop}/models/card_get_response.rbs +1 -1
  284. data/sig/terminal_shop/models/card_list_params.rbs +15 -0
  285. data/sig/{terminal-shop → terminal_shop}/models/card_list_response.rbs +1 -1
  286. data/sig/{terminal-shop → terminal_shop}/models/cart.rbs +4 -4
  287. data/sig/terminal_shop/models/cart_clear_params.rbs +15 -0
  288. data/sig/{terminal-shop → terminal_shop}/models/cart_clear_response.rbs +1 -1
  289. data/sig/terminal_shop/models/cart_convert_params.rbs +15 -0
  290. data/sig/{terminal-shop → terminal_shop}/models/cart_convert_response.rbs +1 -1
  291. data/sig/terminal_shop/models/cart_get_params.rbs +15 -0
  292. data/sig/{terminal-shop → terminal_shop}/models/cart_get_response.rbs +1 -1
  293. data/sig/{terminal-shop → terminal_shop}/models/cart_set_address_params.rbs +4 -4
  294. data/sig/{terminal-shop → terminal_shop}/models/cart_set_address_response.rbs +1 -1
  295. data/sig/{terminal-shop → terminal_shop}/models/cart_set_card_params.rbs +4 -4
  296. data/sig/{terminal-shop → terminal_shop}/models/cart_set_card_response.rbs +1 -1
  297. data/sig/{terminal-shop → terminal_shop}/models/cart_set_item_params.rbs +4 -4
  298. data/sig/{terminal-shop → terminal_shop}/models/cart_set_item_response.rbs +1 -1
  299. data/sig/{terminal-shop → terminal_shop}/models/email_create_params.rbs +4 -4
  300. data/sig/{terminal-shop → terminal_shop}/models/email_create_response.rbs +1 -1
  301. data/sig/{terminal-shop → terminal_shop}/models/order.rbs +51 -6
  302. data/sig/{terminal-shop → terminal_shop}/models/order_create_params.rbs +4 -4
  303. data/sig/{terminal-shop → terminal_shop}/models/order_create_response.rbs +1 -1
  304. data/sig/terminal_shop/models/order_get_params.rbs +15 -0
  305. data/sig/{terminal-shop → terminal_shop}/models/order_get_response.rbs +1 -1
  306. data/sig/terminal_shop/models/order_list_params.rbs +15 -0
  307. data/sig/{terminal-shop → terminal_shop}/models/order_list_response.rbs +1 -1
  308. data/sig/{terminal-shop → terminal_shop}/models/product.rbs +9 -3
  309. data/sig/terminal_shop/models/product_get_params.rbs +15 -0
  310. data/sig/{terminal-shop → terminal_shop}/models/product_get_response.rbs +1 -1
  311. data/sig/terminal_shop/models/product_list_params.rbs +15 -0
  312. data/sig/{terminal-shop → terminal_shop}/models/product_list_response.rbs +1 -1
  313. data/sig/terminal_shop/models/product_variant.rbs +70 -0
  314. data/sig/{terminal-shop → terminal_shop}/models/profile.rbs +2 -2
  315. data/sig/terminal_shop/models/profile_me_params.rbs +15 -0
  316. data/sig/{terminal-shop → terminal_shop}/models/profile_me_response.rbs +1 -1
  317. data/sig/{terminal-shop → terminal_shop}/models/profile_update_params.rbs +5 -4
  318. data/sig/{terminal-shop → terminal_shop}/models/profile_update_response.rbs +1 -1
  319. data/sig/{terminal-shop → terminal_shop}/models/region.rbs +3 -2
  320. data/sig/{terminal-shop → terminal_shop}/models/subscription.rbs +12 -4
  321. data/sig/{terminal-shop → terminal_shop}/models/subscription_create_params.rbs +4 -3
  322. data/sig/{terminal-shop → terminal_shop}/models/subscription_create_response.rbs +1 -1
  323. data/sig/terminal_shop/models/subscription_delete_params.rbs +15 -0
  324. data/sig/{terminal-shop → terminal_shop}/models/subscription_delete_response.rbs +1 -1
  325. data/sig/terminal_shop/models/subscription_get_params.rbs +15 -0
  326. data/sig/{terminal-shop → terminal_shop}/models/subscription_get_response.rbs +1 -1
  327. data/sig/terminal_shop/models/subscription_list_params.rbs +15 -0
  328. data/sig/{terminal-shop → terminal_shop}/models/subscription_list_response.rbs +1 -1
  329. data/sig/terminal_shop/models/subscription_update_params.rbs +71 -0
  330. data/sig/terminal_shop/models/subscription_update_response.rbs +14 -0
  331. data/sig/{terminal-shop → terminal_shop}/models/token.rbs +1 -1
  332. data/sig/terminal_shop/models/token_create_params.rbs +15 -0
  333. data/sig/{terminal-shop → terminal_shop}/models/token_create_response.rbs +2 -2
  334. data/sig/terminal_shop/models/token_delete_params.rbs +15 -0
  335. data/sig/{terminal-shop → terminal_shop}/models/token_delete_response.rbs +1 -1
  336. data/sig/terminal_shop/models/token_get_params.rbs +15 -0
  337. data/sig/{terminal-shop → terminal_shop}/models/token_get_response.rbs +1 -1
  338. data/sig/terminal_shop/models/token_list_params.rbs +15 -0
  339. data/sig/{terminal-shop → terminal_shop}/models/token_list_response.rbs +1 -1
  340. data/sig/terminal_shop/models/view_init_params.rbs +15 -0
  341. data/sig/{terminal-shop → terminal_shop}/models/view_init_response.rbs +2 -2
  342. data/sig/{terminal-shop → terminal_shop}/request_options.rbs +1 -1
  343. data/sig/{terminal-shop → terminal_shop}/resources/subscription.rbs +10 -0
  344. data/sig/{terminal-shop → terminal_shop}/version.rbs +1 -1
  345. metadata +354 -339
  346. data/lib/terminal-shop/errors.rb +0 -183
  347. data/lib/terminal-shop/models/address.rb +0 -90
  348. data/lib/terminal-shop/models/address_create_params.rb +0 -86
  349. data/lib/terminal-shop/models/address_create_response.rb +0 -20
  350. data/lib/terminal-shop/models/address_delete_params.rb +0 -18
  351. data/lib/terminal-shop/models/address_delete_response.rb +0 -19
  352. data/lib/terminal-shop/models/address_get_params.rb +0 -18
  353. data/lib/terminal-shop/models/address_list_params.rb +0 -18
  354. data/lib/terminal-shop/models/address_list_response.rb +0 -20
  355. data/lib/terminal-shop/models/app_create_params.rb +0 -30
  356. data/lib/terminal-shop/models/app_delete_params.rb +0 -18
  357. data/lib/terminal-shop/models/app_delete_response.rb +0 -19
  358. data/lib/terminal-shop/models/app_get_params.rb +0 -18
  359. data/lib/terminal-shop/models/app_list_params.rb +0 -18
  360. data/lib/terminal-shop/models/app_list_response.rb +0 -20
  361. data/lib/terminal-shop/models/card.rb +0 -67
  362. data/lib/terminal-shop/models/card_collect_params.rb +0 -18
  363. data/lib/terminal-shop/models/card_collect_response.rb +0 -38
  364. data/lib/terminal-shop/models/card_create_params.rb +0 -26
  365. data/lib/terminal-shop/models/card_create_response.rb +0 -20
  366. data/lib/terminal-shop/models/card_delete_params.rb +0 -18
  367. data/lib/terminal-shop/models/card_delete_response.rb +0 -19
  368. data/lib/terminal-shop/models/card_get_params.rb +0 -18
  369. data/lib/terminal-shop/models/card_list_params.rb +0 -18
  370. data/lib/terminal-shop/models/card_list_response.rb +0 -20
  371. data/lib/terminal-shop/models/cart.rb +0 -178
  372. data/lib/terminal-shop/models/cart_clear_params.rb +0 -18
  373. data/lib/terminal-shop/models/cart_clear_response.rb +0 -19
  374. data/lib/terminal-shop/models/cart_convert_params.rb +0 -18
  375. data/lib/terminal-shop/models/cart_get_params.rb +0 -18
  376. data/lib/terminal-shop/models/cart_set_address_params.rb +0 -25
  377. data/lib/terminal-shop/models/cart_set_address_response.rb +0 -19
  378. data/lib/terminal-shop/models/cart_set_card_params.rb +0 -25
  379. data/lib/terminal-shop/models/cart_set_card_response.rb +0 -19
  380. data/lib/terminal-shop/models/cart_set_item_params.rb +0 -32
  381. data/lib/terminal-shop/models/email_create_params.rb +0 -25
  382. data/lib/terminal-shop/models/email_create_response.rb +0 -19
  383. data/lib/terminal-shop/models/order.rb +0 -257
  384. data/lib/terminal-shop/models/order_create_params.rb +0 -39
  385. data/lib/terminal-shop/models/order_create_response.rb +0 -20
  386. data/lib/terminal-shop/models/order_get_params.rb +0 -18
  387. data/lib/terminal-shop/models/order_list_params.rb +0 -18
  388. data/lib/terminal-shop/models/order_list_response.rb +0 -20
  389. data/lib/terminal-shop/models/product.rb +0 -150
  390. data/lib/terminal-shop/models/product_get_params.rb +0 -18
  391. data/lib/terminal-shop/models/product_list_params.rb +0 -18
  392. data/lib/terminal-shop/models/product_list_response.rb +0 -20
  393. data/lib/terminal-shop/models/product_variant.rb +0 -36
  394. data/lib/terminal-shop/models/profile_me_params.rb +0 -18
  395. data/lib/terminal-shop/models/profile_update_params.rb +0 -30
  396. data/lib/terminal-shop/models/subscription.rb +0 -119
  397. data/lib/terminal-shop/models/subscription_create_params.rb +0 -18
  398. data/lib/terminal-shop/models/subscription_create_response.rb +0 -19
  399. data/lib/terminal-shop/models/subscription_delete_params.rb +0 -18
  400. data/lib/terminal-shop/models/subscription_delete_response.rb +0 -19
  401. data/lib/terminal-shop/models/subscription_get_params.rb +0 -18
  402. data/lib/terminal-shop/models/subscription_list_params.rb +0 -18
  403. data/lib/terminal-shop/models/subscription_list_response.rb +0 -20
  404. data/lib/terminal-shop/models/token.rb +0 -37
  405. data/lib/terminal-shop/models/token_create_params.rb +0 -18
  406. data/lib/terminal-shop/models/token_create_response.rb +0 -42
  407. data/lib/terminal-shop/models/token_delete_params.rb +0 -18
  408. data/lib/terminal-shop/models/token_delete_response.rb +0 -19
  409. data/lib/terminal-shop/models/token_get_params.rb +0 -18
  410. data/lib/terminal-shop/models/token_get_response.rb +0 -21
  411. data/lib/terminal-shop/models/token_list_params.rb +0 -18
  412. data/lib/terminal-shop/models/token_list_response.rb +0 -20
  413. data/lib/terminal-shop/models/view_init_params.rb +0 -18
  414. data/lib/terminal-shop/models/view_init_response.rb +0 -93
  415. data/lib/terminal-shop/resources/subscription.rb +0 -96
  416. data/lib/terminal-shop/transport/base_client.rb +0 -459
  417. data/lib/terminal-shop/transport/pooled_net_requester.rb +0 -182
  418. data/lib/terminal-shop/type/array_of.rb +0 -112
  419. data/lib/terminal-shop/type/base_model.rb +0 -364
  420. data/lib/terminal-shop/type/base_page.rb +0 -61
  421. data/lib/terminal-shop/type/boolean_model.rb +0 -52
  422. data/lib/terminal-shop/type/converter.rb +0 -217
  423. data/lib/terminal-shop/type/enum.rb +0 -101
  424. data/lib/terminal-shop/type/hash_of.rb +0 -138
  425. data/lib/terminal-shop/type/request_parameters.rb +0 -38
  426. data/lib/terminal-shop/type/union.rb +0 -185
  427. data/lib/terminal-shop/type/unknown.rb +0 -56
  428. data/lib/terminal-shop/type.rb +0 -23
  429. data/lib/terminal-shop/util.rb +0 -726
  430. data/lib/terminal-shop.rb +0 -149
  431. data/rbi/lib/terminal-shop/errors.rbi +0 -144
  432. data/rbi/lib/terminal-shop/models/address_delete_params.rbi +0 -21
  433. data/rbi/lib/terminal-shop/models/address_get_params.rbi +0 -21
  434. data/rbi/lib/terminal-shop/models/address_list_params.rbi +0 -21
  435. data/rbi/lib/terminal-shop/models/app_delete_params.rbi +0 -21
  436. data/rbi/lib/terminal-shop/models/app_get_params.rbi +0 -21
  437. data/rbi/lib/terminal-shop/models/app_get_response.rbi +0 -22
  438. data/rbi/lib/terminal-shop/models/app_list_params.rbi +0 -21
  439. data/rbi/lib/terminal-shop/models/card_collect_params.rbi +0 -21
  440. data/rbi/lib/terminal-shop/models/card_create_params.rbi +0 -32
  441. data/rbi/lib/terminal-shop/models/card_delete_params.rbi +0 -21
  442. data/rbi/lib/terminal-shop/models/card_get_params.rbi +0 -21
  443. data/rbi/lib/terminal-shop/models/card_get_response.rbi +0 -22
  444. data/rbi/lib/terminal-shop/models/card_list_params.rbi +0 -21
  445. data/rbi/lib/terminal-shop/models/cart_clear_params.rbi +0 -21
  446. data/rbi/lib/terminal-shop/models/cart_convert_params.rbi +0 -21
  447. data/rbi/lib/terminal-shop/models/cart_convert_response.rbi +0 -22
  448. data/rbi/lib/terminal-shop/models/cart_get_params.rbi +0 -21
  449. data/rbi/lib/terminal-shop/models/cart_get_response.rbi +0 -22
  450. data/rbi/lib/terminal-shop/models/cart_set_card_params.rbi +0 -31
  451. data/rbi/lib/terminal-shop/models/cart_set_item_response.rbi +0 -22
  452. data/rbi/lib/terminal-shop/models/email_create_params.rbi +0 -31
  453. data/rbi/lib/terminal-shop/models/order_get_params.rbi +0 -21
  454. data/rbi/lib/terminal-shop/models/order_get_response.rbi +0 -22
  455. data/rbi/lib/terminal-shop/models/order_list_params.rbi +0 -21
  456. data/rbi/lib/terminal-shop/models/product_get_params.rbi +0 -21
  457. data/rbi/lib/terminal-shop/models/product_list_params.rbi +0 -21
  458. data/rbi/lib/terminal-shop/models/product_variant.rbi +0 -28
  459. data/rbi/lib/terminal-shop/models/profile_me_params.rbi +0 -21
  460. data/rbi/lib/terminal-shop/models/subscription_delete_params.rbi +0 -21
  461. data/rbi/lib/terminal-shop/models/subscription_get_params.rbi +0 -21
  462. data/rbi/lib/terminal-shop/models/subscription_list_params.rbi +0 -21
  463. data/rbi/lib/terminal-shop/models/token_create_params.rbi +0 -21
  464. data/rbi/lib/terminal-shop/models/token_delete_params.rbi +0 -21
  465. data/rbi/lib/terminal-shop/models/token_get_params.rbi +0 -21
  466. data/rbi/lib/terminal-shop/models/token_get_response.rbi +0 -23
  467. data/rbi/lib/terminal-shop/models/token_list_params.rbi +0 -21
  468. data/rbi/lib/terminal-shop/models/view_init_params.rbi +0 -21
  469. data/rbi/lib/terminal-shop/transport/base_client.rbi +0 -208
  470. data/rbi/lib/terminal-shop/transport/pooled_net_requester.rbi +0 -64
  471. data/rbi/lib/terminal-shop/type/array_of.rbi +0 -82
  472. data/rbi/lib/terminal-shop/type/base_model.rbi +0 -194
  473. data/rbi/lib/terminal-shop/type/base_page.rbi +0 -38
  474. data/rbi/lib/terminal-shop/type/boolean_model.rbi +0 -41
  475. data/rbi/lib/terminal-shop/type/converter.rbi +0 -101
  476. data/rbi/lib/terminal-shop/type/enum.rbi +0 -58
  477. data/rbi/lib/terminal-shop/type/hash_of.rbi +0 -85
  478. data/rbi/lib/terminal-shop/type/request_parameters.rbi +0 -20
  479. data/rbi/lib/terminal-shop/type/union.rbi +0 -68
  480. data/rbi/lib/terminal-shop/type/unknown.rbi +0 -37
  481. data/rbi/lib/terminal-shop/type.rbi +0 -23
  482. data/rbi/lib/terminal-shop/util.rbi +0 -281
  483. data/sig/terminal-shop/errors.rbs +0 -99
  484. data/sig/terminal-shop/models/address_delete_params.rbs +0 -14
  485. data/sig/terminal-shop/models/address_get_params.rbs +0 -14
  486. data/sig/terminal-shop/models/address_list_params.rbs +0 -14
  487. data/sig/terminal-shop/models/app_delete_params.rbs +0 -14
  488. data/sig/terminal-shop/models/app_get_params.rbs +0 -14
  489. data/sig/terminal-shop/models/app_list_params.rbs +0 -14
  490. data/sig/terminal-shop/models/card_collect_params.rbs +0 -14
  491. data/sig/terminal-shop/models/card_delete_params.rbs +0 -14
  492. data/sig/terminal-shop/models/card_get_params.rbs +0 -14
  493. data/sig/terminal-shop/models/card_list_params.rbs +0 -14
  494. data/sig/terminal-shop/models/cart_clear_params.rbs +0 -14
  495. data/sig/terminal-shop/models/cart_convert_params.rbs +0 -14
  496. data/sig/terminal-shop/models/cart_get_params.rbs +0 -14
  497. data/sig/terminal-shop/models/order_get_params.rbs +0 -14
  498. data/sig/terminal-shop/models/order_list_params.rbs +0 -14
  499. data/sig/terminal-shop/models/product_get_params.rbs +0 -14
  500. data/sig/terminal-shop/models/product_list_params.rbs +0 -14
  501. data/sig/terminal-shop/models/product_variant.rbs +0 -17
  502. data/sig/terminal-shop/models/profile_me_params.rbs +0 -14
  503. data/sig/terminal-shop/models/subscription_delete_params.rbs +0 -14
  504. data/sig/terminal-shop/models/subscription_get_params.rbs +0 -14
  505. data/sig/terminal-shop/models/subscription_list_params.rbs +0 -14
  506. data/sig/terminal-shop/models/token_create_params.rbs +0 -14
  507. data/sig/terminal-shop/models/token_delete_params.rbs +0 -14
  508. data/sig/terminal-shop/models/token_get_params.rbs +0 -14
  509. data/sig/terminal-shop/models/token_list_params.rbs +0 -14
  510. data/sig/terminal-shop/models/view_init_params.rbs +0 -14
  511. data/sig/terminal-shop/transport/base_client.rbs +0 -110
  512. data/sig/terminal-shop/transport/pooled_net_requester.rbs +0 -39
  513. data/sig/terminal-shop/type/array_of.rbs +0 -36
  514. data/sig/terminal-shop/type/base_model.rbs +0 -73
  515. data/sig/terminal-shop/type/base_page.rbs +0 -22
  516. data/sig/terminal-shop/type/boolean_model.rbs +0 -18
  517. data/sig/terminal-shop/type/converter.rbs +0 -42
  518. data/sig/terminal-shop/type/enum.rbs +0 -22
  519. data/sig/terminal-shop/type/hash_of.rbs +0 -36
  520. data/sig/terminal-shop/type/request_parameters.rbs +0 -13
  521. data/sig/terminal-shop/type/union.rbs +0 -40
  522. data/sig/terminal-shop/type/unknown.rbs +0 -18
  523. data/sig/terminal-shop/type.rbs +0 -22
  524. data/sig/terminal-shop/util.rbs +0 -136
  525. /data/sig/{terminal-shop → terminal_shop}/resources/address.rbs +0 -0
  526. /data/sig/{terminal-shop → terminal_shop}/resources/app.rbs +0 -0
  527. /data/sig/{terminal-shop → terminal_shop}/resources/card.rbs +0 -0
  528. /data/sig/{terminal-shop → terminal_shop}/resources/cart.rbs +0 -0
  529. /data/sig/{terminal-shop → terminal_shop}/resources/email.rbs +0 -0
  530. /data/sig/{terminal-shop → terminal_shop}/resources/order.rbs +0 -0
  531. /data/sig/{terminal-shop → terminal_shop}/resources/product.rbs +0 -0
  532. /data/sig/{terminal-shop → terminal_shop}/resources/profile.rbs +0 -0
  533. /data/sig/{terminal-shop → terminal_shop}/resources/token.rbs +0 -0
  534. /data/sig/{terminal-shop → terminal_shop}/resources/view.rbs +0 -0
@@ -0,0 +1,486 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerminalShop
4
+ module Internal
5
+ module Transport
6
+ # @api private
7
+ #
8
+ # @abstract
9
+ class BaseClient
10
+ # from whatwg fetch spec
11
+ MAX_REDIRECTS = 20
12
+
13
+ # rubocop:disable Style/MutableConstant
14
+ PLATFORM_HEADERS =
15
+ {
16
+ "x-stainless-arch" => TerminalShop::Internal::Util.arch,
17
+ "x-stainless-lang" => "ruby",
18
+ "x-stainless-os" => TerminalShop::Internal::Util.os,
19
+ "x-stainless-package-version" => TerminalShop::VERSION,
20
+ "x-stainless-runtime" => ::RUBY_ENGINE,
21
+ "x-stainless-runtime-version" => ::RUBY_ENGINE_VERSION
22
+ }
23
+ # rubocop:enable Style/MutableConstant
24
+
25
+ class << self
26
+ # @api private
27
+ #
28
+ # @param req [Hash{Symbol=>Object}]
29
+ #
30
+ # @raise [ArgumentError]
31
+ def validate!(req)
32
+ keys = [:method, :path, :query, :headers, :body, :unwrap, :page, :stream, :model, :options]
33
+ case req
34
+ in Hash
35
+ req.each_key do |k|
36
+ unless keys.include?(k)
37
+ raise ArgumentError.new("Request `req` keys must be one of #{keys}, got #{k.inspect}")
38
+ end
39
+ end
40
+ else
41
+ raise ArgumentError.new("Request `req` must be a Hash or RequestOptions, got #{req.inspect}")
42
+ end
43
+ end
44
+
45
+ # @api private
46
+ #
47
+ # @param status [Integer]
48
+ # @param headers [Hash{String=>String}, Net::HTTPHeader]
49
+ #
50
+ # @return [Boolean]
51
+ def should_retry?(status, headers:)
52
+ coerced = TerminalShop::Internal::Util.coerce_boolean(headers["x-should-retry"])
53
+ case [coerced, status]
54
+ in [true | false, _]
55
+ coerced
56
+ in [_, 408 | 409 | 429 | (500..)]
57
+ # retry on:
58
+ # 408: timeouts
59
+ # 409: locks
60
+ # 429: rate limits
61
+ # 500+: unknown errors
62
+ true
63
+ else
64
+ false
65
+ end
66
+ end
67
+
68
+ # @api private
69
+ #
70
+ # @param request [Hash{Symbol=>Object}] .
71
+ #
72
+ # @option request [Symbol] :method
73
+ #
74
+ # @option request [URI::Generic] :url
75
+ #
76
+ # @option request [Hash{String=>String}] :headers
77
+ #
78
+ # @option request [Object] :body
79
+ #
80
+ # @option request [Integer] :max_retries
81
+ #
82
+ # @option request [Float] :timeout
83
+ #
84
+ # @param status [Integer]
85
+ #
86
+ # @param response_headers [Hash{String=>String}, Net::HTTPHeader]
87
+ #
88
+ # @return [Hash{Symbol=>Object}]
89
+ def follow_redirect(request, status:, response_headers:)
90
+ method, url, headers = request.fetch_values(:method, :url, :headers)
91
+ location =
92
+ Kernel.then do
93
+ URI.join(url, response_headers["location"])
94
+ rescue ArgumentError
95
+ message = "Server responded with status #{status} but no valid location header."
96
+ raise TerminalShop::Errors::APIConnectionError.new(
97
+ url: url,
98
+ response: response_headers,
99
+ message: message
100
+ )
101
+ end
102
+
103
+ request = {**request, url: location}
104
+
105
+ case [url.scheme, location.scheme]
106
+ in ["https", "http"]
107
+ message = "Tried to redirect to a insecure URL"
108
+ raise TerminalShop::Errors::APIConnectionError.new(
109
+ url: url,
110
+ response: response_headers,
111
+ message: message
112
+ )
113
+ else
114
+ nil
115
+ end
116
+
117
+ # from whatwg fetch spec
118
+ case [status, method]
119
+ in [301 | 302, :post] | [303, _]
120
+ drop = %w[content-encoding content-language content-length content-location content-type]
121
+ request = {
122
+ **request,
123
+ method: method == :head ? :head : :get,
124
+ headers: headers.except(*drop),
125
+ body: nil
126
+ }
127
+ else
128
+ end
129
+
130
+ # from undici
131
+ if TerminalShop::Internal::Util.uri_origin(url) != TerminalShop::Internal::Util.uri_origin(location)
132
+ drop = %w[authorization cookie host proxy-authorization]
133
+ request = {**request, headers: request.fetch(:headers).except(*drop)}
134
+ end
135
+
136
+ request
137
+ end
138
+
139
+ # @api private
140
+ #
141
+ # @param status [Integer, TerminalShop::Errors::APIConnectionError]
142
+ # @param stream [Enumerable<String>, nil]
143
+ def reap_connection!(status, stream:)
144
+ case status
145
+ in (..199) | (300..499)
146
+ stream&.each { next }
147
+ in TerminalShop::Errors::APIConnectionError | (500..)
148
+ TerminalShop::Internal::Util.close_fused!(stream)
149
+ else
150
+ end
151
+ end
152
+ end
153
+
154
+ # @api private
155
+ # @return [TerminalShop::Internal::Transport::PooledNetRequester]
156
+ attr_reader :requester
157
+
158
+ # @api private
159
+ #
160
+ # @param base_url [String]
161
+ # @param timeout [Float]
162
+ # @param max_retries [Integer]
163
+ # @param initial_retry_delay [Float]
164
+ # @param max_retry_delay [Float]
165
+ # @param headers [Hash{String=>String, Integer, Array<String, Integer, nil>, nil}]
166
+ # @param idempotency_header [String, nil]
167
+ def initialize(
168
+ base_url:,
169
+ timeout: 0.0,
170
+ max_retries: 0,
171
+ initial_retry_delay: 0.0,
172
+ max_retry_delay: 0.0,
173
+ headers: {},
174
+ idempotency_header: nil
175
+ )
176
+ @requester = TerminalShop::Internal::Transport::PooledNetRequester.new
177
+ @headers = TerminalShop::Internal::Util.normalized_headers(
178
+ self.class::PLATFORM_HEADERS,
179
+ {
180
+ "accept" => "application/json",
181
+ "content-type" => "application/json"
182
+ },
183
+ headers
184
+ )
185
+ @base_url = TerminalShop::Internal::Util.parse_uri(base_url)
186
+ @idempotency_header = idempotency_header&.to_s&.downcase
187
+ @max_retries = max_retries
188
+ @timeout = timeout
189
+ @initial_retry_delay = initial_retry_delay
190
+ @max_retry_delay = max_retry_delay
191
+ end
192
+
193
+ # @api private
194
+ #
195
+ # @return [Hash{String=>String}]
196
+ private def auth_headers = {}
197
+
198
+ # @api private
199
+ #
200
+ # @return [String]
201
+ private def generate_idempotency_key = "stainless-ruby-retry-#{SecureRandom.uuid}"
202
+
203
+ # @api private
204
+ #
205
+ # @param req [Hash{Symbol=>Object}] .
206
+ #
207
+ # @option req [Symbol] :method
208
+ #
209
+ # @option req [String, Array<String>] :path
210
+ #
211
+ # @option req [Hash{String=>Array<String>, String, nil}, nil] :query
212
+ #
213
+ # @option req [Hash{String=>String, Integer, Array<String, Integer, nil>, nil}, nil] :headers
214
+ #
215
+ # @option req [Object, nil] :body
216
+ #
217
+ # @option req [Symbol, Integer, Array<Symbol, Integer>, Proc, nil] :unwrap
218
+ #
219
+ # @option req [Class<TerminalShop::Internal::Type::BasePage>, nil] :page
220
+ #
221
+ # @option req [Class<TerminalShop::Internal::Type::BaseStream>, nil] :stream
222
+ #
223
+ # @option req [TerminalShop::Internal::Type::Converter, Class, nil] :model
224
+ #
225
+ # @param opts [Hash{Symbol=>Object}] .
226
+ #
227
+ # @option opts [String, nil] :idempotency_key
228
+ #
229
+ # @option opts [Hash{String=>Array<String>, String, nil}, nil] :extra_query
230
+ #
231
+ # @option opts [Hash{String=>String, nil}, nil] :extra_headers
232
+ #
233
+ # @option opts [Object, nil] :extra_body
234
+ #
235
+ # @option opts [Integer, nil] :max_retries
236
+ #
237
+ # @option opts [Float, nil] :timeout
238
+ #
239
+ # @return [Hash{Symbol=>Object}]
240
+ private def build_request(req, opts)
241
+ method, uninterpolated_path = req.fetch_values(:method, :path)
242
+
243
+ path = TerminalShop::Internal::Util.interpolate_path(uninterpolated_path)
244
+
245
+ query = TerminalShop::Internal::Util.deep_merge(req[:query].to_h, opts[:extra_query].to_h)
246
+
247
+ headers = TerminalShop::Internal::Util.normalized_headers(
248
+ @headers,
249
+ auth_headers,
250
+ req[:headers].to_h,
251
+ opts[:extra_headers].to_h
252
+ )
253
+
254
+ if @idempotency_header &&
255
+ !headers.key?(@idempotency_header) &&
256
+ (!Net::HTTP::IDEMPOTENT_METHODS_.include?(method.to_s.upcase) || opts.key?(:idempotency_key))
257
+ headers[@idempotency_header] = opts.fetch(:idempotency_key) { generate_idempotency_key }
258
+ end
259
+
260
+ unless headers.key?("x-stainless-retry-count")
261
+ headers["x-stainless-retry-count"] = "0"
262
+ end
263
+
264
+ timeout = opts.fetch(:timeout, @timeout).to_f.clamp((0..))
265
+ unless headers.key?("x-stainless-timeout") || timeout.zero?
266
+ headers["x-stainless-timeout"] = timeout.to_s
267
+ end
268
+
269
+ headers.reject! { |_, v| v.to_s.empty? }
270
+
271
+ body =
272
+ case method
273
+ in :get | :head | :options | :trace
274
+ nil
275
+ else
276
+ TerminalShop::Internal::Util.deep_merge(*[req[:body], opts[:extra_body]].compact)
277
+ end
278
+
279
+ headers, encoded = TerminalShop::Internal::Util.encode_content(headers, body)
280
+ {
281
+ method: method,
282
+ url: TerminalShop::Internal::Util.join_parsed_uri(@base_url, {**req, path: path, query: query}),
283
+ headers: headers,
284
+ body: encoded,
285
+ max_retries: opts.fetch(:max_retries, @max_retries),
286
+ timeout: timeout
287
+ }
288
+ end
289
+
290
+ # @api private
291
+ #
292
+ # @param headers [Hash{String=>String}]
293
+ # @param retry_count [Integer]
294
+ #
295
+ # @return [Float]
296
+ private def retry_delay(headers, retry_count:)
297
+ # Non-standard extension
298
+ span = Float(headers["retry-after-ms"], exception: false)&.then { _1 / 1000 }
299
+ return span if span
300
+
301
+ retry_header = headers["retry-after"]
302
+ return span if (span = Float(retry_header, exception: false))
303
+
304
+ span = retry_header&.then do
305
+ Time.httpdate(_1) - Time.now
306
+ rescue ArgumentError
307
+ nil
308
+ end
309
+ return span if span
310
+
311
+ scale = retry_count**2
312
+ jitter = 1 - (0.25 * rand)
313
+ (@initial_retry_delay * scale * jitter).clamp(0, @max_retry_delay)
314
+ end
315
+
316
+ # @api private
317
+ #
318
+ # @param request [Hash{Symbol=>Object}] .
319
+ #
320
+ # @option request [Symbol] :method
321
+ #
322
+ # @option request [URI::Generic] :url
323
+ #
324
+ # @option request [Hash{String=>String}] :headers
325
+ #
326
+ # @option request [Object] :body
327
+ #
328
+ # @option request [Integer] :max_retries
329
+ #
330
+ # @option request [Float] :timeout
331
+ #
332
+ # @param redirect_count [Integer]
333
+ #
334
+ # @param retry_count [Integer]
335
+ #
336
+ # @param send_retry_header [Boolean]
337
+ #
338
+ # @raise [TerminalShop::Errors::APIError]
339
+ # @return [Array(Integer, Net::HTTPResponse, Enumerable<String>)]
340
+ private def send_request(request, redirect_count:, retry_count:, send_retry_header:)
341
+ url, headers, max_retries, timeout = request.fetch_values(:url, :headers, :max_retries, :timeout)
342
+ input = {
343
+ **request.except(:timeout),
344
+ deadline: TerminalShop::Internal::Util.monotonic_secs + timeout
345
+ }
346
+
347
+ if send_retry_header
348
+ headers["x-stainless-retry-count"] = retry_count.to_s
349
+ end
350
+
351
+ begin
352
+ status, response, stream = @requester.execute(input)
353
+ rescue TerminalShop::Errors::APIConnectionError => e
354
+ status = e
355
+ end
356
+
357
+ case status
358
+ in ..299
359
+ [status, response, stream]
360
+ in 300..399 if redirect_count >= self.class::MAX_REDIRECTS
361
+ self.class.reap_connection!(status, stream: stream)
362
+
363
+ message = "Failed to complete the request within #{self.class::MAX_REDIRECTS} redirects."
364
+ raise TerminalShop::Errors::APIConnectionError.new(url: url, response: response, message: message)
365
+ in 300..399
366
+ self.class.reap_connection!(status, stream: stream)
367
+
368
+ request = self.class.follow_redirect(request, status: status, response_headers: response)
369
+ send_request(
370
+ request,
371
+ redirect_count: redirect_count + 1,
372
+ retry_count: retry_count,
373
+ send_retry_header: send_retry_header
374
+ )
375
+ in TerminalShop::Errors::APIConnectionError if retry_count >= max_retries
376
+ raise status
377
+ in (400..) if retry_count >= max_retries || !self.class.should_retry?(status, headers: response)
378
+ decoded = Kernel.then do
379
+ TerminalShop::Internal::Util.decode_content(response, stream: stream, suppress_error: true)
380
+ ensure
381
+ self.class.reap_connection!(status, stream: stream)
382
+ end
383
+
384
+ raise TerminalShop::Errors::APIStatusError.for(
385
+ url: url,
386
+ status: status,
387
+ body: decoded,
388
+ request: nil,
389
+ response: response
390
+ )
391
+ in (400..) | TerminalShop::Errors::APIConnectionError
392
+ self.class.reap_connection!(status, stream: stream)
393
+
394
+ delay = retry_delay(response || {}, retry_count: retry_count)
395
+ sleep(delay)
396
+
397
+ send_request(
398
+ request,
399
+ redirect_count: redirect_count,
400
+ retry_count: retry_count + 1,
401
+ send_retry_header: send_retry_header
402
+ )
403
+ end
404
+ end
405
+
406
+ # Execute the request specified by `req`. This is the method that all resource
407
+ # methods call into.
408
+ #
409
+ # @overload request(method, path, query: {}, headers: {}, body: nil, unwrap: nil, page: nil, stream: nil, model: TerminalShop::Internal::Type::Unknown, options: {})
410
+ #
411
+ # @param method [Symbol]
412
+ #
413
+ # @param path [String, Array<String>]
414
+ #
415
+ # @param query [Hash{String=>Array<String>, String, nil}, nil]
416
+ #
417
+ # @param headers [Hash{String=>String, Integer, Array<String, Integer, nil>, nil}, nil]
418
+ #
419
+ # @param body [Object, nil]
420
+ #
421
+ # @param unwrap [Symbol, Integer, Array<Symbol, Integer>, Proc, nil]
422
+ #
423
+ # @param page [Class<TerminalShop::Internal::Type::BasePage>, nil]
424
+ #
425
+ # @param stream [Class<TerminalShop::Internal::Type::BaseStream>, nil]
426
+ #
427
+ # @param model [TerminalShop::Internal::Type::Converter, Class, nil]
428
+ #
429
+ # @param options [TerminalShop::RequestOptions, Hash{Symbol=>Object}, nil] .
430
+ #
431
+ # @option options [String, nil] :idempotency_key
432
+ #
433
+ # @option options [Hash{String=>Array<String>, String, nil}, nil] :extra_query
434
+ #
435
+ # @option options [Hash{String=>String, nil}, nil] :extra_headers
436
+ #
437
+ # @option options [Object, nil] :extra_body
438
+ #
439
+ # @option options [Integer, nil] :max_retries
440
+ #
441
+ # @option options [Float, nil] :timeout
442
+ #
443
+ # @raise [TerminalShop::Errors::APIError]
444
+ # @return [Object]
445
+ def request(req)
446
+ self.class.validate!(req)
447
+ model = req.fetch(:model) { TerminalShop::Internal::Type::Unknown }
448
+ opts = req[:options].to_h
449
+ TerminalShop::RequestOptions.validate!(opts)
450
+ request = build_request(req.except(:options), opts)
451
+ url = request.fetch(:url)
452
+
453
+ # Don't send the current retry count in the headers if the caller modified the header defaults.
454
+ send_retry_header = request.fetch(:headers)["x-stainless-retry-count"] == "0"
455
+ status, response, stream = send_request(
456
+ request,
457
+ redirect_count: 0,
458
+ retry_count: 0,
459
+ send_retry_header: send_retry_header
460
+ )
461
+
462
+ decoded = TerminalShop::Internal::Util.decode_content(response, stream: stream)
463
+ case req
464
+ in { stream: Class => st }
465
+ st.new(model: model, url: url, status: status, response: response, stream: decoded)
466
+ in { page: Class => page }
467
+ page.new(client: self, req: req, headers: response, page_data: decoded)
468
+ else
469
+ unwrapped = TerminalShop::Internal::Util.dig(decoded, req[:unwrap])
470
+ TerminalShop::Internal::Type::Converter.coerce(model, unwrapped)
471
+ end
472
+ end
473
+
474
+ # @api private
475
+ #
476
+ # @return [String]
477
+ def inspect
478
+ # rubocop:disable Layout/LineLength
479
+ base_url = TerminalShop::Internal::Util.unparse_uri(@base_url)
480
+ "#<#{self.class.name}:0x#{object_id.to_s(16)} base_url=#{base_url} max_retries=#{@max_retries} timeout=#{@timeout}>"
481
+ # rubocop:enable Layout/LineLength
482
+ end
483
+ end
484
+ end
485
+ end
486
+ end
@@ -0,0 +1,193 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TerminalShop
4
+ module Internal
5
+ module Transport
6
+ # @api private
7
+ class PooledNetRequester
8
+ # from the golang stdlib
9
+ # https://github.com/golang/go/blob/c8eced8580028328fde7c03cbfcb720ce15b2358/src/net/http/transport.go#L49
10
+ KEEP_ALIVE_TIMEOUT = 30
11
+
12
+ class << self
13
+ # @api private
14
+ #
15
+ # @param url [URI::Generic]
16
+ #
17
+ # @return [Net::HTTP]
18
+ def connect(url)
19
+ port =
20
+ case [url.port, url.scheme]
21
+ in [Integer, _]
22
+ url.port
23
+ in [nil, "http" | "ws"]
24
+ Net::HTTP.http_default_port
25
+ in [nil, "https" | "wss"]
26
+ Net::HTTP.https_default_port
27
+ end
28
+
29
+ Net::HTTP.new(url.host, port).tap do
30
+ _1.use_ssl = %w[https wss].include?(url.scheme)
31
+ _1.max_retries = 0
32
+ end
33
+ end
34
+
35
+ # @api private
36
+ #
37
+ # @param conn [Net::HTTP]
38
+ # @param deadline [Float]
39
+ def calibrate_socket_timeout(conn, deadline)
40
+ timeout = deadline - TerminalShop::Internal::Util.monotonic_secs
41
+ conn.open_timeout = conn.read_timeout = conn.write_timeout = conn.continue_timeout = timeout
42
+ end
43
+
44
+ # @api private
45
+ #
46
+ # @param request [Hash{Symbol=>Object}] .
47
+ #
48
+ # @option request [Symbol] :method
49
+ #
50
+ # @option request [URI::Generic] :url
51
+ #
52
+ # @option request [Hash{String=>String}] :headers
53
+ #
54
+ # @param blk [Proc]
55
+ #
56
+ # @yieldparam [String]
57
+ # @return [Array(Net::HTTPGenericRequest, Proc)]
58
+ def build_request(request, &blk)
59
+ method, url, headers, body = request.fetch_values(:method, :url, :headers, :body)
60
+ req = Net::HTTPGenericRequest.new(
61
+ method.to_s.upcase,
62
+ !body.nil?,
63
+ method != :head,
64
+ URI(url.to_s) # ensure we construct a URI class of the right scheme
65
+ )
66
+
67
+ headers.each { req[_1] = _2 }
68
+
69
+ case body
70
+ in nil
71
+ nil
72
+ in String
73
+ req["content-length"] ||= body.bytesize.to_s unless req["transfer-encoding"]
74
+ req.body_stream = TerminalShop::Internal::Util::ReadIOAdapter.new(body, &blk)
75
+ in StringIO
76
+ req["content-length"] ||= body.size.to_s unless req["transfer-encoding"]
77
+ req.body_stream = TerminalShop::Internal::Util::ReadIOAdapter.new(body, &blk)
78
+ in Pathname | IO | Enumerator
79
+ req["transfer-encoding"] ||= "chunked" unless req["content-length"]
80
+ req.body_stream = TerminalShop::Internal::Util::ReadIOAdapter.new(body, &blk)
81
+ end
82
+
83
+ [req, req.body_stream&.method(:close)]
84
+ end
85
+ end
86
+
87
+ # @api private
88
+ #
89
+ # @param url [URI::Generic]
90
+ # @param deadline [Float]
91
+ # @param blk [Proc]
92
+ #
93
+ # @raise [Timeout::Error]
94
+ # @yieldparam [Net::HTTP]
95
+ private def with_pool(url, deadline:, &blk)
96
+ origin = TerminalShop::Internal::Util.uri_origin(url)
97
+ timeout = deadline - TerminalShop::Internal::Util.monotonic_secs
98
+ pool =
99
+ @mutex.synchronize do
100
+ @pools[origin] ||= ConnectionPool.new(size: @size) do
101
+ self.class.connect(url)
102
+ end
103
+ end
104
+
105
+ pool.with(timeout: timeout, &blk)
106
+ end
107
+
108
+ # @api private
109
+ #
110
+ # @param request [Hash{Symbol=>Object}] .
111
+ #
112
+ # @option request [Symbol] :method
113
+ #
114
+ # @option request [URI::Generic] :url
115
+ #
116
+ # @option request [Hash{String=>String}] :headers
117
+ #
118
+ # @option request [Object] :body
119
+ #
120
+ # @option request [Float] :deadline
121
+ #
122
+ # @return [Array(Integer, Net::HTTPResponse, Enumerable<String>)]
123
+ def execute(request)
124
+ url, deadline = request.fetch_values(:url, :deadline)
125
+
126
+ req = nil
127
+ eof = false
128
+ finished = false
129
+ closing = nil
130
+
131
+ # rubocop:disable Metrics/BlockLength
132
+ enum = Enumerator.new do |y|
133
+ with_pool(url, deadline: deadline) do |conn|
134
+ next if finished
135
+
136
+ req, closing = self.class.build_request(request) do
137
+ self.class.calibrate_socket_timeout(conn, deadline)
138
+ end
139
+
140
+ self.class.calibrate_socket_timeout(conn, deadline)
141
+ unless conn.started?
142
+ conn.keep_alive_timeout = self.class::KEEP_ALIVE_TIMEOUT
143
+ conn.start
144
+ end
145
+
146
+ self.class.calibrate_socket_timeout(conn, deadline)
147
+ conn.request(req) do |rsp|
148
+ y << [conn, req, rsp]
149
+ break if finished
150
+
151
+ rsp.read_body do |bytes|
152
+ y << bytes.force_encoding(Encoding::BINARY)
153
+ break if finished
154
+
155
+ self.class.calibrate_socket_timeout(conn, deadline)
156
+ end
157
+ eof = true
158
+ end
159
+ end
160
+ rescue Timeout::Error
161
+ raise TerminalShop::Errors::APITimeoutError.new(url: url, request: req)
162
+ rescue StandardError
163
+ raise TerminalShop::Errors::APIConnectionError.new(url: url, request: req)
164
+ end
165
+ # rubocop:enable Metrics/BlockLength
166
+
167
+ conn, _, response = enum.next
168
+ body = TerminalShop::Internal::Util.fused_enum(enum, external: true) do
169
+ finished = true
170
+ tap do
171
+ enum.next
172
+ rescue StopIteration
173
+ nil
174
+ end
175
+ ensure
176
+ conn.finish if !eof && conn&.started?
177
+ closing&.call
178
+ end
179
+ [Integer(response.code), response, body]
180
+ end
181
+
182
+ # @api private
183
+ #
184
+ # @param size [Integer]
185
+ def initialize(size: Etc.nprocessors)
186
+ @mutex = Mutex.new
187
+ @size = size
188
+ @pools = {}
189
+ end
190
+ end
191
+ end
192
+ end
193
+ end