dodopayments 0.0.1.pre.alpha.0 → 1.14.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 (380) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +111 -0
  3. data/README.md +84 -23
  4. data/SECURITY.md +27 -0
  5. data/lib/dodopayments/client.rb +14 -19
  6. data/lib/dodopayments/errors.rb +168 -159
  7. data/lib/dodopayments/internal/default_page_number_pagination.rb +91 -0
  8. data/lib/dodopayments/internal/transport/base_client.rb +486 -0
  9. data/lib/dodopayments/internal/transport/pooled_net_requester.rb +193 -0
  10. data/lib/dodopayments/internal/type/array_of.rb +143 -0
  11. data/lib/dodopayments/internal/type/base_model.rb +407 -0
  12. data/lib/dodopayments/internal/type/base_page.rb +47 -0
  13. data/lib/dodopayments/internal/type/boolean.rb +60 -0
  14. data/lib/dodopayments/internal/type/converter.rb +271 -0
  15. data/lib/dodopayments/internal/type/enum.rb +129 -0
  16. data/lib/dodopayments/internal/type/hash_of.rb +163 -0
  17. data/lib/dodopayments/internal/type/io_like.rb +77 -0
  18. data/lib/dodopayments/internal/type/request_parameters.rb +49 -0
  19. data/lib/dodopayments/internal/type/union.rb +232 -0
  20. data/lib/dodopayments/internal/type/unknown.rb +64 -0
  21. data/lib/dodopayments/internal/util.rb +782 -0
  22. data/lib/dodopayments/internal.rb +12 -0
  23. data/lib/dodopayments/models/attach_existing_customer.rb +2 -2
  24. data/lib/dodopayments/models/billing_address.rb +2 -2
  25. data/lib/dodopayments/models/country_code.rb +7 -3
  26. data/lib/dodopayments/models/create_new_customer.rb +5 -5
  27. data/lib/dodopayments/models/customer.rb +3 -2
  28. data/lib/dodopayments/models/customer_create_params.rb +5 -4
  29. data/lib/dodopayments/models/customer_limited_details.rb +2 -2
  30. data/lib/dodopayments/models/customer_list_params.rb +5 -4
  31. data/lib/dodopayments/models/customer_portal_session.rb +2 -2
  32. data/lib/dodopayments/models/customer_request.rb +5 -6
  33. data/lib/dodopayments/models/customer_retrieve_params.rb +5 -4
  34. data/lib/dodopayments/models/customer_update_params.rb +5 -4
  35. data/lib/dodopayments/models/customers/customer_portal_create_params.rb +6 -5
  36. data/lib/dodopayments/models/discount.rb +7 -6
  37. data/lib/dodopayments/models/discount_create_params.rb +13 -12
  38. data/lib/dodopayments/models/discount_delete_params.rb +5 -4
  39. data/lib/dodopayments/models/discount_list_params.rb +5 -4
  40. data/lib/dodopayments/models/discount_retrieve_params.rb +5 -4
  41. data/lib/dodopayments/models/discount_type.rb +7 -2
  42. data/lib/dodopayments/models/discount_update_params.rb +11 -10
  43. data/lib/dodopayments/models/dispute.rb +4 -3
  44. data/lib/dodopayments/models/dispute_list_params.rb +5 -4
  45. data/lib/dodopayments/models/dispute_retrieve_params.rb +5 -4
  46. data/lib/dodopayments/models/dispute_stage.rb +7 -2
  47. data/lib/dodopayments/models/dispute_status.rb +7 -2
  48. data/lib/dodopayments/models/intent_status.rb +7 -2
  49. data/lib/dodopayments/models/invoices/payment_retrieve_params.rb +5 -4
  50. data/lib/dodopayments/models/license_activate_params.rb +5 -4
  51. data/lib/dodopayments/models/license_deactivate_params.rb +5 -4
  52. data/lib/dodopayments/models/license_key.rb +4 -3
  53. data/lib/dodopayments/models/license_key_duration.rb +2 -2
  54. data/lib/dodopayments/models/license_key_instance.rb +3 -2
  55. data/lib/dodopayments/models/license_key_instance_list_params.rb +5 -4
  56. data/lib/dodopayments/models/license_key_instance_retrieve_params.rb +5 -4
  57. data/lib/dodopayments/models/license_key_instance_update_params.rb +5 -4
  58. data/lib/dodopayments/models/license_key_list_params.rb +5 -4
  59. data/lib/dodopayments/models/license_key_retrieve_params.rb +5 -4
  60. data/lib/dodopayments/models/license_key_status.rb +7 -2
  61. data/lib/dodopayments/models/license_key_update_params.rb +9 -8
  62. data/lib/dodopayments/models/license_validate_params.rb +5 -4
  63. data/lib/dodopayments/models/license_validate_response.rb +4 -3
  64. data/lib/dodopayments/models/misc_list_supported_countries_params.rb +5 -4
  65. data/lib/dodopayments/models/misc_list_supported_countries_response.rb +2 -1
  66. data/lib/dodopayments/models/one_time_product_cart_item.rb +4 -3
  67. data/lib/dodopayments/models/payment.rb +18 -11
  68. data/lib/dodopayments/models/payment_create_params.rb +231 -9
  69. data/lib/dodopayments/models/payment_create_response.rb +6 -5
  70. data/lib/dodopayments/models/payment_list_params.rb +5 -4
  71. data/lib/dodopayments/models/payment_list_response.rb +12 -5
  72. data/lib/dodopayments/models/payment_retrieve_params.rb +5 -4
  73. data/lib/dodopayments/models/payout_list_params.rb +5 -4
  74. data/lib/dodopayments/models/payout_list_response.rb +21 -6
  75. data/lib/dodopayments/models/price.rb +41 -30
  76. data/lib/dodopayments/models/product.rb +17 -10
  77. data/lib/dodopayments/models/product_create_params.rb +16 -11
  78. data/lib/dodopayments/models/product_delete_params.rb +5 -4
  79. data/lib/dodopayments/models/product_list_params.rb +10 -9
  80. data/lib/dodopayments/models/product_list_response.rb +30 -17
  81. data/lib/dodopayments/models/product_retrieve_params.rb +5 -4
  82. data/lib/dodopayments/models/product_unarchive_params.rb +5 -4
  83. data/lib/dodopayments/models/product_update_params.rb +22 -17
  84. data/lib/dodopayments/models/products/image_update_params.rb +6 -5
  85. data/lib/dodopayments/models/products/image_update_response.rb +3 -2
  86. data/lib/dodopayments/models/refund.rb +11 -4
  87. data/lib/dodopayments/models/refund_create_params.rb +6 -13
  88. data/lib/dodopayments/models/refund_list_params.rb +5 -4
  89. data/lib/dodopayments/models/refund_retrieve_params.rb +5 -4
  90. data/lib/dodopayments/models/refund_status.rb +7 -2
  91. data/lib/dodopayments/models/subscription.rb +21 -7
  92. data/lib/dodopayments/models/subscription_charge_params.rb +27 -0
  93. data/lib/dodopayments/models/subscription_charge_response.rb +20 -0
  94. data/lib/dodopayments/models/subscription_create_params.rb +261 -8
  95. data/lib/dodopayments/models/subscription_create_response.rb +6 -5
  96. data/lib/dodopayments/models/subscription_list_params.rb +5 -4
  97. data/lib/dodopayments/models/subscription_retrieve_params.rb +5 -4
  98. data/lib/dodopayments/models/subscription_status.rb +7 -2
  99. data/lib/dodopayments/models/subscription_update_params.rb +19 -6
  100. data/lib/dodopayments/models/time_interval.rb +7 -2
  101. data/lib/dodopayments/models/webhook_event.rb +3 -2
  102. data/lib/dodopayments/models/webhook_event_list_params.rb +6 -5
  103. data/lib/dodopayments/models/webhook_event_retrieve_params.rb +5 -4
  104. data/lib/dodopayments/request_options.rb +12 -47
  105. data/lib/dodopayments/resources/customers/customer_portal.rb +10 -8
  106. data/lib/dodopayments/resources/customers.rb +30 -29
  107. data/lib/dodopayments/resources/discounts.rb +45 -69
  108. data/lib/dodopayments/resources/disputes.rb +20 -22
  109. data/lib/dodopayments/resources/invoices/payments.rb +8 -5
  110. data/lib/dodopayments/resources/invoices.rb +2 -0
  111. data/lib/dodopayments/resources/license_key_instances.rb +23 -21
  112. data/lib/dodopayments/resources/license_keys.rb +27 -32
  113. data/lib/dodopayments/resources/licenses.rb +20 -18
  114. data/lib/dodopayments/resources/misc.rb +7 -3
  115. data/lib/dodopayments/resources/payments.rb +36 -43
  116. data/lib/dodopayments/resources/payouts.rb +9 -7
  117. data/lib/dodopayments/resources/products/images.rb +9 -7
  118. data/lib/dodopayments/resources/products.rb +59 -87
  119. data/lib/dodopayments/resources/refunds.rb +25 -29
  120. data/lib/dodopayments/resources/subscriptions.rb +68 -54
  121. data/lib/dodopayments/resources/webhook_events.rb +20 -21
  122. data/lib/dodopayments/version.rb +1 -1
  123. data/lib/dodopayments.rb +34 -7
  124. data/manifest.yaml +1 -0
  125. data/rbi/lib/dodopayments/client.rbi +32 -47
  126. data/rbi/lib/dodopayments/errors.rbi +125 -161
  127. data/rbi/lib/dodopayments/internal/default_page_number_pagination.rbi +18 -0
  128. data/rbi/lib/dodopayments/internal/transport/base_client.rbi +199 -0
  129. data/rbi/lib/dodopayments/internal/transport/pooled_net_requester.rbi +60 -0
  130. data/rbi/lib/dodopayments/internal/type/array_of.rbi +85 -0
  131. data/rbi/lib/dodopayments/internal/type/base_model.rbi +203 -0
  132. data/rbi/lib/dodopayments/internal/type/base_page.rbi +36 -0
  133. data/rbi/lib/dodopayments/internal/type/boolean.rbi +48 -0
  134. data/rbi/lib/dodopayments/internal/type/converter.rbi +120 -0
  135. data/rbi/lib/dodopayments/internal/type/enum.rbi +69 -0
  136. data/rbi/lib/dodopayments/internal/type/hash_of.rbi +85 -0
  137. data/rbi/lib/dodopayments/internal/type/io_like.rbi +46 -0
  138. data/rbi/lib/dodopayments/internal/type/request_parameters.rbi +21 -0
  139. data/rbi/lib/dodopayments/internal/type/union.rbi +77 -0
  140. data/rbi/lib/dodopayments/internal/type/unknown.rbi +40 -0
  141. data/rbi/lib/dodopayments/internal/util.rbi +297 -0
  142. data/rbi/lib/dodopayments/internal.rbi +12 -0
  143. data/rbi/lib/dodopayments/models/attach_existing_customer.rbi +4 -11
  144. data/rbi/lib/dodopayments/models/billing_address.rbi +20 -38
  145. data/rbi/lib/dodopayments/models/country_code.rbi +256 -256
  146. data/rbi/lib/dodopayments/models/create_new_customer.rbi +11 -30
  147. data/rbi/lib/dodopayments/models/customer.rbi +9 -41
  148. data/rbi/lib/dodopayments/models/customer_create_params.rbi +9 -26
  149. data/rbi/lib/dodopayments/models/customer_limited_details.rbi +6 -23
  150. data/rbi/lib/dodopayments/models/customer_list_params.rbi +8 -20
  151. data/rbi/lib/dodopayments/models/customer_portal_session.rbi +4 -11
  152. data/rbi/lib/dodopayments/models/customer_request.rbi +4 -7
  153. data/rbi/lib/dodopayments/models/customer_retrieve_params.rbi +6 -8
  154. data/rbi/lib/dodopayments/models/customer_update_params.rbi +8 -20
  155. data/rbi/lib/dodopayments/models/customers/customer_portal_create_params.rbi +7 -14
  156. data/rbi/lib/dodopayments/models/discount.rbi +20 -78
  157. data/rbi/lib/dodopayments/models/discount_create_params.rbi +23 -61
  158. data/rbi/lib/dodopayments/models/discount_delete_params.rbi +6 -8
  159. data/rbi/lib/dodopayments/models/discount_list_params.rbi +8 -20
  160. data/rbi/lib/dodopayments/models/discount_retrieve_params.rbi +6 -8
  161. data/rbi/lib/dodopayments/models/discount_type.rbi +8 -8
  162. data/rbi/lib/dodopayments/models/discount_update_params.rbi +21 -59
  163. data/rbi/lib/dodopayments/models/dispute.rbi +27 -59
  164. data/rbi/lib/dodopayments/models/dispute_list_params.rbi +19 -57
  165. data/rbi/lib/dodopayments/models/dispute_retrieve_params.rbi +6 -8
  166. data/rbi/lib/dodopayments/models/dispute_stage.rbi +10 -10
  167. data/rbi/lib/dodopayments/models/dispute_status.rbi +14 -14
  168. data/rbi/lib/dodopayments/models/intent_status.rbi +22 -18
  169. data/rbi/lib/dodopayments/models/invoices/payment_retrieve_params.rbi +6 -8
  170. data/rbi/lib/dodopayments/models/license_activate_params.rbi +8 -20
  171. data/rbi/lib/dodopayments/models/license_deactivate_params.rbi +8 -20
  172. data/rbi/lib/dodopayments/models/license_key.rbi +19 -82
  173. data/rbi/lib/dodopayments/models/license_key_duration.rbi +8 -20
  174. data/rbi/lib/dodopayments/models/license_key_instance.rbi +8 -35
  175. data/rbi/lib/dodopayments/models/license_key_instance_list_params.rbi +9 -26
  176. data/rbi/lib/dodopayments/models/license_key_instance_retrieve_params.rbi +6 -8
  177. data/rbi/lib/dodopayments/models/license_key_instance_update_params.rbi +7 -17
  178. data/rbi/lib/dodopayments/models/license_key_list_params.rbi +21 -40
  179. data/rbi/lib/dodopayments/models/license_key_retrieve_params.rbi +6 -8
  180. data/rbi/lib/dodopayments/models/license_key_status.rbi +10 -10
  181. data/rbi/lib/dodopayments/models/license_key_update_params.rbi +12 -29
  182. data/rbi/lib/dodopayments/models/license_validate_params.rbi +8 -20
  183. data/rbi/lib/dodopayments/models/license_validate_response.rbi +4 -11
  184. data/rbi/lib/dodopayments/models/misc_list_supported_countries_params.rbi +6 -8
  185. data/rbi/lib/dodopayments/models/misc_list_supported_countries_response.rbi +5 -1
  186. data/rbi/lib/dodopayments/models/one_time_product_cart_item.rbi +8 -24
  187. data/rbi/lib/dodopayments/models/payment.rbi +197 -308
  188. data/rbi/lib/dodopayments/models/payment_create_params.rbi +256 -61
  189. data/rbi/lib/dodopayments/models/payment_create_response.rbi +16 -60
  190. data/rbi/lib/dodopayments/models/payment_list_params.rbi +16 -54
  191. data/rbi/lib/dodopayments/models/payment_list_response.rbi +178 -228
  192. data/rbi/lib/dodopayments/models/payment_retrieve_params.rbi +6 -8
  193. data/rbi/lib/dodopayments/models/payout_list_params.rbi +8 -20
  194. data/rbi/lib/dodopayments/models/payout_list_response.rbi +197 -271
  195. data/rbi/lib/dodopayments/models/price.rbi +368 -464
  196. data/rbi/lib/dodopayments/models/product.rbi +48 -119
  197. data/rbi/lib/dodopayments/models/product_create_params.rbi +46 -86
  198. data/rbi/lib/dodopayments/models/product_delete_params.rbi +6 -8
  199. data/rbi/lib/dodopayments/models/product_list_params.rbi +15 -34
  200. data/rbi/lib/dodopayments/models/product_list_response.rbi +209 -275
  201. data/rbi/lib/dodopayments/models/product_retrieve_params.rbi +6 -8
  202. data/rbi/lib/dodopayments/models/product_unarchive_params.rbi +6 -8
  203. data/rbi/lib/dodopayments/models/product_update_params.rbi +55 -102
  204. data/rbi/lib/dodopayments/models/products/image_update_params.rbi +7 -14
  205. data/rbi/lib/dodopayments/models/products/image_update_response.rbi +5 -17
  206. data/rbi/lib/dodopayments/models/refund.rbi +181 -213
  207. data/rbi/lib/dodopayments/models/refund_create_params.rbi +13 -39
  208. data/rbi/lib/dodopayments/models/refund_list_params.rbi +15 -48
  209. data/rbi/lib/dodopayments/models/refund_retrieve_params.rbi +6 -8
  210. data/rbi/lib/dodopayments/models/refund_status.rbi +11 -11
  211. data/rbi/lib/dodopayments/models/subscription.rbi +202 -283
  212. data/rbi/lib/dodopayments/models/subscription_charge_params.rbi +27 -0
  213. data/rbi/lib/dodopayments/models/subscription_charge_response.rbi +16 -0
  214. data/rbi/lib/dodopayments/models/subscription_create_params.rbi +310 -69
  215. data/rbi/lib/dodopayments/models/subscription_create_response.rbi +15 -51
  216. data/rbi/lib/dodopayments/models/subscription_list_params.rbi +15 -48
  217. data/rbi/lib/dodopayments/models/subscription_retrieve_params.rbi +6 -8
  218. data/rbi/lib/dodopayments/models/subscription_status.rbi +14 -14
  219. data/rbi/lib/dodopayments/models/subscription_update_params.rbi +25 -21
  220. data/rbi/lib/dodopayments/models/time_interval.rbi +11 -11
  221. data/rbi/lib/dodopayments/models/webhook_event.rbi +11 -54
  222. data/rbi/lib/dodopayments/models/webhook_event_list_params.rbi +12 -45
  223. data/rbi/lib/dodopayments/models/webhook_event_retrieve_params.rbi +6 -8
  224. data/rbi/lib/dodopayments/request_options.rbi +18 -81
  225. data/rbi/lib/dodopayments/resources/customers/customer_portal.rbi +5 -7
  226. data/rbi/lib/dodopayments/resources/customers.rbi +12 -20
  227. data/rbi/lib/dodopayments/resources/discounts.rbi +27 -37
  228. data/rbi/lib/dodopayments/resources/disputes.rbi +9 -13
  229. data/rbi/lib/dodopayments/resources/invoices/payments.rbi +4 -5
  230. data/rbi/lib/dodopayments/resources/invoices.rbi +3 -4
  231. data/rbi/lib/dodopayments/resources/license_key_instances.rbi +9 -15
  232. data/rbi/lib/dodopayments/resources/license_keys.rbi +13 -19
  233. data/rbi/lib/dodopayments/resources/licenses.rbi +8 -11
  234. data/rbi/lib/dodopayments/resources/misc.rbi +12 -6
  235. data/rbi/lib/dodopayments/resources/payments.rbi +32 -21
  236. data/rbi/lib/dodopayments/resources/payouts.rbi +5 -7
  237. data/rbi/lib/dodopayments/resources/products/images.rbi +4 -6
  238. data/rbi/lib/dodopayments/resources/products.rbi +43 -44
  239. data/rbi/lib/dodopayments/resources/refunds.rbi +10 -20
  240. data/rbi/lib/dodopayments/resources/subscriptions.rbi +57 -24
  241. data/rbi/lib/dodopayments/resources/webhook_events.rbi +7 -10
  242. data/rbi/lib/dodopayments/version.rbi +1 -1
  243. data/sig/dodopayments/client.rbs +8 -8
  244. data/sig/dodopayments/errors.rbs +98 -96
  245. data/sig/dodopayments/internal/default_page_number_pagination.rbs +11 -0
  246. data/sig/dodopayments/internal/transport/base_client.rbs +110 -0
  247. data/sig/dodopayments/internal/transport/pooled_net_requester.rbs +41 -0
  248. data/sig/dodopayments/internal/type/array_of.rbs +43 -0
  249. data/sig/dodopayments/internal/type/base_model.rbs +86 -0
  250. data/sig/dodopayments/internal/type/base_page.rbs +24 -0
  251. data/sig/dodopayments/internal/type/boolean.rbs +23 -0
  252. data/sig/dodopayments/internal/type/converter.rbs +54 -0
  253. data/sig/dodopayments/internal/type/enum.rbs +29 -0
  254. data/sig/dodopayments/internal/type/hash_of.rbs +43 -0
  255. data/sig/dodopayments/internal/type/io_like.rbs +23 -0
  256. data/sig/dodopayments/internal/type/request_parameters.rbs +15 -0
  257. data/sig/dodopayments/internal/type/union.rbs +47 -0
  258. data/sig/dodopayments/internal/type/unknown.rbs +23 -0
  259. data/sig/dodopayments/internal/util.rbs +156 -0
  260. data/sig/dodopayments/internal.rbs +5 -0
  261. data/sig/dodopayments/models/attach_existing_customer.rbs +2 -7
  262. data/sig/dodopayments/models/billing_address.rbs +8 -12
  263. data/sig/dodopayments/models/country_code.rbs +4 -2
  264. data/sig/dodopayments/models/create_new_customer.rbs +7 -12
  265. data/sig/dodopayments/models/customer.rbs +9 -13
  266. data/sig/dodopayments/models/customer_create_params.rbs +10 -15
  267. data/sig/dodopayments/models/customer_limited_details.rbs +2 -7
  268. data/sig/dodopayments/models/customer_list_params.rbs +9 -14
  269. data/sig/dodopayments/models/customer_portal_session.rbs +2 -7
  270. data/sig/dodopayments/models/customer_request.rbs +4 -2
  271. data/sig/dodopayments/models/customer_retrieve_params.rbs +6 -10
  272. data/sig/dodopayments/models/customer_update_params.rbs +9 -14
  273. data/sig/dodopayments/models/customers/customer_portal_create_params.rbs +8 -13
  274. data/sig/dodopayments/models/discount.rbs +14 -18
  275. data/sig/dodopayments/models/discount_create_params.rbs +14 -19
  276. data/sig/dodopayments/models/discount_delete_params.rbs +6 -10
  277. data/sig/dodopayments/models/discount_list_params.rbs +9 -14
  278. data/sig/dodopayments/models/discount_retrieve_params.rbs +6 -10
  279. data/sig/dodopayments/models/discount_type.rbs +4 -2
  280. data/sig/dodopayments/models/discount_update_params.rbs +14 -19
  281. data/sig/dodopayments/models/dispute.rbs +11 -15
  282. data/sig/dodopayments/models/dispute_list_params.rbs +14 -19
  283. data/sig/dodopayments/models/dispute_retrieve_params.rbs +6 -10
  284. data/sig/dodopayments/models/dispute_stage.rbs +4 -2
  285. data/sig/dodopayments/models/dispute_status.rbs +4 -2
  286. data/sig/dodopayments/models/intent_status.rbs +4 -2
  287. data/sig/dodopayments/models/invoices/payment_retrieve_params.rbs +6 -10
  288. data/sig/dodopayments/models/license_activate_params.rbs +10 -14
  289. data/sig/dodopayments/models/license_deactivate_params.rbs +9 -14
  290. data/sig/dodopayments/models/license_key.rbs +15 -19
  291. data/sig/dodopayments/models/license_key_duration.rbs +5 -7
  292. data/sig/dodopayments/models/license_key_instance.rbs +8 -13
  293. data/sig/dodopayments/models/license_key_instance_list_params.rbs +10 -15
  294. data/sig/dodopayments/models/license_key_instance_retrieve_params.rbs +5 -10
  295. data/sig/dodopayments/models/license_key_instance_update_params.rbs +8 -10
  296. data/sig/dodopayments/models/license_key_list_params.rbs +12 -17
  297. data/sig/dodopayments/models/license_key_retrieve_params.rbs +6 -10
  298. data/sig/dodopayments/models/license_key_status.rbs +4 -2
  299. data/sig/dodopayments/models/license_key_update_params.rbs +10 -15
  300. data/sig/dodopayments/models/license_validate_params.rbs +9 -14
  301. data/sig/dodopayments/models/license_validate_response.rbs +2 -7
  302. data/sig/dodopayments/models/misc_list_supported_countries_params.rbs +5 -10
  303. data/sig/dodopayments/models/one_time_product_cart_item.rbs +6 -7
  304. data/sig/dodopayments/models/payment.rbs +28 -35
  305. data/sig/dodopayments/models/payment_create_params.rbs +371 -20
  306. data/sig/dodopayments/models/payment_create_response.rbs +11 -16
  307. data/sig/dodopayments/models/payment_list_params.rbs +14 -19
  308. data/sig/dodopayments/models/payment_list_response.rbs +17 -20
  309. data/sig/dodopayments/models/payment_retrieve_params.rbs +6 -10
  310. data/sig/dodopayments/models/payout_list_params.rbs +9 -14
  311. data/sig/dodopayments/models/payout_list_response.rbs +30 -28
  312. data/sig/dodopayments/models/price.rbs +37 -41
  313. data/sig/dodopayments/models/product.rbs +22 -24
  314. data/sig/dodopayments/models/product_create_params.rbs +20 -23
  315. data/sig/dodopayments/models/product_delete_params.rbs +6 -10
  316. data/sig/dodopayments/models/product_list_params.rbs +11 -16
  317. data/sig/dodopayments/models/product_list_response.rbs +24 -25
  318. data/sig/dodopayments/models/product_retrieve_params.rbs +6 -10
  319. data/sig/dodopayments/models/product_unarchive_params.rbs +6 -10
  320. data/sig/dodopayments/models/product_update_params.rbs +21 -24
  321. data/sig/dodopayments/models/products/image_update_params.rbs +9 -13
  322. data/sig/dodopayments/models/products/image_update_response.rbs +2 -7
  323. data/sig/dodopayments/models/refund.rbs +15 -15
  324. data/sig/dodopayments/models/refund_create_params.rbs +10 -18
  325. data/sig/dodopayments/models/refund_list_params.rbs +13 -18
  326. data/sig/dodopayments/models/refund_retrieve_params.rbs +6 -10
  327. data/sig/dodopayments/models/refund_status.rbs +4 -2
  328. data/sig/dodopayments/models/subscription.rbs +29 -27
  329. data/sig/dodopayments/models/subscription_charge_params.rbs +21 -0
  330. data/sig/dodopayments/models/subscription_charge_response.rbs +13 -0
  331. data/sig/dodopayments/models/subscription_create_params.rbs +389 -22
  332. data/sig/dodopayments/models/subscription_create_response.rbs +10 -15
  333. data/sig/dodopayments/models/subscription_list_params.rbs +13 -18
  334. data/sig/dodopayments/models/subscription_retrieve_params.rbs +6 -10
  335. data/sig/dodopayments/models/subscription_status.rbs +4 -2
  336. data/sig/dodopayments/models/subscription_update_params.rbs +18 -15
  337. data/sig/dodopayments/models/time_interval.rbs +4 -2
  338. data/sig/dodopayments/models/webhook_event.rbs +11 -15
  339. data/sig/dodopayments/models/webhook_event_list_params.rbs +13 -18
  340. data/sig/dodopayments/models/webhook_event_retrieve_params.rbs +6 -10
  341. data/sig/dodopayments/request_options.rbs +3 -13
  342. data/sig/dodopayments/resources/customers/customer_portal.rbs +5 -11
  343. data/sig/dodopayments/resources/customers.rbs +21 -42
  344. data/sig/dodopayments/resources/discounts.rbs +34 -61
  345. data/sig/dodopayments/resources/disputes.rbs +14 -24
  346. data/sig/dodopayments/resources/invoices/payments.rbs +4 -10
  347. data/sig/dodopayments/resources/license_key_instances.rbs +15 -32
  348. data/sig/dodopayments/resources/license_keys.rbs +19 -36
  349. data/sig/dodopayments/resources/licenses.rbs +15 -30
  350. data/sig/dodopayments/resources/misc.rbs +3 -8
  351. data/sig/dodopayments/resources/payments.rbs +28 -39
  352. data/sig/dodopayments/resources/payouts.rbs +5 -9
  353. data/sig/dodopayments/resources/products/images.rbs +5 -11
  354. data/sig/dodopayments/resources/products.rbs +45 -71
  355. data/sig/dodopayments/resources/refunds.rbs +18 -33
  356. data/sig/dodopayments/resources/subscriptions.rbs +44 -54
  357. data/sig/dodopayments/resources/webhook_events.rbs +13 -24
  358. data/sig/dodopayments/version.rbs +1 -1
  359. metadata +62 -27
  360. data/lib/dodopayments/base_client.rb +0 -453
  361. data/lib/dodopayments/base_model.rb +0 -1217
  362. data/lib/dodopayments/base_page.rb +0 -62
  363. data/lib/dodopayments/default_page_number_pagination.rb +0 -97
  364. data/lib/dodopayments/extern.rb +0 -9
  365. data/lib/dodopayments/pooled_net_requester.rb +0 -164
  366. data/lib/dodopayments/util.rb +0 -717
  367. data/rbi/lib/dodopayments/base_client.rbi +0 -186
  368. data/rbi/lib/dodopayments/base_model.rbi +0 -606
  369. data/rbi/lib/dodopayments/base_page.rbi +0 -40
  370. data/rbi/lib/dodopayments/default_page_number_pagination.rbi +0 -17
  371. data/rbi/lib/dodopayments/extern.rbi +0 -8
  372. data/rbi/lib/dodopayments/pooled_net_requester.rbi +0 -47
  373. data/rbi/lib/dodopayments/util.rbi +0 -270
  374. data/sig/dodopayments/base_client.rbs +0 -103
  375. data/sig/dodopayments/base_model.rbs +0 -246
  376. data/sig/dodopayments/base_page.rbs +0 -20
  377. data/sig/dodopayments/default_page_number_pagination.rbs +0 -7
  378. data/sig/dodopayments/extern.rbs +0 -4
  379. data/sig/dodopayments/pooled_net_requester.rbs +0 -30
  380. data/sig/dodopayments/util.rbs +0 -136
@@ -0,0 +1,782 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dodopayments
4
+ module Internal
5
+ # @api private
6
+ module Util
7
+ # @api private
8
+ #
9
+ # @return [Float]
10
+ def self.monotonic_secs = Process.clock_gettime(Process::CLOCK_MONOTONIC)
11
+
12
+ class << self
13
+ # @api private
14
+ #
15
+ # @return [String]
16
+ def arch
17
+ case (arch = RbConfig::CONFIG["arch"])&.downcase
18
+ in nil
19
+ "unknown"
20
+ in /aarch64|arm64/
21
+ "arm64"
22
+ in /x86_64/
23
+ "x64"
24
+ in /arm/
25
+ "arm"
26
+ else
27
+ "other:#{arch}"
28
+ end
29
+ end
30
+
31
+ # @api private
32
+ #
33
+ # @return [String]
34
+ def os
35
+ case (host = RbConfig::CONFIG["host_os"])&.downcase
36
+ in nil
37
+ "Unknown"
38
+ in /linux/
39
+ "Linux"
40
+ in /darwin/
41
+ "MacOS"
42
+ in /freebsd/
43
+ "FreeBSD"
44
+ in /openbsd/
45
+ "OpenBSD"
46
+ in /mswin|mingw|cygwin|ucrt/
47
+ "Windows"
48
+ else
49
+ "Other:#{host}"
50
+ end
51
+ end
52
+ end
53
+
54
+ class << self
55
+ # @api private
56
+ #
57
+ # @param input [Object]
58
+ #
59
+ # @return [Boolean]
60
+ def primitive?(input)
61
+ case input
62
+ in true | false | Numeric | Symbol | String
63
+ true
64
+ else
65
+ false
66
+ end
67
+ end
68
+
69
+ # @api private
70
+ #
71
+ # @param input [String, Boolean]
72
+ #
73
+ # @return [Boolean, Object]
74
+ def coerce_boolean(input)
75
+ case input.is_a?(String) ? input.downcase : input
76
+ in "true"
77
+ true
78
+ in "false"
79
+ false
80
+ else
81
+ input
82
+ end
83
+ end
84
+
85
+ # @api private
86
+ #
87
+ # @param input [String, Boolean]
88
+ #
89
+ # @raise [ArgumentError]
90
+ # @return [Boolean, nil]
91
+ def coerce_boolean!(input)
92
+ case coerce_boolean(input)
93
+ in true | false | nil => coerced
94
+ coerced
95
+ else
96
+ raise ArgumentError.new("Unable to coerce #{input.inspect} into boolean value")
97
+ end
98
+ end
99
+
100
+ # @api private
101
+ #
102
+ # @param input [String, Integer]
103
+ #
104
+ # @return [Integer, Object]
105
+ def coerce_integer(input)
106
+ Integer(input, exception: false) || input
107
+ end
108
+
109
+ # @api private
110
+ #
111
+ # @param input [String, Integer, Float]
112
+ #
113
+ # @return [Float, Object]
114
+ def coerce_float(input)
115
+ Float(input, exception: false) || input
116
+ end
117
+
118
+ # @api private
119
+ #
120
+ # @param input [Object]
121
+ #
122
+ # @return [Hash{Object=>Object}, Object]
123
+ def coerce_hash(input)
124
+ case input
125
+ in NilClass | Array | Set | Enumerator | StringIO | IO
126
+ input
127
+ else
128
+ input.respond_to?(:to_h) ? input.to_h : input
129
+ end
130
+ end
131
+ end
132
+
133
+ class << self
134
+ # @api private
135
+ #
136
+ # @param lhs [Object]
137
+ # @param rhs [Object]
138
+ # @param concat [Boolean]
139
+ #
140
+ # @return [Object]
141
+ private def deep_merge_lr(lhs, rhs, concat: false)
142
+ case [lhs, rhs, concat]
143
+ in [Hash, Hash, _]
144
+ lhs.merge(rhs) { deep_merge_lr(_2, _3, concat: concat) }
145
+ in [Array, Array, true]
146
+ lhs.concat(rhs)
147
+ else
148
+ rhs
149
+ end
150
+ end
151
+
152
+ # @api private
153
+ #
154
+ # Recursively merge one hash with another. If the values at a given key are not
155
+ # both hashes, just take the new value.
156
+ #
157
+ # @param values [Array<Object>]
158
+ #
159
+ # @param sentinel [Object, nil] the value to return if no values are provided.
160
+ #
161
+ # @param concat [Boolean] whether to merge sequences by concatenation.
162
+ #
163
+ # @return [Object]
164
+ def deep_merge(*values, sentinel: nil, concat: false)
165
+ case values
166
+ in [value, *values]
167
+ values.reduce(value) do |acc, val|
168
+ deep_merge_lr(acc, val, concat: concat)
169
+ end
170
+ else
171
+ sentinel
172
+ end
173
+ end
174
+
175
+ # @api private
176
+ #
177
+ # @param data [Hash{Symbol=>Object}, Array<Object>, Object]
178
+ # @param pick [Symbol, Integer, Array<Symbol, Integer>, nil]
179
+ # @param sentinel [Object, nil]
180
+ # @param blk [Proc, nil]
181
+ #
182
+ # @return [Object, nil]
183
+ def dig(data, pick, sentinel = nil, &blk)
184
+ case [data, pick, blk]
185
+ in [_, nil, nil]
186
+ data
187
+ in [Hash, Symbol, _] | [Array, Integer, _]
188
+ blk.nil? ? data.fetch(pick, sentinel) : data.fetch(pick, &blk)
189
+ in [Hash | Array, Array, _]
190
+ pick.reduce(data) do |acc, key|
191
+ case acc
192
+ in Hash if acc.key?(key)
193
+ acc.fetch(key)
194
+ in Array if key.is_a?(Integer) && key < acc.length
195
+ acc[key]
196
+ else
197
+ return blk.nil? ? sentinel : blk.call
198
+ end
199
+ end
200
+ in _
201
+ blk.nil? ? sentinel : blk.call
202
+ end
203
+ end
204
+ end
205
+
206
+ class << self
207
+ # @api private
208
+ #
209
+ # @param uri [URI::Generic]
210
+ #
211
+ # @return [String]
212
+ def uri_origin(uri)
213
+ "#{uri.scheme}://#{uri.host}#{uri.port == uri.default_port ? '' : ":#{uri.port}"}"
214
+ end
215
+
216
+ # @api private
217
+ #
218
+ # @param path [String, Array<String>]
219
+ #
220
+ # @return [String]
221
+ def interpolate_path(path)
222
+ case path
223
+ in String
224
+ path
225
+ in []
226
+ ""
227
+ in [String => p, *interpolations]
228
+ encoded = interpolations.map { ERB::Util.url_encode(_1) }
229
+ format(p, *encoded)
230
+ end
231
+ end
232
+ end
233
+
234
+ class << self
235
+ # @api private
236
+ #
237
+ # @param query [String, nil]
238
+ #
239
+ # @return [Hash{String=>Array<String>}]
240
+ def decode_query(query)
241
+ CGI.parse(query.to_s)
242
+ end
243
+
244
+ # @api private
245
+ #
246
+ # @param query [Hash{String=>Array<String>, String, nil}, nil]
247
+ #
248
+ # @return [String, nil]
249
+ def encode_query(query)
250
+ query.to_h.empty? ? nil : URI.encode_www_form(query)
251
+ end
252
+ end
253
+
254
+ class << self
255
+ # @api private
256
+ #
257
+ # @param url [URI::Generic, String]
258
+ #
259
+ # @return [Hash{Symbol=>String, Integer, nil}]
260
+ def parse_uri(url)
261
+ parsed = URI::Generic.component.zip(URI.split(url)).to_h
262
+ {**parsed, query: decode_query(parsed.fetch(:query))}
263
+ end
264
+
265
+ # @api private
266
+ #
267
+ # @param parsed [Hash{Symbol=>String, Integer, nil}] .
268
+ #
269
+ # @option parsed [String, nil] :scheme
270
+ #
271
+ # @option parsed [String, nil] :host
272
+ #
273
+ # @option parsed [Integer, nil] :port
274
+ #
275
+ # @option parsed [String, nil] :path
276
+ #
277
+ # @option parsed [Hash{String=>Array<String>}] :query
278
+ #
279
+ # @return [URI::Generic]
280
+ def unparse_uri(parsed)
281
+ URI::Generic.build(**parsed, query: encode_query(parsed.fetch(:query)))
282
+ end
283
+
284
+ # @api private
285
+ #
286
+ # @param lhs [Hash{Symbol=>String, Integer, nil}] .
287
+ #
288
+ # @option lhs [String, nil] :scheme
289
+ #
290
+ # @option lhs [String, nil] :host
291
+ #
292
+ # @option lhs [Integer, nil] :port
293
+ #
294
+ # @option lhs [String, nil] :path
295
+ #
296
+ # @option lhs [Hash{String=>Array<String>}] :query
297
+ #
298
+ # @param rhs [Hash{Symbol=>String, Integer, nil}] .
299
+ #
300
+ # @option rhs [String, nil] :scheme
301
+ #
302
+ # @option rhs [String, nil] :host
303
+ #
304
+ # @option rhs [Integer, nil] :port
305
+ #
306
+ # @option rhs [String, nil] :path
307
+ #
308
+ # @option rhs [Hash{String=>Array<String>}] :query
309
+ #
310
+ # @return [URI::Generic]
311
+ def join_parsed_uri(lhs, rhs)
312
+ base_path, base_query = lhs.fetch_values(:path, :query)
313
+ slashed = base_path.end_with?("/") ? base_path : "#{base_path}/"
314
+
315
+ parsed_path, parsed_query = parse_uri(rhs.fetch(:path)).fetch_values(:path, :query)
316
+ override = URI::Generic.build(**rhs.slice(:scheme, :host, :port), path: parsed_path)
317
+
318
+ joined = URI.join(URI::Generic.build(lhs.except(:path, :query)), slashed, override)
319
+ query = deep_merge(
320
+ joined.path == base_path ? base_query : {},
321
+ parsed_query,
322
+ rhs[:query].to_h,
323
+ concat: true
324
+ )
325
+
326
+ joined.query = encode_query(query)
327
+ joined
328
+ end
329
+ end
330
+
331
+ class << self
332
+ # @api private
333
+ #
334
+ # @param headers [Hash{String=>String, Integer, Array<String, Integer, nil>, nil}]
335
+ #
336
+ # @return [Hash{String=>String}]
337
+ def normalized_headers(*headers)
338
+ {}.merge(*headers.compact).to_h do |key, val|
339
+ value =
340
+ case val
341
+ in Array
342
+ val.filter_map { _1&.to_s&.strip }.join(", ")
343
+ else
344
+ val&.to_s&.strip
345
+ end
346
+ [key.downcase, value]
347
+ end
348
+ end
349
+ end
350
+
351
+ # @api private
352
+ class SerializationAdapter
353
+ # @return [Pathname, IO]
354
+ attr_reader :inner
355
+
356
+ # @param a [Object]
357
+ #
358
+ # @return [String]
359
+ def to_json(*a) = (inner.is_a?(IO) ? inner.read : inner.read(binmode: true)).to_json(*a)
360
+
361
+ # @param a [Object]
362
+ #
363
+ # @return [String]
364
+ def to_yaml(*a) = (inner.is_a?(IO) ? inner.read : inner.read(binmode: true)).to_yaml(*a)
365
+
366
+ # @api private
367
+ #
368
+ # @param inner [Pathname, IO]
369
+ def initialize(inner) = @inner = inner
370
+ end
371
+
372
+ # @api private
373
+ #
374
+ # An adapter that satisfies the IO interface required by `::IO.copy_stream`
375
+ class ReadIOAdapter
376
+ # @api private
377
+ #
378
+ # @return [Boolean, nil]
379
+ def close? = @closing
380
+
381
+ # @api private
382
+ def close
383
+ case @stream
384
+ in Enumerator
385
+ Dodopayments::Internal::Util.close_fused!(@stream)
386
+ in IO if close?
387
+ @stream.close
388
+ else
389
+ end
390
+ end
391
+
392
+ # @api private
393
+ #
394
+ # @param max_len [Integer, nil]
395
+ #
396
+ # @return [String]
397
+ private def read_enum(max_len)
398
+ case max_len
399
+ in nil
400
+ @stream.to_a.join
401
+ in Integer
402
+ @buf << @stream.next while @buf.length < max_len
403
+ @buf.slice!(..max_len)
404
+ end
405
+ rescue StopIteration
406
+ @stream = nil
407
+ @buf.slice!(0..)
408
+ end
409
+
410
+ # @api private
411
+ #
412
+ # @param max_len [Integer, nil]
413
+ # @param out_string [String, nil]
414
+ #
415
+ # @return [String, nil]
416
+ def read(max_len = nil, out_string = nil)
417
+ case @stream
418
+ in nil
419
+ nil
420
+ in IO | StringIO
421
+ @stream.read(max_len, out_string)
422
+ in Enumerator
423
+ read = read_enum(max_len)
424
+ case out_string
425
+ in String
426
+ out_string.replace(read)
427
+ in nil
428
+ read
429
+ end
430
+ end
431
+ .tap(&@blk)
432
+ end
433
+
434
+ # @api private
435
+ #
436
+ # @param src [String, Pathname, StringIO, Enumerable<String>]
437
+ # @param blk [Proc]
438
+ #
439
+ # @yieldparam [String]
440
+ def initialize(src, &blk)
441
+ @stream =
442
+ case src
443
+ in String
444
+ StringIO.new(src)
445
+ in Pathname
446
+ @closing = true
447
+ src.open(binmode: true)
448
+ else
449
+ src
450
+ end
451
+ @buf = String.new
452
+ @blk = blk
453
+ end
454
+ end
455
+
456
+ class << self
457
+ # @param blk [Proc]
458
+ #
459
+ # @yieldparam [Enumerator::Yielder]
460
+ # @return [Enumerable<String>]
461
+ def writable_enum(&blk)
462
+ Enumerator.new do |y|
463
+ buf = String.new
464
+ y.define_singleton_method(:write) do
465
+ self << buf.replace(_1)
466
+ buf.bytesize
467
+ end
468
+
469
+ blk.call(y)
470
+ end
471
+ end
472
+ end
473
+
474
+ class << self
475
+ # @api private
476
+ #
477
+ # @param y [Enumerator::Yielder]
478
+ # @param boundary [String]
479
+ # @param key [Symbol, String]
480
+ # @param val [Object]
481
+ # @param closing [Array<Proc>]
482
+ private def write_multipart_chunk(y, boundary:, key:, val:, closing:)
483
+ val = val.inner if val.is_a?(Dodopayments::Internal::Util::SerializationAdapter)
484
+
485
+ y << "--#{boundary}\r\n"
486
+ y << "Content-Disposition: form-data"
487
+ unless key.nil?
488
+ name = ERB::Util.url_encode(key.to_s)
489
+ y << "; name=\"#{name}\""
490
+ end
491
+ case val
492
+ in Pathname | IO
493
+ filename = ERB::Util.url_encode(File.basename(val.to_path))
494
+ y << "; filename=\"#{filename}\""
495
+ else
496
+ end
497
+ y << "\r\n"
498
+ case val
499
+ in Pathname
500
+ y << "Content-Type: application/octet-stream\r\n\r\n"
501
+ io = val.open(binmode: true)
502
+ closing << io.method(:close)
503
+ IO.copy_stream(io, y)
504
+ in IO
505
+ y << "Content-Type: application/octet-stream\r\n\r\n"
506
+ IO.copy_stream(val, y)
507
+ in StringIO
508
+ y << "Content-Type: application/octet-stream\r\n\r\n"
509
+ y << val.string
510
+ in String
511
+ y << "Content-Type: application/octet-stream\r\n\r\n"
512
+ y << val.to_s
513
+ in _ if primitive?(val)
514
+ y << "Content-Type: text/plain\r\n\r\n"
515
+ y << val.to_s
516
+ else
517
+ y << "Content-Type: application/json\r\n\r\n"
518
+ y << JSON.fast_generate(val)
519
+ end
520
+ y << "\r\n"
521
+ end
522
+
523
+ # @api private
524
+ #
525
+ # @param body [Object]
526
+ #
527
+ # @return [Array(String, Enumerable<String>)]
528
+ private def encode_multipart_streaming(body)
529
+ boundary = SecureRandom.urlsafe_base64(60)
530
+
531
+ closing = []
532
+ strio = writable_enum do |y|
533
+ case body
534
+ in Hash
535
+ body.each do |key, val|
536
+ case val
537
+ in Array if val.all? { primitive?(_1) }
538
+ val.each do |v|
539
+ write_multipart_chunk(y, boundary: boundary, key: key, val: v, closing: closing)
540
+ end
541
+ else
542
+ write_multipart_chunk(y, boundary: boundary, key: key, val: val, closing: closing)
543
+ end
544
+ end
545
+ else
546
+ write_multipart_chunk(y, boundary: boundary, key: nil, val: body, closing: closing)
547
+ end
548
+ y << "--#{boundary}--\r\n"
549
+ end
550
+
551
+ fused_io = fused_enum(strio) { closing.each(&:call) }
552
+ [boundary, fused_io]
553
+ end
554
+
555
+ # @api private
556
+ #
557
+ # @param headers [Hash{String=>String}]
558
+ # @param body [Object]
559
+ #
560
+ # @return [Object]
561
+ def encode_content(headers, body)
562
+ content_type = headers["content-type"]
563
+ body = body.inner if body.is_a?(Dodopayments::Internal::Util::SerializationAdapter)
564
+
565
+ case [content_type, body]
566
+ in [%r{^application/(?:vnd\.api\+)?json}, Hash | Array | -> { primitive?(_1) }]
567
+ [headers, JSON.fast_generate(body)]
568
+ in [%r{^application/(?:x-)?jsonl}, Enumerable] unless body.is_a?(StringIO) || body.is_a?(IO)
569
+ [headers, body.lazy.map { JSON.fast_generate(_1) }]
570
+ in [%r{^multipart/form-data}, Hash | Pathname | StringIO | IO]
571
+ boundary, strio = encode_multipart_streaming(body)
572
+ headers = {**headers, "content-type" => "#{content_type}; boundary=#{boundary}"}
573
+ [headers, strio]
574
+ in [_, Symbol | Numeric]
575
+ [headers, body.to_s]
576
+ in [_, StringIO]
577
+ [headers, body.string]
578
+ else
579
+ [headers, body]
580
+ end
581
+ end
582
+
583
+ # @api private
584
+ #
585
+ # https://www.iana.org/assignments/character-sets/character-sets.xhtml
586
+ #
587
+ # @param content_type [String]
588
+ # @param text [String]
589
+ def force_charset!(content_type, text:)
590
+ charset = /charset=([^;\s]+)/.match(content_type)&.captures&.first
591
+
592
+ return unless charset
593
+
594
+ begin
595
+ encoding = Encoding.find(charset)
596
+ text.force_encoding(encoding)
597
+ rescue ArgumentError
598
+ nil
599
+ end
600
+ end
601
+
602
+ # @api private
603
+ #
604
+ # Assumes each chunk in stream has `Encoding::BINARY`.
605
+ #
606
+ # @param headers [Hash{String=>String}, Net::HTTPHeader]
607
+ # @param stream [Enumerable<String>]
608
+ # @param suppress_error [Boolean]
609
+ #
610
+ # @raise [JSON::ParserError]
611
+ # @return [Object]
612
+ def decode_content(headers, stream:, suppress_error: false)
613
+ case (content_type = headers["content-type"])
614
+ in %r{^application/(?:vnd\.api\+)?json}
615
+ json = stream.to_a.join
616
+ begin
617
+ JSON.parse(json, symbolize_names: true)
618
+ rescue JSON::ParserError => e
619
+ raise e unless suppress_error
620
+ json
621
+ end
622
+ in %r{^application/(?:x-)?jsonl}
623
+ lines = decode_lines(stream)
624
+ chain_fused(lines) do |y|
625
+ lines.each { y << JSON.parse(_1, symbolize_names: true) }
626
+ end
627
+ in %r{^text/event-stream}
628
+ lines = decode_lines(stream)
629
+ decode_sse(lines)
630
+ else
631
+ text = stream.to_a.join
632
+ force_charset!(content_type, text: text)
633
+ StringIO.new(text)
634
+ end
635
+ end
636
+ end
637
+
638
+ class << self
639
+ # @api private
640
+ #
641
+ # https://doc.rust-lang.org/std/iter/trait.FusedIterator.html
642
+ #
643
+ # @param enum [Enumerable<Object>]
644
+ # @param external [Boolean]
645
+ # @param close [Proc]
646
+ #
647
+ # @return [Enumerable<Object>]
648
+ def fused_enum(enum, external: false, &close)
649
+ fused = false
650
+ iter = Enumerator.new do |y|
651
+ next if fused
652
+
653
+ fused = true
654
+ if external
655
+ loop { y << enum.next }
656
+ else
657
+ enum.each(&y)
658
+ end
659
+ ensure
660
+ close&.call
661
+ close = nil
662
+ end
663
+
664
+ iter.define_singleton_method(:rewind) do
665
+ fused = true
666
+ self
667
+ end
668
+ iter
669
+ end
670
+
671
+ # @api private
672
+ #
673
+ # @param enum [Enumerable<Object>, nil]
674
+ def close_fused!(enum)
675
+ return unless enum.is_a?(Enumerator)
676
+
677
+ # rubocop:disable Lint/UnreachableLoop
678
+ enum.rewind.each { break }
679
+ # rubocop:enable Lint/UnreachableLoop
680
+ end
681
+
682
+ # @api private
683
+ #
684
+ # @param enum [Enumerable<Object>, nil]
685
+ # @param blk [Proc]
686
+ #
687
+ # @yieldparam [Enumerator::Yielder]
688
+ # @return [Enumerable<Object>]
689
+ def chain_fused(enum, &blk)
690
+ iter = Enumerator.new { blk.call(_1) }
691
+ fused_enum(iter) { close_fused!(enum) }
692
+ end
693
+ end
694
+
695
+ class << self
696
+ # @api private
697
+ #
698
+ # Assumes Strings have been forced into having `Encoding::BINARY`.
699
+ #
700
+ # This decoder is responsible for reassembling lines split across multiple
701
+ # fragments.
702
+ #
703
+ # @param enum [Enumerable<String>]
704
+ #
705
+ # @return [Enumerable<String>]
706
+ def decode_lines(enum)
707
+ re = /(\r\n|\r|\n)/
708
+ buffer = String.new
709
+ cr_seen = nil
710
+
711
+ chain_fused(enum) do |y|
712
+ enum.each do |row|
713
+ offset = buffer.bytesize
714
+ buffer << row
715
+ while (match = re.match(buffer, cr_seen&.to_i || offset))
716
+ case [match.captures.first, cr_seen]
717
+ in ["\r", nil]
718
+ cr_seen = match.end(1)
719
+ next
720
+ in ["\r" | "\r\n", Integer]
721
+ y << buffer.slice!(..(cr_seen.pred))
722
+ else
723
+ y << buffer.slice!(..(match.end(1).pred))
724
+ end
725
+ offset = 0
726
+ cr_seen = nil
727
+ end
728
+ end
729
+
730
+ y << buffer.slice!(..(cr_seen.pred)) unless cr_seen.nil?
731
+ y << buffer unless buffer.empty?
732
+ end
733
+ end
734
+
735
+ # @api private
736
+ #
737
+ # https://html.spec.whatwg.org/multipage/server-sent-events.html#parsing-an-event-stream
738
+ #
739
+ # Assumes that `lines` has been decoded with `#decode_lines`.
740
+ #
741
+ # @param lines [Enumerable<String>]
742
+ #
743
+ # @return [Enumerable<Hash{Symbol=>Object}>]
744
+ def decode_sse(lines)
745
+ # rubocop:disable Metrics/BlockLength
746
+ chain_fused(lines) do |y|
747
+ blank = {event: nil, data: nil, id: nil, retry: nil}
748
+ current = {}
749
+
750
+ lines.each do |line|
751
+ case line.sub(/\R$/, "")
752
+ in ""
753
+ next if current.empty?
754
+ y << {**blank, **current}
755
+ current = {}
756
+ in /^:/
757
+ next
758
+ in /^([^:]+):\s?(.*)$/
759
+ field, value = Regexp.last_match.captures
760
+ case field
761
+ in "event"
762
+ current.merge!(event: value)
763
+ in "data"
764
+ (current[:data] ||= String.new) << (value << "\n")
765
+ in "id" unless value.include?("\0")
766
+ current.merge!(id: value)
767
+ in "retry" if /^\d+$/ =~ value
768
+ current.merge!(retry: Integer(value))
769
+ else
770
+ end
771
+ else
772
+ end
773
+ end
774
+ # rubocop:enable Metrics/BlockLength
775
+
776
+ y << {**blank, **current} unless current.empty?
777
+ end
778
+ end
779
+ end
780
+ end
781
+ end
782
+ end