orb-billing 0.1.0.pre.alpha.38 → 0.1.1

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 (409) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -2
  3. data/lib/orb/client.rb +4 -0
  4. data/lib/orb/internal/transport/base_client.rb +2 -2
  5. data/lib/orb/internal/transport/pooled_net_requester.rb +15 -6
  6. data/lib/orb/internal/type/array_of.rb +12 -2
  7. data/lib/orb/internal/type/base_model.rb +23 -22
  8. data/lib/orb/internal/type/boolean.rb +5 -1
  9. data/lib/orb/internal/type/converter.rb +62 -39
  10. data/lib/orb/internal/type/enum.rb +13 -9
  11. data/lib/orb/internal/type/hash_of.rb +6 -2
  12. data/lib/orb/internal/type/io_like.rb +75 -0
  13. data/lib/orb/internal/type/request_parameters.rb +11 -2
  14. data/lib/orb/internal/type/union.rb +7 -3
  15. data/lib/orb/internal/type/unknown.rb +5 -1
  16. data/lib/orb/internal/util.rb +81 -26
  17. data/lib/orb/models/alert.rb +9 -9
  18. data/lib/orb/models/alert_create_for_customer_params.rb +3 -3
  19. data/lib/orb/models/alert_create_for_external_customer_params.rb +3 -3
  20. data/lib/orb/models/alert_create_for_subscription_params.rb +3 -3
  21. data/lib/orb/models/alert_list_params.rb +5 -5
  22. data/lib/orb/models/alert_update_params.rb +3 -3
  23. data/lib/orb/models/amount_discount.rb +1 -1
  24. data/lib/orb/models/billable_metric.rb +7 -7
  25. data/lib/orb/models/coupon.rb +7 -7
  26. data/lib/orb/models/coupon_create_params.rb +2 -2
  27. data/lib/orb/models/coupon_list_params.rb +2 -2
  28. data/lib/orb/models/coupons/subscription_list_params.rb +1 -1
  29. data/lib/orb/models/credit_note.rb +1 -1
  30. data/lib/orb/models/credit_note_list_params.rb +5 -5
  31. data/lib/orb/models/customer.rb +232 -232
  32. data/lib/orb/models/customer_create_params.rb +223 -223
  33. data/lib/orb/models/customer_list_params.rb +5 -5
  34. data/lib/orb/models/customer_update_by_external_id_params.rb +224 -224
  35. data/lib/orb/models/customer_update_params.rb +224 -224
  36. data/lib/orb/models/customers/balance_transaction_create_response.rb +2 -2
  37. data/lib/orb/models/customers/balance_transaction_list_params.rb +5 -5
  38. data/lib/orb/models/customers/balance_transaction_list_response.rb +2 -2
  39. data/lib/orb/models/customers/cost_list_by_external_id_params.rb +6 -6
  40. data/lib/orb/models/customers/cost_list_params.rb +6 -6
  41. data/lib/orb/models/customers/credit_list_by_external_id_params.rb +2 -2
  42. data/lib/orb/models/customers/credit_list_params.rb +2 -2
  43. data/lib/orb/models/customers/credits/ledger_create_entry_by_external_id_params.rb +20 -20
  44. data/lib/orb/models/customers/credits/ledger_create_entry_by_external_id_response.rb +22 -22
  45. data/lib/orb/models/customers/credits/ledger_create_entry_params.rb +20 -20
  46. data/lib/orb/models/customers/credits/ledger_create_entry_response.rb +22 -22
  47. data/lib/orb/models/customers/credits/ledger_list_by_external_id_params.rb +5 -5
  48. data/lib/orb/models/customers/credits/ledger_list_by_external_id_response.rb +22 -22
  49. data/lib/orb/models/customers/credits/ledger_list_params.rb +5 -5
  50. data/lib/orb/models/customers/credits/ledger_list_response.rb +22 -22
  51. data/lib/orb/models/customers/credits/top_up_create_by_external_id_params.rb +8 -8
  52. data/lib/orb/models/customers/credits/top_up_create_by_external_id_response.rb +7 -7
  53. data/lib/orb/models/customers/credits/top_up_create_params.rb +8 -8
  54. data/lib/orb/models/customers/credits/top_up_create_response.rb +7 -7
  55. data/lib/orb/models/customers/credits/top_up_list_by_external_id_params.rb +1 -1
  56. data/lib/orb/models/customers/credits/top_up_list_by_external_id_response.rb +7 -7
  57. data/lib/orb/models/customers/credits/top_up_list_params.rb +1 -1
  58. data/lib/orb/models/customers/credits/top_up_list_response.rb +7 -7
  59. data/lib/orb/models/dimensional_price_group.rb +7 -7
  60. data/lib/orb/models/dimensional_price_group_create_params.rb +2 -2
  61. data/lib/orb/models/dimensional_price_group_list_params.rb +1 -1
  62. data/lib/orb/models/event_ingest_params.rb +7 -7
  63. data/lib/orb/models/event_ingest_response.rb +4 -4
  64. data/lib/orb/models/event_search_params.rb +5 -5
  65. data/lib/orb/models/event_search_response.rb +8 -8
  66. data/lib/orb/models/event_update_params.rb +4 -4
  67. data/lib/orb/models/events/backfill_close_response.rb +7 -7
  68. data/lib/orb/models/events/backfill_create_params.rb +11 -11
  69. data/lib/orb/models/events/backfill_create_response.rb +7 -7
  70. data/lib/orb/models/events/backfill_fetch_response.rb +7 -7
  71. data/lib/orb/models/events/backfill_list_params.rb +1 -1
  72. data/lib/orb/models/events/backfill_list_response.rb +7 -7
  73. data/lib/orb/models/events/backfill_revert_response.rb +7 -7
  74. data/lib/orb/models/events/event_volumes.rb +1 -1
  75. data/lib/orb/models/events/volume_list_params.rb +7 -7
  76. data/lib/orb/models/invoice.rb +270 -270
  77. data/lib/orb/models/invoice_create_params.rb +12 -11
  78. data/lib/orb/models/invoice_fetch_upcoming_response.rb +266 -266
  79. data/lib/orb/models/invoice_issue_params.rb +4 -4
  80. data/lib/orb/models/invoice_line_item_create_params.rb +1 -1
  81. data/lib/orb/models/invoice_line_item_create_response.rb +27 -27
  82. data/lib/orb/models/invoice_list_params.rb +12 -12
  83. data/lib/orb/models/invoice_update_params.rb +2 -2
  84. data/lib/orb/models/item.rb +2 -2
  85. data/lib/orb/models/item_list_params.rb +1 -1
  86. data/lib/orb/models/metric_create_params.rb +2 -2
  87. data/lib/orb/models/metric_list_params.rb +5 -5
  88. data/lib/orb/models/metric_update_params.rb +2 -2
  89. data/lib/orb/models/percentage_discount.rb +2 -2
  90. data/lib/orb/models/plan.rb +35 -35
  91. data/lib/orb/models/plan_create_params.rb +267 -267
  92. data/lib/orb/models/plan_list_params.rb +5 -5
  93. data/lib/orb/models/plan_update_params.rb +4 -4
  94. data/lib/orb/models/plans/external_plan_id_update_params.rb +4 -4
  95. data/lib/orb/models/price.rb +158 -158
  96. data/lib/orb/models/price_create_params.rb +20 -20
  97. data/lib/orb/models/price_evaluate_params.rb +4 -4
  98. data/lib/orb/models/price_list_params.rb +1 -1
  99. data/lib/orb/models/price_update_params.rb +2 -2
  100. data/lib/orb/models/prices/external_price_id_update_params.rb +2 -2
  101. data/lib/orb/models/subscription.rb +114 -87
  102. data/lib/orb/models/subscription_cancel_params.rb +3 -3
  103. data/lib/orb/models/subscription_cancel_response.rb +150 -72
  104. data/lib/orb/models/subscription_change_apply_params.rb +33 -0
  105. data/lib/orb/models/subscription_change_apply_response.rb +1372 -0
  106. data/lib/orb/models/subscription_change_cancel_params.rb +19 -0
  107. data/lib/orb/models/subscription_change_cancel_response.rb +1372 -0
  108. data/lib/orb/models/subscription_change_retrieve_params.rb +19 -0
  109. data/lib/orb/models/subscription_change_retrieve_response.rb +1372 -0
  110. data/lib/orb/models/subscription_create_params.rb +641 -641
  111. data/lib/orb/models/subscription_create_response.rb +150 -72
  112. data/lib/orb/models/subscription_fetch_costs_params.rb +6 -6
  113. data/lib/orb/models/subscription_fetch_schedule_params.rb +5 -5
  114. data/lib/orb/models/subscription_fetch_schedule_response.rb +2 -2
  115. data/lib/orb/models/subscription_fetch_usage_params.rb +8 -8
  116. data/lib/orb/models/subscription_list_params.rb +5 -5
  117. data/lib/orb/models/subscription_price_intervals_params.rb +323 -323
  118. data/lib/orb/models/subscription_price_intervals_response.rb +152 -72
  119. data/lib/orb/models/subscription_schedule_plan_change_params.rb +651 -651
  120. data/lib/orb/models/subscription_schedule_plan_change_response.rb +152 -72
  121. data/lib/orb/models/subscription_trigger_phase_params.rb +3 -3
  122. data/lib/orb/models/subscription_trigger_phase_response.rb +152 -72
  123. data/lib/orb/models/subscription_unschedule_cancellation_response.rb +152 -72
  124. data/lib/orb/models/subscription_unschedule_fixed_fee_quantity_updates_response.rb +153 -73
  125. data/lib/orb/models/subscription_unschedule_pending_plan_changes_response.rb +152 -72
  126. data/lib/orb/models/subscription_update_fixed_fee_quantity_params.rb +8 -8
  127. data/lib/orb/models/subscription_update_fixed_fee_quantity_response.rb +152 -72
  128. data/lib/orb/models/subscription_update_params.rb +10 -10
  129. data/lib/orb/models/subscription_update_trial_params.rb +3 -3
  130. data/lib/orb/models/subscription_update_trial_response.rb +152 -72
  131. data/lib/orb/models/trial_discount.rb +1 -1
  132. data/lib/orb/models/usage_discount.rb +2 -2
  133. data/lib/orb/request_options.rb +7 -7
  134. data/lib/orb/resources/alerts.rb +38 -38
  135. data/lib/orb/resources/coupons/subscriptions.rb +3 -3
  136. data/lib/orb/resources/coupons.rb +9 -9
  137. data/lib/orb/resources/credit_notes.rb +8 -8
  138. data/lib/orb/resources/customers/balance_transactions.rb +26 -26
  139. data/lib/orb/resources/customers/costs.rb +232 -232
  140. data/lib/orb/resources/customers/credits/ledger.rb +344 -344
  141. data/lib/orb/resources/customers/credits/top_ups.rb +12 -12
  142. data/lib/orb/resources/customers/credits.rb +8 -8
  143. data/lib/orb/resources/customers.rb +59 -59
  144. data/lib/orb/resources/dimensional_price_groups.rb +6 -6
  145. data/lib/orb/resources/events/backfills.rb +49 -49
  146. data/lib/orb/resources/events/volume.rb +10 -10
  147. data/lib/orb/resources/events.rb +295 -295
  148. data/lib/orb/resources/invoice_line_items.rb +1 -1
  149. data/lib/orb/resources/invoices.rb +38 -38
  150. data/lib/orb/resources/items.rb +1 -1
  151. data/lib/orb/resources/metrics.rb +11 -11
  152. data/lib/orb/resources/plans/external_plan_id.rb +14 -14
  153. data/lib/orb/resources/plans.rb +22 -22
  154. data/lib/orb/resources/prices/external_price_id.rb +4 -4
  155. data/lib/orb/resources/prices.rb +30 -30
  156. data/lib/orb/resources/subscription_changes.rb +87 -0
  157. data/lib/orb/resources/subscriptions.rb +813 -813
  158. data/lib/orb/resources/top_level.rb +4 -4
  159. data/lib/orb/version.rb +1 -1
  160. data/lib/orb.rb +8 -0
  161. data/rbi/lib/orb/client.rbi +5 -4
  162. data/rbi/lib/orb/errors.rbi +3 -6
  163. data/rbi/lib/orb/internal/page.rbi +3 -6
  164. data/rbi/lib/orb/internal/transport/base_client.rbi +13 -27
  165. data/rbi/lib/orb/internal/transport/pooled_net_requester.rbi +8 -14
  166. data/rbi/lib/orb/internal/type/array_of.rbi +14 -18
  167. data/rbi/lib/orb/internal/type/base_model.rbi +51 -66
  168. data/rbi/lib/orb/internal/type/base_page.rbi +5 -10
  169. data/rbi/lib/orb/internal/type/boolean.rbi +12 -10
  170. data/rbi/lib/orb/internal/type/converter.rbi +44 -37
  171. data/rbi/lib/orb/internal/type/enum.rbi +24 -21
  172. data/rbi/lib/orb/internal/type/hash_of.rbi +13 -18
  173. data/rbi/lib/orb/internal/type/io_like.rbi +49 -0
  174. data/rbi/lib/orb/internal/type/request_parameters.rbi +1 -2
  175. data/rbi/lib/orb/internal/type/union.rbi +19 -21
  176. data/rbi/lib/orb/internal/type/unknown.rbi +10 -9
  177. data/rbi/lib/orb/internal/util.rbi +67 -70
  178. data/rbi/lib/orb/internal.rbi +1 -1
  179. data/rbi/lib/orb/models/alert.rbi +21 -33
  180. data/rbi/lib/orb/models/alert_create_for_customer_params.rbi +8 -13
  181. data/rbi/lib/orb/models/alert_create_for_external_customer_params.rbi +8 -13
  182. data/rbi/lib/orb/models/alert_create_for_subscription_params.rbi +8 -13
  183. data/rbi/lib/orb/models/alert_disable_params.rbi +2 -4
  184. data/rbi/lib/orb/models/alert_enable_params.rbi +2 -4
  185. data/rbi/lib/orb/models/alert_list_params.rbi +3 -6
  186. data/rbi/lib/orb/models/alert_retrieve_params.rbi +2 -4
  187. data/rbi/lib/orb/models/alert_update_params.rbi +7 -11
  188. data/rbi/lib/orb/models/amount_discount.rbi +4 -7
  189. data/rbi/lib/orb/models/billable_metric.rbi +10 -13
  190. data/rbi/lib/orb/models/billing_cycle_relative_date.rbi +1 -2
  191. data/rbi/lib/orb/models/coupon.rbi +9 -11
  192. data/rbi/lib/orb/models/coupon_archive_params.rbi +2 -4
  193. data/rbi/lib/orb/models/coupon_create_params.rbi +8 -14
  194. data/rbi/lib/orb/models/coupon_fetch_params.rbi +2 -4
  195. data/rbi/lib/orb/models/coupon_list_params.rbi +3 -4
  196. data/rbi/lib/orb/models/coupons/subscription_list_params.rbi +3 -5
  197. data/rbi/lib/orb/models/credit_note.rbi +22 -45
  198. data/rbi/lib/orb/models/credit_note_create_params.rbi +5 -10
  199. data/rbi/lib/orb/models/credit_note_fetch_params.rbi +2 -4
  200. data/rbi/lib/orb/models/credit_note_list_params.rbi +3 -6
  201. data/rbi/lib/orb/models/customer.rbi +256 -281
  202. data/rbi/lib/orb/models/customer_create_params.rbi +251 -276
  203. data/rbi/lib/orb/models/customer_delete_params.rbi +2 -4
  204. data/rbi/lib/orb/models/customer_fetch_by_external_id_params.rbi +2 -4
  205. data/rbi/lib/orb/models/customer_fetch_params.rbi +2 -4
  206. data/rbi/lib/orb/models/customer_list_params.rbi +3 -6
  207. data/rbi/lib/orb/models/customer_sync_payment_methods_from_gateway_by_external_customer_id_params.rbi +2 -4
  208. data/rbi/lib/orb/models/customer_sync_payment_methods_from_gateway_params.rbi +2 -4
  209. data/rbi/lib/orb/models/customer_update_by_external_id_params.rbi +252 -277
  210. data/rbi/lib/orb/models/customer_update_params.rbi +252 -277
  211. data/rbi/lib/orb/models/customers/balance_transaction_create_params.rbi +3 -6
  212. data/rbi/lib/orb/models/customers/balance_transaction_create_response.rbi +10 -19
  213. data/rbi/lib/orb/models/customers/balance_transaction_list_params.rbi +3 -6
  214. data/rbi/lib/orb/models/customers/balance_transaction_list_response.rbi +10 -19
  215. data/rbi/lib/orb/models/customers/cost_list_by_external_id_params.rbi +8 -10
  216. data/rbi/lib/orb/models/customers/cost_list_by_external_id_response.rbi +6 -12
  217. data/rbi/lib/orb/models/customers/cost_list_params.rbi +8 -10
  218. data/rbi/lib/orb/models/customers/cost_list_response.rbi +6 -12
  219. data/rbi/lib/orb/models/customers/credit_list_by_external_id_params.rbi +3 -4
  220. data/rbi/lib/orb/models/customers/credit_list_by_external_id_response.rbi +2 -4
  221. data/rbi/lib/orb/models/customers/credit_list_params.rbi +3 -4
  222. data/rbi/lib/orb/models/customers/credit_list_response.rbi +2 -4
  223. data/rbi/lib/orb/models/customers/credits/ledger_create_entry_by_external_id_params.rbi +26 -33
  224. data/rbi/lib/orb/models/customers/credits/ledger_create_entry_by_external_id_response.rbi +79 -136
  225. data/rbi/lib/orb/models/customers/credits/ledger_create_entry_params.rbi +26 -33
  226. data/rbi/lib/orb/models/customers/credits/ledger_create_entry_response.rbi +78 -135
  227. data/rbi/lib/orb/models/customers/credits/ledger_list_by_external_id_params.rbi +5 -10
  228. data/rbi/lib/orb/models/customers/credits/ledger_list_by_external_id_response.rbi +79 -136
  229. data/rbi/lib/orb/models/customers/credits/ledger_list_params.rbi +5 -10
  230. data/rbi/lib/orb/models/customers/credits/ledger_list_response.rbi +74 -131
  231. data/rbi/lib/orb/models/customers/credits/top_up_create_by_external_id_params.rbi +13 -19
  232. data/rbi/lib/orb/models/customers/credits/top_up_create_by_external_id_response.rbi +12 -18
  233. data/rbi/lib/orb/models/customers/credits/top_up_create_params.rbi +13 -19
  234. data/rbi/lib/orb/models/customers/credits/top_up_create_response.rbi +12 -18
  235. data/rbi/lib/orb/models/customers/credits/top_up_delete_by_external_id_params.rbi +2 -4
  236. data/rbi/lib/orb/models/customers/credits/top_up_delete_params.rbi +2 -4
  237. data/rbi/lib/orb/models/customers/credits/top_up_list_by_external_id_params.rbi +3 -5
  238. data/rbi/lib/orb/models/customers/credits/top_up_list_by_external_id_response.rbi +12 -18
  239. data/rbi/lib/orb/models/customers/credits/top_up_list_params.rbi +3 -5
  240. data/rbi/lib/orb/models/customers/credits/top_up_list_response.rbi +12 -18
  241. data/rbi/lib/orb/models/dimensional_price_group.rbi +8 -9
  242. data/rbi/lib/orb/models/dimensional_price_group_create_params.rbi +4 -7
  243. data/rbi/lib/orb/models/dimensional_price_group_list_params.rbi +3 -5
  244. data/rbi/lib/orb/models/dimensional_price_group_retrieve_params.rbi +2 -4
  245. data/rbi/lib/orb/models/dimensional_price_groups/external_dimensional_price_group_id_retrieve_params.rbi +2 -4
  246. data/rbi/lib/orb/models/dimensional_price_groups.rbi +2 -4
  247. data/rbi/lib/orb/models/discount.rbi +1 -2
  248. data/rbi/lib/orb/models/evaluate_price_group.rbi +3 -6
  249. data/rbi/lib/orb/models/event_deprecate_params.rbi +2 -4
  250. data/rbi/lib/orb/models/event_deprecate_response.rbi +2 -4
  251. data/rbi/lib/orb/models/event_ingest_params.rbi +10 -13
  252. data/rbi/lib/orb/models/event_ingest_response.rbi +10 -16
  253. data/rbi/lib/orb/models/event_search_params.rbi +7 -9
  254. data/rbi/lib/orb/models/event_search_response.rbi +11 -14
  255. data/rbi/lib/orb/models/event_update_params.rbi +5 -6
  256. data/rbi/lib/orb/models/event_update_response.rbi +2 -4
  257. data/rbi/lib/orb/models/events/backfill_close_params.rbi +2 -4
  258. data/rbi/lib/orb/models/events/backfill_close_response.rbi +10 -14
  259. data/rbi/lib/orb/models/events/backfill_create_params.rbi +13 -16
  260. data/rbi/lib/orb/models/events/backfill_create_response.rbi +10 -14
  261. data/rbi/lib/orb/models/events/backfill_fetch_params.rbi +2 -4
  262. data/rbi/lib/orb/models/events/backfill_fetch_response.rbi +10 -14
  263. data/rbi/lib/orb/models/events/backfill_list_params.rbi +3 -5
  264. data/rbi/lib/orb/models/events/backfill_list_response.rbi +10 -14
  265. data/rbi/lib/orb/models/events/backfill_revert_params.rbi +2 -4
  266. data/rbi/lib/orb/models/events/backfill_revert_response.rbi +10 -14
  267. data/rbi/lib/orb/models/events/event_volumes.rbi +5 -9
  268. data/rbi/lib/orb/models/events/volume_list_params.rbi +9 -11
  269. data/rbi/lib/orb/models/invoice.rbi +388 -465
  270. data/rbi/lib/orb/models/invoice_create_params.rbi +19 -26
  271. data/rbi/lib/orb/models/invoice_fetch_params.rbi +2 -4
  272. data/rbi/lib/orb/models/invoice_fetch_upcoming_params.rbi +2 -4
  273. data/rbi/lib/orb/models/invoice_fetch_upcoming_response.rbi +381 -460
  274. data/rbi/lib/orb/models/invoice_issue_params.rbi +6 -8
  275. data/rbi/lib/orb/models/invoice_level_discount.rbi +1 -2
  276. data/rbi/lib/orb/models/invoice_line_item_create_params.rbi +3 -5
  277. data/rbi/lib/orb/models/invoice_line_item_create_response.rbi +101 -143
  278. data/rbi/lib/orb/models/invoice_list_params.rbi +8 -13
  279. data/rbi/lib/orb/models/invoice_mark_paid_params.rbi +2 -4
  280. data/rbi/lib/orb/models/invoice_pay_params.rbi +2 -4
  281. data/rbi/lib/orb/models/invoice_update_params.rbi +4 -6
  282. data/rbi/lib/orb/models/invoice_void_params.rbi +2 -4
  283. data/rbi/lib/orb/models/item.rbi +7 -12
  284. data/rbi/lib/orb/models/item_create_params.rbi +2 -4
  285. data/rbi/lib/orb/models/item_fetch_params.rbi +2 -4
  286. data/rbi/lib/orb/models/item_list_params.rbi +3 -5
  287. data/rbi/lib/orb/models/item_update_params.rbi +5 -10
  288. data/rbi/lib/orb/models/metric_create_params.rbi +4 -6
  289. data/rbi/lib/orb/models/metric_fetch_params.rbi +2 -4
  290. data/rbi/lib/orb/models/metric_list_params.rbi +3 -6
  291. data/rbi/lib/orb/models/metric_update_params.rbi +4 -6
  292. data/rbi/lib/orb/models/pagination_metadata.rbi +2 -4
  293. data/rbi/lib/orb/models/percentage_discount.rbi +5 -8
  294. data/rbi/lib/orb/models/plan.rbi +180 -219
  295. data/rbi/lib/orb/models/plan_create_params.rbi +670 -951
  296. data/rbi/lib/orb/models/plan_fetch_params.rbi +2 -4
  297. data/rbi/lib/orb/models/plan_list_params.rbi +4 -8
  298. data/rbi/lib/orb/models/plan_update_params.rbi +6 -8
  299. data/rbi/lib/orb/models/plans/external_plan_id_fetch_params.rbi +2 -4
  300. data/rbi/lib/orb/models/plans/external_plan_id_update_params.rbi +6 -8
  301. data/rbi/lib/orb/models/price.rbi +827 -1494
  302. data/rbi/lib/orb/models/price_create_params.rbi +60 -101
  303. data/rbi/lib/orb/models/price_evaluate_params.rbi +6 -9
  304. data/rbi/lib/orb/models/price_evaluate_response.rbi +2 -4
  305. data/rbi/lib/orb/models/price_fetch_params.rbi +2 -4
  306. data/rbi/lib/orb/models/price_list_params.rbi +3 -5
  307. data/rbi/lib/orb/models/price_update_params.rbi +4 -6
  308. data/rbi/lib/orb/models/prices/external_price_id_fetch_params.rbi +2 -4
  309. data/rbi/lib/orb/models/prices/external_price_id_update_params.rbi +4 -6
  310. data/rbi/lib/orb/models/subscription.rbi +167 -187
  311. data/rbi/lib/orb/models/subscription_cancel_params.rbi +5 -7
  312. data/rbi/lib/orb/models/subscription_cancel_response.rbi +224 -178
  313. data/rbi/lib/orb/models/subscription_change_apply_params.rbi +40 -0
  314. data/rbi/lib/orb/models/subscription_change_apply_response.rbi +1554 -0
  315. data/rbi/lib/orb/models/subscription_change_cancel_params.rbi +18 -0
  316. data/rbi/lib/orb/models/subscription_change_cancel_response.rbi +1565 -0
  317. data/rbi/lib/orb/models/subscription_change_retrieve_params.rbi +18 -0
  318. data/rbi/lib/orb/models/subscription_change_retrieve_response.rbi +1581 -0
  319. data/rbi/lib/orb/models/subscription_create_params.rbi +1372 -1968
  320. data/rbi/lib/orb/models/subscription_create_response.rbi +224 -178
  321. data/rbi/lib/orb/models/subscription_fetch_costs_params.rbi +8 -10
  322. data/rbi/lib/orb/models/subscription_fetch_costs_response.rbi +6 -12
  323. data/rbi/lib/orb/models/subscription_fetch_params.rbi +2 -4
  324. data/rbi/lib/orb/models/subscription_fetch_schedule_params.rbi +3 -6
  325. data/rbi/lib/orb/models/subscription_fetch_schedule_response.rbi +6 -10
  326. data/rbi/lib/orb/models/subscription_fetch_usage_params.rbi +12 -17
  327. data/rbi/lib/orb/models/subscription_list_params.rbi +4 -8
  328. data/rbi/lib/orb/models/subscription_price_intervals_params.rbi +772 -1124
  329. data/rbi/lib/orb/models/subscription_price_intervals_response.rbi +228 -178
  330. data/rbi/lib/orb/models/subscription_schedule_plan_change_params.rbi +1396 -1993
  331. data/rbi/lib/orb/models/subscription_schedule_plan_change_response.rbi +238 -182
  332. data/rbi/lib/orb/models/subscription_trigger_phase_params.rbi +5 -7
  333. data/rbi/lib/orb/models/subscription_trigger_phase_response.rbi +224 -178
  334. data/rbi/lib/orb/models/subscription_unschedule_cancellation_params.rbi +2 -4
  335. data/rbi/lib/orb/models/subscription_unschedule_cancellation_response.rbi +238 -182
  336. data/rbi/lib/orb/models/subscription_unschedule_fixed_fee_quantity_updates_params.rbi +2 -4
  337. data/rbi/lib/orb/models/subscription_unschedule_fixed_fee_quantity_updates_response.rbi +265 -199
  338. data/rbi/lib/orb/models/subscription_unschedule_pending_plan_changes_params.rbi +2 -4
  339. data/rbi/lib/orb/models/subscription_unschedule_pending_plan_changes_response.rbi +264 -198
  340. data/rbi/lib/orb/models/subscription_update_fixed_fee_quantity_params.rbi +11 -15
  341. data/rbi/lib/orb/models/subscription_update_fixed_fee_quantity_response.rbi +238 -182
  342. data/rbi/lib/orb/models/subscription_update_params.rbi +12 -15
  343. data/rbi/lib/orb/models/subscription_update_trial_params.rbi +6 -9
  344. data/rbi/lib/orb/models/subscription_update_trial_response.rbi +224 -178
  345. data/rbi/lib/orb/models/subscription_usage.rbi +24 -43
  346. data/rbi/lib/orb/models/subscriptions.rbi +2 -4
  347. data/rbi/lib/orb/models/top_level_ping_params.rbi +2 -4
  348. data/rbi/lib/orb/models/top_level_ping_response.rbi +2 -4
  349. data/rbi/lib/orb/models/trial_discount.rbi +4 -8
  350. data/rbi/lib/orb/models/usage_discount.rbi +5 -8
  351. data/rbi/lib/orb/request_options.rbi +9 -11
  352. data/rbi/lib/orb/resources/alerts.rbi +44 -60
  353. data/rbi/lib/orb/resources/coupons/subscriptions.rbi +6 -9
  354. data/rbi/lib/orb/resources/coupons.rbi +18 -25
  355. data/rbi/lib/orb/resources/credit_notes.rbi +9 -15
  356. data/rbi/lib/orb/resources/customers/balance_transactions.rbi +26 -31
  357. data/rbi/lib/orb/resources/customers/costs.rbi +241 -246
  358. data/rbi/lib/orb/resources/customers/credits/ledger.rbi +387 -396
  359. data/rbi/lib/orb/resources/customers/credits/top_ups.rbi +29 -40
  360. data/rbi/lib/orb/resources/customers/credits.rbi +15 -20
  361. data/rbi/lib/orb/resources/customers.rbi +407 -417
  362. data/rbi/lib/orb/resources/dimensional_price_groups/external_dimensional_price_group_id.rbi +2 -4
  363. data/rbi/lib/orb/resources/dimensional_price_groups.rbi +13 -19
  364. data/rbi/lib/orb/resources/events/backfills.rbi +61 -69
  365. data/rbi/lib/orb/resources/events/volume.rbi +19 -22
  366. data/rbi/lib/orb/resources/events.rbi +311 -319
  367. data/rbi/lib/orb/resources/invoice_line_items.rbi +4 -7
  368. data/rbi/lib/orb/resources/invoices.rbi +62 -76
  369. data/rbi/lib/orb/resources/items.rbi +7 -14
  370. data/rbi/lib/orb/resources/metrics.rbi +17 -25
  371. data/rbi/lib/orb/resources/plans/external_plan_id.rbi +21 -25
  372. data/rbi/lib/orb/resources/plans.rbi +63 -71
  373. data/rbi/lib/orb/resources/prices/external_price_id.rbi +9 -13
  374. data/rbi/lib/orb/resources/prices.rbi +77 -87
  375. data/rbi/lib/orb/resources/subscription_changes.rbi +61 -0
  376. data/rbi/lib/orb/resources/subscriptions.rbi +933 -963
  377. data/rbi/lib/orb/resources/top_level.rbi +6 -8
  378. data/sig/orb/client.rbs +2 -0
  379. data/sig/orb/internal/transport/pooled_net_requester.rbs +1 -1
  380. data/sig/orb/internal/type/array_of.rbs +5 -2
  381. data/sig/orb/internal/type/base_model.rbs +5 -2
  382. data/sig/orb/internal/type/boolean.rbs +5 -2
  383. data/sig/orb/internal/type/converter.rbs +11 -5
  384. data/sig/orb/internal/type/enum.rbs +5 -2
  385. data/sig/orb/internal/type/hash_of.rbs +5 -2
  386. data/sig/orb/internal/type/io_like.rbs +23 -0
  387. data/sig/orb/internal/type/union.rbs +5 -2
  388. data/sig/orb/internal/type/unknown.rbs +5 -2
  389. data/sig/orb/internal/util.rbs +17 -2
  390. data/sig/orb/models/subscription.rbs +14 -0
  391. data/sig/orb/models/subscription_cancel_response.rbs +47 -2
  392. data/sig/orb/models/subscription_change_apply_params.rbs +24 -0
  393. data/sig/orb/models/subscription_change_apply_response.rbs +784 -0
  394. data/sig/orb/models/subscription_change_cancel_params.rbs +15 -0
  395. data/sig/orb/models/subscription_change_cancel_response.rbs +784 -0
  396. data/sig/orb/models/subscription_change_retrieve_params.rbs +15 -0
  397. data/sig/orb/models/subscription_change_retrieve_response.rbs +784 -0
  398. data/sig/orb/models/subscription_create_response.rbs +47 -2
  399. data/sig/orb/models/subscription_price_intervals_response.rbs +47 -2
  400. data/sig/orb/models/subscription_schedule_plan_change_response.rbs +47 -2
  401. data/sig/orb/models/subscription_trigger_phase_response.rbs +47 -2
  402. data/sig/orb/models/subscription_unschedule_cancellation_response.rbs +47 -2
  403. data/sig/orb/models/subscription_unschedule_fixed_fee_quantity_updates_response.rbs +47 -2
  404. data/sig/orb/models/subscription_unschedule_pending_plan_changes_response.rbs +47 -2
  405. data/sig/orb/models/subscription_update_fixed_fee_quantity_response.rbs +47 -2
  406. data/sig/orb/models/subscription_update_trial_response.rbs +47 -2
  407. data/sig/orb/resources/customers.rbs +2 -2
  408. data/sig/orb/resources/subscription_changes.rbs +24 -0
  409. metadata +28 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 249d2973800ed2fb6c87fe4e0c7b22208082baef56fa69146ebd6b6eb464fd0f
4
- data.tar.gz: e3db0fd166e2f0e698bc3487a9e69d6b0461bdab175a105624f43b4b230c150d
3
+ metadata.gz: 96cef32525e1e12a5b3d6e1eb8839eceb8aea9e3dddb1b8dc906b4b793bdec35
4
+ data.tar.gz: 148cb13c2428e83eb8e9dbf6720601ad3b03c90b2b2df73bad9b1d8022dab983
5
5
  SHA512:
6
- metadata.gz: ce5534719e3cfa2faa48435c2ec0b84910f1f1cfb4e5679c43ae6cbe4d218855479bac17e467d723799ccf1953197a7cfe9a89442f5b904bcb252a66490b9fb8
7
- data.tar.gz: fed3c6b0e6311ab74defabad0b7fa99f6b464de6dce1af15f2212e7c4725211eba89aae5fd4747611ebab9b778a5c036a3b7b8a1d808fdf8609f6b2af28869fe
6
+ metadata.gz: aeb7b0a8da2dc0c3b5134cb979eb60af78bc8ce3dc64fb204da38e40ef7cb5ca0f9eb476eb601dd40fd3b796f2b459a8182b83f1176dd37c68c35d4f7cb3be33
7
+ data.tar.gz: 87f4b582111e480f15e830a0b537ca205c89d5958b2b3ff4dc275e2c8966805b8e8b804205f5e945636cc7532940f25846dad64411c8110cd0dfc630f3b261fc
data/README.md CHANGED
@@ -15,7 +15,7 @@ To use this gem, install via Bundler by adding the following to your application
15
15
  <!-- x-release-please-start-version -->
16
16
 
17
17
  ```ruby
18
- gem "orb-billing", "~> 0.1.0.pre.alpha.37"
18
+ gem "orb-billing", "~> 0.1.0"
19
19
  ```
20
20
 
21
21
  <!-- x-release-please-end -->
@@ -148,6 +148,13 @@ After Solargraph is installed, **you must populate its index** either via the pr
148
148
  bundle exec solargraph gems
149
149
  ```
150
150
 
151
+ Note: if you had installed the gem either using a `git:` or `github:` URL, or had vendored the gem using bundler, you will need to set up your [`.solargraph.yml`](https://solargraph.org/guides/configuration) to include the path to the gem's `lib` directory.
152
+
153
+ ```yaml
154
+ include:
155
+ - 'vendor/bundle/ruby/*/gems/orb-billing-*/lib/**/*.rb'
156
+ ```
157
+
151
158
  Otherwise Solargraph will not be able to provide type information or auto-completion for any non-indexed libraries.
152
159
 
153
160
  ### Sorbet
@@ -161,7 +168,8 @@ Due to limitations with the Sorbet type system, where a method otherwise can tak
161
168
  Please follow Sorbet's [setup guides](https://sorbet.org/docs/adopting) for best experience.
162
169
 
163
170
  ```ruby
164
- params = Orb::Models::CustomerCreateParams.new(email: "example-customer@withorb.com", name: "My Customer")
171
+ params =
172
+ Orb::Models::CustomerCreateParams.new(email: "example-customer@withorb.com", name: "My Customer")
165
173
 
166
174
  orb.customers.create(**params)
167
175
  ```
data/lib/orb/client.rb CHANGED
@@ -60,6 +60,9 @@ module Orb
60
60
  # @return [Orb::Resources::DimensionalPriceGroups]
61
61
  attr_reader :dimensional_price_groups
62
62
 
63
+ # @return [Orb::Resources::SubscriptionChanges]
64
+ attr_reader :subscription_changes
65
+
63
66
  # @api private
64
67
  #
65
68
  # @return [Hash{String=>String}]
@@ -124,6 +127,7 @@ module Orb
124
127
  @subscriptions = Orb::Resources::Subscriptions.new(client: self)
125
128
  @alerts = Orb::Resources::Alerts.new(client: self)
126
129
  @dimensional_price_groups = Orb::Resources::DimensionalPriceGroups.new(client: self)
130
+ @subscription_changes = Orb::Resources::SubscriptionChanges.new(client: self)
127
131
  end
128
132
  end
129
133
  end
@@ -380,7 +380,7 @@ module Orb
380
380
  in (400..) | Orb::Errors::APIConnectionError
381
381
  self.class.reap_connection!(status, stream: stream)
382
382
 
383
- delay = retry_delay(response, retry_count: retry_count)
383
+ delay = retry_delay(response || {}, retry_count: retry_count)
384
384
  sleep(delay)
385
385
 
386
386
  send_request(
@@ -393,7 +393,7 @@ module Orb
393
393
  end
394
394
 
395
395
  # Execute the request specified by `req`. This is the method that all resource
396
- # methods call into.
396
+ # methods call into.
397
397
  #
398
398
  # @overload request(method, path, query: {}, headers: {}, body: nil, unwrap: nil, page: nil, stream: nil, model: Orb::Internal::Type::Unknown, options: {})
399
399
  #
@@ -6,7 +6,7 @@ module Orb
6
6
  # @api private
7
7
  class PooledNetRequester
8
8
  # from the golang stdlib
9
- # https://github.com/golang/go/blob/c8eced8580028328fde7c03cbfcb720ce15b2358/src/net/http/transport.go#L49
9
+ # https://github.com/golang/go/blob/c8eced8580028328fde7c03cbfcb720ce15b2358/src/net/http/transport.go#L49
10
10
  KEEP_ALIVE_TIMEOUT = 30
11
11
 
12
12
  class << self
@@ -54,7 +54,7 @@ module Orb
54
54
  # @param blk [Proc]
55
55
  #
56
56
  # @yieldparam [String]
57
- # @return [Net::HTTPGenericRequest]
57
+ # @return [Array(Net::HTTPGenericRequest, Proc)]
58
58
  def build_request(request, &blk)
59
59
  method, url, headers, body = request.fetch_values(:method, :url, :headers, :body)
60
60
  req = Net::HTTPGenericRequest.new(
@@ -75,12 +75,12 @@ module Orb
75
75
  in StringIO
76
76
  req["content-length"] ||= body.size.to_s unless req["transfer-encoding"]
77
77
  req.body_stream = Orb::Internal::Util::ReadIOAdapter.new(body, &blk)
78
- in IO | Enumerator
78
+ in Pathname | IO | Enumerator
79
79
  req["transfer-encoding"] ||= "chunked" unless req["content-length"]
80
80
  req.body_stream = Orb::Internal::Util::ReadIOAdapter.new(body, &blk)
81
81
  end
82
82
 
83
- req
83
+ [req, req.body_stream&.method(:close)]
84
84
  end
85
85
  end
86
86
 
@@ -123,13 +123,17 @@ module Orb
123
123
  def execute(request)
124
124
  url, deadline = request.fetch_values(:url, :deadline)
125
125
 
126
+ req = nil
126
127
  eof = false
127
128
  finished = false
129
+ closing = nil
130
+
131
+ # rubocop:disable Metrics/BlockLength
128
132
  enum = Enumerator.new do |y|
129
133
  with_pool(url, deadline: deadline) do |conn|
130
134
  next if finished
131
135
 
132
- req = self.class.build_request(request) do
136
+ req, closing = self.class.build_request(request) do
133
137
  self.class.calibrate_socket_timeout(conn, deadline)
134
138
  end
135
139
 
@@ -154,8 +158,11 @@ module Orb
154
158
  end
155
159
  end
156
160
  rescue Timeout::Error
157
- raise Orb::Errors::APITimeoutError
161
+ raise Orb::Errors::APITimeoutError.new(url: url, request: req)
162
+ rescue StandardError
163
+ raise Orb::Errors::APIConnectionError.new(url: url, request: req)
158
164
  end
165
+ # rubocop:enable Metrics/BlockLength
159
166
 
160
167
  conn, _, response = enum.next
161
168
  body = Orb::Internal::Util.fused_enum(enum, external: true) do
@@ -165,7 +172,9 @@ module Orb
165
172
  rescue StopIteration
166
173
  nil
167
174
  end
175
+ ensure
168
176
  conn.finish if !eof && conn&.started?
177
+ closing&.call
169
178
  end
170
179
  [Integer(response.code), response, (response.body = body)]
171
180
  end
@@ -79,10 +79,20 @@ module Orb
79
79
  #
80
80
  # @param value [Array<Object>, Object]
81
81
  #
82
+ # @param state [Hash{Symbol=>Object}] .
83
+ #
84
+ # @option state [Boolean] :can_retry
85
+ #
82
86
  # @return [Array<Object>, Object]
83
- def dump(value)
87
+ def dump(value, state:)
84
88
  target = item_type
85
- value.is_a?(Array) ? value.map { Orb::Internal::Type::Converter.dump(target, _1) } : super
89
+ if value.is_a?(Array)
90
+ value.map do
91
+ Orb::Internal::Type::Converter.dump(target, _1, state: state)
92
+ end
93
+ else
94
+ super
95
+ end
86
96
  end
87
97
 
88
98
  # @api private
@@ -19,7 +19,7 @@ module Orb
19
19
  # @api private
20
20
  #
21
21
  # Assumes superclass fields are totally defined before fields are accessed /
22
- # defined on subclasses.
22
+ # defined on subclasses.
23
23
  #
24
24
  # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
25
25
  def known_fields
@@ -143,7 +143,7 @@ module Orb
143
143
  # @api private
144
144
  #
145
145
  # `request_only` attributes not excluded from `.#coerce` when receiving responses
146
- # even if well behaved servers should not send them
146
+ # even if well behaved servers should not send them
147
147
  #
148
148
  # @param blk [Proc]
149
149
  private def request_only(&blk)
@@ -252,36 +252,37 @@ module Orb
252
252
  #
253
253
  # @param value [Orb::Internal::Type::BaseModel, Object]
254
254
  #
255
+ # @param state [Hash{Symbol=>Object}] .
256
+ #
257
+ # @option state [Boolean] :can_retry
258
+ #
255
259
  # @return [Hash{Object=>Object}, Object]
256
- def dump(value)
260
+ def dump(value, state:)
257
261
  unless (coerced = Orb::Internal::Util.coerce_hash(value)).is_a?(Hash)
258
262
  return super
259
263
  end
260
264
 
261
- is_param = singleton_class <= Orb::Internal::Type::RequestParameters::Converter
262
265
  acc = {}
263
266
 
264
267
  coerced.each do |key, val|
265
268
  name = key.is_a?(String) ? key.to_sym : key
266
269
  case (field = known_fields[name])
267
270
  in nil
268
- acc.store(name, super(val))
271
+ acc.store(name, super(val, state: state))
269
272
  else
270
- mode, type_fn = field.fetch_values(:mode, :type_fn)
273
+ api_name, mode, type_fn = field.fetch_values(:api_name, :mode, :type_fn)
271
274
  case mode
272
275
  in :coerce
273
276
  next
274
277
  else
275
278
  target = type_fn.call
276
- api_name = is_param ? name : field.fetch(:api_name)
277
- acc.store(api_name, Orb::Internal::Type::Converter.dump(target, val))
279
+ acc.store(api_name, Orb::Internal::Type::Converter.dump(target, val, state: state))
278
280
  end
279
281
  end
280
282
  end
281
283
 
282
- known_fields.each do |name, field|
283
- mode, const = field.fetch_values(:mode, :const)
284
- api_name = is_param ? name : field.fetch(:api_name)
284
+ known_fields.each_value do |field|
285
+ api_name, mode, const = field.fetch_values(:api_name, :mode, :const)
285
286
  next if mode == :coerce || acc.key?(api_name) || const == Orb::Internal::OMIT
286
287
  acc.store(api_name, const)
287
288
  end
@@ -291,11 +292,11 @@ module Orb
291
292
  end
292
293
 
293
294
  # Returns the raw value associated with the given key, if found. Otherwise, nil is
294
- # returned.
295
+ # returned.
295
296
  #
296
- # It is valid to lookup keys that are not in the API spec, for example to access
297
- # undocumented features. This method does not parse response data into
298
- # higher-level types. Lookup by anything other than a Symbol is an ArgumentError.
297
+ # It is valid to lookup keys that are not in the API spec, for example to access
298
+ # undocumented features. This method does not parse response data into
299
+ # higher-level types. Lookup by anything other than a Symbol is an ArgumentError.
299
300
  #
300
301
  # @param key [Symbol]
301
302
  #
@@ -310,12 +311,12 @@ module Orb
310
311
 
311
312
  # Returns a Hash of the data underlying this object. O(1)
312
313
  #
313
- # Keys are Symbols and values are the raw values from the response. The return
314
- # value indicates which values were ever set on the object. i.e. there will be a
315
- # key in this hash if they ever were, even if the set value was nil.
314
+ # Keys are Symbols and values are the raw values from the response. The return
315
+ # value indicates which values were ever set on the object. i.e. there will be a
316
+ # key in this hash if they ever were, even if the set value was nil.
316
317
  #
317
- # This method is not recursive. The returned value is shared by the object, so it
318
- # should not be mutated.
318
+ # This method is not recursive. The returned value is shared by the object, so it
319
+ # should not be mutated.
319
320
  #
320
321
  # @return [Hash{Symbol=>Object}]
321
322
  def to_h = @data
@@ -340,12 +341,12 @@ module Orb
340
341
  # @param a [Object]
341
342
  #
342
343
  # @return [String]
343
- def to_json(*a) = self.class.dump(self).to_json(*a)
344
+ def to_json(*a) = Orb::Internal::Type::Converter.dump(self.class, self).to_json(*a)
344
345
 
345
346
  # @param a [Object]
346
347
  #
347
348
  # @return [String]
348
- def to_yaml(*a) = self.class.dump(self).to_yaml(*a)
349
+ def to_yaml(*a) = Orb::Internal::Type::Converter.dump(self.class, self).to_yaml(*a)
349
350
 
350
351
  # Create a new instance of a model.
351
352
  #
@@ -45,8 +45,12 @@ module Orb
45
45
  # #
46
46
  # # @param value [Boolean, Object]
47
47
  # #
48
+ # # @param state [Hash{Symbol=>Object}] .
49
+ # #
50
+ # # @option state [Boolean] :can_retry
51
+ # #
48
52
  # # @return [Boolean, Object]
49
- # def dump(value) = super
53
+ # def dump(value, state:) = super
50
54
  end
51
55
  end
52
56
  end
@@ -3,7 +3,6 @@
3
3
  module Orb
4
4
  module Internal
5
5
  module Type
6
- # rubocop:disable Metrics/ModuleLength
7
6
  # @api private
8
7
  module Converter
9
8
  # rubocop:disable Lint/UnusedMethodArgument
@@ -27,15 +26,24 @@ module Orb
27
26
  #
28
27
  # @param value [Object]
29
28
  #
29
+ # @param state [Hash{Symbol=>Object}] .
30
+ #
31
+ # @option state [Boolean] :can_retry
32
+ #
30
33
  # @return [Object]
31
- def dump(value)
34
+ def dump(value, state:)
32
35
  case value
33
36
  in Array
34
- value.map { Orb::Internal::Type::Unknown.dump(_1) }
37
+ value.map { Orb::Internal::Type::Unknown.dump(_1, state: state) }
35
38
  in Hash
36
- value.transform_values { Orb::Internal::Type::Unknown.dump(_1) }
39
+ value.transform_values { Orb::Internal::Type::Unknown.dump(_1, state: state) }
37
40
  in Orb::Internal::Type::BaseModel
38
- value.class.dump(value)
41
+ value.class.dump(value, state: state)
42
+ in StringIO
43
+ value.string
44
+ in Pathname | IO
45
+ state[:can_retry] = false if value.is_a?(IO)
46
+ Orb::Internal::Util::SerializationAdapter.new(value)
39
47
  else
40
48
  value
41
49
  end
@@ -76,37 +84,37 @@ module Orb
76
84
  #
77
85
  # Based on `target`, transform `value` into `target`, to the extent possible:
78
86
  #
79
- # 1. if the given `value` conforms to `target` already, return the given `value`
80
- # 2. if it's possible and safe to convert the given `value` to `target`, then the
81
- # converted value
82
- # 3. otherwise, the given `value` unaltered
87
+ # 1. if the given `value` conforms to `target` already, return the given `value`
88
+ # 2. if it's possible and safe to convert the given `value` to `target`, then the
89
+ # converted value
90
+ # 3. otherwise, the given `value` unaltered
83
91
  #
84
- # The coercion process is subject to improvement between minor release versions.
85
- # See https://docs.pydantic.dev/latest/concepts/unions/#smart-mode
92
+ # The coercion process is subject to improvement between minor release versions.
93
+ # See https://docs.pydantic.dev/latest/concepts/unions/#smart-mode
86
94
  #
87
95
  # @param target [Orb::Internal::Type::Converter, Class]
88
96
  #
89
97
  # @param value [Object]
90
98
  #
91
99
  # @param state [Hash{Symbol=>Object}] The `strictness` is one of `true`, `false`, or `:strong`. This informs the
92
- # coercion strategy when we have to decide between multiple possible conversion
93
- # targets:
100
+ # coercion strategy when we have to decide between multiple possible conversion
101
+ # targets:
94
102
  #
95
- # - `true`: the conversion must be exact, with minimum coercion.
96
- # - `false`: the conversion can be approximate, with some coercion.
97
- # - `:strong`: the conversion must be exact, with no coercion, and raise an error
98
- # if not possible.
103
+ # - `true`: the conversion must be exact, with minimum coercion.
104
+ # - `false`: the conversion can be approximate, with some coercion.
105
+ # - `:strong`: the conversion must be exact, with no coercion, and raise an error
106
+ # if not possible.
99
107
  #
100
- # The `exactness` is `Hash` with keys being one of `yes`, `no`, or `maybe`. For
101
- # any given conversion attempt, the exactness will be updated based on how closely
102
- # the value recursively matches the target type:
108
+ # The `exactness` is `Hash` with keys being one of `yes`, `no`, or `maybe`. For
109
+ # any given conversion attempt, the exactness will be updated based on how closely
110
+ # the value recursively matches the target type:
103
111
  #
104
- # - `yes`: the value can be converted to the target type with minimum coercion.
105
- # - `maybe`: the value can be converted to the target type with some reasonable
106
- # coercion.
107
- # - `no`: the value cannot be converted to the target type.
112
+ # - `yes`: the value can be converted to the target type with minimum coercion.
113
+ # - `maybe`: the value can be converted to the target type with some reasonable
114
+ # coercion.
115
+ # - `no`: the value cannot be converted to the target type.
108
116
  #
109
- # See implementation below for more details.
117
+ # See implementation below for more details.
110
118
  #
111
119
  # @option state [Boolean, :strong] :strictness
112
120
  #
@@ -141,9 +149,9 @@ module Orb
141
149
  if value.is_a?(Integer)
142
150
  exactness[:yes] += 1
143
151
  return value
144
- elsif strictness == :strong
152
+ elsif strictness == :strong && Integer(value, exception: false) != value
145
153
  message = "no implicit conversion of #{value.class} into #{target.inspect}"
146
- raise TypeError.new(message)
154
+ raise value.is_a?(Numeric) ? ArgumentError.new(message) : TypeError.new(message)
147
155
  else
148
156
  Kernel.then do
149
157
  return Integer(value).tap { exactness[:maybe] += 1 }
@@ -183,18 +191,26 @@ module Orb
183
191
  rescue ArgumentError, TypeError => e
184
192
  raise e if strictness == :strong
185
193
  end
186
- in -> { _1 <= IO } if value.is_a?(String)
194
+ in -> { _1 <= StringIO } if value.is_a?(String)
187
195
  exactness[:yes] += 1
188
196
  return StringIO.new(value.b)
189
197
  else
190
198
  end
191
199
  in Symbol
192
- if (value.is_a?(Symbol) || value.is_a?(String)) && value.to_sym == target
193
- exactness[:yes] += 1
194
- return target
195
- elsif strictness == :strong
196
- message = "cannot convert non-matching #{value.class} into #{target.inspect}"
197
- raise ArgumentError.new(message)
200
+ case value
201
+ in Symbol | String
202
+ if value.to_sym == target
203
+ exactness[:yes] += 1
204
+ return target
205
+ else
206
+ exactness[:maybe] += 1
207
+ return value
208
+ end
209
+ else
210
+ if strictness == :strong
211
+ message = "cannot convert non-matching #{value.class} into #{target.inspect}"
212
+ raise ArgumentError.new(message)
213
+ end
198
214
  end
199
215
  else
200
216
  end
@@ -208,17 +224,24 @@ module Orb
208
224
  # @api private
209
225
  #
210
226
  # @param target [Orb::Internal::Type::Converter, Class]
227
+ #
211
228
  # @param value [Object]
212
229
  #
230
+ # @param state [Hash{Symbol=>Object}] .
231
+ #
232
+ # @option state [Boolean] :can_retry
233
+ #
213
234
  # @return [Object]
214
- def dump(target, value)
215
- # rubocop:disable Layout/LineLength
216
- target.is_a?(Orb::Internal::Type::Converter) ? target.dump(value) : Orb::Internal::Type::Unknown.dump(value)
217
- # rubocop:enable Layout/LineLength
235
+ def dump(target, value, state: {can_retry: true})
236
+ case target
237
+ in Orb::Internal::Type::Converter
238
+ target.dump(value, state: state)
239
+ else
240
+ Orb::Internal::Type::Unknown.dump(value, state: state)
241
+ end
218
242
  end
219
243
  end
220
244
  end
221
- # rubocop:enable Metrics/ModuleLength
222
245
  end
223
246
  end
224
247
  end
@@ -6,15 +6,15 @@ module Orb
6
6
  # @api private
7
7
  #
8
8
  # A value from among a specified list of options. OpenAPI enum values map to Ruby
9
- # values in the SDK as follows:
9
+ # values in the SDK as follows:
10
10
  #
11
- # 1. boolean => true | false
12
- # 2. integer => Integer
13
- # 3. float => Float
14
- # 4. string => Symbol
11
+ # 1. boolean => true | false
12
+ # 2. integer => Integer
13
+ # 3. float => Float
14
+ # 4. string => Symbol
15
15
  #
16
- # We can therefore convert string values to Symbols, but can't convert other
17
- # values safely.
16
+ # We can therefore convert string values to Symbols, but can't convert other
17
+ # values safely.
18
18
  #
19
19
  # @example
20
20
  # # `billing_cycle_relative_date` is a `Orb::Models::BillingCycleRelativeDate`
@@ -66,7 +66,7 @@ module Orb
66
66
  # @api private
67
67
  #
68
68
  # Unlike with primitives, `Enum` additionally validates that the value is a member
69
- # of the enum.
69
+ # of the enum.
70
70
  #
71
71
  # @param value [String, Symbol, Object]
72
72
  #
@@ -97,8 +97,12 @@ module Orb
97
97
  # #
98
98
  # # @param value [Symbol, Object]
99
99
  # #
100
+ # # @param state [Hash{Symbol=>Object}] .
101
+ # #
102
+ # # @option state [Boolean] :can_retry
103
+ # #
100
104
  # # @return [Symbol, Object]
101
- # def dump(value) = super
105
+ # def dump(value, state:) = super
102
106
  end
103
107
  end
104
108
  end
@@ -99,12 +99,16 @@ module Orb
99
99
  #
100
100
  # @param value [Hash{Object=>Object}, Object]
101
101
  #
102
+ # @param state [Hash{Symbol=>Object}] .
103
+ #
104
+ # @option state [Boolean] :can_retry
105
+ #
102
106
  # @return [Hash{Symbol=>Object}, Object]
103
- def dump(value)
107
+ def dump(value, state:)
104
108
  target = item_type
105
109
  if value.is_a?(Hash)
106
110
  value.transform_values do
107
- Orb::Internal::Type::Converter.dump(target, _1)
111
+ Orb::Internal::Type::Converter.dump(target, _1, state: state)
108
112
  end
109
113
  else
110
114
  super
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Orb
4
+ module Internal
5
+ module Type
6
+ # @api private
7
+ #
8
+ # @abstract
9
+ #
10
+ # Either `Pathname` or `StringIO`.
11
+ class IOLike
12
+ extend Orb::Internal::Type::Converter
13
+
14
+ # @param other [Object]
15
+ #
16
+ # @return [Boolean]
17
+ def self.===(other)
18
+ case other
19
+ in StringIO | Pathname | IO
20
+ true
21
+ else
22
+ false
23
+ end
24
+ end
25
+
26
+ # @param other [Object]
27
+ #
28
+ # @return [Boolean]
29
+ def self.==(other) = other.is_a?(Class) && other <= Orb::Internal::Type::IOLike
30
+
31
+ class << self
32
+ # @api private
33
+ #
34
+ # @param value [StringIO, String, Object]
35
+ #
36
+ # @param state [Hash{Symbol=>Object}] .
37
+ #
38
+ # @option state [Boolean, :strong] :strictness
39
+ #
40
+ # @option state [Hash{Symbol=>Object}] :exactness
41
+ #
42
+ # @option state [Integer] :branched
43
+ #
44
+ # @return [StringIO, Object]
45
+ def coerce(value, state:)
46
+ exactness = state.fetch(:exactness)
47
+ case value
48
+ in String
49
+ exactness[:yes] += 1
50
+ StringIO.new(value)
51
+ in StringIO
52
+ exactness[:yes] += 1
53
+ value
54
+ else
55
+ exactness[:no] += 1
56
+ value
57
+ end
58
+ end
59
+
60
+ # @!parse
61
+ # # @api private
62
+ # #
63
+ # # @param value [Pathname, StringIO, IO, String, Object]
64
+ # #
65
+ # # @param state [Hash{Symbol=>Object}] .
66
+ # #
67
+ # # @option state [Boolean] :can_retry
68
+ # #
69
+ # # @return [Pathname, StringIO, IO, String, Object]
70
+ # def dump(value, state:) = super
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -26,9 +26,18 @@ module Orb
26
26
  #
27
27
  # @return [Array(Object, Hash{Symbol=>Object})]
28
28
  def dump_request(params)
29
- case (dumped = dump(params))
29
+ state = {can_retry: true}
30
+ case (dumped = dump(params, state: state))
30
31
  in Hash
31
- [dumped.except(:request_options), dumped[:request_options]]
32
+ options = Orb::Internal::Util.coerce_hash(dumped[:request_options])
33
+ request_options =
34
+ case [options, state.fetch(:can_retry)]
35
+ in [Hash | nil, false]
36
+ {**options.to_h, max_retries: 0}
37
+ else
38
+ options
39
+ end
40
+ [dumped.except(:request_options), request_options]
32
41
  else
33
42
  [dumped, nil]
34
43
  end
@@ -205,15 +205,19 @@ module Orb
205
205
  #
206
206
  # @param value [Object]
207
207
  #
208
+ # @param state [Hash{Symbol=>Object}] .
209
+ #
210
+ # @option state [Boolean] :can_retry
211
+ #
208
212
  # @return [Object]
209
- def dump(value)
213
+ def dump(value, state:)
210
214
  if (target = resolve_variant(value))
211
- return Orb::Internal::Type::Converter.dump(target, value)
215
+ return Orb::Internal::Type::Converter.dump(target, value, state: state)
212
216
  end
213
217
 
214
218
  known_variants.each do
215
219
  target = _2.call
216
- return Orb::Internal::Type::Converter.dump(target, value) if target === value
220
+ return Orb::Internal::Type::Converter.dump(target, value, state: state) if target === value
217
221
  end
218
222
 
219
223
  super