metronome-sdk 1.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +91 -0
  3. data/README.md +1 -1
  4. data/lib/metronome_sdk/errors.rb +25 -11
  5. data/lib/metronome_sdk/file_part.rb +10 -7
  6. data/lib/metronome_sdk/internal/body_cursor_page.rb +1 -1
  7. data/lib/metronome_sdk/internal/cursor_page.rb +1 -1
  8. data/lib/metronome_sdk/internal/cursor_page_without_limit.rb +1 -1
  9. data/lib/metronome_sdk/internal/transport/base_client.rb +11 -7
  10. data/lib/metronome_sdk/internal/transport/pooled_net_requester.rb +34 -31
  11. data/lib/metronome_sdk/internal/type/base_page.rb +1 -1
  12. data/lib/metronome_sdk/internal/type/enum.rb +25 -0
  13. data/lib/metronome_sdk/internal/type/file_input.rb +7 -4
  14. data/lib/metronome_sdk/internal/util.rb +8 -7
  15. data/lib/metronome_sdk/models/contract.rb +1 -0
  16. data/lib/metronome_sdk/models/contract_v2.rb +275 -6
  17. data/lib/metronome_sdk/models/contract_without_amendments.rb +2 -2
  18. data/lib/metronome_sdk/models/hierarchy_configuration.rb +123 -2
  19. data/lib/metronome_sdk/models/payment_gate_config.rb +1 -0
  20. data/lib/metronome_sdk/models/payment_gate_config_v2.rb +1 -0
  21. data/lib/metronome_sdk/models/subscription.rb +95 -1
  22. data/lib/metronome_sdk/models/v1/alert_archive_params.rb +8 -4
  23. data/lib/metronome_sdk/models/v1/alert_create_params.rb +38 -36
  24. data/lib/metronome_sdk/models/v1/contract_amend_params.rb +1 -0
  25. data/lib/metronome_sdk/models/v1/contract_create_params.rb +157 -9
  26. data/lib/metronome_sdk/models/v1/contract_list_balances_params.rb +9 -1
  27. data/lib/metronome_sdk/models/v1/customer_create_params.rb +11 -1
  28. data/lib/metronome_sdk/models/v1/customer_detail.rb +9 -1
  29. data/lib/metronome_sdk/models/v1/customer_preview_events_params.rb +19 -25
  30. data/lib/metronome_sdk/models/v1/customer_preview_events_response.rb +3 -3
  31. data/lib/metronome_sdk/models/v1/customer_retrieve_billing_configurations_response.rb +1 -0
  32. data/lib/metronome_sdk/models/v1/customer_set_billing_configurations_params.rb +1 -0
  33. data/lib/metronome_sdk/models/v1/customers/alert_list_params.rb +3 -3
  34. data/lib/metronome_sdk/models/v1/customers/alert_reset_params.rb +2 -2
  35. data/lib/metronome_sdk/models/v1/customers/alert_retrieve_params.rb +12 -12
  36. data/lib/metronome_sdk/models/v1/customers/billing_config_create_params.rb +6 -1
  37. data/lib/metronome_sdk/models/v1/customers/billing_config_delete_params.rb +1 -0
  38. data/lib/metronome_sdk/models/v1/customers/billing_config_retrieve_params.rb +1 -0
  39. data/lib/metronome_sdk/models/v1/customers/billing_config_retrieve_response.rb +6 -1
  40. data/lib/metronome_sdk/models/v1/customers/commit_create_params.rb +1 -1
  41. data/lib/metronome_sdk/models/v1/customers/customer_alert.rb +41 -38
  42. data/lib/metronome_sdk/models/v1/customers/invoice.rb +256 -16
  43. data/lib/metronome_sdk/models/v1/customers/invoice_retrieve_pdf_params.rb +30 -0
  44. data/lib/metronome_sdk/models/v1/payment.rb +157 -0
  45. data/lib/metronome_sdk/models/v1/payment_attempt_params.rb +28 -0
  46. data/lib/metronome_sdk/models/v1/payment_attempt_response.rb +18 -0
  47. data/lib/metronome_sdk/models/v1/payment_cancel_params.rb +28 -0
  48. data/lib/metronome_sdk/models/v1/payment_cancel_response.rb +18 -0
  49. data/lib/metronome_sdk/models/v1/payment_list_params.rb +53 -0
  50. data/lib/metronome_sdk/models/v1/payment_status.rb +19 -0
  51. data/lib/metronome_sdk/models/v1/setting_upsert_avalara_credentials_params.rb +65 -0
  52. data/lib/metronome_sdk/models/v1/setting_upsert_avalara_credentials_response.rb +12 -0
  53. data/lib/metronome_sdk/models/v1/settings/billing_provider_create_params.rb +73 -0
  54. data/lib/metronome_sdk/models/v1/settings/billing_provider_create_response.rb +31 -0
  55. data/lib/metronome_sdk/models/v1/settings/billing_provider_list_params.rb +26 -0
  56. data/lib/metronome_sdk/models/v1/settings/billing_provider_list_response.rb +105 -0
  57. data/lib/metronome_sdk/models/v2/contract_edit_commit_params.rb +9 -1
  58. data/lib/metronome_sdk/models/v2/contract_edit_credit_params.rb +9 -1
  59. data/lib/metronome_sdk/models/v2/contract_edit_params.rb +219 -9
  60. data/lib/metronome_sdk/models/v2/contract_get_edit_history_response.rb +195 -8
  61. data/lib/metronome_sdk/resources/v1/alerts.rb +57 -53
  62. data/lib/metronome_sdk/resources/v1/contracts.rb +8 -5
  63. data/lib/metronome_sdk/resources/v1/credit_grants.rb +10 -5
  64. data/lib/metronome_sdk/resources/v1/customers/alerts.rb +70 -51
  65. data/lib/metronome_sdk/resources/v1/customers/billing_config.rb +7 -4
  66. data/lib/metronome_sdk/resources/v1/customers/commits.rb +2 -1
  67. data/lib/metronome_sdk/resources/v1/customers/invoices.rb +57 -1
  68. data/lib/metronome_sdk/resources/v1/customers/plans.rb +8 -4
  69. data/lib/metronome_sdk/resources/v1/customers.rb +13 -8
  70. data/lib/metronome_sdk/resources/v1/payments.rb +102 -0
  71. data/lib/metronome_sdk/resources/v1/plans.rb +8 -4
  72. data/lib/metronome_sdk/resources/v1/settings/billing_providers.rb +75 -0
  73. data/lib/metronome_sdk/resources/v1/settings.rb +55 -0
  74. data/lib/metronome_sdk/resources/v1/usage.rb +4 -2
  75. data/lib/metronome_sdk/resources/v1.rb +8 -0
  76. data/lib/metronome_sdk/resources/v2/contracts.rb +9 -3
  77. data/lib/metronome_sdk/version.rb +1 -1
  78. data/lib/metronome_sdk.rb +17 -0
  79. data/rbi/metronome_sdk/errors.rbi +29 -2
  80. data/rbi/metronome_sdk/file_part.rbi +1 -1
  81. data/rbi/metronome_sdk/internal/transport/base_client.rbi +4 -5
  82. data/rbi/metronome_sdk/internal/type/base_page.rbi +1 -1
  83. data/rbi/metronome_sdk/internal/util.rbi +1 -1
  84. data/rbi/metronome_sdk/models/contract.rbi +5 -0
  85. data/rbi/metronome_sdk/models/contract_v2.rbi +635 -10
  86. data/rbi/metronome_sdk/models/contract_without_amendments.rbi +2 -2
  87. data/rbi/metronome_sdk/models/hierarchy_configuration.rbi +286 -6
  88. data/rbi/metronome_sdk/models/payment_gate_config.rbi +5 -0
  89. data/rbi/metronome_sdk/models/payment_gate_config_v2.rbi +5 -0
  90. data/rbi/metronome_sdk/models/subscription.rbi +190 -0
  91. data/rbi/metronome_sdk/models/v1/alert_archive_params.rbi +6 -4
  92. data/rbi/metronome_sdk/models/v1/alert_create_params.rbi +51 -47
  93. data/rbi/metronome_sdk/models/v1/contract_amend_params.rbi +5 -0
  94. data/rbi/metronome_sdk/models/v1/contract_create_params.rbi +326 -10
  95. data/rbi/metronome_sdk/models/v1/contract_list_balances_params.rbi +11 -0
  96. data/rbi/metronome_sdk/models/v1/customer_create_params.rbi +11 -0
  97. data/rbi/metronome_sdk/models/v1/customer_detail.rbi +8 -0
  98. data/rbi/metronome_sdk/models/v1/customer_preview_events_params.rbi +24 -32
  99. data/rbi/metronome_sdk/models/v1/customer_preview_events_response.rbi +10 -9
  100. data/rbi/metronome_sdk/models/v1/customer_retrieve_billing_configurations_response.rbi +5 -0
  101. data/rbi/metronome_sdk/models/v1/customer_set_billing_configurations_params.rbi +5 -0
  102. data/rbi/metronome_sdk/models/v1/customers/alert_list_params.rbi +4 -4
  103. data/rbi/metronome_sdk/models/v1/customers/alert_reset_params.rbi +2 -2
  104. data/rbi/metronome_sdk/models/v1/customers/alert_retrieve_params.rbi +14 -14
  105. data/rbi/metronome_sdk/models/v1/customers/billing_config_create_params.rbi +11 -0
  106. data/rbi/metronome_sdk/models/v1/customers/billing_config_delete_params.rbi +5 -0
  107. data/rbi/metronome_sdk/models/v1/customers/billing_config_retrieve_params.rbi +5 -0
  108. data/rbi/metronome_sdk/models/v1/customers/billing_config_retrieve_response.rbi +6 -0
  109. data/rbi/metronome_sdk/models/v1/customers/commit_create_params.rbi +2 -2
  110. data/rbi/metronome_sdk/models/v1/customers/customer_alert.rbi +53 -44
  111. data/rbi/metronome_sdk/models/v1/customers/invoice.rbi +462 -38
  112. data/rbi/metronome_sdk/models/v1/customers/invoice_retrieve_pdf_params.rbi +50 -0
  113. data/rbi/metronome_sdk/models/v1/payment.rbi +324 -0
  114. data/rbi/metronome_sdk/models/v1/payment_attempt_params.rbi +48 -0
  115. data/rbi/metronome_sdk/models/v1/payment_attempt_response.rbi +35 -0
  116. data/rbi/metronome_sdk/models/v1/payment_cancel_params.rbi +48 -0
  117. data/rbi/metronome_sdk/models/v1/payment_cancel_response.rbi +35 -0
  118. data/rbi/metronome_sdk/models/v1/payment_list_params.rbi +91 -0
  119. data/rbi/metronome_sdk/models/v1/payment_status.rbi +33 -0
  120. data/rbi/metronome_sdk/models/v1/setting_upsert_avalara_credentials_params.rbi +115 -0
  121. data/rbi/metronome_sdk/models/v1/setting_upsert_avalara_credentials_response.rbi +25 -0
  122. data/rbi/metronome_sdk/models/v1/settings/billing_provider_create_params.rbi +157 -0
  123. data/rbi/metronome_sdk/models/v1/settings/billing_provider_create_response.rbi +75 -0
  124. data/rbi/metronome_sdk/models/v1/settings/billing_provider_list_params.rbi +50 -0
  125. data/rbi/metronome_sdk/models/v1/settings/billing_provider_list_response.rbi +245 -0
  126. data/rbi/metronome_sdk/models/v2/contract_edit_commit_params.rbi +18 -0
  127. data/rbi/metronome_sdk/models/v2/contract_edit_credit_params.rbi +18 -0
  128. data/rbi/metronome_sdk/models/v2/contract_edit_params.rbi +536 -12
  129. data/rbi/metronome_sdk/models/v2/contract_get_edit_history_response.rbi +462 -14
  130. data/rbi/metronome_sdk/resources/v1/alerts.rbi +68 -64
  131. data/rbi/metronome_sdk/resources/v1/contracts.rbi +8 -4
  132. data/rbi/metronome_sdk/resources/v1/credit_grants.rbi +10 -5
  133. data/rbi/metronome_sdk/resources/v1/customers/alerts.rbi +73 -54
  134. data/rbi/metronome_sdk/resources/v1/customers/billing_config.rbi +8 -4
  135. data/rbi/metronome_sdk/resources/v1/customers/commits.rbi +3 -2
  136. data/rbi/metronome_sdk/resources/v1/customers/invoices.rbi +38 -1
  137. data/rbi/metronome_sdk/resources/v1/customers/plans.rbi +8 -4
  138. data/rbi/metronome_sdk/resources/v1/customers.rbi +17 -11
  139. data/rbi/metronome_sdk/resources/v1/payments.rbi +72 -0
  140. data/rbi/metronome_sdk/resources/v1/plans.rbi +8 -4
  141. data/rbi/metronome_sdk/resources/v1/settings/billing_providers.rbi +63 -0
  142. data/rbi/metronome_sdk/resources/v1/settings.rbi +47 -0
  143. data/rbi/metronome_sdk/resources/v1/usage.rbi +4 -2
  144. data/rbi/metronome_sdk/resources/v1.rbi +6 -0
  145. data/rbi/metronome_sdk/resources/v2/contracts.rbi +14 -0
  146. data/sig/metronome_sdk/errors.rbs +7 -0
  147. data/sig/metronome_sdk/file_part.rbs +1 -1
  148. data/sig/metronome_sdk/models/contract.rbs +2 -0
  149. data/sig/metronome_sdk/models/contract_v2.rbs +241 -12
  150. data/sig/metronome_sdk/models/hierarchy_configuration.rbs +87 -6
  151. data/sig/metronome_sdk/models/payment_gate_config.rbs +2 -1
  152. data/sig/metronome_sdk/models/payment_gate_config_v2.rbs +2 -1
  153. data/sig/metronome_sdk/models/subscription.rbs +80 -0
  154. data/sig/metronome_sdk/models/v1/contract_amend_params.rbs +2 -1
  155. data/sig/metronome_sdk/models/v1/contract_create_params.rbs +91 -5
  156. data/sig/metronome_sdk/models/v1/contract_list_balances_params.rbs +7 -0
  157. data/sig/metronome_sdk/models/v1/customer_create_params.rbs +2 -0
  158. data/sig/metronome_sdk/models/v1/customer_detail.rbs +5 -0
  159. data/sig/metronome_sdk/models/v1/customer_preview_events_params.rbs +0 -7
  160. data/sig/metronome_sdk/models/v1/customer_preview_events_response.rbs +6 -4
  161. data/sig/metronome_sdk/models/v1/customer_retrieve_billing_configurations_response.rbs +2 -0
  162. data/sig/metronome_sdk/models/v1/customer_set_billing_configurations_params.rbs +2 -0
  163. data/sig/metronome_sdk/models/v1/customers/billing_config_create_params.rbs +2 -0
  164. data/sig/metronome_sdk/models/v1/customers/billing_config_delete_params.rbs +2 -0
  165. data/sig/metronome_sdk/models/v1/customers/billing_config_retrieve_params.rbs +2 -0
  166. data/sig/metronome_sdk/models/v1/customers/customer_alert.rbs +2 -0
  167. data/sig/metronome_sdk/models/v1/customers/invoice.rbs +244 -19
  168. data/sig/metronome_sdk/models/v1/customers/invoice_retrieve_pdf_params.rbs +32 -0
  169. data/sig/metronome_sdk/models/v1/payment.rbs +198 -0
  170. data/sig/metronome_sdk/models/v1/payment_attempt_params.rbs +30 -0
  171. data/sig/metronome_sdk/models/v1/payment_attempt_response.rbs +15 -0
  172. data/sig/metronome_sdk/models/v1/payment_cancel_params.rbs +30 -0
  173. data/sig/metronome_sdk/models/v1/payment_cancel_response.rbs +15 -0
  174. data/sig/metronome_sdk/models/v1/payment_list_params.rbs +56 -0
  175. data/sig/metronome_sdk/models/v1/payment_status.rbs +19 -0
  176. data/sig/metronome_sdk/models/v1/setting_upsert_avalara_credentials_params.rbs +54 -0
  177. data/sig/metronome_sdk/models/v1/setting_upsert_avalara_credentials_response.rbs +13 -0
  178. data/sig/metronome_sdk/models/v1/settings/billing_provider_create_params.rbs +64 -0
  179. data/sig/metronome_sdk/models/v1/settings/billing_provider_create_response.rbs +34 -0
  180. data/sig/metronome_sdk/models/v1/settings/billing_provider_list_params.rbs +28 -0
  181. data/sig/metronome_sdk/models/v1/settings/billing_provider_list_response.rbs +102 -0
  182. data/sig/metronome_sdk/models/v2/contract_edit_commit_params.rbs +9 -0
  183. data/sig/metronome_sdk/models/v2/contract_edit_credit_params.rbs +9 -0
  184. data/sig/metronome_sdk/models/v2/contract_edit_params.rbs +184 -7
  185. data/sig/metronome_sdk/models/v2/contract_get_edit_history_response.rbs +221 -18
  186. data/sig/metronome_sdk/resources/v1/contracts.rbs +1 -0
  187. data/sig/metronome_sdk/resources/v1/customers/invoices.rbs +6 -0
  188. data/sig/metronome_sdk/resources/v1/payments.rbs +30 -0
  189. data/sig/metronome_sdk/resources/v1/settings/billing_providers.rbs +23 -0
  190. data/sig/metronome_sdk/resources/v1/settings.rbs +19 -0
  191. data/sig/metronome_sdk/resources/v1.rbs +4 -0
  192. data/sig/metronome_sdk/resources/v2/contracts.rbs +3 -0
  193. metadata +53 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2446e983c08f573e1756e7aeb0fd0cac0d67056f18c3c0464e2d0422f63aa2f2
4
- data.tar.gz: 282cfc878a3a3d74b38184a1b473a9080e265fb0224ee7b3d2dce2ae5aa7caab
3
+ metadata.gz: f70b65323a25a4de65861565a092a6aa70f43d28e5e910acca44d883efe9cf86
4
+ data.tar.gz: 4d89458274f95fb69ca5d6bccad455a6ecaf92a3d1a93b8843290166f724e01d
5
5
  SHA512:
6
- metadata.gz: a379c84d235c7957ca683790821b637b2eac2f86ca46c0bc31c6093b699974b89e3e1def7092aee0b692dda2acb1cc76109a9e588b37c1f4b248203e2090d659
7
- data.tar.gz: 621e6552b720ac41ef0bff931ddfbdfa22c0eec89ca9a2c143c930ee631dcb67fe7c24c428bd7f521a704e734834aad81079ee7ac1e6261bcc035233d016cbcc
6
+ metadata.gz: '010907bdf574da3664f42af09be522e41a87dfc4ae1280ee4307326c8d62751c1fdc11bfec4214ec22176cbaf0002a2f1a7b6ed3668da3fb3347ab2bdb3b5494'
7
+ data.tar.gz: d9be0ec4d10b760064dc84412f78c074258613af6b2ba7e33432ddade4c39d6356ed9d4fc59fb7a89eadc1ce4cd99f893e7c329bbedc27b4dc8e3ac8f76d1c5d
data/CHANGELOG.md CHANGED
@@ -1,5 +1,96 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.1.0 (2025-10-31)
4
+
5
+ Full Changelog: [v2.0.0...v2.1.0](https://github.com/Metronome-Industries/metronome-ruby/compare/v2.0.0...v2.1.0)
6
+
7
+ ### Features
8
+
9
+ * [ORCH-282] plumb `payment_method_id` to the payment gateway object ([bba092f](https://github.com/Metronome-Industries/metronome-ruby/commit/bba092fbe0b66d2f2df6187c579bdc0458375a65))
10
+ * [ORCH-797] add billing_provider_error to invoice.external_invoice ([7f77e42](https://github.com/Metronome-Industries/metronome-ruby/commit/7f77e42d219f720783d480096248bf153e771336))
11
+ * Add avalara creds + billing provider APIs to SDK. Add avalara creds API to docs. ([9808e39](https://github.com/Metronome-Industries/metronome-ruby/commit/9808e39003df39e50183c64e806ef4589819353d))
12
+ * add beta tag to stripe auto charge items ([652727e](https://github.com/Metronome-Industries/metronome-ruby/commit/652727e1f6df7269a3b6db00f401460aab32ce6d))
13
+ * add exclude_zero_balances field behind a FF for anthropic ([9e7b1a4](https://github.com/Metronome-Industries/metronome-ruby/commit/9e7b1a461fe7eb13fd846f18f0ea329f6b1083b7))
14
+ * add METRONOME to BillingProvider type ([2f7e988](https://github.com/Metronome-Industries/metronome-ruby/commit/2f7e9882bf53acae0356e748be68e37067ef9bd9))
15
+ * docs(api) Documentation for seat-based subscription linked recurring commits beta release ([2e53b04](https://github.com/Metronome-Industries/metronome-ruby/commit/2e53b04d23b9e49184bd91d32c712a4c59a73f0a))
16
+ * handle thread interrupts in the core HTTP client ([db696fe](https://github.com/Metronome-Industries/metronome-ruby/commit/db696fe074207b842d076aaafa549c5695c87dd5))
17
+ * ignore_duplicates ([cd50ce6](https://github.com/Metronome-Industries/metronome-ruby/commit/cd50ce63586d55d98557e050024cad863be60b99))
18
+ * internal: moving plans docs to deprecated section of new docs site ([f5f12b4](https://github.com/Metronome-Industries/metronome-ruby/commit/f5f12b4af2bbc39d892b885b6b6f768128330806))
19
+ * not ready for review ([efabbf6](https://github.com/Metronome-Industries/metronome-ruby/commit/efabbf64195a0575e5136ba7de0a0552a11a7592))
20
+ * not ready for review ([624dd4f](https://github.com/Metronome-Industries/metronome-ruby/commit/624dd4f2c827279317bb7ac53cb9c8ab9aa4dde8))
21
+ * Relax requirement on customer level commits for invoice_contract_id if do_not_invoice is set to true ([af4a8a7](https://github.com/Metronome-Industries/metronome-ruby/commit/af4a8a72d376d709a69b9cd248e54ef12eaa8124))
22
+ * update get customer alerts api to include low seat balance type ([1e08e6d](https://github.com/Metronome-Industries/metronome-ruby/commit/1e08e6d2f1186dd47e17a6bf986d8732ec9801b3))
23
+
24
+
25
+ ### Bug Fixes
26
+
27
+ * **api:** Make id field required in /v2/notifications/edit ([34c16c6](https://github.com/Metronome-Industries/metronome-ruby/commit/34c16c6bcebdfc18765883b017708225cf6d312c))
28
+
29
+
30
+ ### Chores
31
+
32
+ * **api:** Note SQL BM is not supported in previewCustomerEvents description ([1bb482c](https://github.com/Metronome-Industries/metronome-ruby/commit/1bb482c536bc70849b425b45a073431cf4dff009))
33
+
34
+
35
+ ### Documentation
36
+
37
+ * add migrate amendments to edits page ([6b10754](https://github.com/Metronome-Industries/metronome-ruby/commit/6b1075422730cb9b1b254ac7549c76b8f5f8d475))
38
+
39
+ ## 2.0.0 (2025-10-16)
40
+
41
+ Full Changelog: [v1.0.0...v2.0.0](https://github.com/Metronome-Industries/metronome-ruby/compare/v1.0.0...v2.0.0)
42
+
43
+ ### ⚠ BREAKING CHANGES
44
+
45
+ * **api:** Remove customer_id from preview events payload
46
+ * **api:** in getEditHistory endpoint, commit invoice schedule amount, unit price, and quantity are now optional values
47
+ * **api:** Added optional archive_filter param to /notifications/offset/list endpoint
48
+
49
+ ### Features
50
+
51
+ * Add empty handler for cancelPayment ([7e99149](https://github.com/Metronome-Industries/metronome-ruby/commit/7e99149c22a82550ec373c0727351c4b70c852eb))
52
+ * Add payment APIs to the SDK ([616d0df](https://github.com/Metronome-Industries/metronome-ruby/commit/616d0df5ded63e16bb817733c839196ac9033074))
53
+ * **api:** add billing_periods to Subscription ([fadf0b8](https://github.com/Metronome-Industries/metronome-ruby/commit/fadf0b8e5db369baefffa0a7e30602da594eff03))
54
+ * **api:** add new payments/attempt v1 api endpoint ([da865e7](https://github.com/Metronome-Industries/metronome-ruby/commit/da865e7efa8e041a6e84f3482ec786fb9ae0bb91))
55
+ * **api:** Added optional archive_filter param to /notifications/offset/list endpoint ([2fdc9f4](https://github.com/Metronome-Industries/metronome-ruby/commit/2fdc9f4e905b00e8bdfcfc7c364d08bb60b40c5f))
56
+ * **api:** Remove customer_id from preview events payload ([20ca72d](https://github.com/Metronome-Industries/metronome-ruby/commit/20ca72d41c6793058ab236e67b29bc2e0d2b4143))
57
+ * Bump graphql version and fix type errors ([13a12b1](https://github.com/Metronome-Industries/metronome-ruby/commit/13a12b145a0cf9889315ebf05bb147943632e520))
58
+ * elia/orch 128 add external apis for payments ([91fb616](https://github.com/Metronome-Industries/metronome-ruby/commit/91fb6167790ec522698bdbdb22ccd370f1bddcc2))
59
+ * expose response headers for both streams and errors ([9f0e87e](https://github.com/Metronome-Industries/metronome-ruby/commit/9f0e87e8df28a54ccc7a913d687205dee5ccf9cb))
60
+ * feat(api):Allow clients retrieve archived config via `/notifications/get` ([466033c](https://github.com/Metronome-Industries/metronome-ruby/commit/466033c55325bd066a9a8c6669955bbec1328ce1))
61
+ * internal: releasing x-mint ([d14a332](https://github.com/Metronome-Industries/metronome-ruby/commit/d14a33277f46d61ab13a26e22dd88f343583d9d6))
62
+ * internal: Skip retrieve_pdf API SDK tests ([c079dc3](https://github.com/Metronome-Industries/metronome-ruby/commit/c079dc32fddf4862e271cf60fd0192cca3cb0ce1))
63
+ * internal(docs): adding confluent endpoints ([79bb81b](https://github.com/Metronome-Industries/metronome-ruby/commit/79bb81b1b17ebd05349fac0279bc17b0a71f9245))
64
+ * LAUNCH-516 add getSubscriptionSeatsScheduleHistory api ([bcc34f8](https://github.com/Metronome-Industries/metronome-ruby/commit/bcc34f8dd2fe1be818ecbd1dbf9108020a15f2f7))
65
+ * rename getSubscriptionSeatsScheduleHistory to getSubscriptionSeatsHistory ([68ef0a3](https://github.com/Metronome-Industries/metronome-ruby/commit/68ef0a3ddd9771fa4d810d750f37483d24d2d3f0))
66
+ * Return array of invoices instead of single invoice and handle multipl… ([129d95e](https://github.com/Metronome-Industries/metronome-ruby/commit/129d95ef9c26cd35adb9b493aa07f610f53c2a89))
67
+ * Set up contract get and create with new AH info ([9a174d7](https://github.com/Metronome-Industries/metronome-ruby/commit/9a174d758368c63f563b26e840afa7385c7040cc))
68
+ * update api docs ([e9ef5a1](https://github.com/Metronome-Industries/metronome-ruby/commit/e9ef5a1e3aa60612c73d0bb7f88fe95382e81549))
69
+
70
+
71
+ ### Bug Fixes
72
+
73
+ * absolutely qualified uris should always override the default ([d2a34bf](https://github.com/Metronome-Industries/metronome-ruby/commit/d2a34bf32891e8e9938f939c53971cf8c824406b))
74
+ * always send `filename=...` for multipart requests where a file is expected ([618065e](https://github.com/Metronome-Industries/metronome-ruby/commit/618065efd1dfc5f78842f26047c63f8f8214d922))
75
+ * **api:** in getEditHistory endpoint, commit invoice schedule amount, unit price, and quantity are now optional values ([d2a37fb](https://github.com/Metronome-Industries/metronome-ruby/commit/d2a37fb61ca0bd828868a2b7d86ddd0d5a12f311))
76
+ * coroutine leaks from connection pool ([f44d189](https://github.com/Metronome-Industries/metronome-ruby/commit/f44d18933e585e241d04277911be69eedbb72be8))
77
+ * **internal:** use null byte as file separator in the fast formatting script ([dec574a](https://github.com/Metronome-Industries/metronome-ruby/commit/dec574a038c9a81c43efd52fadbe9ed4b41d9465))
78
+ * LAUNCH-1130 remove min and max in api spec for better valiation error message ([1e2282c](https://github.com/Metronome-Industries/metronome-ruby/commit/1e2282cd8b3feab83f0b487e29509a7591d854b1))
79
+ * shorten multipart boundary sep to less than RFC specificed max length ([b49e6f1](https://github.com/Metronome-Industries/metronome-ruby/commit/b49e6f16e1836ddb330d3bb22ed5cbe70ebe435d))
80
+ * should not reuse buffers for `IO.copy_stream` interop ([c80da18](https://github.com/Metronome-Industries/metronome-ruby/commit/c80da18b2978ee09675a8031db122a04450fcd24))
81
+
82
+
83
+ ### Performance Improvements
84
+
85
+ * faster code formatting ([1a84007](https://github.com/Metronome-Industries/metronome-ruby/commit/1a8400771228e75a50f7003f8864740da000f583))
86
+
87
+
88
+ ### Chores
89
+
90
+ * allow fast-format to use bsd sed as well ([10fad42](https://github.com/Metronome-Industries/metronome-ruby/commit/10fad42d511c0a696c22b4f94b5c6c828b855980))
91
+ * do not install brew dependencies in ./scripts/bootstrap by default ([92ff30c](https://github.com/Metronome-Industries/metronome-ruby/commit/92ff30cd9332917e0f465525ccf2ac809d8de48b))
92
+ * ignore linter error for tests having large collections ([785a441](https://github.com/Metronome-Industries/metronome-ruby/commit/785a441f773283af8731625e50de3ea7d67bdc81))
93
+
3
94
  ## 1.0.0 (2025-09-15)
4
95
 
5
96
  Full Changelog: [v0.3.0...v1.0.0](https://github.com/Metronome-Industries/metronome-ruby/compare/v0.3.0...v1.0.0)
data/README.md CHANGED
@@ -17,7 +17,7 @@ To use this gem, install via Bundler by adding the following to your application
17
17
  <!-- x-release-please-start-version -->
18
18
 
19
19
  ```ruby
20
- gem "metronome-sdk", "~> 1.0.0"
20
+ gem "metronome-sdk", "~> 2.1.0"
21
21
  ```
22
22
 
23
23
  <!-- x-release-please-end -->
@@ -40,6 +40,9 @@ module MetronomeSDK
40
40
  # @return [Integer, nil]
41
41
  attr_accessor :status
42
42
 
43
+ # @return [Hash{String=>String}, nil]
44
+ attr_accessor :headers
45
+
43
46
  # @return [Object, nil]
44
47
  attr_accessor :body
45
48
 
@@ -47,13 +50,15 @@ module MetronomeSDK
47
50
  #
48
51
  # @param url [URI::Generic]
49
52
  # @param status [Integer, nil]
53
+ # @param headers [Hash{String=>String}, nil]
50
54
  # @param body [Object, nil]
51
55
  # @param request [nil]
52
56
  # @param response [nil]
53
57
  # @param message [String, nil]
54
- def initialize(url:, status: nil, body: nil, request: nil, response: nil, message: nil)
58
+ def initialize(url:, status: nil, headers: nil, body: nil, request: nil, response: nil, message: nil)
55
59
  @url = url
56
60
  @status = status
61
+ @headers = headers
57
62
  @body = body
58
63
  @request = request
59
64
  @response = response
@@ -74,6 +79,7 @@ module MetronomeSDK
74
79
  #
75
80
  # @param url [URI::Generic]
76
81
  # @param status [nil]
82
+ # @param headers [Hash{String=>String}, nil]
77
83
  # @param body [nil]
78
84
  # @param request [nil]
79
85
  # @param response [nil]
@@ -81,6 +87,7 @@ module MetronomeSDK
81
87
  def initialize(
82
88
  url:,
83
89
  status: nil,
90
+ headers: nil,
84
91
  body: nil,
85
92
  request: nil,
86
93
  response: nil,
@@ -95,6 +102,7 @@ module MetronomeSDK
95
102
  #
96
103
  # @param url [URI::Generic]
97
104
  # @param status [nil]
105
+ # @param headers [Hash{String=>String}, nil]
98
106
  # @param body [nil]
99
107
  # @param request [nil]
100
108
  # @param response [nil]
@@ -102,6 +110,7 @@ module MetronomeSDK
102
110
  def initialize(
103
111
  url:,
104
112
  status: nil,
113
+ headers: nil,
105
114
  body: nil,
106
115
  request: nil,
107
116
  response: nil,
@@ -116,21 +125,24 @@ module MetronomeSDK
116
125
  #
117
126
  # @param url [URI::Generic]
118
127
  # @param status [Integer]
128
+ # @param headers [Hash{String=>String}, nil]
119
129
  # @param body [Object, nil]
120
130
  # @param request [nil]
121
131
  # @param response [nil]
122
132
  # @param message [String, nil]
123
133
  #
124
134
  # @return [self]
125
- def self.for(url:, status:, body:, request:, response:, message: nil)
126
- kwargs = {
127
- url: url,
128
- status: status,
129
- body: body,
130
- request: request,
131
- response: response,
132
- message: message
133
- }
135
+ def self.for(url:, status:, headers:, body:, request:, response:, message: nil)
136
+ kwargs =
137
+ {
138
+ url: url,
139
+ status: status,
140
+ headers: headers,
141
+ body: body,
142
+ request: request,
143
+ response: response,
144
+ message: message
145
+ }
134
146
 
135
147
  case status
136
148
  in 400
@@ -162,15 +174,17 @@ module MetronomeSDK
162
174
  #
163
175
  # @param url [URI::Generic]
164
176
  # @param status [Integer]
177
+ # @param headers [Hash{String=>String}, nil]
165
178
  # @param body [Object, nil]
166
179
  # @param request [nil]
167
180
  # @param response [nil]
168
181
  # @param message [String, nil]
169
- def initialize(url:, status:, body:, request:, response:, message: nil)
182
+ def initialize(url:, status:, headers:, body:, request:, response:, message: nil)
170
183
  message ||= {url: url.to_s, status: status, body: body}
171
184
  super(
172
185
  url: url,
173
186
  status: status,
187
+ headers: headers,
174
188
  body: body,
175
189
  request: request,
176
190
  response: response,
@@ -38,18 +38,21 @@ module MetronomeSDK
38
38
  def to_yaml(*a) = read.to_yaml(*a)
39
39
 
40
40
  # @param content [Pathname, StringIO, IO, String]
41
- # @param filename [String, nil]
41
+ # @param filename [Pathname, String, nil]
42
42
  # @param content_type [String, nil]
43
43
  def initialize(content, filename: nil, content_type: nil)
44
- @content = content
44
+ @content_type = content_type
45
45
  @filename =
46
- case content
47
- in Pathname
48
- filename.nil? ? content.basename.to_path : ::File.basename(filename)
46
+ case [filename, (@content = content)]
47
+ in [String | Pathname, _]
48
+ ::File.basename(filename)
49
+ in [nil, Pathname]
50
+ content.basename.to_path
51
+ in [nil, IO]
52
+ content.to_path
49
53
  else
50
- filename.nil? ? nil : ::File.basename(filename)
54
+ filename
51
55
  end
52
- @content_type = content_type
53
56
  end
54
57
  end
55
58
  end
@@ -60,7 +60,7 @@ module MetronomeSDK
60
60
  #
61
61
  # @param client [MetronomeSDK::Internal::Transport::BaseClient]
62
62
  # @param req [Hash{Symbol=>Object}]
63
- # @param headers [Hash{String=>String}, Net::HTTPHeader]
63
+ # @param headers [Hash{String=>String}]
64
64
  # @param page_data [Hash{Symbol=>Object}]
65
65
  def initialize(client:, req:, headers:, page_data:)
66
66
  super
@@ -60,7 +60,7 @@ module MetronomeSDK
60
60
  #
61
61
  # @param client [MetronomeSDK::Internal::Transport::BaseClient]
62
62
  # @param req [Hash{Symbol=>Object}]
63
- # @param headers [Hash{String=>String}, Net::HTTPHeader]
63
+ # @param headers [Hash{String=>String}]
64
64
  # @param page_data [Hash{Symbol=>Object}]
65
65
  def initialize(client:, req:, headers:, page_data:)
66
66
  super
@@ -60,7 +60,7 @@ module MetronomeSDK
60
60
  #
61
61
  # @param client [MetronomeSDK::Internal::Transport::BaseClient]
62
62
  # @param req [Hash{Symbol=>Object}]
63
- # @param headers [Hash{String=>String}, Net::HTTPHeader]
63
+ # @param headers [Hash{String=>String}]
64
64
  # @param page_data [Hash{Symbol=>Object}]
65
65
  def initialize(client:, req:, headers:, page_data:)
66
66
  super
@@ -47,7 +47,7 @@ module MetronomeSDK
47
47
  # @api private
48
48
  #
49
49
  # @param status [Integer]
50
- # @param headers [Hash{String=>String}, Net::HTTPHeader]
50
+ # @param headers [Hash{String=>String}]
51
51
  #
52
52
  # @return [Boolean]
53
53
  def should_retry?(status, headers:)
@@ -85,7 +85,7 @@ module MetronomeSDK
85
85
  #
86
86
  # @param status [Integer]
87
87
  #
88
- # @param response_headers [Hash{String=>String}, Net::HTTPHeader]
88
+ # @param response_headers [Hash{String=>String}]
89
89
  #
90
90
  # @return [Hash{Symbol=>Object}]
91
91
  def follow_redirect(request, status:, response_headers:)
@@ -378,6 +378,7 @@ module MetronomeSDK
378
378
  rescue MetronomeSDK::Errors::APIConnectionError => e
379
379
  status = e
380
380
  end
381
+ headers = MetronomeSDK::Internal::Util.normalized_headers(response&.each_header&.to_h)
381
382
 
382
383
  case status
383
384
  in ..299
@@ -390,7 +391,7 @@ module MetronomeSDK
390
391
  in 300..399
391
392
  self.class.reap_connection!(status, stream: stream)
392
393
 
393
- request = self.class.follow_redirect(request, status: status, response_headers: response)
394
+ request = self.class.follow_redirect(request, status: status, response_headers: headers)
394
395
  send_request(
395
396
  request,
396
397
  redirect_count: redirect_count + 1,
@@ -399,9 +400,9 @@ module MetronomeSDK
399
400
  )
400
401
  in MetronomeSDK::Errors::APIConnectionError if retry_count >= max_retries
401
402
  raise status
402
- in (400..) if retry_count >= max_retries || !self.class.should_retry?(status, headers: response)
403
+ in (400..) if retry_count >= max_retries || !self.class.should_retry?(status, headers: headers)
403
404
  decoded = Kernel.then do
404
- MetronomeSDK::Internal::Util.decode_content(response, stream: stream, suppress_error: true)
405
+ MetronomeSDK::Internal::Util.decode_content(headers, stream: stream, suppress_error: true)
405
406
  ensure
406
407
  self.class.reap_connection!(status, stream: stream)
407
408
  end
@@ -409,6 +410,7 @@ module MetronomeSDK
409
410
  raise MetronomeSDK::Errors::APIStatusError.for(
410
411
  url: url,
411
412
  status: status,
413
+ headers: headers,
412
414
  body: decoded,
413
415
  request: nil,
414
416
  response: response
@@ -485,19 +487,21 @@ module MetronomeSDK
485
487
  send_retry_header: send_retry_header
486
488
  )
487
489
 
488
- decoded = MetronomeSDK::Internal::Util.decode_content(response, stream: stream)
490
+ headers = MetronomeSDK::Internal::Util.normalized_headers(response.each_header.to_h)
491
+ decoded = MetronomeSDK::Internal::Util.decode_content(headers, stream: stream)
489
492
  case req
490
493
  in {stream: Class => st}
491
494
  st.new(
492
495
  model: model,
493
496
  url: url,
494
497
  status: status,
498
+ headers: headers,
495
499
  response: response,
496
500
  unwrap: unwrap,
497
501
  stream: decoded
498
502
  )
499
503
  in {page: Class => page}
500
- page.new(client: self, req: req, headers: response, page_data: decoded)
504
+ page.new(client: self, req: req, headers: headers, page_data: decoded)
501
505
  else
502
506
  unwrapped = MetronomeSDK::Internal::Util.dig(decoded, unwrap)
503
507
  MetronomeSDK::Internal::Type::Converter.coerce(model, unwrapped)
@@ -128,37 +128,47 @@ module MetronomeSDK
128
128
  url, deadline = request.fetch_values(:url, :deadline)
129
129
 
130
130
  req = nil
131
- eof = false
132
131
  finished = false
133
- closing = nil
134
132
 
135
133
  # rubocop:disable Metrics/BlockLength
136
134
  enum = Enumerator.new do |y|
137
- with_pool(url, deadline: deadline) do |conn|
138
- next if finished
139
-
140
- req, closing = self.class.build_request(request) do
141
- self.class.calibrate_socket_timeout(conn, deadline)
142
- end
143
-
144
- self.class.calibrate_socket_timeout(conn, deadline)
145
- unless conn.started?
146
- conn.keep_alive_timeout = self.class::KEEP_ALIVE_TIMEOUT
147
- conn.start
148
- end
135
+ next if finished
149
136
 
150
- self.class.calibrate_socket_timeout(conn, deadline)
151
- conn.request(req) do |rsp|
152
- y << [conn, req, rsp]
153
- break if finished
137
+ with_pool(url, deadline: deadline) do |conn|
138
+ eof = false
139
+ closing = nil
140
+ ::Thread.handle_interrupt(Object => :never) do
141
+ ::Thread.handle_interrupt(Object => :immediate) do
142
+ req, closing = self.class.build_request(request) do
143
+ self.class.calibrate_socket_timeout(conn, deadline)
144
+ end
154
145
 
155
- rsp.read_body do |bytes|
156
- y << bytes.force_encoding(Encoding::BINARY)
157
- break if finished
146
+ self.class.calibrate_socket_timeout(conn, deadline)
147
+ unless conn.started?
148
+ conn.keep_alive_timeout = self.class::KEEP_ALIVE_TIMEOUT
149
+ conn.start
150
+ end
158
151
 
159
152
  self.class.calibrate_socket_timeout(conn, deadline)
153
+ conn.request(req) do |rsp|
154
+ y << [req, rsp]
155
+ break if finished
156
+
157
+ rsp.read_body do |bytes|
158
+ y << bytes.force_encoding(Encoding::BINARY)
159
+ break if finished
160
+
161
+ self.class.calibrate_socket_timeout(conn, deadline)
162
+ end
163
+ eof = true
164
+ end
165
+ end
166
+ ensure
167
+ begin
168
+ conn.finish if !eof && conn&.started?
169
+ ensure
170
+ closing&.call
160
171
  end
161
- eof = true
162
172
  end
163
173
  end
164
174
  rescue Timeout::Error
@@ -168,17 +178,10 @@ module MetronomeSDK
168
178
  end
169
179
  # rubocop:enable Metrics/BlockLength
170
180
 
171
- conn, _, response = enum.next
181
+ _, response = enum.next
172
182
  body = MetronomeSDK::Internal::Util.fused_enum(enum, external: true) do
173
183
  finished = true
174
- tap do
175
- enum.next
176
- rescue StopIteration
177
- nil
178
- end
179
- ensure
180
- conn.finish if !eof && conn&.started?
181
- closing&.call
184
+ loop { enum.next }
182
185
  end
183
186
  [Integer(response.code), response, body]
184
187
  end
@@ -39,7 +39,7 @@ module MetronomeSDK
39
39
  #
40
40
  # @param client [MetronomeSDK::Internal::Transport::BaseClient]
41
41
  # @param req [Hash{Symbol=>Object}]
42
- # @param headers [Hash{String=>String}, Net::HTTPHeader]
42
+ # @param headers [Hash{String=>String}]
43
43
  # @param page_data [Object]
44
44
  def initialize(client:, req:, headers:, page_data:)
45
45
  @client = client
@@ -15,6 +15,31 @@ module MetronomeSDK
15
15
  #
16
16
  # We can therefore convert string values to Symbols, but can't convert other
17
17
  # values safely.
18
+ #
19
+ # @example
20
+ # # `payment_status` is a `MetronomeSDK::V1::PaymentStatus`
21
+ # case payment_status
22
+ # when MetronomeSDK::V1::PaymentStatus::PENDING
23
+ # # ...
24
+ # when MetronomeSDK::V1::PaymentStatus::REQUIRES_INTERVENTION
25
+ # # ...
26
+ # when MetronomeSDK::V1::PaymentStatus::PAID
27
+ # # ...
28
+ # else
29
+ # puts(payment_status)
30
+ # end
31
+ #
32
+ # @example
33
+ # case payment_status
34
+ # in :pending
35
+ # # ...
36
+ # in :requires_intervention
37
+ # # ...
38
+ # in :paid
39
+ # # ...
40
+ # else
41
+ # puts(payment_status)
42
+ # end
18
43
  module Enum
19
44
  include MetronomeSDK::Internal::Type::Converter
20
45
  include MetronomeSDK::Internal::Util::SorbetRuntimeSupport
@@ -82,17 +82,20 @@ module MetronomeSDK
82
82
  #
83
83
  # @return [Pathname, StringIO, IO, String, Object]
84
84
  def dump(value, state:)
85
- # rubocop:disable Lint/DuplicateBranch
86
85
  case value
86
+ in StringIO | String
87
+ # https://datatracker.ietf.org/doc/html/rfc7578#section-4.2
88
+ # while not required, a filename is recommended, and in practice many servers do expect this
89
+ MetronomeSDK::FilePart.new(value, filename: "upload")
87
90
  in IO
88
91
  state[:can_retry] = false
92
+ value.to_path.nil? ? MetronomeSDK::FilePart.new(value, filename: "upload") : value
89
93
  in MetronomeSDK::FilePart if value.content.is_a?(IO)
90
94
  state[:can_retry] = false
95
+ value
91
96
  else
97
+ value
92
98
  end
93
- # rubocop:enable Lint/DuplicateBranch
94
-
95
- value
96
99
  end
97
100
 
98
101
  # @api private
@@ -346,8 +346,9 @@ module MetronomeSDK
346
346
  base_path, base_query = lhs.fetch_values(:path, :query)
347
347
  slashed = base_path.end_with?("/") ? base_path : "#{base_path}/"
348
348
 
349
- parsed_path, parsed_query = parse_uri(rhs.fetch(:path)).fetch_values(:path, :query)
350
- override = URI::Generic.build(**rhs.slice(:scheme, :host, :port), path: parsed_path)
349
+ merged = {**parse_uri(rhs.fetch(:path)), **rhs.except(:path, :query)}
350
+ parsed_path, parsed_query = merged.fetch_values(:path, :query)
351
+ override = URI::Generic.build(**merged.slice(:scheme, :host, :port), path: parsed_path)
351
352
 
352
353
  joined = URI.join(URI::Generic.build(lhs.except(:path, :query)), slashed, override)
353
354
  query = deep_merge(
@@ -473,10 +474,9 @@ module MetronomeSDK
473
474
  # @return [Enumerable<String>]
474
475
  def writable_enum(&blk)
475
476
  Enumerator.new do |y|
476
- buf = String.new
477
477
  y.define_singleton_method(:write) do
478
- self << buf.replace(_1)
479
- buf.bytesize
478
+ self << _1.dup
479
+ _1.bytesize
480
480
  end
481
481
 
482
482
  blk.call(y)
@@ -566,7 +566,8 @@ module MetronomeSDK
566
566
  #
567
567
  # @return [Array(String, Enumerable<String>)]
568
568
  private def encode_multipart_streaming(body)
569
- boundary = SecureRandom.urlsafe_base64(60)
569
+ # RFC 1521 Section 7.2.1 says we should have 70 char maximum for boundary length
570
+ boundary = SecureRandom.urlsafe_base64(46)
570
571
 
571
572
  closing = []
572
573
  strio = writable_enum do |y|
@@ -647,7 +648,7 @@ module MetronomeSDK
647
648
  #
648
649
  # Assumes each chunk in stream has `Encoding::BINARY`.
649
650
  #
650
- # @param headers [Hash{String=>String}, Net::HTTPHeader]
651
+ # @param headers [Hash{String=>String}]
651
652
  # @param stream [Enumerable<String>]
652
653
  # @param suppress_error [Boolean]
653
654
  #
@@ -365,6 +365,7 @@ module MetronomeSDK
365
365
  QUICKBOOKS_ONLINE = :quickbooks_online
366
366
  WORKDAY = :workday
367
367
  GCP_MARKETPLACE = :gcp_marketplace
368
+ METRONOME = :metronome
368
369
 
369
370
  # @!method self.values
370
371
  # @return [Array<Symbol>]