straddle 0.1.1 → 0.3.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 (248) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.md +2 -2
  4. data/SECURITY.md +1 -1
  5. data/lib/straddle/client.rb +3 -3
  6. data/lib/straddle/errors.rb +25 -11
  7. data/lib/straddle/file_part.rb +10 -7
  8. data/lib/straddle/internal/page_number_schema.rb +1 -1
  9. data/lib/straddle/internal/transport/base_client.rb +19 -9
  10. data/lib/straddle/internal/transport/pooled_net_requester.rb +41 -42
  11. data/lib/straddle/internal/type/array_of.rb +1 -0
  12. data/lib/straddle/internal/type/base_model.rb +4 -9
  13. data/lib/straddle/internal/type/base_page.rb +1 -1
  14. data/lib/straddle/internal/type/converter.rb +27 -0
  15. data/lib/straddle/internal/type/file_input.rb +7 -4
  16. data/lib/straddle/internal/type/hash_of.rb +1 -0
  17. data/lib/straddle/internal/type/union.rb +9 -7
  18. data/lib/straddle/internal/util.rb +9 -8
  19. data/lib/straddle/models/bridge/link_bank_account_params.rb +39 -6
  20. data/lib/straddle/models/bridge/link_create_paykey_params.rb +39 -6
  21. data/lib/straddle/models/bridge/link_create_paykey_response.rb +31 -2
  22. data/lib/straddle/models/bridge/link_create_tan_params.rb +38 -6
  23. data/lib/straddle/models/bridge/link_create_tan_response.rb +31 -2
  24. data/lib/straddle/models/bridge/link_plaid_params.rb +37 -2
  25. data/lib/straddle/models/bridge_initialize_params.rb +37 -2
  26. data/lib/straddle/models/charge_cancel_params.rb +8 -1
  27. data/lib/straddle/models/charge_create_params.rb +8 -1
  28. data/lib/straddle/models/charge_hold_params.rb +8 -1
  29. data/lib/straddle/models/charge_release_params.rb +8 -1
  30. data/lib/straddle/models/charge_update_params.rb +8 -1
  31. data/lib/straddle/models/customer_create_params.rb +8 -1
  32. data/lib/straddle/models/customer_delete_params.rb +7 -1
  33. data/lib/straddle/models/customer_unmasked_v1.rb +1 -4
  34. data/lib/straddle/models/customer_update_params.rb +8 -1
  35. data/lib/straddle/models/customers/customer_review_v1.rb +15 -50
  36. data/lib/straddle/models/customers/review_decision_params.rb +8 -1
  37. data/lib/straddle/models/customers/review_refresh_review_params.rb +40 -0
  38. data/lib/straddle/models/embed/account_create_params.rb +8 -1
  39. data/lib/straddle/models/embed/account_onboard_params.rb +7 -1
  40. data/lib/straddle/models/embed/account_paged_v1.rb +3 -12
  41. data/lib/straddle/models/embed/account_simulate_params.rb +7 -1
  42. data/lib/straddle/models/embed/account_update_params.rb +8 -1
  43. data/lib/straddle/models/embed/account_v1.rb +2 -8
  44. data/lib/straddle/models/embed/accounts/capability_request_create_params.rb +8 -1
  45. data/lib/straddle/models/embed/accounts/capability_request_paged_v1.rb +3 -11
  46. data/lib/straddle/models/embed/linked_bank_account_cancel_params.rb +34 -0
  47. data/lib/straddle/models/embed/linked_bank_account_create_params.rb +51 -4
  48. data/lib/straddle/models/embed/linked_bank_account_list_params.rb +51 -1
  49. data/lib/straddle/models/embed/linked_bank_account_paged_v1.rb +33 -13
  50. data/lib/straddle/models/embed/linked_bank_account_unmask_v1.rb +3 -8
  51. data/lib/straddle/models/embed/linked_bank_account_update_params.rb +8 -1
  52. data/lib/straddle/models/embed/linked_bank_account_v1.rb +30 -1
  53. data/lib/straddle/models/embed/organization_create_params.rb +8 -1
  54. data/lib/straddle/models/embed/representative.rb +10 -1
  55. data/lib/straddle/models/embed/representative_create_params.rb +17 -1
  56. data/lib/straddle/models/embed/representative_paged.rb +10 -1
  57. data/lib/straddle/models/embed/representative_update_params.rb +17 -1
  58. data/lib/straddle/models/funding_event_list_params.rb +9 -1
  59. data/lib/straddle/models/funding_event_summary_item_v1.rb +25 -1
  60. data/lib/straddle/models/funding_event_summary_paged_v1.rb +25 -1
  61. data/lib/straddle/models/paykey_cancel_params.rb +7 -1
  62. data/lib/straddle/models/paykey_reveal_response.rb +31 -2
  63. data/lib/straddle/models/paykey_summary_paged_v1.rb +30 -2
  64. data/lib/straddle/models/paykey_unmasked_v1.rb +30 -2
  65. data/lib/straddle/models/{customer_refresh_review_params.rb → paykey_update_balance_params.rb} +9 -3
  66. data/lib/straddle/models/paykey_v1.rb +30 -2
  67. data/lib/straddle/models/paykeys/review_decision_params.rb +56 -0
  68. data/lib/straddle/models/paykeys/review_get_params.rb +34 -0
  69. data/lib/straddle/models/paykeys/review_get_response.rb +642 -0
  70. data/lib/straddle/models/paykeys/review_refresh_review_params.rb +40 -0
  71. data/lib/straddle/models/payment_summary_paged_v1.rb +9 -1
  72. data/lib/straddle/models/payout_cancel_params.rb +8 -1
  73. data/lib/straddle/models/payout_create_params.rb +8 -1
  74. data/lib/straddle/models/payout_hold_params.rb +8 -1
  75. data/lib/straddle/models/payout_release_params.rb +8 -1
  76. data/lib/straddle/models/payout_update_params.rb +8 -1
  77. data/lib/straddle/models.rb +4 -2
  78. data/lib/straddle/resources/bridge/link.rb +24 -4
  79. data/lib/straddle/resources/bridge.rb +6 -1
  80. data/lib/straddle/resources/charges.rb +20 -5
  81. data/lib/straddle/resources/customers/review.rb +41 -1
  82. data/lib/straddle/resources/customers.rb +12 -37
  83. data/lib/straddle/resources/embed/accounts/capability_requests.rb +5 -2
  84. data/lib/straddle/resources/embed/accounts.rb +19 -7
  85. data/lib/straddle/resources/embed/linked_bank_accounts.rb +66 -7
  86. data/lib/straddle/resources/embed/organizations.rb +5 -2
  87. data/lib/straddle/resources/embed/representatives.rb +14 -4
  88. data/lib/straddle/resources/funding_events.rb +4 -1
  89. data/lib/straddle/resources/paykeys/review.rb +128 -0
  90. data/lib/straddle/resources/paykeys.rb +44 -1
  91. data/lib/straddle/resources/payouts.rb +20 -5
  92. data/lib/straddle/version.rb +1 -1
  93. data/lib/straddle.rb +9 -1
  94. data/manifest.yaml +1 -0
  95. data/rbi/straddle/client.rbi +4 -4
  96. data/rbi/straddle/errors.rbi +31 -4
  97. data/rbi/straddle/file_part.rbi +1 -1
  98. data/rbi/straddle/internal/transport/base_client.rbi +10 -6
  99. data/rbi/straddle/internal/transport/pooled_net_requester.rbi +6 -2
  100. data/rbi/straddle/internal/type/base_model.rbi +8 -4
  101. data/rbi/straddle/internal/type/base_page.rbi +1 -1
  102. data/rbi/straddle/internal/type/converter.rbi +54 -0
  103. data/rbi/straddle/internal/type/union.rbi +9 -2
  104. data/rbi/straddle/internal/util.rbi +1 -1
  105. data/rbi/straddle/models/bridge/link_bank_account_params.rbi +85 -1
  106. data/rbi/straddle/models/bridge/link_create_paykey_params.rbi +85 -1
  107. data/rbi/straddle/models/bridge/link_create_paykey_response.rbi +76 -1
  108. data/rbi/straddle/models/bridge/link_create_tan_params.rbi +85 -1
  109. data/rbi/straddle/models/bridge/link_create_tan_response.rbi +76 -1
  110. data/rbi/straddle/models/bridge/link_plaid_params.rbi +85 -1
  111. data/rbi/straddle/models/bridge_initialize_params.rbi +85 -1
  112. data/rbi/straddle/models/charge_cancel_params.rbi +9 -0
  113. data/rbi/straddle/models/charge_create_params.rbi +9 -0
  114. data/rbi/straddle/models/charge_hold_params.rbi +9 -0
  115. data/rbi/straddle/models/charge_release_params.rbi +9 -0
  116. data/rbi/straddle/models/charge_update_params.rbi +9 -0
  117. data/rbi/straddle/models/customer_create_params.rbi +9 -0
  118. data/rbi/straddle/models/customer_delete_params.rbi +9 -0
  119. data/rbi/straddle/models/customer_update_params.rbi +9 -0
  120. data/rbi/straddle/models/customers/review_decision_params.rbi +9 -0
  121. data/rbi/straddle/models/customers/review_refresh_review_params.rbi +76 -0
  122. data/rbi/straddle/models/embed/account_create_params.rbi +9 -0
  123. data/rbi/straddle/models/embed/account_onboard_params.rbi +9 -0
  124. data/rbi/straddle/models/embed/account_simulate_params.rbi +9 -0
  125. data/rbi/straddle/models/embed/account_update_params.rbi +9 -0
  126. data/rbi/straddle/models/embed/accounts/capability_request_create_params.rbi +9 -0
  127. data/rbi/straddle/models/embed/linked_bank_account_cancel_params.rbi +67 -0
  128. data/rbi/straddle/models/embed/linked_bank_account_create_params.rbi +95 -3
  129. data/rbi/straddle/models/embed/linked_bank_account_list_params.rbi +149 -0
  130. data/rbi/straddle/models/embed/linked_bank_account_paged_v1.rbi +72 -0
  131. data/rbi/straddle/models/embed/linked_bank_account_unmask_v1.rbi +5 -0
  132. data/rbi/straddle/models/embed/linked_bank_account_update_params.rbi +9 -0
  133. data/rbi/straddle/models/embed/linked_bank_account_v1.rbi +72 -0
  134. data/rbi/straddle/models/embed/organization_create_params.rbi +9 -0
  135. data/rbi/straddle/models/embed/representative.rbi +10 -0
  136. data/rbi/straddle/models/embed/representative_create_params.rbi +19 -0
  137. data/rbi/straddle/models/embed/representative_paged.rbi +10 -0
  138. data/rbi/straddle/models/embed/representative_update_params.rbi +19 -0
  139. data/rbi/straddle/models/funding_event_list_params.rbi +8 -0
  140. data/rbi/straddle/models/funding_event_summary_item_v1.rbi +24 -0
  141. data/rbi/straddle/models/funding_event_summary_paged_v1.rbi +24 -0
  142. data/rbi/straddle/models/paykey_cancel_params.rbi +9 -0
  143. data/rbi/straddle/models/paykey_reveal_response.rbi +76 -1
  144. data/rbi/straddle/models/paykey_summary_paged_v1.rbi +76 -1
  145. data/rbi/straddle/models/paykey_unmasked_v1.rbi +76 -1
  146. data/rbi/straddle/models/{customer_refresh_review_params.rbi → paykey_update_balance_params.rbi} +11 -2
  147. data/rbi/straddle/models/paykey_v1.rbi +76 -1
  148. data/rbi/straddle/models/paykeys/review_decision_params.rbi +115 -0
  149. data/rbi/straddle/models/paykeys/review_get_params.rbi +67 -0
  150. data/rbi/straddle/models/paykeys/review_get_response.rbi +1524 -0
  151. data/rbi/straddle/models/paykeys/review_refresh_review_params.rbi +76 -0
  152. data/rbi/straddle/models/payment_summary_paged_v1.rbi +8 -0
  153. data/rbi/straddle/models/payout_cancel_params.rbi +9 -0
  154. data/rbi/straddle/models/payout_create_params.rbi +9 -0
  155. data/rbi/straddle/models/payout_hold_params.rbi +9 -0
  156. data/rbi/straddle/models/payout_release_params.rbi +9 -0
  157. data/rbi/straddle/models/payout_update_params.rbi +9 -0
  158. data/rbi/straddle/models.rbi +4 -2
  159. data/rbi/straddle/resources/bridge/link.rbi +28 -0
  160. data/rbi/straddle/resources/bridge.rbi +7 -0
  161. data/rbi/straddle/resources/charges.rbi +15 -0
  162. data/rbi/straddle/resources/customers/review.rbi +30 -0
  163. data/rbi/straddle/resources/customers.rbi +9 -24
  164. data/rbi/straddle/resources/embed/accounts/capability_requests.rbi +3 -0
  165. data/rbi/straddle/resources/embed/accounts.rbi +12 -0
  166. data/rbi/straddle/resources/embed/linked_bank_accounts.rbi +56 -1
  167. data/rbi/straddle/resources/embed/organizations.rbi +3 -0
  168. data/rbi/straddle/resources/embed/representatives.rbi +14 -0
  169. data/rbi/straddle/resources/funding_events.rbi +3 -0
  170. data/rbi/straddle/resources/paykeys/review.rbi +94 -0
  171. data/rbi/straddle/resources/paykeys.rbi +32 -0
  172. data/rbi/straddle/resources/payouts.rbi +15 -0
  173. data/sig/straddle/client.rbs +2 -2
  174. data/sig/straddle/errors.rbs +7 -0
  175. data/sig/straddle/file_part.rbs +1 -1
  176. data/sig/straddle/internal/transport/base_client.rbs +3 -1
  177. data/sig/straddle/internal/transport/pooled_net_requester.rbs +4 -1
  178. data/sig/straddle/internal/type/converter.rbs +17 -0
  179. data/sig/straddle/internal/type/union.rbs +2 -2
  180. data/sig/straddle/models/bridge/link_bank_account_params.rbs +35 -1
  181. data/sig/straddle/models/bridge/link_create_paykey_params.rbs +35 -1
  182. data/sig/straddle/models/bridge/link_create_paykey_response.rbs +28 -1
  183. data/sig/straddle/models/bridge/link_create_tan_params.rbs +35 -1
  184. data/sig/straddle/models/bridge/link_create_tan_response.rbs +28 -1
  185. data/sig/straddle/models/bridge/link_plaid_params.rbs +35 -1
  186. data/sig/straddle/models/bridge_initialize_params.rbs +35 -1
  187. data/sig/straddle/models/charge_cancel_params.rbs +7 -0
  188. data/sig/straddle/models/charge_create_params.rbs +7 -0
  189. data/sig/straddle/models/charge_hold_params.rbs +7 -0
  190. data/sig/straddle/models/charge_release_params.rbs +7 -0
  191. data/sig/straddle/models/charge_update_params.rbs +7 -0
  192. data/sig/straddle/models/customer_create_params.rbs +7 -0
  193. data/sig/straddle/models/customer_delete_params.rbs +7 -0
  194. data/sig/straddle/models/customer_update_params.rbs +7 -0
  195. data/sig/straddle/models/customers/review_decision_params.rbs +7 -0
  196. data/sig/straddle/models/customers/review_refresh_review_params.rbs +51 -0
  197. data/sig/straddle/models/embed/account_create_params.rbs +7 -0
  198. data/sig/straddle/models/embed/account_onboard_params.rbs +7 -0
  199. data/sig/straddle/models/embed/account_simulate_params.rbs +7 -0
  200. data/sig/straddle/models/embed/account_update_params.rbs +7 -0
  201. data/sig/straddle/models/embed/accounts/capability_request_create_params.rbs +7 -0
  202. data/sig/straddle/models/embed/linked_bank_account_cancel_params.rbs +40 -0
  203. data/sig/straddle/models/embed/linked_bank_account_create_params.rbs +38 -4
  204. data/sig/straddle/models/embed/linked_bank_account_list_params.rbs +46 -0
  205. data/sig/straddle/models/embed/linked_bank_account_paged_v1.rbs +25 -1
  206. data/sig/straddle/models/embed/linked_bank_account_unmask_v1.rbs +3 -1
  207. data/sig/straddle/models/embed/linked_bank_account_update_params.rbs +7 -0
  208. data/sig/straddle/models/embed/linked_bank_account_v1.rbs +25 -1
  209. data/sig/straddle/models/embed/organization_create_params.rbs +7 -0
  210. data/sig/straddle/models/embed/representative.rbs +5 -0
  211. data/sig/straddle/models/embed/representative_create_params.rbs +12 -0
  212. data/sig/straddle/models/embed/representative_paged.rbs +5 -0
  213. data/sig/straddle/models/embed/representative_update_params.rbs +12 -0
  214. data/sig/straddle/models/funding_event_list_params.rbs +5 -0
  215. data/sig/straddle/models/funding_event_summary_item_v1.rbs +15 -0
  216. data/sig/straddle/models/funding_event_summary_paged_v1.rbs +15 -0
  217. data/sig/straddle/models/paykey_cancel_params.rbs +7 -0
  218. data/sig/straddle/models/paykey_reveal_response.rbs +28 -1
  219. data/sig/straddle/models/paykey_summary_paged_v1.rbs +28 -1
  220. data/sig/straddle/models/paykey_unmasked_v1.rbs +28 -1
  221. data/sig/straddle/models/{customer_refresh_review_params.rbs → paykey_update_balance_params.rbs} +9 -2
  222. data/sig/straddle/models/paykey_v1.rbs +28 -1
  223. data/sig/straddle/models/paykeys/review_decision_params.rbs +67 -0
  224. data/sig/straddle/models/paykeys/review_get_params.rbs +44 -0
  225. data/sig/straddle/models/paykeys/review_get_response.rbs +627 -0
  226. data/sig/straddle/models/paykeys/review_refresh_review_params.rbs +51 -0
  227. data/sig/straddle/models/payment_summary_paged_v1.rbs +5 -0
  228. data/sig/straddle/models/payout_cancel_params.rbs +7 -0
  229. data/sig/straddle/models/payout_create_params.rbs +7 -0
  230. data/sig/straddle/models/payout_hold_params.rbs +7 -0
  231. data/sig/straddle/models/payout_release_params.rbs +7 -0
  232. data/sig/straddle/models/payout_update_params.rbs +7 -0
  233. data/sig/straddle/models.rbs +4 -2
  234. data/sig/straddle/resources/bridge/link.rbs +8 -0
  235. data/sig/straddle/resources/bridge.rbs +2 -0
  236. data/sig/straddle/resources/charges.rbs +5 -0
  237. data/sig/straddle/resources/customers/review.rbs +10 -0
  238. data/sig/straddle/resources/customers.rbs +3 -8
  239. data/sig/straddle/resources/embed/accounts/capability_requests.rbs +1 -0
  240. data/sig/straddle/resources/embed/accounts.rbs +4 -0
  241. data/sig/straddle/resources/embed/linked_bank_accounts.rbs +16 -1
  242. data/sig/straddle/resources/embed/organizations.rbs +1 -0
  243. data/sig/straddle/resources/embed/representatives.rbs +4 -0
  244. data/sig/straddle/resources/funding_events.rbs +1 -0
  245. data/sig/straddle/resources/paykeys/review.rbs +36 -0
  246. data/sig/straddle/resources/paykeys.rbs +12 -0
  247. data/sig/straddle/resources/payouts.rbs +5 -0
  248. metadata +27 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 070d9a859dd569658ee931097b2a5fd7c34ebe7f58bbac87972c170c2af5cd5e
4
- data.tar.gz: be5103223c6a35ed17e6456a17a67c4c084c2dd71b7814ad89682697280881d1
3
+ metadata.gz: 3e5e80a1c1b53b3a5f149984bc7e7fbb1ae782caee1a4c9683ffcb96559733a7
4
+ data.tar.gz: 376d8c6d7ee586b2d7e61dad2947fae516565306f9ad6d4754273c38568bfa8d
5
5
  SHA512:
6
- metadata.gz: 66da28451c8bce1bf74dfa3e58e3ff9fb1736cb9d1610307da3083b49b68090328a5cbaaa3642fe479acc27052922116e53a1412de4bec8568a654ecbe82b8c8
7
- data.tar.gz: ebe0b559f5be6ff461a3cfa062d2edb87d8d3b3bed19c21d7e96ed64f54e8a25ce603eec76fcf46b5dcce9a4e7525577e7377ecf1b15b6c9e5b88615cec5297c
6
+ metadata.gz: 57024a8ac2cbc21595f1d7eb0896f367273cda63b109d206fe0ef5168f8eb9c91bf47550c509c5b74bac8ff745366678acd1a433566d67278cc780c4698f1a24
7
+ data.tar.gz: 7128242298fe0136fdbaa3b3e87ead934ba990d6bf99aed938229b034cd90e903a8fb51989dd8cd89c1eb53ae9d70411547aad962c7812898e966fde32292bc3
data/CHANGELOG.md CHANGED
@@ -1,5 +1,71 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.0 (2025-11-16)
4
+
5
+ Full Changelog: [v0.2.0...v0.3.0](https://github.com/straddleio/straddle-ruby/compare/v0.2.0...v0.3.0)
6
+
7
+ ### Features
8
+
9
+ * **api:** manual updates ([c048e53](https://github.com/straddleio/straddle-ruby/commit/c048e539bb7e3851302e4ddbd166a58fb593a52b))
10
+ * **docs:** Preliminary update to SDK Spec ([8d573e9](https://github.com/straddleio/straddle-ruby/commit/8d573e9c1d39e407dae8a1ec8cc716c0e86a8b46))
11
+ * handle thread interrupts in the core HTTP client ([0e8ff22](https://github.com/straddleio/straddle-ruby/commit/0e8ff229d3f4e5bb905f807338896f8999cc1f44))
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * absolutely qualified uris should always override the default ([9ec59a0](https://github.com/straddleio/straddle-ruby/commit/9ec59a081f213bbef52a0deb0e05229f047ec4b3))
17
+ * better thread safety via early initializing SSL store during HTTP client creation ([44dd717](https://github.com/straddleio/straddle-ruby/commit/44dd7179fdf7a912e6c0df4016cd7976ceaaa3f9))
18
+ * should not reuse buffers for `IO.copy_stream` interop ([ab1134b](https://github.com/straddleio/straddle-ruby/commit/ab1134bebd96319b18959ef961f303b7fa92cf18))
19
+
20
+
21
+ ### Chores
22
+
23
+ * bump dependency version and update sorbet types ([19ed027](https://github.com/straddleio/straddle-ruby/commit/19ed0274aeb5f8303d0170817a1520591c6e484b))
24
+ * ignore linter error for tests having large collections ([bc64eef](https://github.com/straddleio/straddle-ruby/commit/bc64eefa88be0777031542098b605f2677a8c29f))
25
+
26
+ ## 0.2.0 (2025-10-08)
27
+
28
+ Full Changelog: [v0.1.1...v0.2.0](https://github.com/straddleio/straddle-ruby/compare/v0.1.1...v0.2.0)
29
+
30
+ ### Features
31
+
32
+ * **api:** manual updates ([057927a](https://github.com/straddleio/straddle-ruby/commit/057927a455631a850c4284ebcfbc4f1bfa7dc5eb))
33
+ * **api:** manual updates ([98aa85e](https://github.com/straddleio/straddle-ruby/commit/98aa85e3b01e330403942184fd986af93253640a))
34
+ * **docs:** Preliminary update to SDK Spec ([dc61e54](https://github.com/straddleio/straddle-ruby/commit/dc61e54a7964ace2e73c99c1844e1c8afd3b6d24))
35
+ * **docs:** Preliminary update to SDK Spec ([a2fbd33](https://github.com/straddleio/straddle-ruby/commit/a2fbd33c6636f827e0edd35f26815b32a24296e6))
36
+ * **docs:** Preliminary update to SDK Spec ([0cde0b4](https://github.com/straddleio/straddle-ruby/commit/0cde0b45a6ac30cd2086eb804f43849bffc734dd))
37
+ * **docs:** Preliminary update to SDK Spec ([20b1183](https://github.com/straddleio/straddle-ruby/commit/20b11834366af2928a97030f939a70c706d50469))
38
+ * **docs:** Release Updates to SDK based on Open API Spec (Final) ([9442214](https://github.com/straddleio/straddle-ruby/commit/94422145d27bf6974a7955eb678ec2bc9c0bb4ef))
39
+ * expose response headers for both streams and errors ([a06e5bb](https://github.com/straddleio/straddle-ruby/commit/a06e5bb80cf4d4a49f515d4bff66d6fa11adeae1))
40
+
41
+
42
+ ### Bug Fixes
43
+
44
+ * always send `filename=...` for multipart requests where a file is expected ([d8dcb1b](https://github.com/straddleio/straddle-ruby/commit/d8dcb1b00300a03983cbd67a72af18020822c5c3))
45
+ * **api:** update default API URLs and metadata ([b23e97e](https://github.com/straddleio/straddle-ruby/commit/b23e97ea5c1b0698df3f7f21735a7e0fcf8b6e5a))
46
+ * bump sorbet version and fix new type errors from the breaking change ([c57c7c9](https://github.com/straddleio/straddle-ruby/commit/c57c7c920a948012f18f8e047eb11f9832ce1cb6))
47
+ * coroutine leaks from connection pool ([f2e61b1](https://github.com/straddleio/straddle-ruby/commit/f2e61b1a8cfc85996d03712b753e306368196203))
48
+ * **internal:** ensure sorbet test always runs serially ([9f7f88a](https://github.com/straddleio/straddle-ruby/commit/9f7f88a59fdc8b2723aec681757d170505561202))
49
+ * shorten multipart boundary sep to less than RFC specificed max length ([ffd8ef5](https://github.com/straddleio/straddle-ruby/commit/ffd8ef5e84376bd3bdbdff9d1b6e2c27083cb2aa))
50
+
51
+
52
+ ### Performance Improvements
53
+
54
+ * faster code formatting ([8e88904](https://github.com/straddleio/straddle-ruby/commit/8e88904d37df47c41da9b68cc8d9933137f648a0))
55
+
56
+
57
+ ### Chores
58
+
59
+ * add json schema comment for rubocop.yml ([0bde048](https://github.com/straddleio/straddle-ruby/commit/0bde0487e0cea64712cf1cac96aba024a16ad5f7))
60
+ * allow fast-format to use bsd sed as well ([95b82e0](https://github.com/straddleio/straddle-ruby/commit/95b82e01dcbfa391aa8d4879f448c574efd39ed2))
61
+ * collect metadata from type DSL ([715a864](https://github.com/straddleio/straddle-ruby/commit/715a864f14ceda15395fb9b9d49f1acc2f338d51))
62
+ * do not install brew dependencies in ./scripts/bootstrap by default ([546b45e](https://github.com/straddleio/straddle-ruby/commit/546b45e0c2a548264407a012fbce0f0197954784))
63
+ * **internal:** codegen related update ([645f5e3](https://github.com/straddleio/straddle-ruby/commit/645f5e3f2d3061c2259c98666745224f04652391))
64
+ * **internal:** increase visibility of internal helper method ([ef8bbee](https://github.com/straddleio/straddle-ruby/commit/ef8bbee699b474dcdb6ea184f35af6c07d4bc0b4))
65
+ * **internal:** update comment in script ([caa575f](https://github.com/straddleio/straddle-ruby/commit/caa575ff8c113eb04eb86d35cdbb559c994cb5f8))
66
+ * update @stainless-api/prism-cli to v5.15.0 ([c881442](https://github.com/straddleio/straddle-ruby/commit/c8814421f86dd430870abc78b29685cca4a7535d))
67
+ * update contribute.md ([1da1122](https://github.com/straddleio/straddle-ruby/commit/1da11228a4e40ad0e4b2a5a750a343f312d5fe16))
68
+
3
69
  ## 0.1.1 (2025-07-08)
4
70
 
5
71
  Full Changelog: [v0.1.0-alpha.1...v0.1.1](https://github.com/straddleio/straddle-ruby/compare/v0.1.0-alpha.1...v0.1.1)
data/README.md CHANGED
@@ -8,7 +8,7 @@ It is generated with [Stainless](https://www.stainless.com/).
8
8
 
9
9
  Documentation for releases of this gem can be found [on RubyDoc](https://gemdocs.org/gems/straddle).
10
10
 
11
- The REST API documentation can be found on [docs.straddle.io](https://docs.straddle.io).
11
+ The REST API documentation can be found on [docs.straddle.com](https://docs.straddle.com).
12
12
 
13
13
  ## Installation
14
14
 
@@ -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 "straddle", "~> 0.1.1"
20
+ gem "straddle", "~> 0.3.0"
21
21
  ```
22
22
 
23
23
  <!-- x-release-please-end -->
data/SECURITY.md CHANGED
@@ -20,7 +20,7 @@ or products provided by Straddle, please follow the respective company's securit
20
20
 
21
21
  ### Straddle Terms and Policies
22
22
 
23
- Please contact help@straddle.io for any questions or concerns regarding the security of our services.
23
+ Please contact help@straddle.com for any questions or concerns regarding the security of our services.
24
24
 
25
25
  ---
26
26
 
@@ -17,7 +17,7 @@ module Straddle
17
17
 
18
18
  # rubocop:disable Style/MutableConstant
19
19
  # @type [Hash{Symbol=>String}]
20
- ENVIRONMENTS = {sandbox: "https://sandbox.straddle.io", production: "https://production.straddle.io"}
20
+ ENVIRONMENTS = {sandbox: "https://sandbox.straddle.com", production: "https://production.straddle.com"}
21
21
  # rubocop:enable Style/MutableConstant
22
22
 
23
23
  # Use your Straddle API Key in the Authorization header as Bearer <token> to
@@ -70,8 +70,8 @@ module Straddle
70
70
  #
71
71
  # Each environment maps to a different base URL:
72
72
  #
73
- # - `sandbox` corresponds to `https://sandbox.straddle.io`
74
- # - `production` corresponds to `https://production.straddle.io`
73
+ # - `sandbox` corresponds to `https://sandbox.straddle.com`
74
+ # - `production` corresponds to `https://production.straddle.com`
75
75
  #
76
76
  # @param base_url [String, nil] Override the default base URL for the API, e.g.,
77
77
  # `"https://api.example.com/v2/"`. Defaults to `ENV["STRADDLE_BASE_URL"]`
@@ -40,6 +40,9 @@ module Straddle
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 Straddle
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 Straddle
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 Straddle
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 Straddle
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 Straddle
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 Straddle
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 Straddle
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 Straddle
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
@@ -69,7 +69,7 @@ module Straddle
69
69
  #
70
70
  # @param client [Straddle::Internal::Transport::BaseClient]
71
71
  # @param req [Hash{Symbol=>Object}]
72
- # @param headers [Hash{String=>String}, Net::HTTPHeader]
72
+ # @param headers [Hash{String=>String}]
73
73
  # @param page_data [Hash{Symbol=>Object}]
74
74
  def initialize(client:, req:, headers:, page_data:)
75
75
  super
@@ -47,7 +47,7 @@ module Straddle
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 Straddle
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:)
@@ -201,7 +201,8 @@ module Straddle
201
201
  self.class::PLATFORM_HEADERS,
202
202
  {
203
203
  "accept" => "application/json",
204
- "content-type" => "application/json"
204
+ "content-type" => "application/json",
205
+ "user-agent" => user_agent
205
206
  },
206
207
  headers
207
208
  )
@@ -219,6 +220,11 @@ module Straddle
219
220
  # @return [Hash{String=>String}]
220
221
  private def auth_headers = {}
221
222
 
223
+ # @api private
224
+ #
225
+ # @return [String]
226
+ private def user_agent = "#{self.class.name}/Ruby #{Straddle::VERSION}"
227
+
222
228
  # @api private
223
229
  #
224
230
  # @return [String]
@@ -365,7 +371,7 @@ module Straddle
365
371
  #
366
372
  # @raise [Straddle::Errors::APIError]
367
373
  # @return [Array(Integer, Net::HTTPResponse, Enumerable<String>)]
368
- private def send_request(request, redirect_count:, retry_count:, send_retry_header:)
374
+ def send_request(request, redirect_count:, retry_count:, send_retry_header:)
369
375
  url, headers, max_retries, timeout = request.fetch_values(:url, :headers, :max_retries, :timeout)
370
376
  input = {**request.except(:timeout), deadline: Straddle::Internal::Util.monotonic_secs + timeout}
371
377
 
@@ -378,6 +384,7 @@ module Straddle
378
384
  rescue Straddle::Errors::APIConnectionError => e
379
385
  status = e
380
386
  end
387
+ headers = Straddle::Internal::Util.normalized_headers(response&.each_header&.to_h)
381
388
 
382
389
  case status
383
390
  in ..299
@@ -390,7 +397,7 @@ module Straddle
390
397
  in 300..399
391
398
  self.class.reap_connection!(status, stream: stream)
392
399
 
393
- request = self.class.follow_redirect(request, status: status, response_headers: response)
400
+ request = self.class.follow_redirect(request, status: status, response_headers: headers)
394
401
  send_request(
395
402
  request,
396
403
  redirect_count: redirect_count + 1,
@@ -399,9 +406,9 @@ module Straddle
399
406
  )
400
407
  in Straddle::Errors::APIConnectionError if retry_count >= max_retries
401
408
  raise status
402
- in (400..) if retry_count >= max_retries || !self.class.should_retry?(status, headers: response)
409
+ in (400..) if retry_count >= max_retries || !self.class.should_retry?(status, headers: headers)
403
410
  decoded = Kernel.then do
404
- Straddle::Internal::Util.decode_content(response, stream: stream, suppress_error: true)
411
+ Straddle::Internal::Util.decode_content(headers, stream: stream, suppress_error: true)
405
412
  ensure
406
413
  self.class.reap_connection!(status, stream: stream)
407
414
  end
@@ -409,6 +416,7 @@ module Straddle
409
416
  raise Straddle::Errors::APIStatusError.for(
410
417
  url: url,
411
418
  status: status,
419
+ headers: headers,
412
420
  body: decoded,
413
421
  request: nil,
414
422
  response: response
@@ -485,19 +493,21 @@ module Straddle
485
493
  send_retry_header: send_retry_header
486
494
  )
487
495
 
488
- decoded = Straddle::Internal::Util.decode_content(response, stream: stream)
496
+ headers = Straddle::Internal::Util.normalized_headers(response.each_header.to_h)
497
+ decoded = Straddle::Internal::Util.decode_content(headers, stream: stream)
489
498
  case req
490
499
  in {stream: Class => st}
491
500
  st.new(
492
501
  model: model,
493
502
  url: url,
494
503
  status: status,
504
+ headers: headers,
495
505
  response: response,
496
506
  unwrap: unwrap,
497
507
  stream: decoded
498
508
  )
499
509
  in {page: Class => page}
500
- page.new(client: self, req: req, headers: response, page_data: decoded)
510
+ page.new(client: self, req: req, headers: headers, page_data: decoded)
501
511
  else
502
512
  unwrapped = Straddle::Internal::Util.dig(decoded, unwrap)
503
513
  Straddle::Internal::Type::Converter.coerce(model, unwrapped)
@@ -16,10 +16,11 @@ module Straddle
16
16
  class << self
17
17
  # @api private
18
18
  #
19
+ # @param cert_store [OpenSSL::X509::Store]
19
20
  # @param url [URI::Generic]
20
21
  #
21
22
  # @return [Net::HTTP]
22
- def connect(url)
23
+ def connect(cert_store:, url:)
23
24
  port =
24
25
  case [url.port, url.scheme]
25
26
  in [Integer, _]
@@ -33,6 +34,8 @@ module Straddle
33
34
  Net::HTTP.new(url.host, port).tap do
34
35
  _1.use_ssl = %w[https wss].include?(url.scheme)
35
36
  _1.max_retries = 0
37
+
38
+ (_1.cert_store = cert_store) if _1.use_ssl?
36
39
  end
37
40
  end
38
41
 
@@ -102,7 +105,7 @@ module Straddle
102
105
  pool =
103
106
  @mutex.synchronize do
104
107
  @pools[origin] ||= ConnectionPool.new(size: @size) do
105
- self.class.connect(url)
108
+ self.class.connect(cert_store: @cert_store, url: url)
106
109
  end
107
110
  end
108
111
 
@@ -128,37 +131,47 @@ module Straddle
128
131
  url, deadline = request.fetch_values(:url, :deadline)
129
132
 
130
133
  req = nil
131
- eof = false
132
134
  finished = false
133
- closing = nil
134
135
 
135
136
  # rubocop:disable Metrics/BlockLength
136
137
  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
138
+ next if finished
149
139
 
150
- self.class.calibrate_socket_timeout(conn, deadline)
151
- conn.request(req) do |rsp|
152
- y << [conn, req, rsp]
153
- break if finished
140
+ with_pool(url, deadline: deadline) do |conn|
141
+ eof = false
142
+ closing = nil
143
+ ::Thread.handle_interrupt(Object => :never) do
144
+ ::Thread.handle_interrupt(Object => :immediate) do
145
+ req, closing = self.class.build_request(request) do
146
+ self.class.calibrate_socket_timeout(conn, deadline)
147
+ end
154
148
 
155
- rsp.read_body do |bytes|
156
- y << bytes.force_encoding(Encoding::BINARY)
157
- break if finished
149
+ self.class.calibrate_socket_timeout(conn, deadline)
150
+ unless conn.started?
151
+ conn.keep_alive_timeout = self.class::KEEP_ALIVE_TIMEOUT
152
+ conn.start
153
+ end
158
154
 
159
155
  self.class.calibrate_socket_timeout(conn, deadline)
156
+ conn.request(req) do |rsp|
157
+ y << [req, rsp]
158
+ break if finished
159
+
160
+ rsp.read_body do |bytes|
161
+ y << bytes.force_encoding(Encoding::BINARY)
162
+ break if finished
163
+
164
+ self.class.calibrate_socket_timeout(conn, deadline)
165
+ end
166
+ eof = true
167
+ end
168
+ end
169
+ ensure
170
+ begin
171
+ conn.finish if !eof && conn&.started?
172
+ ensure
173
+ closing&.call
160
174
  end
161
- eof = true
162
175
  end
163
176
  end
164
177
  rescue Timeout::Error
@@ -168,17 +181,10 @@ module Straddle
168
181
  end
169
182
  # rubocop:enable Metrics/BlockLength
170
183
 
171
- conn, _, response = enum.next
184
+ _, response = enum.next
172
185
  body = Straddle::Internal::Util.fused_enum(enum, external: true) do
173
186
  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
187
+ loop { enum.next }
182
188
  end
183
189
  [Integer(response.code), response, body]
184
190
  end
@@ -189,19 +195,12 @@ module Straddle
189
195
  def initialize(size: self.class::DEFAULT_MAX_CONNECTIONS)
190
196
  @mutex = Mutex.new
191
197
  @size = size
198
+ @cert_store = OpenSSL::X509::Store.new.tap(&:set_default_paths)
192
199
  @pools = {}
193
200
  end
194
201
 
195
202
  define_sorbet_constant!(:Request) do
196
- T.type_alias do
197
- {
198
- method: Symbol,
199
- url: URI::Generic,
200
- headers: T::Hash[String, String],
201
- body: T.anything,
202
- deadline: Float
203
- }
204
- end
203
+ T.type_alias { {method: Symbol, url: URI::Generic, headers: T::Hash[String, String], body: T.anything, deadline: Float} }
205
204
  end
206
205
  end
207
206
  end
@@ -148,6 +148,7 @@ module Straddle
148
148
  # @option spec [Boolean] :"nil?"
149
149
  def initialize(type_info, spec = {})
150
150
  @item_type_fn = Straddle::Internal::Type::Converter.type_info(type_info || spec)
151
+ @meta = Straddle::Internal::Type::Converter.meta_info(type_info, spec)
151
152
  @nilable = spec.fetch(:nil?, false)
152
153
  end
153
154
 
@@ -52,6 +52,7 @@ module Straddle
52
52
  #
53
53
  # @option spec [Boolean] :"nil?"
54
54
  private def add_field(name_sym, required:, type_info:, spec:)
55
+ meta = Straddle::Internal::Type::Converter.meta_info(type_info, spec)
55
56
  type_fn, info =
56
57
  case type_info
57
58
  in Proc | Straddle::Internal::Type::Converter | Class
@@ -63,14 +64,7 @@ module Straddle
63
64
  setter = :"#{name_sym}="
64
65
  api_name = info.fetch(:api_name, name_sym)
65
66
  nilable = info.fetch(:nil?, false)
66
- const = if required && !nilable
67
- info.fetch(
68
- :const,
69
- Straddle::Internal::OMIT
70
- )
71
- else
72
- Straddle::Internal::OMIT
73
- end
67
+ const = required && !nilable ? info.fetch(:const, Straddle::Internal::OMIT) : Straddle::Internal::OMIT
74
68
 
75
69
  [name_sym, setter].each { undef_method(_1) } if known_fields.key?(name_sym)
76
70
 
@@ -81,7 +75,8 @@ module Straddle
81
75
  required: required,
82
76
  nilable: nilable,
83
77
  const: const,
84
- type_fn: type_fn
78
+ type_fn: type_fn,
79
+ meta: meta
85
80
  }
86
81
 
87
82
  define_method(setter) do |value|
@@ -39,7 +39,7 @@ module Straddle
39
39
  #
40
40
  # @param client [Straddle::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
@@ -98,6 +98,33 @@ module Straddle
98
98
  end
99
99
  end
100
100
 
101
+ # @api private
102
+ #
103
+ # @param type_info [Hash{Symbol=>Object}, Proc, Straddle::Internal::Type::Converter, Class] .
104
+ #
105
+ # @option type_info [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
106
+ #
107
+ # @option type_info [Proc] :enum
108
+ #
109
+ # @option type_info [Proc] :union
110
+ #
111
+ # @option type_info [Boolean] :"nil?"
112
+ #
113
+ # @param spec [Hash{Symbol=>Object}, Proc, Straddle::Internal::Type::Converter, Class] .
114
+ #
115
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
116
+ #
117
+ # @option spec [Proc] :enum
118
+ #
119
+ # @option spec [Proc] :union
120
+ #
121
+ # @option spec [Boolean] :"nil?"
122
+ #
123
+ # @return [Hash{Symbol=>Object}]
124
+ def meta_info(type_info, spec)
125
+ [spec, type_info].grep(Hash).first.to_h.except(:const, :enum, :union, :nil?)
126
+ end
127
+
101
128
  # @api private
102
129
  #
103
130
  # @param translate_names [Boolean]
@@ -82,17 +82,20 @@ module Straddle
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
+ Straddle::FilePart.new(value, filename: "upload")
87
90
  in IO
88
91
  state[:can_retry] = false
92
+ value.to_path.nil? ? Straddle::FilePart.new(value, filename: "upload") : value
89
93
  in Straddle::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
@@ -168,6 +168,7 @@ module Straddle
168
168
  # @option spec [Boolean] :"nil?"
169
169
  def initialize(type_info, spec = {})
170
170
  @item_type_fn = Straddle::Internal::Type::Converter.type_info(type_info || spec)
171
+ @meta = Straddle::Internal::Type::Converter.meta_info(type_info, spec)
171
172
  @nilable = spec.fetch(:nil?, false)
172
173
  end
173
174