clerk-sdk-ruby 5.1.1 → 5.1.3

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 (326) hide show
  1. checksums.yaml +4 -4
  2. data/lib/clerk/actortokens.rb +12 -4
  3. data/lib/clerk/agenttasks.rb +335 -0
  4. data/lib/clerk/allowlistidentifiers.rb +16 -5
  5. data/lib/clerk/api_keys.rb +39 -13
  6. data/lib/clerk/betafeatures.rb +17 -9
  7. data/lib/clerk/billing.rb +46 -14
  8. data/lib/clerk/blocklistidentifiers.rb +16 -5
  9. data/lib/clerk/clients.rb +18 -7
  10. data/lib/clerk/domains.rb +21 -7
  11. data/lib/clerk/emailaddresses.rb +23 -9
  12. data/lib/clerk/emailandsmstemplates.rb +10 -5
  13. data/lib/clerk/emailsmstemplates.rb +28 -14
  14. data/lib/clerk/instancesettings.rb +306 -15
  15. data/lib/clerk/invitations.rb +22 -8
  16. data/lib/clerk/jwks.rb +7 -2
  17. data/lib/clerk/jwttemplates.rb +25 -8
  18. data/lib/clerk/m2m.rb +32 -14
  19. data/lib/clerk/machines.rb +43 -14
  20. data/lib/clerk/miscellaneous.rb +7 -2
  21. data/lib/clerk/models/components/action.rb +20 -0
  22. data/lib/clerk/models/components/action.rbi +11 -0
  23. data/lib/clerk/models/components/actortoken.rb +4 -4
  24. data/lib/clerk/models/components/adjustcreditbalancerequest.rb +48 -0
  25. data/lib/clerk/models/components/adjustcreditbalancerequest.rbi +21 -0
  26. data/lib/clerk/models/components/agenttask.rb +47 -0
  27. data/lib/clerk/models/components/agenttask.rbi +19 -0
  28. data/lib/clerk/models/components/agenttask_object.rb +19 -0
  29. data/lib/clerk/models/components/agenttask_object.rbi +11 -0
  30. data/lib/clerk/models/components/allowlistidentifier.rb +6 -6
  31. data/lib/clerk/models/components/allowlistidentifier_object.rb +1 -1
  32. data/lib/clerk/models/components/balance.rb +44 -0
  33. data/lib/clerk/models/components/balance.rbi +19 -0
  34. data/lib/clerk/models/components/billingpaymentattempt.rb +7 -3
  35. data/lib/clerk/models/components/billingpaymentattempt.rbi +2 -0
  36. data/lib/clerk/models/components/billingpaymentattempt_credits.rb +40 -0
  37. data/lib/clerk/models/components/billingpaymentattempt_credits.rbi +17 -0
  38. data/lib/clerk/models/components/billingpaymentattempt_payer.rb +36 -0
  39. data/lib/clerk/models/components/billingpaymentattempt_payer.rbi +15 -0
  40. data/lib/clerk/models/components/billingpaymentattempt_proration.rb +44 -0
  41. data/lib/clerk/models/components/billingpaymentattempt_proration.rbi +19 -0
  42. data/lib/clerk/models/components/billingpaymentattempt_totals.rb +52 -0
  43. data/lib/clerk/models/components/billingpaymentattempt_totals.rbi +23 -0
  44. data/lib/clerk/models/components/billingpriceresponse.rb +6 -2
  45. data/lib/clerk/models/components/billingpriceresponse.rbi +2 -0
  46. data/lib/clerk/models/components/billingstatement.rb +3 -3
  47. data/lib/clerk/models/components/{totals.rb → billingstatement_totals.rb} +6 -2
  48. data/lib/clerk/models/components/{totals.rbi → billingstatement_totals.rbi} +4 -2
  49. data/lib/clerk/models/components/blocklistidentifier.rb +6 -6
  50. data/lib/clerk/models/components/blocklistidentifier_object.rb +1 -1
  51. data/lib/clerk/models/components/blocklistidentifiers.rb +1 -1
  52. data/lib/clerk/models/components/client.rb +7 -7
  53. data/lib/clerk/models/components/client_object.rb +1 -1
  54. data/lib/clerk/models/components/cnametarget.rb +1 -1
  55. data/lib/clerk/models/components/commercecreditbalanceresponse.rb +36 -0
  56. data/lib/clerk/models/components/commercecreditbalanceresponse.rbi +15 -0
  57. data/lib/clerk/models/components/commercecreditledgerresponse.rb +64 -0
  58. data/lib/clerk/models/components/commercecreditledgerresponse.rbi +29 -0
  59. data/lib/clerk/models/components/commercepayerresponse.rb +1 -1
  60. data/lib/clerk/models/components/commercepaymentmethodresponse.rb +3 -3
  61. data/lib/clerk/models/components/commerceperunittotal.rb +40 -0
  62. data/lib/clerk/models/components/commerceperunittotal.rbi +17 -0
  63. data/lib/clerk/models/components/commerceperunittotaltier.rb +40 -0
  64. data/lib/clerk/models/components/commerceperunittotaltier.rbi +17 -0
  65. data/lib/clerk/models/components/commerceplan.rb +8 -4
  66. data/lib/clerk/models/components/commerceplan.rbi +2 -0
  67. data/lib/clerk/models/components/commerceplanunitprice.rb +40 -0
  68. data/lib/clerk/models/components/commerceplanunitprice.rbi +17 -0
  69. data/lib/clerk/models/components/commerceplanunitpricetier.rb +40 -0
  70. data/lib/clerk/models/components/commerceplanunitpricetier.rbi +17 -0
  71. data/lib/clerk/models/components/commercepricetransitiondetails.rb +2 -2
  72. data/lib/clerk/models/components/commercepricetransitionresponse.rb +1 -1
  73. data/lib/clerk/models/components/commercesubscription.rb +2 -2
  74. data/lib/clerk/models/components/commercesubscriptionitem.rb +17 -5
  75. data/lib/clerk/models/components/commercesubscriptionitem.rbi +6 -0
  76. data/lib/clerk/models/components/commercesubscriptionitem_credits.rb +40 -0
  77. data/lib/clerk/models/components/commercesubscriptionitem_credits.rbi +17 -0
  78. data/lib/clerk/models/components/commercesubscriptionitem_payer.rb +36 -0
  79. data/lib/clerk/models/components/commercesubscriptionitem_payer.rbi +15 -0
  80. data/lib/clerk/models/components/commercesubscriptionitem_plan.rb +8 -4
  81. data/lib/clerk/models/components/commercesubscriptionitem_plan.rbi +2 -0
  82. data/lib/clerk/models/components/commercesubscriptionitem_proration.rb +44 -0
  83. data/lib/clerk/models/components/commercesubscriptionitem_proration.rbi +19 -0
  84. data/lib/clerk/models/components/commercesubscriptionitem_totals.rb +52 -0
  85. data/lib/clerk/models/components/commercesubscriptionitem_totals.rbi +23 -0
  86. data/lib/clerk/models/components/commercesubscriptionitem_totals_credits.rb +40 -0
  87. data/lib/clerk/models/components/commercesubscriptionitem_totals_credits.rbi +17 -0
  88. data/lib/clerk/models/components/commercesubscriptionitem_totals_payer.rb +36 -0
  89. data/lib/clerk/models/components/commercesubscriptionitem_totals_payer.rbi +15 -0
  90. data/lib/clerk/models/components/commercesubscriptionitem_totals_proration.rb +44 -0
  91. data/lib/clerk/models/components/commercesubscriptionitem_totals_proration.rbi +19 -0
  92. data/lib/clerk/models/components/cookies.rb +1 -1
  93. data/lib/clerk/models/components/creator_role.rb +1 -1
  94. data/lib/clerk/models/components/default_role.rb +1 -1
  95. data/lib/clerk/models/components/domain.rb +2 -2
  96. data/lib/clerk/models/components/domains.rb +1 -1
  97. data/lib/clerk/models/components/emailaddress.rb +5 -5
  98. data/lib/clerk/models/components/emailaddress_admin.rb +3 -3
  99. data/lib/clerk/models/components/emailaddress_object.rb +1 -1
  100. data/lib/clerk/models/components/emailaddress_otp.rb +3 -3
  101. data/lib/clerk/models/components/emailaddress_saml.rb +3 -3
  102. data/lib/clerk/models/components/emailaddress_ticket.rb +3 -3
  103. data/lib/clerk/models/components/emaillink.rb +3 -3
  104. data/lib/clerk/models/components/enterpriseaccount.rb +5 -5
  105. data/lib/clerk/models/components/enterpriseaccount_oauth.rb +2 -2
  106. data/lib/clerk/models/components/enterpriseaccount_object.rb +1 -1
  107. data/lib/clerk/models/components/enterpriseaccount_saml.rb +3 -3
  108. data/lib/clerk/models/components/enterpriseaccount_ticket.rb +3 -3
  109. data/lib/clerk/models/components/enterpriseconnection_1.rb +3 -3
  110. data/lib/clerk/models/components/enterpriseconnection_2.rb +3 -3
  111. data/lib/clerk/models/components/extendfreetrialrequest.rb +1 -1
  112. data/lib/clerk/models/components/externalaccountwithverification.rb +7 -7
  113. data/lib/clerk/models/components/externalaccountwithverification_oauth.rb +2 -2
  114. data/lib/clerk/models/components/featureresponse.rb +1 -1
  115. data/lib/clerk/models/components/fromoauth.rb +2 -2
  116. data/lib/clerk/models/components/googleonetap.rb +3 -3
  117. data/lib/clerk/models/components/group.rb +1 -1
  118. data/lib/clerk/models/components/instance.rb +1 -1
  119. data/lib/clerk/models/components/instanceprotect.rb +1 -1
  120. data/lib/clerk/models/components/instancerestrictions.rb +1 -1
  121. data/lib/clerk/models/components/instancesettings.rb +1 -1
  122. data/lib/clerk/models/components/invitation.rb +5 -5
  123. data/lib/clerk/models/components/invitation_revoked.rb +5 -5
  124. data/lib/clerk/models/components/jwttemplate.rb +3 -3
  125. data/lib/clerk/models/components/machine.rb +1 -1
  126. data/lib/clerk/models/components/machine_created.rb +1 -1
  127. data/lib/clerk/models/components/machine_deleted.rb +1 -1
  128. data/lib/clerk/models/components/machine_secretkey.rb +1 -1
  129. data/lib/clerk/models/components/machinescope.rb +1 -1
  130. data/lib/clerk/models/components/machinescope_deleted.rb +1 -1
  131. data/lib/clerk/models/components/machinewithoutscopedmachines.rb +1 -1
  132. data/lib/clerk/models/components/oauthaccesstoken.rb +1 -1
  133. data/lib/clerk/models/components/oauthapplication.rb +6 -6
  134. data/lib/clerk/models/components/oauthapplications.rb +1 -1
  135. data/lib/clerk/models/components/oauthapplicationsettings.rb +40 -0
  136. data/lib/clerk/models/components/oauthapplicationsettings.rbi +17 -0
  137. data/lib/clerk/models/components/oauthapplicationsettings_object.rb +19 -0
  138. data/lib/clerk/models/components/oauthapplicationsettings_object.rbi +11 -0
  139. data/lib/clerk/models/components/oauthapplicationwithsecret.rb +7 -7
  140. data/lib/clerk/models/components/organization.rb +5 -5
  141. data/lib/clerk/models/components/organizationdomain.rb +3 -3
  142. data/lib/clerk/models/components/organizationdomain_object.rb +1 -1
  143. data/lib/clerk/models/components/organizationdomain_verification.rb +1 -1
  144. data/lib/clerk/models/components/organizationdomains.rb +1 -1
  145. data/lib/clerk/models/components/organizationinvitation.rb +2 -2
  146. data/lib/clerk/models/components/organizationinvitation_object.rb +1 -1
  147. data/lib/clerk/models/components/organizationinvitations.rb +1 -1
  148. data/lib/clerk/models/components/organizationinvitationswithpublicorganizationdata.rb +1 -1
  149. data/lib/clerk/models/components/organizationinvitationwithpublicorganizationdata.rb +2 -2
  150. data/lib/clerk/models/components/organizationinvitationwithpublicorganizationdata_object.rb +1 -1
  151. data/lib/clerk/models/components/organizationmembership.rb +2 -2
  152. data/lib/clerk/models/components/organizationmembership_object.rb +1 -1
  153. data/lib/clerk/models/components/organizationmembership_organization.rb +5 -5
  154. data/lib/clerk/models/components/organizationmembershippublicuserdata.rb +1 -1
  155. data/lib/clerk/models/components/organizationmemberships.rb +1 -1
  156. data/lib/clerk/models/components/organizations.rb +1 -1
  157. data/lib/clerk/models/components/organizationsettings.rb +3 -3
  158. data/lib/clerk/models/components/organizationwithlogo.rb +6 -6
  159. data/lib/clerk/models/components/passkey.rb +3 -3
  160. data/lib/clerk/models/components/passkey_object.rb +1 -1
  161. data/lib/clerk/models/components/payment_source.rb +3 -3
  162. data/lib/clerk/models/components/permission.rb +3 -3
  163. data/lib/clerk/models/components/permissions.rb +1 -1
  164. data/lib/clerk/models/components/phonenumber.rb +4 -4
  165. data/lib/clerk/models/components/phonenumber_admin.rb +3 -3
  166. data/lib/clerk/models/components/phonenumber_object.rb +1 -1
  167. data/lib/clerk/models/components/phonenumber_otp.rb +3 -3
  168. data/lib/clerk/models/components/protocol.rb +1 -1
  169. data/lib/clerk/models/components/proxycheck.rb +4 -4
  170. data/lib/clerk/models/components/redirecturl.rb +3 -3
  171. data/lib/clerk/models/components/role.rb +3 -3
  172. data/lib/clerk/models/components/role_set_migration.rb +1 -1
  173. data/lib/clerk/models/components/roles.rb +1 -1
  174. data/lib/clerk/models/components/roleset.rb +2 -2
  175. data/lib/clerk/models/components/rolesetitem.rb +1 -1
  176. data/lib/clerk/models/components/samlaccount.rb +3 -3
  177. data/lib/clerk/models/components/samlaccount_object.rb +1 -1
  178. data/lib/clerk/models/components/samlaccount_saml.rb +3 -3
  179. data/lib/clerk/models/components/samlaccount_ticket.rb +3 -3
  180. data/lib/clerk/models/components/samlconnection_1.rb +3 -3
  181. data/lib/clerk/models/components/samlconnection_2.rb +3 -3
  182. data/lib/clerk/models/components/samlconnections.rb +1 -1
  183. data/lib/clerk/models/components/schemas_commerceplan.rb +1 -1
  184. data/lib/clerk/models/components/schemas_commercesubscriptionitem.rb +4 -4
  185. data/lib/clerk/models/components/{payer.rb → schemas_commercesubscriptionitem_payer.rb} +2 -2
  186. data/lib/clerk/models/components/{payer.rbi → schemas_commercesubscriptionitem_payer.rbi} +2 -2
  187. data/lib/clerk/models/components/schemas_commercesubscriptionitem_plan.rb +1 -1
  188. data/lib/clerk/models/components/schemas_featureresponse.rb +1 -1
  189. data/lib/clerk/models/components/schemas_samlconnection_samlconnection_1.rb +4 -4
  190. data/lib/clerk/models/components/schemas_samlconnection_samlconnection_2.rb +4 -4
  191. data/lib/clerk/models/components/seats.rb +32 -0
  192. data/lib/clerk/models/components/seats.rbi +13 -0
  193. data/lib/clerk/models/components/session.rb +7 -7
  194. data/lib/clerk/models/components/session_object.rb +1 -1
  195. data/lib/clerk/models/components/signintoken.rb +4 -4
  196. data/lib/clerk/models/components/signup.rb +5 -5
  197. data/lib/clerk/models/components/signup_external_account.rb +1 -1
  198. data/lib/clerk/models/components/signupverification.rb +2 -2
  199. data/lib/clerk/models/components/template.rb +4 -4
  200. data/lib/clerk/models/components/template_object.rb +1 -1
  201. data/lib/clerk/models/components/testingtoken.rb +2 -2
  202. data/lib/clerk/models/components/token.rb +3 -3
  203. data/lib/clerk/models/components/token_object.rb +1 -1
  204. data/lib/clerk/models/components/totalcount.rb +2 -2
  205. data/lib/clerk/models/components/totalcount_object.rb +1 -1
  206. data/lib/clerk/models/components/user.rb +18 -18
  207. data/lib/clerk/models/components/user_object.rb +1 -1
  208. data/lib/clerk/models/components/verification_passkey_passkey.rb +4 -4
  209. data/lib/clerk/models/components/waitlistentry.rb +5 -5
  210. data/lib/clerk/models/components/waitlistentry_invitation.rb +5 -5
  211. data/lib/clerk/models/components/web3signature.rb +3 -3
  212. data/lib/clerk/models/components/web3wallet.rb +4 -4
  213. data/lib/clerk/models/components/web3wallet_admin.rb +3 -3
  214. data/lib/clerk/models/components/web3wallet_object.rb +1 -1
  215. data/lib/clerk/models/components.rb +27 -2
  216. data/lib/clerk/models/operations/actor.rb +1 -1
  217. data/lib/clerk/models/operations/adjustorganizationbillingcreditbalance_request.rb +36 -0
  218. data/lib/clerk/models/operations/adjustorganizationbillingcreditbalance_request.rbi +15 -0
  219. data/lib/clerk/models/operations/adjustorganizationbillingcreditbalance_response.rb +44 -0
  220. data/lib/clerk/models/operations/adjustorganizationbillingcreditbalance_response.rbi +19 -0
  221. data/lib/clerk/models/operations/adjustuserbillingcreditbalance_request.rb +36 -0
  222. data/lib/clerk/models/operations/adjustuserbillingcreditbalance_request.rbi +15 -0
  223. data/lib/clerk/models/operations/adjustuserbillingcreditbalance_response.rb +44 -0
  224. data/lib/clerk/models/operations/adjustuserbillingcreditbalance_response.rbi +19 -0
  225. data/lib/clerk/models/operations/clerkidpoauthaccesstoken.rb +1 -1
  226. data/lib/clerk/models/operations/createagenttask_request.rb +60 -0
  227. data/lib/clerk/models/operations/createagenttask_request.rbi +23 -0
  228. data/lib/clerk/models/operations/createagenttask_response.rb +44 -0
  229. data/lib/clerk/models/operations/createagenttask_response.rbi +19 -0
  230. data/lib/clerk/models/operations/createapikey_responsebody.rb +1 -1
  231. data/lib/clerk/models/operations/createbulkinvitations_requestbody.rb +1 -1
  232. data/lib/clerk/models/operations/createinvitation_request.rb +1 -1
  233. data/lib/clerk/models/operations/createm2mtoken_request.rb +5 -1
  234. data/lib/clerk/models/operations/createm2mtoken_request.rbi +2 -0
  235. data/lib/clerk/models/operations/createm2mtoken_responsebody.rb +1 -1
  236. data/lib/clerk/models/operations/createoauthapplication_request.rb +2 -2
  237. data/lib/clerk/models/operations/createroleset_request.rb +1 -1
  238. data/lib/clerk/models/operations/createsamlconnection_requestbody_1.rb +3 -3
  239. data/lib/clerk/models/operations/createsamlconnection_requestbody_2.rb +3 -3
  240. data/lib/clerk/models/operations/createsessiontoken_responsebody.rb +1 -1
  241. data/lib/clerk/models/operations/createsessiontokenfromtemplate_responsebody.rb +1 -1
  242. data/lib/clerk/models/operations/createuser_request.rb +5 -5
  243. data/lib/clerk/models/operations/data.rb +1 -1
  244. data/lib/clerk/models/operations/deleteapikey_responsebody.rb +1 -1
  245. data/lib/clerk/models/operations/getapikey_responsebody.rb +1 -1
  246. data/lib/clerk/models/operations/getinstanceoauthapplicationsettings_response.rb +44 -0
  247. data/lib/clerk/models/operations/getinstanceoauthapplicationsettings_response.rbi +19 -0
  248. data/lib/clerk/models/operations/getorganizationbillingcreditbalance_request.rb +32 -0
  249. data/lib/clerk/models/operations/getorganizationbillingcreditbalance_request.rbi +13 -0
  250. data/lib/clerk/models/operations/getorganizationbillingcreditbalance_response.rb +44 -0
  251. data/lib/clerk/models/operations/getorganizationbillingcreditbalance_response.rbi +19 -0
  252. data/lib/clerk/models/operations/getpublicinterstitial_request.rb +2 -2
  253. data/lib/clerk/models/operations/getuserbillingcreditbalance_request.rb +32 -0
  254. data/lib/clerk/models/operations/getuserbillingcreditbalance_request.rbi +13 -0
  255. data/lib/clerk/models/operations/getuserbillingcreditbalance_response.rb +44 -0
  256. data/lib/clerk/models/operations/getuserbillingcreditbalance_response.rbi +19 -0
  257. data/lib/clerk/models/operations/getuserlist_request.rb +2 -2
  258. data/lib/clerk/models/operations/getuserscount_request.rb +2 -2
  259. data/lib/clerk/models/operations/listallorganizationdomains_request.rb +3 -3
  260. data/lib/clerk/models/operations/listinstanceorganizationinvitations_status.rb +1 -0
  261. data/lib/clerk/models/operations/listorganizationinvitations_status.rb +1 -0
  262. data/lib/clerk/models/operations/listwaitlistentries_request.rb +1 -1
  263. data/lib/clerk/models/operations/m2m_token.rb +1 -1
  264. data/lib/clerk/models/operations/on_behalf_of.rb +37 -0
  265. data/lib/clerk/models/operations/on_behalf_of.rbi +15 -0
  266. data/lib/clerk/models/operations/permissions.rb +19 -0
  267. data/lib/clerk/models/operations/permissions.rbi +11 -0
  268. data/lib/clerk/models/operations/refreshsession_requestbody.rb +1 -1
  269. data/lib/clerk/models/operations/revokeagenttask_request.rb +32 -0
  270. data/lib/clerk/models/operations/revokeagenttask_request.rbi +13 -0
  271. data/lib/clerk/models/operations/revokeagenttask_response.rb +44 -0
  272. data/lib/clerk/models/operations/revokeagenttask_response.rbi +19 -0
  273. data/lib/clerk/models/operations/revokeapikey_responsebody.rb +1 -1
  274. data/lib/clerk/models/operations/revokem2mtoken_responsebody.rb +1 -1
  275. data/lib/clerk/models/operations/token_format.rb +20 -0
  276. data/lib/clerk/models/operations/token_format.rbi +11 -0
  277. data/lib/clerk/models/operations/updateapikey_responsebody.rb +1 -1
  278. data/lib/clerk/models/operations/updateinstance_request.rb +2 -2
  279. data/lib/clerk/models/operations/updateinstanceoauthapplicationsettings_request.rb +36 -0
  280. data/lib/clerk/models/operations/updateinstanceoauthapplicationsettings_request.rbi +15 -0
  281. data/lib/clerk/models/operations/updateinstanceoauthapplicationsettings_response.rb +44 -0
  282. data/lib/clerk/models/operations/updateinstanceoauthapplicationsettings_response.rbi +19 -0
  283. data/lib/clerk/models/operations/updateoauthapplication_requestbody.rb +2 -2
  284. data/lib/clerk/models/operations/updateroleset_requestbody.rb +1 -1
  285. data/lib/clerk/models/operations/updatesamlconnection_requestbody.rb +2 -2
  286. data/lib/clerk/models/operations/updateuser_requestbody.rb +2 -2
  287. data/lib/clerk/models/operations/updateusermetadata_requestbody.rb +1 -1
  288. data/lib/clerk/models/operations/usersgetorganizationinvitations_status.rb +1 -0
  289. data/lib/clerk/models/operations/verifyapikey_responsebody.rb +1 -1
  290. data/lib/clerk/models/operations/verifym2mtoken_responsebody.rb +1 -1
  291. data/lib/clerk/models/operations/verifyoauthaccesstoken_request.rb +2 -2
  292. data/lib/clerk/models/operations/verifytotp_responsebody.rb +1 -1
  293. data/lib/clerk/models/operations.rb +18 -0
  294. data/lib/clerk/oauthaccesstokens.rb +8 -3
  295. data/lib/clerk/oauthapplications.rb +29 -9
  296. data/lib/clerk/openapiclient.rb +4 -2
  297. data/lib/clerk/organizationdomains.rb +27 -10
  298. data/lib/clerk/organizationinvitations.rb +43 -20
  299. data/lib/clerk/organizationmemberships.rb +27 -10
  300. data/lib/clerk/organizationpermissions.rb +25 -8
  301. data/lib/clerk/organizationroles.rb +33 -10
  302. data/lib/clerk/organizations.rb +379 -16
  303. data/lib/clerk/phonenumbers.rb +21 -7
  304. data/lib/clerk/proxy.rb +1 -1
  305. data/lib/clerk/proxychecks.rb +10 -5
  306. data/lib/clerk/redirecturls.rb +20 -6
  307. data/lib/clerk/rolesets.rb +36 -13
  308. data/lib/clerk/samlconnections.rb +25 -8
  309. data/lib/clerk/sdkconfiguration.rb +3 -3
  310. data/lib/clerk/sessions.rb +40 -14
  311. data/lib/clerk/signintokens.rb +12 -4
  312. data/lib/clerk/signups.rb +12 -4
  313. data/lib/clerk/templates.rb +10 -5
  314. data/lib/clerk/testingtokens.rb +7 -2
  315. data/lib/clerk/users.rb +475 -49
  316. data/lib/clerk/utils/request_bodies.rb +8 -3
  317. data/lib/clerk/utils/security.rb +10 -0
  318. data/lib/clerk/utils/url.rb +11 -5
  319. data/lib/clerk/utils/utils.rb +33 -3
  320. data/lib/clerk/waitlistentries.rb +32 -12
  321. data/lib/clerk/webhooks.rb +15 -4
  322. data/lib/clerk_sdk_ruby.rb +1 -0
  323. data/lib/crystalline/metadata_fields.rb +66 -9
  324. data/lib/crystalline/module.rb +3 -3
  325. data/lib/crystalline/types.rb +11 -3
  326. metadata +107 -6
@@ -26,8 +26,6 @@ module Clerk
26
26
 
27
27
  return serialize_content_type(SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method], request) if !request.respond_to?(:fields) || !request.respond_to?(request_field_name)
28
28
 
29
- request_val = request.send(request_field_name)
30
-
31
29
  request_metadata = nil
32
30
  request.fields.each do |f|
33
31
  if f.name == request_field_name
@@ -35,7 +33,14 @@ module Clerk
35
33
  break
36
34
  end
37
35
  end
38
- raise StandardError, 'invalid request type' if request_metadata.nil?
36
+ if request_metadata.nil?
37
+ # Field name collision: model has a field matching request_field_name but without :request metadata.
38
+ # Serialize the entire object as the request body.
39
+ return serialize_content_type(SERIALIZATION_METHOD_TO_CONTENT_TYPE[serialization_method], request)
40
+ end
41
+
42
+ request_val = request.send(request_field_name)
43
+ return ['', nil, nil] if request_val.nil?
39
44
 
40
45
  serialize_content_type(
41
46
  request_metadata.fetch(:media_type, 'application/octet-stream'), request_val
@@ -37,6 +37,16 @@ module Clerk
37
37
 
38
38
 
39
39
  def self._parse_security_option(req, option)
40
+ # Check if this option uses basic auth (needs the whole object, not individual fields)
41
+ first_field = option.fields.first
42
+ if first_field
43
+ first_meta = first_field.metadata[:security]
44
+ if first_meta && first_meta[:type] == 'http' && first_meta[:sub_type] == 'basic'
45
+ _parse_security_scheme(req, first_meta, option)
46
+ return
47
+ end
48
+ end
49
+
40
50
  option.fields.each do |opt_field|
41
51
  metadata = opt_field.metadata[:security]
42
52
  next if metadata.nil? || !metadata.include?(:scheme)
@@ -24,7 +24,7 @@ module Clerk
24
24
  if serialization != ''
25
25
  serialized_params = _get_serialized_params(param_metadata, f_name, param)
26
26
  serialized_params.each do |k, v|
27
- path = path.sub("{#{k}}", v.join(', '))
27
+ path = path.gsub("{#{k}}", v.join(', '))
28
28
  end
29
29
  else
30
30
  if param.is_a? Array
@@ -32,7 +32,7 @@ module Clerk
32
32
  param.each do |pp_val|
33
33
  pp_vals.append(pp_val.to_s)
34
34
  end
35
- path = path.sub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
35
+ path = path.gsub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
36
36
  elsif param.is_a? Hash
37
37
  pp_vals = []
38
38
  param.each do |pp_key, pp_val|
@@ -44,7 +44,7 @@ module Clerk
44
44
  pp_vals.append("#{pp_key},#{value}")
45
45
  end
46
46
  end
47
- path = path.sub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
47
+ path = path.gsub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
48
48
  elsif param.class.include?(::Crystalline::MetadataFields)
49
49
  pp_vals = []
50
50
  attrs = param.fields.filter { |field| field.name && param.respond_to?(field.name.to_sym) }.map(&:name)
@@ -72,9 +72,9 @@ module Clerk
72
72
  pp_vals.append("#{parm_name},#{param_field_val}")
73
73
  end
74
74
  end
75
- path = path.sub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
75
+ path = path.gsub("{#{param_metadata.fetch(:field_name, f.name)}}", pp_vals.join(','))
76
76
  else
77
- path = path.sub("{#{param_metadata.fetch(:field_name, f.name)}}", val_to_string(param))
77
+ path = path.gsub("{#{param_metadata.fetch(:field_name, f.name)}}", _encode_path_param(val_to_string(param)))
78
78
  end
79
79
  end
80
80
  end
@@ -82,6 +82,12 @@ module Clerk
82
82
  server_url.delete_suffix('/') + path
83
83
  end
84
84
 
85
+ # Percent-encode characters that are invalid in URI path segments
86
+
87
+ def self._encode_path_param(value)
88
+ value.gsub(/[<>{}\[\]|\\^`\s?#%]/) { |c| format('%%%02X', c.ord) }
89
+ end
90
+
85
91
 
86
92
  def self.template_url(url_with_params, params)
87
93
  params.each do |key, value|
@@ -19,13 +19,43 @@ module Clerk
19
19
  if val.class.respond_to?(:enums)
20
20
  val.serialize.to_s
21
21
  elsif val.is_a? DateTime
22
- val.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
22
+ val.strftime('%Y-%m-%dT%H:%M:%S.%NZ').sub(/(\.\d*[1-9])0+Z\z/, '\1Z').sub(/\.0+Z\z/, 'Z')
23
23
  else
24
24
  val.to_s
25
25
 
26
26
  end
27
27
  end
28
28
 
29
+ MIME_TYPES = {
30
+ '.json' => 'application/json',
31
+ '.xml' => 'application/xml',
32
+ '.pdf' => 'application/pdf',
33
+ '.zip' => 'application/zip',
34
+ '.gz' => 'application/gzip',
35
+ '.csv' => 'text/csv',
36
+ '.txt' => 'text/plain',
37
+ '.html' => 'text/html',
38
+ '.htm' => 'text/html',
39
+ '.css' => 'text/css',
40
+ '.js' => 'application/javascript',
41
+ '.png' => 'image/png',
42
+ '.jpg' => 'image/jpeg',
43
+ '.jpeg' => 'image/jpeg',
44
+ '.gif' => 'image/gif',
45
+ '.svg' => 'image/svg+xml',
46
+ '.webp' => 'image/webp',
47
+ '.mp3' => 'audio/mpeg',
48
+ '.mp4' => 'video/mp4',
49
+ '.yaml' => 'application/yaml',
50
+ '.yml' => 'application/yaml',
51
+ }.freeze
52
+
53
+
54
+ def self.mime_type_for_filename(filename)
55
+ ext = File.extname(filename).downcase
56
+ MIME_TYPES.fetch(ext, 'application/octet-stream')
57
+ end
58
+
29
59
 
30
60
  def self._get_serialized_params(metadata, field_name, obj)
31
61
  params = {}
@@ -143,7 +173,7 @@ module Clerk
143
173
  # Handle file uploads
144
174
  file_part = Faraday::Multipart::FilePart.new(
145
175
  StringIO.new(field[1]),
146
- 'application/octet-stream',
176
+ mime_type_for_filename(field[0]),
147
177
  field[0]
148
178
  )
149
179
 
@@ -158,7 +188,7 @@ module Clerk
158
188
  end
159
189
  end
160
190
  elsif field.length == 3
161
- param_part = Faraday::Multipart::ParamPart.new(field[1].to_json, field[2])
191
+ param_part = Faraday::Multipart::ParamPart.new(field[1], field[2])
162
192
 
163
193
  # Handle multiple values for the same field name (arrays)
164
194
  if payload.key?(field_name)
@@ -38,8 +38,10 @@ module Clerk
38
38
  end
39
39
 
40
40
 
41
+
42
+
41
43
 
42
- def list(request:, retries: nil, timeout_ms: nil)
44
+ def list(request:, retries: nil, timeout_ms: nil, http_headers: nil)
43
45
  # list - List all waitlist entries
44
46
  # Retrieve a list of waitlist entries for the instance.
45
47
  # Entries are ordered by creation date in descending order by default.
@@ -93,6 +95,9 @@ module Clerk
93
95
  req.options.timeout = timeout unless timeout.nil?
94
96
  req.params = query_params
95
97
  Utils.configure_request_security(req, security)
98
+ http_headers&.each do |key, value|
99
+ req.headers[key.to_s] = value
100
+ end
96
101
 
97
102
  @sdk_configuration.hooks.before_request(
98
103
  hook_ctx: SDKHooks::BeforeRequestHookContext.new(
@@ -161,7 +166,7 @@ module Clerk
161
166
 
162
167
 
163
168
 
164
- def create(request: nil, retries: nil, timeout_ms: nil)
169
+ def create(request: nil, retries: nil, timeout_ms: nil, http_headers: nil)
165
170
  # create - Create a waitlist entry
166
171
  # Creates a new waitlist entry for the given email address.
167
172
  # If the email address is already on the waitlist, no new entry will be created and the existing waitlist entry will be returned.
@@ -173,7 +178,7 @@ module Clerk
173
178
  req_content_type, data, form = Utils.serialize_request_body(request, false, true, :request, :json)
174
179
  headers['content-type'] = req_content_type
175
180
 
176
- if form
181
+ if form && !form.empty?
177
182
  body = Utils.encode_form(form)
178
183
  elsif Utils.match_content_type(req_content_type, 'application/x-www-form-urlencoded')
179
184
  body = URI.encode_www_form(data)
@@ -223,6 +228,9 @@ module Clerk
223
228
  req.headers.merge!(headers)
224
229
  req.options.timeout = timeout unless timeout.nil?
225
230
  Utils.configure_request_security(req, security)
231
+ http_headers&.each do |key, value|
232
+ req.headers[key.to_s] = value
233
+ end
226
234
 
227
235
  @sdk_configuration.hooks.before_request(
228
236
  hook_ctx: SDKHooks::BeforeRequestHookContext.new(
@@ -306,15 +314,15 @@ module Clerk
306
314
 
307
315
 
308
316
 
309
- def bulk_create(request: nil, retries: nil, timeout_ms: nil)
317
+ def bulk_create(request: nil, retries: nil, timeout_ms: nil, http_headers: nil)
310
318
  # bulk_create - Create multiple waitlist entries
311
319
  # Creates multiple waitlist entries for the provided email addresses.
312
320
  # You can choose whether to send confirmation emails by setting the `notify` parameter to `true` or `false` for each entry.
313
321
  # If the `notify` parameter is omitted, it defaults to `true`.
314
- #
322
+ #
315
323
  # If an email address is already on the waitlist, no new entry will be created and the existing waitlist entry will be returned.
316
324
  # Duplicate email addresses within the same request are not allowed.
317
- #
325
+ #
318
326
  # This endpoint is limited to a maximum of 50 entries per API call. If you need to add more entries, please make multiple requests.
319
327
  url, params = @sdk_configuration.get_server_details
320
328
  base_url = Utils.template_url(url, params)
@@ -324,7 +332,7 @@ module Clerk
324
332
  req_content_type, data, form = Utils.serialize_request_body(request, false, true, :request, :json)
325
333
  headers['content-type'] = req_content_type
326
334
 
327
- if form
335
+ if form && !form.empty?
328
336
  body = Utils.encode_form(form)
329
337
  elsif Utils.match_content_type(req_content_type, 'application/x-www-form-urlencoded')
330
338
  body = URI.encode_www_form(data)
@@ -374,6 +382,9 @@ module Clerk
374
382
  req.headers.merge!(headers)
375
383
  req.options.timeout = timeout unless timeout.nil?
376
384
  Utils.configure_request_security(req, security)
385
+ http_headers&.each do |key, value|
386
+ req.headers[key.to_s] = value
387
+ end
377
388
 
378
389
  @sdk_configuration.hooks.before_request(
379
390
  hook_ctx: SDKHooks::BeforeRequestHookContext.new(
@@ -457,7 +468,7 @@ module Clerk
457
468
 
458
469
 
459
470
 
460
- def delete(waitlist_entry_id:, retries: nil, timeout_ms: nil)
471
+ def delete(waitlist_entry_id:, retries: nil, timeout_ms: nil, http_headers: nil)
461
472
  # delete - Delete a pending waitlist entry
462
473
  # Delete a pending waitlist entry.
463
474
  request = Models::Operations::DeleteWaitlistEntryRequest.new(
@@ -515,6 +526,9 @@ module Clerk
515
526
  req.headers.merge!(headers)
516
527
  req.options.timeout = timeout unless timeout.nil?
517
528
  Utils.configure_request_security(req, security)
529
+ http_headers&.each do |key, value|
530
+ req.headers[key.to_s] = value
531
+ end
518
532
 
519
533
  @sdk_configuration.hooks.before_request(
520
534
  hook_ctx: SDKHooks::BeforeRequestHookContext.new(
@@ -598,7 +612,7 @@ module Clerk
598
612
 
599
613
 
600
614
 
601
- def invite(waitlist_entry_id:, body: nil, retries: nil, timeout_ms: nil)
615
+ def invite(waitlist_entry_id:, body: nil, retries: nil, timeout_ms: nil, http_headers: nil)
602
616
  # invite - Invite a waitlist entry
603
617
  # Send an invite to the email address in a waitlist entry.
604
618
  request = Models::Operations::InviteWaitlistEntryRequest.new(
@@ -618,7 +632,7 @@ module Clerk
618
632
  req_content_type, data, form = Utils.serialize_request_body(request, false, false, :body, :json)
619
633
  headers['content-type'] = req_content_type
620
634
 
621
- if form
635
+ if form && !form.empty?
622
636
  body = Utils.encode_form(form)
623
637
  elsif Utils.match_content_type(req_content_type, 'application/x-www-form-urlencoded')
624
638
  body = URI.encode_www_form(data)
@@ -668,6 +682,9 @@ module Clerk
668
682
  req.headers.merge!(headers)
669
683
  req.options.timeout = timeout unless timeout.nil?
670
684
  Utils.configure_request_security(req, security)
685
+ http_headers&.each do |key, value|
686
+ req.headers[key.to_s] = value
687
+ end
671
688
 
672
689
  @sdk_configuration.hooks.before_request(
673
690
  hook_ctx: SDKHooks::BeforeRequestHookContext.new(
@@ -751,7 +768,7 @@ module Clerk
751
768
 
752
769
 
753
770
 
754
- def reject(waitlist_entry_id:, retries: nil, timeout_ms: nil)
771
+ def reject(waitlist_entry_id:, retries: nil, timeout_ms: nil, http_headers: nil)
755
772
  # reject - Reject a waitlist entry
756
773
  # Reject a waitlist entry.
757
774
  request = Models::Operations::RejectWaitlistEntryRequest.new(
@@ -809,6 +826,9 @@ module Clerk
809
826
  req.headers.merge!(headers)
810
827
  req.options.timeout = timeout unless timeout.nil?
811
828
  Utils.configure_request_security(req, security)
829
+ http_headers&.each do |key, value|
830
+ req.headers[key.to_s] = value
831
+ end
812
832
 
813
833
  @sdk_configuration.hooks.before_request(
814
834
  hook_ctx: SDKHooks::BeforeRequestHookContext.new(
@@ -889,5 +909,5 @@ module Clerk
889
909
 
890
910
  end
891
911
  end
892
- end
912
+ end
893
913
  end
@@ -38,8 +38,10 @@ module Clerk
38
38
  end
39
39
 
40
40
 
41
+
42
+
41
43
 
42
- def create_svix_app(retries: nil, timeout_ms: nil)
44
+ def create_svix_app(retries: nil, timeout_ms: nil, http_headers: nil)
43
45
  # create_svix_app - Create a Svix app
44
46
  # Create a Svix app and associate it with the current instance
45
47
  url, params = @sdk_configuration.get_server_details
@@ -89,6 +91,9 @@ module Clerk
89
91
  req.headers.merge!(headers)
90
92
  req.options.timeout = timeout unless timeout.nil?
91
93
  Utils.configure_request_security(req, security)
94
+ http_headers&.each do |key, value|
95
+ req.headers[key.to_s] = value
96
+ end
92
97
 
93
98
  @sdk_configuration.hooks.before_request(
94
99
  hook_ctx: SDKHooks::BeforeRequestHookContext.new(
@@ -172,7 +177,7 @@ module Clerk
172
177
 
173
178
 
174
179
 
175
- def delete_svix_app(retries: nil, timeout_ms: nil)
180
+ def delete_svix_app(retries: nil, timeout_ms: nil, http_headers: nil)
176
181
  # delete_svix_app - Delete a Svix app
177
182
  # Delete a Svix app and disassociate it from the current instance
178
183
  url, params = @sdk_configuration.get_server_details
@@ -222,6 +227,9 @@ module Clerk
222
227
  req.headers.merge!(headers)
223
228
  req.options.timeout = timeout unless timeout.nil?
224
229
  Utils.configure_request_security(req, security)
230
+ http_headers&.each do |key, value|
231
+ req.headers[key.to_s] = value
232
+ end
225
233
 
226
234
  @sdk_configuration.hooks.before_request(
227
235
  hook_ctx: SDKHooks::BeforeRequestHookContext.new(
@@ -296,7 +304,7 @@ module Clerk
296
304
 
297
305
 
298
306
 
299
- def generate_svix_auth_url(retries: nil, timeout_ms: nil)
307
+ def generate_svix_auth_url(retries: nil, timeout_ms: nil, http_headers: nil)
300
308
  # generate_svix_auth_url - Create a Svix Dashboard URL
301
309
  # Generate a new URL for accessing the Svix's management dashboard for that particular instance
302
310
  url, params = @sdk_configuration.get_server_details
@@ -346,6 +354,9 @@ module Clerk
346
354
  req.headers.merge!(headers)
347
355
  req.options.timeout = timeout unless timeout.nil?
348
356
  Utils.configure_request_security(req, security)
357
+ http_headers&.each do |key, value|
358
+ req.headers[key.to_s] = value
359
+ end
349
360
 
350
361
  @sdk_configuration.hooks.before_request(
351
362
  hook_ctx: SDKHooks::BeforeRequestHookContext.new(
@@ -426,5 +437,5 @@ module Clerk
426
437
 
427
438
  end
428
439
  end
429
- end
440
+ end
430
441
  end
@@ -37,6 +37,7 @@ module Clerk
37
37
  autoload :OauthApplications, 'clerk/oauthapplications'
38
38
  autoload :SamlConnections, 'clerk/samlconnections'
39
39
  autoload :TestingTokens, 'clerk/testingtokens'
40
+ autoload :AgentTasks, 'clerk/agenttasks'
40
41
  autoload :WaitlistEntries, 'clerk/waitlistentries'
41
42
  autoload :Billing, 'clerk/billing'
42
43
  autoload :OrganizationPermissions, 'clerk/organizationpermissions'
@@ -37,19 +37,30 @@ module Crystalline
37
37
  def unmarshal_single(field_type, value, format_metadata = nil)
38
38
  decoder = format_metadata.fetch(:decoder, nil)
39
39
 
40
- if field_type.instance_of?(Class) && field_type.include?(::Crystalline::MetadataFields)
40
+ # Delegate complex Crystalline types to unmarshal_json
41
+ if field_type.is_a?(Crystalline::DiscriminatedUnion) ||
42
+ Crystalline::Utils.arr?(field_type) ||
43
+ Crystalline::Utils.hash?(field_type) ||
44
+ Crystalline::Utils.union?(field_type)
45
+ return Crystalline.unmarshal_json(value, field_type)
46
+ elsif field_type.instance_of?(Class) && field_type.include?(::Crystalline::MetadataFields)
41
47
  return field_type.from_dict(value)
42
48
  elsif field_type.to_s == 'Date'
43
49
  return Date.parse(value)
44
50
  elsif field_type.to_s == 'DateTime'
45
51
  return DateTime.parse(value)
46
52
  elsif field_type.to_s == 'Object'
47
- # rubocop:disable Lint/SuppressedException
48
- begin
49
- value = JSON.parse(value)
50
- rescue TypeError, JSON::ParserError
53
+ if value.is_a?(::String)
54
+ trimmed = value.lstrip
55
+ if trimmed.start_with?('{') || trimmed.start_with?('[')
56
+ # rubocop:disable Lint/SuppressedException
57
+ begin
58
+ value = JSON.parse(value)
59
+ rescue TypeError, JSON::ParserError
60
+ end
61
+ # rubocop:enable Lint/SuppressedException
62
+ end
51
63
  end
52
- # rubocop:enable Lint/SuppressedException
53
64
  return value
54
65
  elsif field_type.to_s == 'Float'
55
66
  return value.to_f
@@ -65,12 +76,27 @@ module Crystalline
65
76
  def from_dict(d)
66
77
  to_build = {}
67
78
 
79
+ # Collect lookup keys for regular fields so we can identify additional properties later
80
+ known_keys = {}
81
+ additional_props_fields = []
68
82
  fields.each do |field|
83
+ format_metadata = field.metadata.fetch(:format_json, {})
84
+ if format_metadata.fetch(:additional_properties, false)
85
+ additional_props_fields << field
86
+ else
87
+ lookup = format_metadata.fetch(:letter_case, nil).call
88
+ known_keys[lookup] = true
89
+ end
90
+ end
91
+
92
+ # Process regular fields
93
+ (fields - additional_props_fields).each do |field|
69
94
  key = field.name
70
95
  format_metadata = field.metadata.fetch(:format_json, {})
96
+ field_type = field.type
97
+
71
98
  lookup = format_metadata.fetch(:letter_case, nil).call
72
99
  value = d[lookup]
73
- field_type = field.type
74
100
  if ::Crystalline::Utils.nilable? field_type
75
101
  if value == 'null'
76
102
  to_build[key] = nil
@@ -78,7 +104,7 @@ module Crystalline
78
104
  end
79
105
  field_type = ::Crystalline::Utils.nilable_of(field_type)
80
106
  end
81
-
107
+
82
108
  # If field is not nilable, and the value is not in the dict, raise a KeyError
83
109
  raise KeyError, "key #{lookup} not found in hash" if value.nil? && !::Crystalline::Utils.nilable?(field.type)
84
110
  # If field is nilable, and the value is not in the dict, just move to the next field
@@ -137,6 +163,32 @@ module Crystalline
137
163
  to_build[key] = unmarshal_single(field_type, value, format_metadata)
138
164
  end
139
165
  end
166
+
167
+ # Process additional properties fields: collect remaining keys from the dict
168
+ additional_props_fields.each do |field|
169
+ key = field.name
170
+ format_metadata = field.metadata.fetch(:format_json, {})
171
+ field_type = field.type
172
+
173
+ remaining = d.reject { |k, _| known_keys.key?(k) }
174
+ if remaining.empty?
175
+ next if ::Crystalline::Utils.nilable?(field.type)
176
+
177
+ raise KeyError, 'no additional properties found in hash'
178
+ end
179
+
180
+ inner_field_type = field_type
181
+ inner_field_type = ::Crystalline::Utils.nilable_of(inner_field_type) if ::Crystalline::Utils.nilable?(inner_field_type)
182
+ if Crystalline::Utils.hash?(inner_field_type)
183
+ val_type = Crystalline::Utils.hash_of(inner_field_type)
184
+ # rubocop:disable Style/HashTransformValues
185
+ to_build[key] = remaining.map { |k, v| [k, unmarshal_single(val_type, v, format_metadata)] }.to_h
186
+ # rubocop:enable Style/HashTransformValues
187
+ else
188
+ to_build[key] = remaining
189
+ end
190
+ end
191
+
140
192
  new(**to_build)
141
193
  end
142
194
  end
@@ -178,6 +230,8 @@ module Crystalline
178
230
  fields.sort_by(&:name).each do |field|
179
231
  format_json_meta = field.metadata[:format_json]
180
232
  required = !format_json_meta.nil? && format_json_meta.include?(:required)
233
+ is_additional_props = !format_json_meta.nil? && format_json_meta.fetch(:additional_properties, false)
234
+
181
235
  if !format_json_meta.nil? && format_json_meta.include?(:letter_case)
182
236
  key = format_json_meta[:letter_case].call(field.name)
183
237
  else
@@ -188,7 +242,10 @@ module Crystalline
188
242
  next if f.nil? && !required
189
243
  result[key] = nil if f.nil? && required
190
244
 
191
- if f.is_a? ::Array
245
+ # Flatten additional properties into the parent object
246
+ if is_additional_props && f.is_a?(::Hash)
247
+ f.each { |k, v| result[k] = marshal_single(v) }
248
+ elsif f.is_a? ::Array
192
249
  result[key] = f.map { |o| marshal_single(o) }
193
250
  elsif f.is_a? ::Hash
194
251
  result[key] = f.transform_values { |v| marshal_single(v) }
@@ -11,9 +11,9 @@ module Crystalline
11
11
  end
12
12
 
13
13
  def self.to_dict(complex)
14
- if complex.is_a? Array
14
+ if complex.is_a? ::Array
15
15
  complex.map { |v| Crystalline.to_dict(v) }
16
- elsif complex.is_a? Hash
16
+ elsif complex.is_a? ::Hash
17
17
  complex.transform_values { |v| Crystalline.to_dict(v) }
18
18
  elsif complex.respond_to?(:class) && complex.class.include?(::Crystalline::MetadataFields)
19
19
  complex.to_dict
@@ -66,7 +66,7 @@ module Crystalline
66
66
  if val.class.respond_to? :enums
67
67
  val.serialize
68
68
  elsif val.is_a? DateTime
69
- val.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
69
+ val.strftime('%Y-%m-%dT%H:%M:%S.%NZ').sub(/(\.\d*[1-9])0+Z\z/, '\1Z').sub(/\.0+Z\z/, 'Z')
70
70
  elsif val.nil?
71
71
  nil
72
72
  elsif primitives
@@ -14,7 +14,7 @@ module Crystalline
14
14
 
15
15
  class Hash
16
16
  attr_accessor :key_type, :value_type
17
-
17
+
18
18
  def initialize(key_type, value_type)
19
19
  @key_type = key_type
20
20
  @value_type = value_type
@@ -23,7 +23,7 @@ module Crystalline
23
23
 
24
24
  class Union
25
25
  attr_accessor :types
26
-
26
+
27
27
  def initialize(*types)
28
28
  @types = types
29
29
  end
@@ -31,7 +31,7 @@ module Crystalline
31
31
 
32
32
  class Nilable
33
33
  attr_accessor :inner_type
34
-
34
+
35
35
  def initialize(inner_type)
36
36
  @inner_type = inner_type
37
37
  end
@@ -142,6 +142,14 @@ module Crystalline
142
142
  @val
143
143
  end
144
144
 
145
+ def to_s
146
+ serialize.to_s
147
+ end
148
+
149
+ def inspect
150
+ "#<#{self.class} #{serialize.inspect}>"
151
+ end
152
+
145
153
  def known?
146
154
  self.class.instance_variable_get(:@mapping)&.value?(self) || false
147
155
  end