finch-api 0.1.0.pre.alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (479) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +124 -0
  3. data/lib/finch-api/base_client.rb +464 -0
  4. data/lib/finch-api/base_model.rb +1188 -0
  5. data/lib/finch-api/base_page.rb +40 -0
  6. data/lib/finch-api/client.rb +145 -0
  7. data/lib/finch-api/errors.rb +188 -0
  8. data/lib/finch-api/extern.rb +10 -0
  9. data/lib/finch-api/individuals_page.rb +98 -0
  10. data/lib/finch-api/models/access_token_create_params.rb +54 -0
  11. data/lib/finch-api/models/account_disconnect_params.rb +18 -0
  12. data/lib/finch-api/models/account_introspect_params.rb +18 -0
  13. data/lib/finch-api/models/account_update_event.rb +1978 -0
  14. data/lib/finch-api/models/base_webhook_event.rb +41 -0
  15. data/lib/finch-api/models/company_event.rb +49 -0
  16. data/lib/finch-api/models/connect/session_new_params.rb +203 -0
  17. data/lib/finch-api/models/connect/session_new_response.rb +29 -0
  18. data/lib/finch-api/models/connect/session_reauthenticate_params.rb +90 -0
  19. data/lib/finch-api/models/connect/session_reauthenticate_response.rb +29 -0
  20. data/lib/finch-api/models/connection_status_type.rb +40 -0
  21. data/lib/finch-api/models/create_access_token_response.rb +163 -0
  22. data/lib/finch-api/models/directory_event.rb +78 -0
  23. data/lib/finch-api/models/disconnect_response.rb +20 -0
  24. data/lib/finch-api/models/employment_event.rb +78 -0
  25. data/lib/finch-api/models/hris/benefit_contribution.rb +54 -0
  26. data/lib/finch-api/models/hris/benefit_create_params.rb +46 -0
  27. data/lib/finch-api/models/hris/benefit_features_and_operations.rb +199 -0
  28. data/lib/finch-api/models/hris/benefit_frequency.rb +33 -0
  29. data/lib/finch-api/models/hris/benefit_list_params.rb +20 -0
  30. data/lib/finch-api/models/hris/benefit_list_supported_benefits_params.rb +20 -0
  31. data/lib/finch-api/models/hris/benefit_retrieve_params.rb +20 -0
  32. data/lib/finch-api/models/hris/benefit_type.rb +57 -0
  33. data/lib/finch-api/models/hris/benefit_update_params.rb +31 -0
  34. data/lib/finch-api/models/hris/benefits/enrolled_individual.rb +108 -0
  35. data/lib/finch-api/models/hris/benefits/individual_benefit.rb +127 -0
  36. data/lib/finch-api/models/hris/benefits/individual_enroll_many_params.rb +268 -0
  37. data/lib/finch-api/models/hris/benefits/individual_enrolled_ids_params.rb +22 -0
  38. data/lib/finch-api/models/hris/benefits/individual_enrolled_ids_response.rb +29 -0
  39. data/lib/finch-api/models/hris/benefits/individual_retrieve_many_benefits_params.rb +34 -0
  40. data/lib/finch-api/models/hris/benefits/individual_unenroll_many_params.rb +33 -0
  41. data/lib/finch-api/models/hris/benefits/unenrolled_individual.rb +77 -0
  42. data/lib/finch-api/models/hris/benefits_support.rb +106 -0
  43. data/lib/finch-api/models/hris/benfit_contribution.rb +9 -0
  44. data/lib/finch-api/models/hris/company.rb +290 -0
  45. data/lib/finch-api/models/hris/company_benefit.rb +40 -0
  46. data/lib/finch-api/models/hris/company_retrieve_params.rb +20 -0
  47. data/lib/finch-api/models/hris/create_company_benefits_response.rb +21 -0
  48. data/lib/finch-api/models/hris/directory_list_individuals_params.rb +42 -0
  49. data/lib/finch-api/models/hris/directory_list_params.rb +42 -0
  50. data/lib/finch-api/models/hris/document_list_params.rb +89 -0
  51. data/lib/finch-api/models/hris/document_list_response.rb +27 -0
  52. data/lib/finch-api/models/hris/document_response.rb +89 -0
  53. data/lib/finch-api/models/hris/document_retreive_params.rb +20 -0
  54. data/lib/finch-api/models/hris/document_retreive_response.rb +41 -0
  55. data/lib/finch-api/models/hris/employment_data.rb +380 -0
  56. data/lib/finch-api/models/hris/employment_data_response.rb +45 -0
  57. data/lib/finch-api/models/hris/employment_retrieve_many_params.rb +45 -0
  58. data/lib/finch-api/models/hris/individual.rb +290 -0
  59. data/lib/finch-api/models/hris/individual_in_directory.rb +117 -0
  60. data/lib/finch-api/models/hris/individual_response.rb +45 -0
  61. data/lib/finch-api/models/hris/individual_retrieve_many_params.rb +73 -0
  62. data/lib/finch-api/models/hris/pay_statement.rb +587 -0
  63. data/lib/finch-api/models/hris/pay_statement_response.rb +45 -0
  64. data/lib/finch-api/models/hris/pay_statement_response_body.rb +36 -0
  65. data/lib/finch-api/models/hris/pay_statement_retrieve_many_params.rb +65 -0
  66. data/lib/finch-api/models/hris/payment.rb +174 -0
  67. data/lib/finch-api/models/hris/payment_list_params.rb +36 -0
  68. data/lib/finch-api/models/hris/support_per_benefit_type.rb +35 -0
  69. data/lib/finch-api/models/hris/supported_benefit.rb +166 -0
  70. data/lib/finch-api/models/hris/update_company_benefit_response.rb +21 -0
  71. data/lib/finch-api/models/hris/w42005.rb +188 -0
  72. data/lib/finch-api/models/hris/w42020.rb +180 -0
  73. data/lib/finch-api/models/income.rb +87 -0
  74. data/lib/finch-api/models/individual_event.rb +78 -0
  75. data/lib/finch-api/models/introspection.rb +342 -0
  76. data/lib/finch-api/models/job_completion_event.rb +90 -0
  77. data/lib/finch-api/models/jobs/automated_async_job.rb +162 -0
  78. data/lib/finch-api/models/jobs/automated_create_params.rb +70 -0
  79. data/lib/finch-api/models/jobs/automated_create_response.rb +43 -0
  80. data/lib/finch-api/models/jobs/automated_list_params.rb +42 -0
  81. data/lib/finch-api/models/jobs/automated_retrieve_params.rb +20 -0
  82. data/lib/finch-api/models/jobs/manual_async_job.rb +63 -0
  83. data/lib/finch-api/models/jobs/manual_retrieve_params.rb +20 -0
  84. data/lib/finch-api/models/location.rb +79 -0
  85. data/lib/finch-api/models/money.rb +30 -0
  86. data/lib/finch-api/models/operation_support.rb +42 -0
  87. data/lib/finch-api/models/operation_support_matrix.rb +81 -0
  88. data/lib/finch-api/models/paging.rb +35 -0
  89. data/lib/finch-api/models/pay_statement_event.rb +89 -0
  90. data/lib/finch-api/models/payment_event.rb +81 -0
  91. data/lib/finch-api/models/payroll/pay_group_list_params.rb +40 -0
  92. data/lib/finch-api/models/payroll/pay_group_list_response.rb +87 -0
  93. data/lib/finch-api/models/payroll/pay_group_retrieve_params.rb +20 -0
  94. data/lib/finch-api/models/payroll/pay_group_retrieve_response.rb +81 -0
  95. data/lib/finch-api/models/provider.rb +2039 -0
  96. data/lib/finch-api/models/provider_list_params.rb +18 -0
  97. data/lib/finch-api/models/request_forwarding_forward_params.rb +60 -0
  98. data/lib/finch-api/models/request_forwarding_forward_response.rb +97 -0
  99. data/lib/finch-api/models/sandbox/company_update_params.rb +294 -0
  100. data/lib/finch-api/models/sandbox/company_update_response.rb +276 -0
  101. data/lib/finch-api/models/sandbox/connection_create_params.rb +90 -0
  102. data/lib/finch-api/models/sandbox/connection_create_response.rb +113 -0
  103. data/lib/finch-api/models/sandbox/connections/account_create_params.rb +87 -0
  104. data/lib/finch-api/models/sandbox/connections/account_create_response.rb +93 -0
  105. data/lib/finch-api/models/sandbox/connections/account_update_params.rb +32 -0
  106. data/lib/finch-api/models/sandbox/connections/account_update_response.rb +91 -0
  107. data/lib/finch-api/models/sandbox/directory_create_params.rb +642 -0
  108. data/lib/finch-api/models/sandbox/directory_create_response.rb +9 -0
  109. data/lib/finch-api/models/sandbox/employment_update_params.rb +372 -0
  110. data/lib/finch-api/models/sandbox/employment_update_response.rb +378 -0
  111. data/lib/finch-api/models/sandbox/individual_update_params.rb +292 -0
  112. data/lib/finch-api/models/sandbox/individual_update_response.rb +300 -0
  113. data/lib/finch-api/models/sandbox/job_create_params.rb +49 -0
  114. data/lib/finch-api/models/sandbox/job_create_response.rb +43 -0
  115. data/lib/finch-api/models/sandbox/jobs/configuration_retrieve_params.rb +22 -0
  116. data/lib/finch-api/models/sandbox/jobs/configuration_retrieve_response.rb +11 -0
  117. data/lib/finch-api/models/sandbox/jobs/configuration_update_params.rb +22 -0
  118. data/lib/finch-api/models/sandbox/jobs/sandbox_job_configuration.rb +79 -0
  119. data/lib/finch-api/models/sandbox/payment_create_params.rb +646 -0
  120. data/lib/finch-api/models/sandbox/payment_create_response.rb +29 -0
  121. data/lib/finch-api/models/webhook_event.rb +48 -0
  122. data/lib/finch-api/page.rb +98 -0
  123. data/lib/finch-api/pooled_net_requester.rb +175 -0
  124. data/lib/finch-api/request_options.rb +115 -0
  125. data/lib/finch-api/resources/access_tokens.rb +40 -0
  126. data/lib/finch-api/resources/account.rb +47 -0
  127. data/lib/finch-api/resources/connect/sessions.rb +81 -0
  128. data/lib/finch-api/resources/connect.rb +17 -0
  129. data/lib/finch-api/resources/hris/benefits/individuals.rb +112 -0
  130. data/lib/finch-api/resources/hris/benefits.rb +125 -0
  131. data/lib/finch-api/resources/hris/company.rb +32 -0
  132. data/lib/finch-api/resources/hris/directory.rb +65 -0
  133. data/lib/finch-api/resources/hris/documents.rb +65 -0
  134. data/lib/finch-api/resources/hris/employments.rb +37 -0
  135. data/lib/finch-api/resources/hris/individuals.rb +39 -0
  136. data/lib/finch-api/resources/hris/pay_statements.rb +40 -0
  137. data/lib/finch-api/resources/hris/payments.rb +41 -0
  138. data/lib/finch-api/resources/hris.rb +45 -0
  139. data/lib/finch-api/resources/jobs/automated.rb +96 -0
  140. data/lib/finch-api/resources/jobs/manual.rb +35 -0
  141. data/lib/finch-api/resources/jobs.rb +21 -0
  142. data/lib/finch-api/resources/payroll/pay_groups.rb +58 -0
  143. data/lib/finch-api/resources/payroll.rb +17 -0
  144. data/lib/finch-api/resources/providers.rb +31 -0
  145. data/lib/finch-api/resources/request_forwarding.rb +52 -0
  146. data/lib/finch-api/resources/sandbox/company.rb +50 -0
  147. data/lib/finch-api/resources/sandbox/connections/accounts.rb +67 -0
  148. data/lib/finch-api/resources/sandbox/connections.rb +48 -0
  149. data/lib/finch-api/resources/sandbox/directory.rb +37 -0
  150. data/lib/finch-api/resources/sandbox/employment.rb +76 -0
  151. data/lib/finch-api/resources/sandbox/individual.rb +65 -0
  152. data/lib/finch-api/resources/sandbox/jobs/configuration.rb +57 -0
  153. data/lib/finch-api/resources/sandbox/jobs.rb +40 -0
  154. data/lib/finch-api/resources/sandbox/payment.rb +40 -0
  155. data/lib/finch-api/resources/sandbox.rb +41 -0
  156. data/lib/finch-api/resources/webhooks.rb +13 -0
  157. data/lib/finch-api/responses_page.rb +84 -0
  158. data/lib/finch-api/single_page.rb +82 -0
  159. data/lib/finch-api/util.rb +636 -0
  160. data/lib/finch-api/version.rb +5 -0
  161. data/lib/finch-api.rb +178 -0
  162. data/manifest.yaml +13 -0
  163. data/rbi/lib/finch-api/base_client.rbi +173 -0
  164. data/rbi/lib/finch-api/base_model.rbi +476 -0
  165. data/rbi/lib/finch-api/base_page.rbi +39 -0
  166. data/rbi/lib/finch-api/client.rbi +102 -0
  167. data/rbi/lib/finch-api/errors.rbi +146 -0
  168. data/rbi/lib/finch-api/extern.rbi +7 -0
  169. data/rbi/lib/finch-api/individuals_page.rbi +37 -0
  170. data/rbi/lib/finch-api/models/access_token_create_params.rbi +70 -0
  171. data/rbi/lib/finch-api/models/account_disconnect_params.rbi +18 -0
  172. data/rbi/lib/finch-api/models/account_introspect_params.rbi +18 -0
  173. data/rbi/lib/finch-api/models/account_update_event.rbi +2479 -0
  174. data/rbi/lib/finch-api/models/base_webhook_event.rbi +39 -0
  175. data/rbi/lib/finch-api/models/company_event.rbi +43 -0
  176. data/rbi/lib/finch-api/models/connect/session_new_params.rbi +203 -0
  177. data/rbi/lib/finch-api/models/connect/session_new_response.rbi +33 -0
  178. data/rbi/lib/finch-api/models/connect/session_reauthenticate_params.rbi +95 -0
  179. data/rbi/lib/finch-api/models/connect/session_reauthenticate_response.rbi +33 -0
  180. data/rbi/lib/finch-api/models/connection_status_type.rbi +20 -0
  181. data/rbi/lib/finch-api/models/create_access_token_response.rbi +159 -0
  182. data/rbi/lib/finch-api/models/directory_event.rbi +61 -0
  183. data/rbi/lib/finch-api/models/disconnect_response.rbi +23 -0
  184. data/rbi/lib/finch-api/models/employment_event.rbi +61 -0
  185. data/rbi/lib/finch-api/models/hris/benefit_contribution.rbi +44 -0
  186. data/rbi/lib/finch-api/models/hris/benefit_create_params.rbi +62 -0
  187. data/rbi/lib/finch-api/models/hris/benefit_features_and_operations.rbi +190 -0
  188. data/rbi/lib/finch-api/models/hris/benefit_frequency.rbi +19 -0
  189. data/rbi/lib/finch-api/models/hris/benefit_list_params.rbi +20 -0
  190. data/rbi/lib/finch-api/models/hris/benefit_list_supported_benefits_params.rbi +20 -0
  191. data/rbi/lib/finch-api/models/hris/benefit_retrieve_params.rbi +20 -0
  192. data/rbi/lib/finch-api/models/hris/benefit_type.rbi +35 -0
  193. data/rbi/lib/finch-api/models/hris/benefit_update_params.rbi +37 -0
  194. data/rbi/lib/finch-api/models/hris/benefits/enrolled_individual.rbi +115 -0
  195. data/rbi/lib/finch-api/models/hris/benefits/individual_benefit.rbi +153 -0
  196. data/rbi/lib/finch-api/models/hris/benefits/individual_enroll_many_params.rbi +281 -0
  197. data/rbi/lib/finch-api/models/hris/benefits/individual_enrolled_ids_params.rbi +22 -0
  198. data/rbi/lib/finch-api/models/hris/benefits/individual_enrolled_ids_response.rbi +35 -0
  199. data/rbi/lib/finch-api/models/hris/benefits/individual_retrieve_many_benefits_params.rbi +36 -0
  200. data/rbi/lib/finch-api/models/hris/benefits/individual_unenroll_many_params.rbi +38 -0
  201. data/rbi/lib/finch-api/models/hris/benefits/unenrolled_individual.rbi +102 -0
  202. data/rbi/lib/finch-api/models/hris/benefits_support.rbi +196 -0
  203. data/rbi/lib/finch-api/models/hris/benfit_contribution.rbi +9 -0
  204. data/rbi/lib/finch-api/models/hris/company.rbi +338 -0
  205. data/rbi/lib/finch-api/models/hris/company_benefit.rbi +67 -0
  206. data/rbi/lib/finch-api/models/hris/company_retrieve_params.rbi +20 -0
  207. data/rbi/lib/finch-api/models/hris/create_company_benefits_response.rbi +25 -0
  208. data/rbi/lib/finch-api/models/hris/directory_list_individuals_params.rbi +43 -0
  209. data/rbi/lib/finch-api/models/hris/directory_list_params.rbi +43 -0
  210. data/rbi/lib/finch-api/models/hris/document_list_params.rbi +83 -0
  211. data/rbi/lib/finch-api/models/hris/document_list_response.rbi +42 -0
  212. data/rbi/lib/finch-api/models/hris/document_response.rbi +86 -0
  213. data/rbi/lib/finch-api/models/hris/document_retreive_params.rbi +20 -0
  214. data/rbi/lib/finch-api/models/hris/document_retreive_response.rbi +15 -0
  215. data/rbi/lib/finch-api/models/hris/employment_data.rbi +393 -0
  216. data/rbi/lib/finch-api/models/hris/employment_data_response.rbi +41 -0
  217. data/rbi/lib/finch-api/models/hris/employment_retrieve_many_params.rbi +63 -0
  218. data/rbi/lib/finch-api/models/hris/individual.rbi +281 -0
  219. data/rbi/lib/finch-api/models/hris/individual_in_directory.rbi +147 -0
  220. data/rbi/lib/finch-api/models/hris/individual_response.rbi +41 -0
  221. data/rbi/lib/finch-api/models/hris/individual_retrieve_many_params.rbi +94 -0
  222. data/rbi/lib/finch-api/models/hris/pay_statement.rbi +691 -0
  223. data/rbi/lib/finch-api/models/hris/pay_statement_response.rbi +47 -0
  224. data/rbi/lib/finch-api/models/hris/pay_statement_response_body.rbi +44 -0
  225. data/rbi/lib/finch-api/models/hris/pay_statement_retrieve_many_params.rbi +79 -0
  226. data/rbi/lib/finch-api/models/hris/payment.rbi +207 -0
  227. data/rbi/lib/finch-api/models/hris/payment_list_params.rbi +45 -0
  228. data/rbi/lib/finch-api/models/hris/support_per_benefit_type.rbi +47 -0
  229. data/rbi/lib/finch-api/models/hris/supported_benefit.rbi +155 -0
  230. data/rbi/lib/finch-api/models/hris/update_company_benefit_response.rbi +25 -0
  231. data/rbi/lib/finch-api/models/hris/w42005.rbi +150 -0
  232. data/rbi/lib/finch-api/models/hris/w42020.rbi +177 -0
  233. data/rbi/lib/finch-api/models/income.rbi +83 -0
  234. data/rbi/lib/finch-api/models/individual_event.rbi +61 -0
  235. data/rbi/lib/finch-api/models/introspection.rbi +350 -0
  236. data/rbi/lib/finch-api/models/job_completion_event.rbi +72 -0
  237. data/rbi/lib/finch-api/models/jobs/automated_async_job.rbi +174 -0
  238. data/rbi/lib/finch-api/models/jobs/automated_create_params.rbi +83 -0
  239. data/rbi/lib/finch-api/models/jobs/automated_create_response.rbi +64 -0
  240. data/rbi/lib/finch-api/models/jobs/automated_list_params.rbi +43 -0
  241. data/rbi/lib/finch-api/models/jobs/automated_retrieve_params.rbi +20 -0
  242. data/rbi/lib/finch-api/models/jobs/manual_async_job.rbi +54 -0
  243. data/rbi/lib/finch-api/models/jobs/manual_retrieve_params.rbi +20 -0
  244. data/rbi/lib/finch-api/models/location.rbi +114 -0
  245. data/rbi/lib/finch-api/models/money.rbi +31 -0
  246. data/rbi/lib/finch-api/models/operation_support.rbi +18 -0
  247. data/rbi/lib/finch-api/models/operation_support_matrix.rbi +47 -0
  248. data/rbi/lib/finch-api/models/paging.rbi +31 -0
  249. data/rbi/lib/finch-api/models/pay_statement_event.rbi +69 -0
  250. data/rbi/lib/finch-api/models/payment_event.rbi +69 -0
  251. data/rbi/lib/finch-api/models/payroll/pay_group_list_params.rbi +52 -0
  252. data/rbi/lib/finch-api/models/payroll/pay_group_list_response.rbi +59 -0
  253. data/rbi/lib/finch-api/models/payroll/pay_group_retrieve_params.rbi +20 -0
  254. data/rbi/lib/finch-api/models/payroll/pay_group_retrieve_response.rbi +82 -0
  255. data/rbi/lib/finch-api/models/provider.rbi +2369 -0
  256. data/rbi/lib/finch-api/models/provider_list_params.rbi +18 -0
  257. data/rbi/lib/finch-api/models/request_forwarding_forward_params.rbi +80 -0
  258. data/rbi/lib/finch-api/models/request_forwarding_forward_response.rbi +138 -0
  259. data/rbi/lib/finch-api/models/sandbox/company_update_params.rbi +336 -0
  260. data/rbi/lib/finch-api/models/sandbox/company_update_response.rbi +330 -0
  261. data/rbi/lib/finch-api/models/sandbox/connection_create_params.rbi +91 -0
  262. data/rbi/lib/finch-api/models/sandbox/connection_create_response.rbi +129 -0
  263. data/rbi/lib/finch-api/models/sandbox/connections/account_create_params.rbi +93 -0
  264. data/rbi/lib/finch-api/models/sandbox/connections/account_create_response.rbi +120 -0
  265. data/rbi/lib/finch-api/models/sandbox/connections/account_update_params.rbi +36 -0
  266. data/rbi/lib/finch-api/models/sandbox/connections/account_update_response.rbi +109 -0
  267. data/rbi/lib/finch-api/models/sandbox/directory_create_params.rbi +629 -0
  268. data/rbi/lib/finch-api/models/sandbox/directory_create_response.rbi +9 -0
  269. data/rbi/lib/finch-api/models/sandbox/employment_update_params.rbi +377 -0
  270. data/rbi/lib/finch-api/models/sandbox/employment_update_response.rbi +382 -0
  271. data/rbi/lib/finch-api/models/sandbox/individual_update_params.rbi +276 -0
  272. data/rbi/lib/finch-api/models/sandbox/individual_update_response.rbi +283 -0
  273. data/rbi/lib/finch-api/models/sandbox/job_create_params.rbi +46 -0
  274. data/rbi/lib/finch-api/models/sandbox/job_create_response.rbi +64 -0
  275. data/rbi/lib/finch-api/models/sandbox/jobs/configuration_retrieve_params.rbi +22 -0
  276. data/rbi/lib/finch-api/models/sandbox/jobs/configuration_retrieve_response.rbi +11 -0
  277. data/rbi/lib/finch-api/models/sandbox/jobs/configuration_update_params.rbi +22 -0
  278. data/rbi/lib/finch-api/models/sandbox/jobs/sandbox_job_configuration.rbi +58 -0
  279. data/rbi/lib/finch-api/models/sandbox/payment_create_params.rbi +876 -0
  280. data/rbi/lib/finch-api/models/sandbox/payment_create_response.rbi +33 -0
  281. data/rbi/lib/finch-api/models/webhook_event.rbi +18 -0
  282. data/rbi/lib/finch-api/page.rbi +37 -0
  283. data/rbi/lib/finch-api/pooled_net_requester.rbi +36 -0
  284. data/rbi/lib/finch-api/request_options.rbi +84 -0
  285. data/rbi/lib/finch-api/resources/access_tokens.rbi +24 -0
  286. data/rbi/lib/finch-api/resources/account.rbi +25 -0
  287. data/rbi/lib/finch-api/resources/connect/sessions.rbi +61 -0
  288. data/rbi/lib/finch-api/resources/connect.rbi +15 -0
  289. data/rbi/lib/finch-api/resources/hris/benefits/individuals.rbi +58 -0
  290. data/rbi/lib/finch-api/resources/hris/benefits.rbi +64 -0
  291. data/rbi/lib/finch-api/resources/hris/company.rbi +20 -0
  292. data/rbi/lib/finch-api/resources/hris/directory.rbi +35 -0
  293. data/rbi/lib/finch-api/resources/hris/documents.rbi +36 -0
  294. data/rbi/lib/finch-api/resources/hris/employments.rbi +23 -0
  295. data/rbi/lib/finch-api/resources/hris/individuals.rbi +24 -0
  296. data/rbi/lib/finch-api/resources/hris/pay_statements.rbi +23 -0
  297. data/rbi/lib/finch-api/resources/hris/payments.rbi +24 -0
  298. data/rbi/lib/finch-api/resources/hris.rbi +43 -0
  299. data/rbi/lib/finch-api/resources/jobs/automated.rbi +45 -0
  300. data/rbi/lib/finch-api/resources/jobs/manual.rbi +23 -0
  301. data/rbi/lib/finch-api/resources/jobs.rbi +19 -0
  302. data/rbi/lib/finch-api/resources/payroll/pay_groups.rbi +34 -0
  303. data/rbi/lib/finch-api/resources/payroll.rbi +15 -0
  304. data/rbi/lib/finch-api/resources/providers.rbi +18 -0
  305. data/rbi/lib/finch-api/resources/request_forwarding.rbi +25 -0
  306. data/rbi/lib/finch-api/resources/sandbox/company.rbi +40 -0
  307. data/rbi/lib/finch-api/resources/sandbox/connections/accounts.rbi +38 -0
  308. data/rbi/lib/finch-api/resources/sandbox/connections.rbi +36 -0
  309. data/rbi/lib/finch-api/resources/sandbox/directory.rbi +23 -0
  310. data/rbi/lib/finch-api/resources/sandbox/employment.rbi +62 -0
  311. data/rbi/lib/finch-api/resources/sandbox/individual.rbi +50 -0
  312. data/rbi/lib/finch-api/resources/sandbox/jobs/configuration.rbi +33 -0
  313. data/rbi/lib/finch-api/resources/sandbox/jobs.rbi +27 -0
  314. data/rbi/lib/finch-api/resources/sandbox/payment.rbi +25 -0
  315. data/rbi/lib/finch-api/resources/sandbox.rbi +39 -0
  316. data/rbi/lib/finch-api/resources/webhooks.rbi +11 -0
  317. data/rbi/lib/finch-api/responses_page.rbi +29 -0
  318. data/rbi/lib/finch-api/single_page.rbi +33 -0
  319. data/rbi/lib/finch-api/util.rbi +167 -0
  320. data/rbi/lib/finch-api/version.rbi +5 -0
  321. data/sig/finch-api/base_client.rbs +101 -0
  322. data/sig/finch-api/base_model.rbs +242 -0
  323. data/sig/finch-api/base_page.rbs +20 -0
  324. data/sig/finch-api/client.rbs +54 -0
  325. data/sig/finch-api/errors.rbs +99 -0
  326. data/sig/finch-api/extern.rbs +4 -0
  327. data/sig/finch-api/individuals_page.rbs +16 -0
  328. data/sig/finch-api/models/access_token_create_params.rbs +46 -0
  329. data/sig/finch-api/models/account_disconnect_params.rbs +19 -0
  330. data/sig/finch-api/models/account_introspect_params.rbs +19 -0
  331. data/sig/finch-api/models/account_update_event.rbs +1448 -0
  332. data/sig/finch-api/models/base_webhook_event.rbs +24 -0
  333. data/sig/finch-api/models/company_event.rbs +36 -0
  334. data/sig/finch-api/models/connect/session_new_params.rbs +129 -0
  335. data/sig/finch-api/models/connect/session_new_response.rbs +22 -0
  336. data/sig/finch-api/models/connect/session_reauthenticate_params.rbs +65 -0
  337. data/sig/finch-api/models/connect/session_reauthenticate_response.rbs +23 -0
  338. data/sig/finch-api/models/connection_status_type.rbs +22 -0
  339. data/sig/finch-api/models/create_access_token_response.rbs +80 -0
  340. data/sig/finch-api/models/directory_event.rbs +61 -0
  341. data/sig/finch-api/models/disconnect_response.rbs +17 -0
  342. data/sig/finch-api/models/employment_event.rbs +61 -0
  343. data/sig/finch-api/models/hris/benefit_contribution.rbs +38 -0
  344. data/sig/finch-api/models/hris/benefit_create_params.rbs +40 -0
  345. data/sig/finch-api/models/hris/benefit_features_and_operations.rbs +112 -0
  346. data/sig/finch-api/models/hris/benefit_frequency.rbs +15 -0
  347. data/sig/finch-api/models/hris/benefit_list_params.rbs +21 -0
  348. data/sig/finch-api/models/hris/benefit_list_supported_benefits_params.rbs +22 -0
  349. data/sig/finch-api/models/hris/benefit_retrieve_params.rbs +21 -0
  350. data/sig/finch-api/models/hris/benefit_type.rbs +50 -0
  351. data/sig/finch-api/models/hris/benefit_update_params.rbs +26 -0
  352. data/sig/finch-api/models/hris/benefits/enrolled_individual.rbs +75 -0
  353. data/sig/finch-api/models/hris/benefits/individual_benefit.rbs +91 -0
  354. data/sig/finch-api/models/hris/benefits/individual_enroll_many_params.rbs +203 -0
  355. data/sig/finch-api/models/hris/benefits/individual_enrolled_ids_params.rbs +24 -0
  356. data/sig/finch-api/models/hris/benefits/individual_enrolled_ids_response.rbs +25 -0
  357. data/sig/finch-api/models/hris/benefits/individual_retrieve_many_benefits_params.rbs +31 -0
  358. data/sig/finch-api/models/hris/benefits/individual_unenroll_many_params.rbs +31 -0
  359. data/sig/finch-api/models/hris/benefits/unenrolled_individual.rbs +62 -0
  360. data/sig/finch-api/models/hris/benefits_support.rbs +68 -0
  361. data/sig/finch-api/models/hris/benfit_contribution.rbs +8 -0
  362. data/sig/finch-api/models/hris/company.rbs +195 -0
  363. data/sig/finch-api/models/hris/company_benefit.rbs +36 -0
  364. data/sig/finch-api/models/hris/company_retrieve_params.rbs +21 -0
  365. data/sig/finch-api/models/hris/create_company_benefits_response.rbs +20 -0
  366. data/sig/finch-api/models/hris/directory_list_individuals_params.rbs +34 -0
  367. data/sig/finch-api/models/hris/directory_list_params.rbs +34 -0
  368. data/sig/finch-api/models/hris/document_list_params.rbs +61 -0
  369. data/sig/finch-api/models/hris/document_list_response.rbs +29 -0
  370. data/sig/finch-api/models/hris/document_response.rbs +58 -0
  371. data/sig/finch-api/models/hris/document_retreive_params.rbs +21 -0
  372. data/sig/finch-api/models/hris/document_retreive_response.rbs +12 -0
  373. data/sig/finch-api/models/hris/employment_data.rbs +228 -0
  374. data/sig/finch-api/models/hris/employment_data_response.rbs +41 -0
  375. data/sig/finch-api/models/hris/employment_retrieve_many_params.rbs +45 -0
  376. data/sig/finch-api/models/hris/individual.rbs +176 -0
  377. data/sig/finch-api/models/hris/individual_in_directory.rbs +83 -0
  378. data/sig/finch-api/models/hris/individual_response.rbs +41 -0
  379. data/sig/finch-api/models/hris/individual_retrieve_many_params.rbs +72 -0
  380. data/sig/finch-api/models/hris/pay_statement.rbs +445 -0
  381. data/sig/finch-api/models/hris/pay_statement_response.rbs +41 -0
  382. data/sig/finch-api/models/hris/pay_statement_response_body.rbs +35 -0
  383. data/sig/finch-api/models/hris/pay_statement_retrieve_many_params.rbs +53 -0
  384. data/sig/finch-api/models/hris/payment.rbs +112 -0
  385. data/sig/finch-api/models/hris/payment_list_params.rbs +30 -0
  386. data/sig/finch-api/models/hris/support_per_benefit_type.rbs +37 -0
  387. data/sig/finch-api/models/hris/supported_benefit.rbs +84 -0
  388. data/sig/finch-api/models/hris/update_company_benefit_response.rbs +20 -0
  389. data/sig/finch-api/models/hris/w42005.rbs +111 -0
  390. data/sig/finch-api/models/hris/w42020.rbs +108 -0
  391. data/sig/finch-api/models/income.rbs +57 -0
  392. data/sig/finch-api/models/individual_event.rbs +61 -0
  393. data/sig/finch-api/models/introspection.rbs +204 -0
  394. data/sig/finch-api/models/job_completion_event.rbs +70 -0
  395. data/sig/finch-api/models/jobs/automated_async_job.rbs +102 -0
  396. data/sig/finch-api/models/jobs/automated_create_params.rbs +57 -0
  397. data/sig/finch-api/models/jobs/automated_create_response.rbs +37 -0
  398. data/sig/finch-api/models/jobs/automated_list_params.rbs +34 -0
  399. data/sig/finch-api/models/jobs/automated_retrieve_params.rbs +21 -0
  400. data/sig/finch-api/models/jobs/manual_async_job.rbs +43 -0
  401. data/sig/finch-api/models/jobs/manual_retrieve_params.rbs +21 -0
  402. data/sig/finch-api/models/location.rbs +48 -0
  403. data/sig/finch-api/models/money.rbs +19 -0
  404. data/sig/finch-api/models/operation_support.rbs +18 -0
  405. data/sig/finch-api/models/operation_support_matrix.rbs +50 -0
  406. data/sig/finch-api/models/paging.rbs +21 -0
  407. data/sig/finch-api/models/pay_statement_event.rbs +68 -0
  408. data/sig/finch-api/models/payment_event.rbs +59 -0
  409. data/sig/finch-api/models/payroll/pay_group_list_params.rbs +35 -0
  410. data/sig/finch-api/models/payroll/pay_group_list_response.rbs +66 -0
  411. data/sig/finch-api/models/payroll/pay_group_retrieve_params.rbs +21 -0
  412. data/sig/finch-api/models/payroll/pay_group_retrieve_response.rbs +62 -0
  413. data/sig/finch-api/models/provider.rbs +1455 -0
  414. data/sig/finch-api/models/provider_list_params.rbs +18 -0
  415. data/sig/finch-api/models/request_forwarding_forward_params.rbs +44 -0
  416. data/sig/finch-api/models/request_forwarding_forward_response.rbs +71 -0
  417. data/sig/finch-api/models/sandbox/company_update_params.rbs +197 -0
  418. data/sig/finch-api/models/sandbox/company_update_response.rbs +192 -0
  419. data/sig/finch-api/models/sandbox/connection_create_params.rbs +61 -0
  420. data/sig/finch-api/models/sandbox/connection_create_response.rbs +66 -0
  421. data/sig/finch-api/models/sandbox/connections/account_create_params.rbs +62 -0
  422. data/sig/finch-api/models/sandbox/connections/account_create_response.rbs +63 -0
  423. data/sig/finch-api/models/sandbox/connections/account_update_params.rbs +34 -0
  424. data/sig/finch-api/models/sandbox/connections/account_update_response.rbs +61 -0
  425. data/sig/finch-api/models/sandbox/directory_create_params.rbs +392 -0
  426. data/sig/finch-api/models/sandbox/directory_create_response.rbs +9 -0
  427. data/sig/finch-api/models/sandbox/employment_update_params.rbs +228 -0
  428. data/sig/finch-api/models/sandbox/employment_update_response.rbs +229 -0
  429. data/sig/finch-api/models/sandbox/individual_update_params.rbs +178 -0
  430. data/sig/finch-api/models/sandbox/individual_update_response.rbs +179 -0
  431. data/sig/finch-api/models/sandbox/job_create_params.rbs +36 -0
  432. data/sig/finch-api/models/sandbox/job_create_response.rbs +37 -0
  433. data/sig/finch-api/models/sandbox/jobs/configuration_retrieve_params.rbs +23 -0
  434. data/sig/finch-api/models/sandbox/jobs/configuration_retrieve_response.rbs +12 -0
  435. data/sig/finch-api/models/sandbox/jobs/configuration_update_params.rbs +23 -0
  436. data/sig/finch-api/models/sandbox/jobs/sandbox_job_configuration.rbs +51 -0
  437. data/sig/finch-api/models/sandbox/payment_create_params.rbs +487 -0
  438. data/sig/finch-api/models/sandbox/payment_create_response.rbs +22 -0
  439. data/sig/finch-api/models/webhook_event.rbs +17 -0
  440. data/sig/finch-api/page.rbs +16 -0
  441. data/sig/finch-api/pooled_net_requester.rbs +28 -0
  442. data/sig/finch-api/request_options.rbs +40 -0
  443. data/sig/finch-api/resources/access_tokens.rbs +19 -0
  444. data/sig/finch-api/resources/account.rbs +25 -0
  445. data/sig/finch-api/resources/connect/sessions.rbs +40 -0
  446. data/sig/finch-api/resources/connect.rbs +9 -0
  447. data/sig/finch-api/resources/hris/benefits/individuals.rbs +58 -0
  448. data/sig/finch-api/resources/hris/benefits.rbs +64 -0
  449. data/sig/finch-api/resources/hris/company.rbs +18 -0
  450. data/sig/finch-api/resources/hris/directory.rbs +31 -0
  451. data/sig/finch-api/resources/hris/documents.rbs +33 -0
  452. data/sig/finch-api/resources/hris/employments.rbs +19 -0
  453. data/sig/finch-api/resources/hris/individuals.rbs +20 -0
  454. data/sig/finch-api/resources/hris/pay_statements.rbs +19 -0
  455. data/sig/finch-api/resources/hris/payments.rbs +20 -0
  456. data/sig/finch-api/resources/hris.rbs +23 -0
  457. data/sig/finch-api/resources/jobs/automated.rbs +42 -0
  458. data/sig/finch-api/resources/jobs/manual.rbs +20 -0
  459. data/sig/finch-api/resources/jobs.rbs +11 -0
  460. data/sig/finch-api/resources/payroll/pay_groups.rbs +31 -0
  461. data/sig/finch-api/resources/payroll.rbs +9 -0
  462. data/sig/finch-api/resources/providers.rbs +15 -0
  463. data/sig/finch-api/resources/request_forwarding.rbs +21 -0
  464. data/sig/finch-api/resources/sandbox/company.rbs +26 -0
  465. data/sig/finch-api/resources/sandbox/connections/accounts.rbs +34 -0
  466. data/sig/finch-api/resources/sandbox/connections.rbs +24 -0
  467. data/sig/finch-api/resources/sandbox/directory.rbs +19 -0
  468. data/sig/finch-api/resources/sandbox/employment.rbs +38 -0
  469. data/sig/finch-api/resources/sandbox/individual.rbs +32 -0
  470. data/sig/finch-api/resources/sandbox/jobs/configuration.rbs +31 -0
  471. data/sig/finch-api/resources/sandbox/jobs.rbs +21 -0
  472. data/sig/finch-api/resources/sandbox/payment.rbs +21 -0
  473. data/sig/finch-api/resources/sandbox.rbs +21 -0
  474. data/sig/finch-api/resources/webhooks.rbs +7 -0
  475. data/sig/finch-api/responses_page.rbs +14 -0
  476. data/sig/finch-api/single_page.rbs +18 -0
  477. data/sig/finch-api/util.rbs +109 -0
  478. data/sig/finch-api/version.rbs +3 -0
  479. metadata +536 -0
@@ -0,0 +1,1188 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FinchAPI
4
+ # @private
5
+ #
6
+ # @abstract
7
+ #
8
+ module Converter
9
+ # rubocop:disable Lint/UnusedMethodArgument
10
+
11
+ # @private
12
+ #
13
+ # @param value [Object]
14
+ #
15
+ # @return [Object]
16
+ #
17
+ def coerce(value) = value
18
+
19
+ # @private
20
+ #
21
+ # @param value [Object]
22
+ #
23
+ # @return [Object]
24
+ #
25
+ def dump(value) = value
26
+
27
+ # @private
28
+ #
29
+ # @param value [Object]
30
+ #
31
+ # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
32
+ #
33
+ def try_strict_coerce(value) = (raise NotImplementedError)
34
+
35
+ # rubocop:enable Lint/UnusedMethodArgument
36
+
37
+ class << self
38
+ # @private
39
+ #
40
+ # @param spec [Hash{Symbol=>Object}, Proc, FinchAPI::Converter, Class] .
41
+ #
42
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
43
+ #
44
+ # @option spec [Proc] :enum
45
+ #
46
+ # @option spec [Proc] :union
47
+ #
48
+ # @option spec [Boolean] :"nil?"
49
+ #
50
+ # @return [Proc]
51
+ #
52
+ def type_info(spec)
53
+ case spec
54
+ in Hash
55
+ type_info(spec.slice(:const, :enum, :union).first&.last)
56
+ in Proc
57
+ spec
58
+ in FinchAPI::Converter | Class
59
+ -> { spec }
60
+ in true | false
61
+ -> { FinchAPI::BooleanModel }
62
+ in NilClass | true | false | Symbol | Integer | Float
63
+ -> { spec.class }
64
+ end
65
+ end
66
+
67
+ # @private
68
+ #
69
+ # Based on `target`, transform `value` into `target`, to the extent possible:
70
+ #
71
+ # 1. if the given `value` conforms to `target` already, return the given `value`
72
+ # 2. if it's possible and safe to convert the given `value` to `target`, then the
73
+ # converted value
74
+ # 3. otherwise, the given `value` unaltered
75
+ #
76
+ # @param target [FinchAPI::Converter, Class]
77
+ # @param value [Object]
78
+ #
79
+ # @return [Object]
80
+ #
81
+ def coerce(target, value)
82
+ case target
83
+ in FinchAPI::Converter
84
+ target.coerce(value)
85
+ in Class
86
+ case target
87
+ in -> { _1 <= NilClass }
88
+ nil
89
+ in -> { _1 <= Integer }
90
+ value.is_a?(Numeric) ? Integer(value) : value
91
+ in -> { _1 <= Float }
92
+ value.is_a?(Numeric) ? Float(value) : value
93
+ in -> { _1 <= Symbol }
94
+ value.is_a?(String) ? value.to_sym : value
95
+ in -> { _1 <= String }
96
+ value.is_a?(Symbol) ? value.to_s : value
97
+ in -> { _1 <= Date || _1 <= Time }
98
+ value.is_a?(String) ? target.parse(value) : value
99
+ in -> { _1 <= IO }
100
+ value.is_a?(String) ? StringIO.new(value) : value
101
+ else
102
+ value
103
+ end
104
+ end
105
+ end
106
+
107
+ # @private
108
+ #
109
+ # @param target [FinchAPI::Converter, Class]
110
+ # @param value [Object]
111
+ #
112
+ # @return [Object]
113
+ #
114
+ def dump(target, value)
115
+ case target
116
+ in FinchAPI::Converter
117
+ target.dump(value)
118
+ else
119
+ value
120
+ end
121
+ end
122
+
123
+ # @private
124
+ #
125
+ # The underlying algorithm for computing maximal compatibility is subject to
126
+ # future improvements.
127
+ #
128
+ # Similar to `#.coerce`, used to determine the best union variant to decode into.
129
+ #
130
+ # 1. determine if strict-ish coercion is possible
131
+ # 2. return either result of successful coercion or if loose coercion is possible
132
+ # 3. return a score for recursively tallied count for fields that can be coerced
133
+ #
134
+ # @param target [FinchAPI::Converter, Class]
135
+ # @param value [Object]
136
+ #
137
+ # @return [Object]
138
+ #
139
+ def try_strict_coerce(target, value)
140
+ case target
141
+ in FinchAPI::Converter
142
+ target.try_strict_coerce(value)
143
+ in Class
144
+ case [target, value]
145
+ in [-> { _1 <= NilClass }, _]
146
+ [true, nil, value.nil? ? 1 : 0]
147
+ in [-> { _1 <= Integer }, Numeric]
148
+ [true, Integer(value), 1]
149
+ in [-> { _1 <= Float }, Numeric]
150
+ [true, Float(value), 1]
151
+ in [-> { _1 <= Symbol }, String]
152
+ [true, value.to_sym, 1]
153
+ in [-> { _1 <= String }, Symbol]
154
+ [true, value.to_s, 1]
155
+ in [-> { _1 <= Date || _1 <= Time }, String]
156
+ Kernel.then do
157
+ [true, target.parse(value), 1]
158
+ rescue ArgumentError, Date::Error
159
+ [false, false, 0]
160
+ end
161
+ in [_, ^target]
162
+ [true, value, 1]
163
+ else
164
+ [false, false, 0]
165
+ end
166
+ end
167
+ end
168
+ end
169
+ end
170
+
171
+ # @private
172
+ #
173
+ # @abstract
174
+ #
175
+ # When we don't know what to expect for the value.
176
+ class Unknown
177
+ extend FinchAPI::Converter
178
+
179
+ # rubocop:disable Lint/UnusedMethodArgument
180
+
181
+ private_class_method :new
182
+
183
+ # @param other [Object]
184
+ #
185
+ # @return [Boolean]
186
+ #
187
+ def self.===(other) = true
188
+
189
+ # @param other [Object]
190
+ #
191
+ # @return [Boolean]
192
+ #
193
+ def self.==(other) = other.is_a?(Class) && other <= FinchAPI::Unknown
194
+
195
+ # @!parse
196
+ # # @private
197
+ # #
198
+ # # @param value [Object]
199
+ # #
200
+ # # @return [Object]
201
+ # #
202
+ # def self.coerce(value) = super
203
+
204
+ # @!parse
205
+ # # @private
206
+ # #
207
+ # # @param value [Object]
208
+ # #
209
+ # # @return [Object]
210
+ # #
211
+ # def self.dump(value) = super
212
+
213
+ # @private
214
+ #
215
+ # @param value [Object]
216
+ #
217
+ # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
218
+ #
219
+ def self.try_strict_coerce(value)
220
+ # prevent unknown variant from being chosen during the first coercion pass
221
+ [false, true, 0]
222
+ end
223
+
224
+ # rubocop:enable Lint/UnusedMethodArgument
225
+ end
226
+
227
+ # @private
228
+ #
229
+ # @abstract
230
+ #
231
+ # Ruby has no Boolean class; this is something for models to refer to.
232
+ class BooleanModel
233
+ extend FinchAPI::Converter
234
+
235
+ private_class_method :new
236
+
237
+ # @param other [Object]
238
+ #
239
+ # @return [Boolean]
240
+ #
241
+ def self.===(other) = other == true || other == false
242
+
243
+ # @param other [Object]
244
+ #
245
+ # @return [Boolean]
246
+ #
247
+ def self.==(other) = other.is_a?(Class) && other <= FinchAPI::BooleanModel
248
+
249
+ # @!parse
250
+ # # @private
251
+ # #
252
+ # # @param value [Boolean, Object]
253
+ # #
254
+ # # @return [Boolean, Object]
255
+ # #
256
+ # def self.coerce(value) = super
257
+
258
+ # @!parse
259
+ # # @private
260
+ # #
261
+ # # @param value [Boolean, Object]
262
+ # #
263
+ # # @return [Boolean, Object]
264
+ # #
265
+ # def self.dump(value) = super
266
+
267
+ # @private
268
+ #
269
+ # @param value [Object]
270
+ #
271
+ # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
272
+ #
273
+ def self.try_strict_coerce(value)
274
+ case value
275
+ in true | false
276
+ [true, value, 1]
277
+ else
278
+ [false, false, 0]
279
+ end
280
+ end
281
+ end
282
+
283
+ # @private
284
+ #
285
+ # @abstract
286
+ #
287
+ # A value from among a specified list of options. OpenAPI enum values map to Ruby
288
+ # values in the SDK as follows:
289
+ #
290
+ # 1. boolean => true | false
291
+ # 2. integer => Integer
292
+ # 3. float => Float
293
+ # 4. string => Symbol
294
+ #
295
+ # We can therefore convert string values to Symbols, but can't convert other
296
+ # values safely.
297
+ class Enum
298
+ extend FinchAPI::Converter
299
+
300
+ # All of the valid Symbol values for this enum.
301
+ #
302
+ # @return [Array<NilClass, Boolean, Integer, Float, Symbol>]
303
+ #
304
+ def self.values = (@values ||= constants.map { const_get(_1) })
305
+
306
+ # @private
307
+ #
308
+ # Guard against thread safety issues by instantiating `@values`.
309
+ #
310
+ private_class_method def self.finalize! = values
311
+
312
+ private_class_method :new
313
+
314
+ # @param other [Object]
315
+ #
316
+ # @return [Boolean]
317
+ #
318
+ def self.===(other) = values.include?(other)
319
+
320
+ # @param other [Object]
321
+ #
322
+ # @return [Boolean]
323
+ #
324
+ def self.==(other)
325
+ other.is_a?(Class) && other <= FinchAPI::Enum && other.values.to_set == values.to_set
326
+ end
327
+
328
+ # @private
329
+ #
330
+ # @param value [String, Symbol, Object]
331
+ #
332
+ # @return [Symbol, Object]
333
+ #
334
+ def self.coerce(value) = (value.is_a?(String) ? value.to_sym : value)
335
+
336
+ # @!parse
337
+ # # @private
338
+ # #
339
+ # # @param value [Symbol, Object]
340
+ # #
341
+ # # @return [Symbol, Object]
342
+ # #
343
+ # def self.dump(value) = super
344
+
345
+ # @private
346
+ #
347
+ # @param value [Object]
348
+ #
349
+ # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
350
+ #
351
+ def self.try_strict_coerce(value)
352
+ return [true, value, 1] if values.include?(value)
353
+
354
+ case value
355
+ in String if values.include?(val = value.to_sym)
356
+ [true, val, 1]
357
+ else
358
+ case [value, values.first]
359
+ in [true | false, true | false] | [Integer, Integer] | [Symbol | String, Symbol]
360
+ [false, true, 0]
361
+ else
362
+ [false, false, 0]
363
+ end
364
+ end
365
+ end
366
+ end
367
+
368
+ # @private
369
+ #
370
+ # @abstract
371
+ #
372
+ class Union
373
+ extend FinchAPI::Converter
374
+
375
+ # @private
376
+ #
377
+ # All of the specified variant info for this union.
378
+ #
379
+ # @return [Array<Array(Symbol, Proc)>]
380
+ #
381
+ private_class_method def self.known_variants = (@known_variants ||= [])
382
+
383
+ class << self
384
+ # @private
385
+ #
386
+ # All of the specified variants for this union.
387
+ #
388
+ # @return [Array<Array(Symbol, Object)>]
389
+ #
390
+ protected def variants
391
+ @known_variants.map { |key, variant_fn| [key, variant_fn.call] }
392
+ end
393
+ end
394
+
395
+ # @private
396
+ #
397
+ # @param property [Symbol]
398
+ #
399
+ private_class_method def self.discriminator(property)
400
+ case property
401
+ in Symbol
402
+ @discriminator = property
403
+ end
404
+ end
405
+
406
+ # @private
407
+ #
408
+ # @param key [Symbol, Hash{Symbol=>Object}, Proc, FinchAPI::Converter, Class]
409
+ #
410
+ # @param spec [Hash{Symbol=>Object}, Proc, FinchAPI::Converter, Class] .
411
+ #
412
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
413
+ #
414
+ # @option spec [Proc] :enum
415
+ #
416
+ # @option spec [Proc] :union
417
+ #
418
+ # @option spec [Boolean] :"nil?"
419
+ #
420
+ private_class_method def self.variant(key, spec = nil)
421
+ variant_info =
422
+ case key
423
+ in Symbol
424
+ [key, FinchAPI::Converter.type_info(spec)]
425
+ in Proc | FinchAPI::Converter | Class | Hash
426
+ [nil, FinchAPI::Converter.type_info(key)]
427
+ end
428
+
429
+ known_variants << variant_info
430
+ end
431
+
432
+ # @private
433
+ #
434
+ # @param value [Object]
435
+ #
436
+ # @return [FinchAPI::Converter, Class, nil]
437
+ #
438
+ private_class_method def self.resolve_variant(value)
439
+ case [@discriminator, value]
440
+ in [_, FinchAPI::BaseModel]
441
+ value.class
442
+ in [Symbol, Hash]
443
+ key =
444
+ if value.key?(@discriminator)
445
+ value.fetch(@discriminator)
446
+ elsif value.key?((discriminator = @discriminator.to_s))
447
+ value.fetch(discriminator)
448
+ end
449
+
450
+ key = key.to_sym if key.is_a?(String)
451
+ _, resolved = known_variants.find { |k,| k == key }
452
+ resolved.nil? ? FinchAPI::Unknown : resolved.call
453
+ else
454
+ nil
455
+ end
456
+ end
457
+
458
+ # rubocop:disable Style/HashEachMethods
459
+ # rubocop:disable Style/CaseEquality
460
+
461
+ private_class_method :new
462
+
463
+ # @param other [Object]
464
+ #
465
+ # @return [Boolean]
466
+ #
467
+ def self.===(other)
468
+ known_variants.any? do |_, variant_fn|
469
+ variant_fn.call === other
470
+ end
471
+ end
472
+
473
+ # @param other [Object]
474
+ #
475
+ # @return [Boolean]
476
+ #
477
+ def self.==(other)
478
+ other.is_a?(Class) && other <= FinchAPI::Union && other.variants == variants
479
+ end
480
+
481
+ # @private
482
+ #
483
+ # @param value [Object]
484
+ #
485
+ # @return [Object]
486
+ #
487
+ def self.coerce(value)
488
+ if (variant = resolve_variant(value))
489
+ return FinchAPI::Converter.coerce(variant, value)
490
+ end
491
+
492
+ matches = []
493
+
494
+ known_variants.each do |_, variant_fn|
495
+ variant = variant_fn.call
496
+
497
+ case FinchAPI::Converter.try_strict_coerce(variant, value)
498
+ in [true, coerced, _]
499
+ return coerced
500
+ in [false, true, score]
501
+ matches << [score, variant]
502
+ in [false, false, _]
503
+ nil
504
+ end
505
+ end
506
+
507
+ _, variant = matches.sort! { _2.first <=> _1.first }.find { |score,| !score.zero? }
508
+ variant.nil? ? value : FinchAPI::Converter.coerce(variant, value)
509
+ end
510
+
511
+ # @private
512
+ #
513
+ # @param value [Object]
514
+ #
515
+ # @return [Object]
516
+ #
517
+ def self.dump(value)
518
+ if (variant = resolve_variant(value))
519
+ return FinchAPI::Converter.dump(variant, value)
520
+ end
521
+
522
+ known_variants.each do |_, variant_fn|
523
+ variant = variant_fn.call
524
+ if variant === value
525
+ return FinchAPI::Converter.dump(variant, value)
526
+ end
527
+ end
528
+ value
529
+ end
530
+
531
+ # @private
532
+ #
533
+ # @param value [Object]
534
+ #
535
+ # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
536
+ #
537
+ def self.try_strict_coerce(value)
538
+ # TODO(ruby) this will result in super linear decoding behaviour for nested unions
539
+ # follow up with a decoding context that captures current strictness levels
540
+ if (variant = resolve_variant(value))
541
+ return Converter.try_strict_coerce(variant, value)
542
+ end
543
+
544
+ coercible = false
545
+ max_score = 0
546
+
547
+ known_variants.each do |_, variant_fn|
548
+ variant = variant_fn.call
549
+
550
+ case FinchAPI::Converter.try_strict_coerce(variant, value)
551
+ in [true, coerced, score]
552
+ return [true, coerced, score]
553
+ in [false, true, score]
554
+ coercible = true
555
+ max_score = [max_score, score].max
556
+ in [false, false, _]
557
+ nil
558
+ end
559
+ end
560
+
561
+ [false, coercible, max_score]
562
+ end
563
+
564
+ # rubocop:enable Style/CaseEquality
565
+ # rubocop:enable Style/HashEachMethods
566
+ end
567
+
568
+ # @private
569
+ #
570
+ # @abstract
571
+ #
572
+ # Array of items of a given type.
573
+ class ArrayOf
574
+ include FinchAPI::Converter
575
+
576
+ private_class_method :new
577
+
578
+ def self.[](...) = new(...)
579
+
580
+ # @param other [Object]
581
+ #
582
+ # @return [Boolean]
583
+ #
584
+ def ===(other)
585
+ type = item_type
586
+ case other
587
+ in Array
588
+ # rubocop:disable Style/CaseEquality
589
+ other.all? { type === _1 }
590
+ # rubocop:enable Style/CaseEquality
591
+ else
592
+ false
593
+ end
594
+ end
595
+
596
+ # @param other [Object]
597
+ #
598
+ # @return [Boolean]
599
+ #
600
+ def ==(other) = other.is_a?(FinchAPI::ArrayOf) && other.item_type == item_type
601
+
602
+ # @private
603
+ #
604
+ # @param value [Enumerable, Object]
605
+ #
606
+ # @return [Array<Object>, Object]
607
+ #
608
+ def coerce(value)
609
+ type = item_type
610
+ case value
611
+ in Enumerable unless value.is_a?(Hash)
612
+ value.map { FinchAPI::Converter.coerce(type, _1) }
613
+ else
614
+ value
615
+ end
616
+ end
617
+
618
+ # @private
619
+ #
620
+ # @param value [Enumerable, Object]
621
+ #
622
+ # @return [Array<Object>, Object]
623
+ #
624
+ def dump(value)
625
+ type = item_type
626
+ case value
627
+ in Enumerable unless value.is_a?(Hash)
628
+ value.map { FinchAPI::Converter.dump(type, _1) }.to_a
629
+ else
630
+ value
631
+ end
632
+ end
633
+
634
+ # @private
635
+ #
636
+ # @param value [Object]
637
+ #
638
+ # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
639
+ #
640
+ def try_strict_coerce(value)
641
+ case value
642
+ in Array
643
+ type = item_type
644
+ great_success = true
645
+ tally = 0
646
+
647
+ mapped =
648
+ value.map do |item|
649
+ case FinchAPI::Converter.try_strict_coerce(type, item)
650
+ in [true, coerced, score]
651
+ tally += score
652
+ coerced
653
+ in [false, true, score]
654
+ great_success = false
655
+ tally += score
656
+ item
657
+ in [false, false, _]
658
+ great_success &&= item.nil?
659
+ item
660
+ end
661
+ end
662
+
663
+ if great_success
664
+ [true, mapped, tally]
665
+ else
666
+ [false, true, tally]
667
+ end
668
+ else
669
+ [false, false, 0]
670
+ end
671
+ end
672
+
673
+ # @private
674
+ #
675
+ # @return [FinchAPI::Converter, Class]
676
+ #
677
+ protected def item_type = @item_type_fn.call
678
+
679
+ # @private
680
+ #
681
+ # @param type_info [Hash{Symbol=>Object}, Proc, FinchAPI::Converter, Class]
682
+ #
683
+ # @param spec [Hash{Symbol=>Object}] .
684
+ #
685
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
686
+ #
687
+ # @option spec [Proc] :enum
688
+ #
689
+ # @option spec [Proc] :union
690
+ #
691
+ # @option spec [Boolean] :"nil?"
692
+ #
693
+ def initialize(type_info, spec = {})
694
+ @item_type_fn = FinchAPI::Converter.type_info(type_info || spec)
695
+ end
696
+ end
697
+
698
+ # @private
699
+ #
700
+ # @abstract
701
+ #
702
+ # Hash of items of a given type.
703
+ class HashOf
704
+ include FinchAPI::Converter
705
+
706
+ private_class_method :new
707
+
708
+ def self.[](...) = new(...)
709
+
710
+ # @param other [Object]
711
+ #
712
+ # @return [Boolean]
713
+ #
714
+ def ===(other)
715
+ type = item_type
716
+ case other
717
+ in Hash
718
+ other.all? do |key, val|
719
+ case [key, val]
720
+ in [Symbol | String, ^type]
721
+ true
722
+ else
723
+ false
724
+ end
725
+ end
726
+ else
727
+ false
728
+ end
729
+ end
730
+
731
+ # @param other [Object]
732
+ #
733
+ # @return [Boolean]
734
+ #
735
+ def ==(other) = other.is_a?(FinchAPI::HashOf) && other.item_type == item_type
736
+
737
+ # @private
738
+ #
739
+ # @param value [Hash{Object=>Object}, Object]
740
+ #
741
+ # @return [Hash{Symbol=>Object}, Object]
742
+ #
743
+ def coerce(value)
744
+ type = item_type
745
+ case value
746
+ in Hash
747
+ value.to_h do |key, val|
748
+ coerced = FinchAPI::Converter.coerce(type, val)
749
+ [key.is_a?(String) ? key.to_sym : key, coerced]
750
+ end
751
+ else
752
+ value
753
+ end
754
+ end
755
+
756
+ # @private
757
+ #
758
+ # @param value [Hash{Object=>Object}, Object]
759
+ #
760
+ # @return [Hash{Symbol=>Object}, Object]
761
+ #
762
+ def dump(value)
763
+ type = item_type
764
+ case value
765
+ in Hash
766
+ value.transform_values do |val|
767
+ FinchAPI::Converter.dump(type, val)
768
+ end
769
+ else
770
+ value
771
+ end
772
+ end
773
+
774
+ # @private
775
+ #
776
+ # @param value [Object]
777
+ #
778
+ # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
779
+ #
780
+ def try_strict_coerce(value)
781
+ case value
782
+ in Hash
783
+ type = item_type
784
+ great_success = true
785
+ tally = 0
786
+
787
+ mapped =
788
+ value.transform_values do |val|
789
+ case FinchAPI::Converter.try_strict_coerce(type, val)
790
+ in [true, coerced, score]
791
+ tally += score
792
+ coerced
793
+ in [false, true, score]
794
+ great_success = false
795
+ tally += score
796
+ val
797
+ in [false, false, _]
798
+ great_success &&= val.nil?
799
+ val
800
+ end
801
+ end
802
+
803
+ if great_success
804
+ [true, mapped, tally]
805
+ else
806
+ [false, true, tally]
807
+ end
808
+ else
809
+ [false, false, 0]
810
+ end
811
+ end
812
+
813
+ # @private
814
+ #
815
+ # @return [FinchAPI::Converter, Class]
816
+ #
817
+ protected def item_type = @item_type_fn.call
818
+
819
+ # @private
820
+ #
821
+ # @param type_info [Hash{Symbol=>Object}, Proc, FinchAPI::Converter, Class]
822
+ #
823
+ # @param spec [Hash{Symbol=>Object}] .
824
+ #
825
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
826
+ #
827
+ # @option spec [Proc] :enum
828
+ #
829
+ # @option spec [Proc] :union
830
+ #
831
+ # @option spec [Boolean] :"nil?"
832
+ #
833
+ def initialize(type_info, spec = {})
834
+ @item_type_fn = FinchAPI::Converter.type_info(type_info || spec)
835
+ end
836
+ end
837
+
838
+ # @private
839
+ #
840
+ # @abstract
841
+ #
842
+ class BaseModel
843
+ extend FinchAPI::Converter
844
+
845
+ # @private
846
+ #
847
+ # Assumes superclass fields are totally defined before fields are accessed /
848
+ # defined on subclasses.
849
+ #
850
+ # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
851
+ #
852
+ def self.known_fields
853
+ @known_fields ||= (self < FinchAPI::BaseModel ? superclass.known_fields.dup : {})
854
+ end
855
+
856
+ class << self
857
+ # @private
858
+ #
859
+ # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
860
+ #
861
+ def fields
862
+ known_fields.transform_values do |field|
863
+ {**field.except(:type_fn), type: field.fetch(:type_fn).call}
864
+ end
865
+ end
866
+ end
867
+
868
+ # @private
869
+ #
870
+ # @return [Hash{Symbol=>Proc}]
871
+ #
872
+ def self.defaults = (@defaults ||= {})
873
+
874
+ # @private
875
+ #
876
+ # @param name_sym [Symbol]
877
+ #
878
+ # @param required [Boolean]
879
+ #
880
+ # @param type_info [Hash{Symbol=>Object}, Proc, FinchAPI::Converter, Class]
881
+ #
882
+ # @param spec [Hash{Symbol=>Object}] .
883
+ #
884
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
885
+ #
886
+ # @option spec [Proc] :enum
887
+ #
888
+ # @option spec [Proc] :union
889
+ #
890
+ # @option spec [Boolean] :"nil?"
891
+ #
892
+ private_class_method def self.add_field(name_sym, required:, type_info:, spec:)
893
+ type_fn, info =
894
+ case type_info
895
+ in Proc | Class | FinchAPI::Converter
896
+ [FinchAPI::Converter.type_info({**spec, union: type_info}), spec]
897
+ in Hash
898
+ [FinchAPI::Converter.type_info(type_info), type_info]
899
+ end
900
+
901
+ fallback = info[:const]
902
+ defaults[name_sym] = fallback if required && !info[:nil?] && info.key?(:const)
903
+
904
+ key = info.fetch(:api_name, name_sym)
905
+ setter = "#{name_sym}="
906
+
907
+ if known_fields.key?(name_sym)
908
+ [name_sym, setter].each { undef_method(_1) }
909
+ end
910
+
911
+ known_fields[name_sym] = {mode: @mode, key: key, required: required, type_fn: type_fn}
912
+
913
+ define_method(setter) do |val|
914
+ @data[key] = val
915
+ end
916
+
917
+ define_method(name_sym) do
918
+ field_type = type_fn.call
919
+ value = @data.fetch(key) { self.class.defaults[key] }
920
+ FinchAPI::Converter.coerce(field_type, value)
921
+ rescue StandardError
922
+ name = self.class.name.split("::").last
923
+ raise FinchAPI::ConversionError.new(
924
+ "Failed to parse #{name}.#{name_sym} as #{field_type.inspect}. " \
925
+ "To get the unparsed API response, use #{name}[:#{key}]."
926
+ )
927
+ end
928
+ end
929
+
930
+ # @private
931
+ #
932
+ # @param name_sym [Symbol]
933
+ #
934
+ # @param type_info [Hash{Symbol=>Object}, Proc, FinchAPI::Converter, Class]
935
+ #
936
+ # @param spec [Hash{Symbol=>Object}] .
937
+ #
938
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
939
+ #
940
+ # @option spec [Proc] :enum
941
+ #
942
+ # @option spec [Proc] :union
943
+ #
944
+ # @option spec [Boolean] :"nil?"
945
+ #
946
+ def self.required(name_sym, type_info, spec = {})
947
+ add_field(name_sym, required: true, type_info: type_info, spec: spec)
948
+ end
949
+
950
+ # @private
951
+ #
952
+ # @param name_sym [Symbol]
953
+ #
954
+ # @param type_info [Hash{Symbol=>Object}, Proc, FinchAPI::Converter, Class]
955
+ #
956
+ # @param spec [Hash{Symbol=>Object}] .
957
+ #
958
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
959
+ #
960
+ # @option spec [Proc] :enum
961
+ #
962
+ # @option spec [Proc] :union
963
+ #
964
+ # @option spec [Boolean] :"nil?"
965
+ #
966
+ def self.optional(name_sym, type_info, spec = {})
967
+ add_field(name_sym, required: false, type_info: type_info, spec: spec)
968
+ end
969
+
970
+ # @private
971
+ #
972
+ # `request_only` attributes not excluded from `.#coerce` when receiving responses
973
+ # even if well behaved servers should not send them
974
+ #
975
+ # @param blk [Proc]
976
+ #
977
+ private_class_method def self.request_only(&blk)
978
+ @mode = :dump
979
+ blk.call
980
+ ensure
981
+ @mode = nil
982
+ end
983
+
984
+ # @private
985
+ #
986
+ # `response_only` attributes are omitted from `.#dump` when making requests
987
+ #
988
+ # @param blk [Proc]
989
+ #
990
+ private_class_method def self.response_only(&blk)
991
+ @mode = :coerce
992
+ blk.call
993
+ ensure
994
+ @mode = nil
995
+ end
996
+
997
+ # @param other [Object]
998
+ #
999
+ # @return [Boolean]
1000
+ #
1001
+ def ==(other)
1002
+ case other
1003
+ in FinchAPI::BaseModel
1004
+ self.class.fields == other.class.fields && @data == other.to_h
1005
+ else
1006
+ false
1007
+ end
1008
+ end
1009
+
1010
+ # @private
1011
+ #
1012
+ # @param value [FinchAPI::BaseModel, Hash{Object=>Object}, Object]
1013
+ #
1014
+ # @return [FinchAPI::BaseModel, Object]
1015
+ #
1016
+ def self.coerce(value)
1017
+ case FinchAPI::Util.coerce_hash(value)
1018
+ in Hash => coerced
1019
+ new(coerced)
1020
+ else
1021
+ value
1022
+ end
1023
+ end
1024
+
1025
+ # @private
1026
+ #
1027
+ # @param value [FinchAPI::BaseModel, Object]
1028
+ #
1029
+ # @return [Hash{Object=>Object}, Object]
1030
+ #
1031
+ def self.dump(value)
1032
+ unless (coerced = FinchAPI::Util.coerce_hash(value)).is_a?(Hash)
1033
+ return value
1034
+ end
1035
+
1036
+ values = coerced.filter_map do |key, val|
1037
+ name = key.to_sym
1038
+ case (field = known_fields[name])
1039
+ in nil
1040
+ [name, val]
1041
+ else
1042
+ mode, type_fn, api_name = field.fetch_values(:mode, :type_fn, :key)
1043
+ case mode
1044
+ in :coerce
1045
+ next
1046
+ else
1047
+ target = type_fn.call
1048
+ [api_name, FinchAPI::Converter.dump(target, val)]
1049
+ end
1050
+ end
1051
+ end.to_h
1052
+
1053
+ defaults.each do |key, val|
1054
+ next if values.key?(key)
1055
+
1056
+ values[key] = val
1057
+ end
1058
+
1059
+ values
1060
+ end
1061
+
1062
+ # @private
1063
+ #
1064
+ # @param value [Object]
1065
+ #
1066
+ # @return [Array(true, Object, nil), Array(false, Boolean, Integer)]
1067
+ #
1068
+ def self.try_strict_coerce(value)
1069
+ case value
1070
+ in Hash | FinchAPI::BaseModel
1071
+ value = value.to_h
1072
+ else
1073
+ return [false, false, 0]
1074
+ end
1075
+
1076
+ keys = value.keys.to_set
1077
+ great_success = true
1078
+ tally = 0
1079
+ acc = {}
1080
+
1081
+ known_fields.each_value do |field|
1082
+ mode, required, type_fn, api_name = field.fetch_values(:mode, :required, :type_fn, :key)
1083
+ keys.delete(api_name)
1084
+
1085
+ case [required && mode != :dump, value.key?(api_name)]
1086
+ in [_, true]
1087
+ target = type_fn.call
1088
+ item = value.fetch(api_name)
1089
+ case FinchAPI::Converter.try_strict_coerce(target, item)
1090
+ in [true, coerced, score]
1091
+ tally += score
1092
+ acc[api_name] = coerced
1093
+ in [false, true, score]
1094
+ great_success = false
1095
+ tally += score
1096
+ acc[api_name] = item
1097
+ in [false, false, _]
1098
+ great_success &&= item.nil?
1099
+ end
1100
+ in [true, false]
1101
+ great_success = false
1102
+ in [false, false]
1103
+ nil
1104
+ end
1105
+ end
1106
+
1107
+ keys.each do |key|
1108
+ acc[key] = value.fetch(key)
1109
+ end
1110
+
1111
+ great_success ? [true, new(acc), tally] : [false, true, tally]
1112
+ end
1113
+
1114
+ # Returns the raw value associated with the given key, if found. Otherwise, nil is
1115
+ # returned.
1116
+ #
1117
+ # It is valid to lookup keys that are not in the API spec, for example to access
1118
+ # undocumented features. This method does not parse response data into
1119
+ # higher-level types. Lookup by anything other than a Symbol is an ArgumentError.
1120
+ #
1121
+ # @param key [Symbol]
1122
+ #
1123
+ # @return [Object, nil]
1124
+ #
1125
+ def [](key)
1126
+ unless key.instance_of?(Symbol)
1127
+ raise ArgumentError.new("Expected symbol key for lookup, got #{key.inspect}")
1128
+ end
1129
+
1130
+ @data[key]
1131
+ end
1132
+
1133
+ # Returns a Hash of the data underlying this object. O(1)
1134
+ #
1135
+ # Keys are Symbols and values are the raw values from the response. The return
1136
+ # value indicates which values were ever set on the object. i.e. there will be a
1137
+ # key in this hash if they ever were, even if the set value was nil.
1138
+ #
1139
+ # This method is not recursive. The returned value is shared by the object, so it
1140
+ # should not be mutated.
1141
+ #
1142
+ # @return [Hash{Symbol=>Object}]
1143
+ #
1144
+ def to_h = @data
1145
+
1146
+ alias_method :to_hash, :to_h
1147
+
1148
+ # @param keys [Array<Symbol>, nil]
1149
+ #
1150
+ # @return [Hash{Symbol=>Object}]
1151
+ #
1152
+ def deconstruct_keys(keys)
1153
+ (keys || self.class.known_fields.keys).filter_map do |k|
1154
+ unless self.class.known_fields.key?(k)
1155
+ next
1156
+ end
1157
+
1158
+ [k, method(k).call]
1159
+ end
1160
+ .to_h
1161
+ end
1162
+
1163
+ # Create a new instance of a model.
1164
+ #
1165
+ # @param data [Hash{Symbol=>Object}, FinchAPI::BaseModel]
1166
+ #
1167
+ def initialize(data = {})
1168
+ case FinchAPI::Util.coerce_hash(data)
1169
+ in Hash => coerced
1170
+ @data = coerced.transform_keys(&:to_sym)
1171
+ else
1172
+ raise ArgumentError.new("Expected a #{Hash} or #{FinchAPI::BaseModel}, got #{data.inspect}")
1173
+ end
1174
+ end
1175
+
1176
+ # @return [String]
1177
+ #
1178
+ def to_s = @data.to_s
1179
+
1180
+ # @return [String]
1181
+ #
1182
+ def inspect
1183
+ "#<#{self.class.name}:0x#{object_id.to_s(16)} #{deconstruct_keys(nil).map do |k, v|
1184
+ "#{k}=#{v.inspect}"
1185
+ end.join(' ')}>"
1186
+ end
1187
+ end
1188
+ end