docspring 3.5.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (505) hide show
  1. checksums.yaml +4 -4
  2. data/.openapi-generator/FILES +361 -150
  3. data/.openapi-generator/VERSION +1 -1
  4. data/.rubocop.yml +1 -1
  5. data/.travis.yml +1 -1
  6. data/AGENTS.md +79 -19
  7. data/CHANGELOG.md +123 -0
  8. data/Gemfile.lock +7 -7
  9. data/README.md +60 -53
  10. data/docs/{RenameFolderData.md → AiFieldNamingLanguage.md} +2 -5
  11. data/docs/AuthenticationCheck.md +18 -0
  12. data/docs/{CreateFolderData.md → BarcodeSymbology.md} +2 -5
  13. data/docs/{CreateWebhookData.md → CheckCharacter.md} +2 -5
  14. data/docs/Client.md +890 -777
  15. data/docs/{UpdateWebhookData.md → CombinedFieldType.md} +2 -5
  16. data/docs/CombinedPdf.md +44 -0
  17. data/docs/CombinedPdfFiles.md +18 -0
  18. data/docs/CombinedPdfList.md +20 -0
  19. data/docs/CombinedPdfSource.md +26 -0
  20. data/docs/CombinedPdfSourceInput.md +88 -0
  21. data/docs/CombinedPdfSourcePdf.md +20 -0
  22. data/docs/CombinedPdfSourceType.md +15 -0
  23. data/docs/CombinedPdfState.md +15 -0
  24. data/docs/CopyTemplateRequest.md +22 -0
  25. data/docs/CreateCombinedPdfRequest.md +26 -0
  26. data/docs/CreateCustomFileFromUploadRequest.md +18 -0
  27. data/docs/CreateFolderRequest.md +20 -0
  28. data/docs/CreateSignatureRequestEventRequest.md +24 -0
  29. data/docs/CreateSignatureRequestTokenRequest.md +18 -0
  30. data/docs/CreateSubmissionBatchRequest.md +26 -0
  31. data/docs/CreateSubmissionRequest.md +36 -0
  32. data/docs/CreateTemplateRequest.md +94 -0
  33. data/docs/CreateWebhookRequest.md +38 -0
  34. data/docs/CustomFile.md +11 -3
  35. data/docs/CustomFileList.md +20 -0
  36. data/docs/CustomFileSourcePdf.md +20 -0
  37. data/docs/ErrorCode.md +15 -0
  38. data/docs/ErrorDetail.md +26 -0
  39. data/docs/ErrorInfo.md +32 -0
  40. data/docs/ErrorResponse.md +1 -3
  41. data/docs/ExpirationInterval.md +15 -0
  42. data/docs/FieldComparisonCondition.md +22 -0
  43. data/docs/FieldComparisonOperator.md +15 -0
  44. data/docs/FieldDisplayType.md +15 -0
  45. data/docs/FieldEqualsCondition.md +22 -0
  46. data/docs/FieldEqualsOperator.md +15 -0
  47. data/docs/FieldInCondition.md +22 -0
  48. data/docs/FieldOverride.md +142 -0
  49. data/docs/FieldPresenceCondition.md +20 -0
  50. data/docs/FieldPresenceOperator.md +15 -0
  51. data/docs/FieldRangeCondition.md +24 -0
  52. data/docs/FieldReimportState.md +15 -0
  53. data/docs/FieldSetupLogic.md +15 -0
  54. data/docs/FieldSetupNaming.md +15 -0
  55. data/docs/FieldSetupSource.md +15 -0
  56. data/docs/Folder.md +9 -5
  57. data/docs/FolderList.md +20 -0
  58. data/docs/GeneratedFile.md +32 -0
  59. data/docs/GeneratedFileState.md +15 -0
  60. data/docs/HtmlEngineOptions.md +36 -0
  61. data/docs/HtmlEngineOptionsInput.md +36 -0
  62. data/docs/ImageGravity.md +15 -0
  63. data/docs/ImageScaleType.md +15 -0
  64. data/docs/ModelCodeLanguage.md +15 -0
  65. data/docs/MoveFolderRequest.md +18 -0
  66. data/docs/MoveTemplateRequest.md +18 -0
  67. data/docs/NumberConditionType.md +15 -0
  68. data/docs/PageFormat.md +15 -0
  69. data/docs/PublishTemplateVersionRequest.md +20 -0
  70. data/docs/RenameFolderRequest.md +18 -0
  71. data/docs/RestoreTemplateVersionRequest.md +18 -0
  72. data/docs/ShapeType.md +15 -0
  73. data/docs/SignatureRequest.md +66 -0
  74. data/docs/SignatureRequestAuthSecondFactorType.md +15 -0
  75. data/docs/SignatureRequestAuthType.md +15 -0
  76. data/docs/SignatureRequestEvent.md +32 -0
  77. data/docs/SignatureRequestEventType.md +15 -0
  78. data/docs/SignatureRequestInput.md +46 -0
  79. data/docs/SignatureRequestMessageType.md +15 -0
  80. data/docs/SignatureRequestState.md +15 -0
  81. data/docs/SignatureRequestToken.md +30 -0
  82. data/docs/SignatureRequestTokenType.md +15 -0
  83. data/docs/StringConditionType.md +15 -0
  84. data/docs/Submission.md +41 -47
  85. data/docs/SubmissionAction.md +6 -8
  86. data/docs/SubmissionActionState.md +15 -0
  87. data/docs/SubmissionActionType.md +15 -0
  88. data/docs/SubmissionBatch.md +16 -10
  89. data/docs/SubmissionBatchState.md +15 -0
  90. data/docs/SubmissionFiles.md +22 -0
  91. data/docs/SubmissionInput.md +38 -0
  92. data/docs/SubmissionList.md +20 -0
  93. data/docs/SubmissionSource.md +15 -0
  94. data/docs/SubmissionSourcePdf.md +20 -0
  95. data/docs/SubmissionState.md +15 -0
  96. data/docs/Template.md +73 -107
  97. data/docs/TemplateActor.md +26 -0
  98. data/docs/TemplateActorType.md +15 -0
  99. data/docs/TemplateDefaults.md +56 -0
  100. data/docs/TemplateDefaultsInput.md +56 -0
  101. data/docs/TemplateDocument.md +40 -0
  102. data/docs/TemplateDocumentState.md +15 -0
  103. data/docs/TemplateFieldDependency.md +26 -0
  104. data/docs/TemplateFieldDependencyAction.md +15 -0
  105. data/docs/TemplateFieldDependencyCondition.md +24 -0
  106. data/docs/TemplateFieldDependencyConditionInput.md +93 -0
  107. data/docs/TemplateFieldDependencyInput.md +26 -0
  108. data/docs/TemplateFieldDependencyMatch.md +15 -0
  109. data/docs/TemplateFieldDependencyOperator.md +15 -0
  110. data/docs/TemplateFieldLogicStatus.md +15 -0
  111. data/docs/TemplateFormMode.md +15 -0
  112. data/docs/TemplateModelCode.md +22 -0
  113. data/docs/TemplatePageAiError.md +15 -0
  114. data/docs/TemplatePageAiNamingStatus.md +15 -0
  115. data/docs/TemplatePageFieldsStatus.md +15 -0
  116. data/docs/TemplatePageImageStatus.md +15 -0
  117. data/docs/TemplatePageProcessingStatus.md +26 -0
  118. data/docs/TemplateSourcePdf.md +24 -0
  119. data/docs/TemplateSummary.md +90 -0
  120. data/docs/TemplateSummaryList.md +20 -0
  121. data/docs/TemplateType.md +15 -0
  122. data/docs/TemplateVersion.md +24 -0
  123. data/docs/TemplateVersionType.md +15 -0
  124. data/docs/TextAlignment.md +15 -0
  125. data/docs/TextOverflow.md +15 -0
  126. data/docs/TextVerticalAlignment.md +15 -0
  127. data/docs/Typeface.md +15 -0
  128. data/docs/UpdateSignatureRequestRequest.md +34 -0
  129. data/docs/UpdateTemplateDocumentRequest.md +22 -0
  130. data/docs/UpdateTemplateRequest.md +80 -0
  131. data/docs/UpdateWebhookRequest.md +38 -0
  132. data/docs/UploadMethod.md +15 -0
  133. data/docs/UploadPresign.md +24 -0
  134. data/docs/UrlSourcePdf.md +20 -0
  135. data/docs/Webhook.md +20 -20
  136. data/docs/WebhookEventType.md +15 -0
  137. data/docs/WebhookList.md +20 -0
  138. data/docs/WebhookMode.md +15 -0
  139. data/docspring.gemspec +3 -3
  140. data/lib/docspring/api/client.rb +995 -942
  141. data/lib/docspring/api_client.rb +14 -6
  142. data/lib/docspring/api_error.rb +3 -3
  143. data/lib/docspring/api_model_base.rb +88 -0
  144. data/lib/docspring/configuration.rb +12 -7
  145. data/lib/docspring/models/ai_field_naming_language.rb +42 -0
  146. data/lib/docspring/models/authentication_check.rb +185 -0
  147. data/lib/docspring/models/barcode_symbology.rb +47 -0
  148. data/lib/docspring/models/check_character.rb +44 -0
  149. data/lib/docspring/models/combined_field_type.rb +41 -0
  150. data/lib/docspring/models/{combined_submission.rb → combined_pdf.rb} +228 -206
  151. data/lib/docspring/models/combined_pdf_files.rb +167 -0
  152. data/lib/docspring/models/combined_pdf_list.rb +200 -0
  153. data/lib/docspring/models/{update_webhook_data.rb → combined_pdf_source.rb} +107 -103
  154. data/lib/docspring/models/combined_pdf_source_input.rb +62 -0
  155. data/lib/docspring/models/combined_pdf_source_pdf.rb +212 -0
  156. data/lib/docspring/models/combined_pdf_source_type.rb +44 -0
  157. data/lib/docspring/models/combined_pdf_state.rb +44 -0
  158. data/lib/docspring/models/{copy_template_options.rb → copy_template_request.rb} +32 -87
  159. data/lib/docspring/models/{combine_pdfs_data.rb → create_combined_pdf_request.rb} +60 -123
  160. data/lib/docspring/models/{create_custom_file_data.rb → create_custom_file_from_upload_request.rb} +29 -96
  161. data/lib/docspring/models/{move_template_data.rb → create_folder_request.rb} +60 -102
  162. data/lib/docspring/models/{create_submission_data_request_event_request.rb → create_signature_request_event_request.rb} +50 -122
  163. data/lib/docspring/models/create_signature_request_token_request.rb +190 -0
  164. data/lib/docspring/models/{submission_batch_data.rb → create_submission_batch_request.rb} +53 -108
  165. data/lib/docspring/models/{create_pdf_submission_data.rb → create_submission_request.rb} +97 -149
  166. data/lib/docspring/models/create_template_request.rb +601 -0
  167. data/lib/docspring/models/create_webhook_request.rb +368 -0
  168. data/lib/docspring/models/custom_file.rb +132 -95
  169. data/lib/docspring/models/custom_file_list.rb +200 -0
  170. data/lib/docspring/models/custom_file_source_pdf.rb +212 -0
  171. data/lib/docspring/models/error_code.rb +60 -0
  172. data/lib/docspring/models/error_detail.rb +242 -0
  173. data/lib/docspring/models/error_info.rb +316 -0
  174. data/lib/docspring/models/error_response.rb +28 -138
  175. data/lib/docspring/models/expiration_interval.rb +42 -0
  176. data/lib/docspring/models/field_comparison_condition.rb +247 -0
  177. data/lib/docspring/models/field_comparison_operator.rb +43 -0
  178. data/lib/docspring/models/field_display_type.rb +45 -0
  179. data/lib/docspring/models/field_equals_condition.rb +247 -0
  180. data/lib/docspring/models/field_equals_operator.rb +41 -0
  181. data/lib/docspring/models/{create_folder_data.rb → field_in_condition.rb} +101 -103
  182. data/lib/docspring/models/field_override.rb +829 -0
  183. data/lib/docspring/models/field_presence_condition.rb +234 -0
  184. data/lib/docspring/models/field_presence_operator.rb +41 -0
  185. data/lib/docspring/models/field_range_condition.rb +234 -0
  186. data/lib/docspring/models/field_reimport_state.rb +43 -0
  187. data/lib/docspring/models/field_setup_logic.rb +41 -0
  188. data/lib/docspring/models/field_setup_naming.rb +41 -0
  189. data/lib/docspring/models/field_setup_source.rb +42 -0
  190. data/lib/docspring/models/folder.rb +134 -93
  191. data/lib/docspring/models/folder_list.rb +200 -0
  192. data/lib/docspring/models/generated_file.rb +326 -0
  193. data/lib/docspring/models/generated_file_state.rb +42 -0
  194. data/lib/docspring/models/html_engine_options.rb +416 -0
  195. data/lib/docspring/models/html_engine_options_input.rb +280 -0
  196. data/lib/docspring/models/image_gravity.rb +48 -0
  197. data/lib/docspring/models/image_scale_type.rb +42 -0
  198. data/lib/docspring/models/model_code_language.rb +48 -0
  199. data/lib/docspring/models/{move_folder_data.rb → move_folder_request.rb} +31 -87
  200. data/lib/docspring/models/move_template_request.rb +171 -0
  201. data/lib/docspring/models/number_condition_type.rb +45 -0
  202. data/lib/docspring/models/page_format.rb +52 -0
  203. data/lib/docspring/models/{publish_version_data.rb → publish_template_version_request.rb} +64 -99
  204. data/lib/docspring/models/{rename_folder_data.rb → rename_folder_request.rb} +29 -87
  205. data/lib/docspring/models/{restore_version_data.rb → restore_template_version_request.rb} +29 -87
  206. data/lib/docspring/models/shape_type.rb +45 -0
  207. data/lib/docspring/models/{submission_data_request_show.rb → signature_request.rb} +240 -171
  208. data/lib/docspring/models/signature_request_auth_second_factor_type.rb +45 -0
  209. data/lib/docspring/models/signature_request_auth_type.rb +46 -0
  210. data/lib/docspring/models/{submission_data_request_event.rb → signature_request_event.rb} +137 -122
  211. data/lib/docspring/models/signature_request_event_type.rb +45 -0
  212. data/lib/docspring/models/{update_submission_data_request_data.rb → signature_request_input.rb} +156 -173
  213. data/lib/docspring/models/signature_request_message_type.rb +48 -0
  214. data/lib/docspring/models/signature_request_state.rb +42 -0
  215. data/lib/docspring/models/signature_request_token.rb +369 -0
  216. data/lib/docspring/models/signature_request_token_type.rb +41 -0
  217. data/lib/docspring/models/string_condition_type.rb +44 -0
  218. data/lib/docspring/models/submission.rb +374 -339
  219. data/lib/docspring/models/submission_action.rb +64 -136
  220. data/lib/docspring/models/submission_action_state.rb +43 -0
  221. data/lib/docspring/models/submission_action_type.rb +46 -0
  222. data/lib/docspring/models/submission_batch.rb +157 -112
  223. data/lib/docspring/models/submission_batch_state.rb +42 -0
  224. data/lib/docspring/models/submission_files.rb +188 -0
  225. data/lib/docspring/models/submission_input.rb +274 -0
  226. data/lib/docspring/models/submission_list.rb +200 -0
  227. data/lib/docspring/models/submission_source.rb +43 -0
  228. data/lib/docspring/models/submission_source_pdf.rb +212 -0
  229. data/lib/docspring/models/submission_state.rb +52 -0
  230. data/lib/docspring/models/template.rb +485 -766
  231. data/lib/docspring/models/{add_fields_data.rb → template_actor.rb} +119 -105
  232. data/lib/docspring/models/template_actor_type.rb +42 -0
  233. data/lib/docspring/models/template_defaults.rb +395 -0
  234. data/lib/docspring/models/template_defaults_input.rb +395 -0
  235. data/lib/docspring/models/template_document.rb +396 -0
  236. data/lib/docspring/models/template_document_state.rb +44 -0
  237. data/lib/docspring/models/{success_error_response.rb → template_field_dependency.rb} +122 -114
  238. data/lib/docspring/models/template_field_dependency_action.rb +42 -0
  239. data/lib/docspring/models/{create_pdf_template.rb → template_field_dependency_condition.rb} +116 -103
  240. data/lib/docspring/models/template_field_dependency_condition_input.rb +67 -0
  241. data/lib/docspring/models/template_field_dependency_input.rb +285 -0
  242. data/lib/docspring/models/template_field_dependency_match.rb +41 -0
  243. data/lib/docspring/models/template_field_dependency_operator.rb +49 -0
  244. data/lib/docspring/models/template_field_logic_status.rb +44 -0
  245. data/lib/docspring/models/template_form_mode.rb +42 -0
  246. data/lib/docspring/models/{template_model_code_response.rb → template_model_code.rb} +37 -96
  247. data/lib/docspring/models/template_page_ai_error.rb +43 -0
  248. data/lib/docspring/models/template_page_ai_naming_status.rb +41 -0
  249. data/lib/docspring/models/template_page_fields_status.rb +44 -0
  250. data/lib/docspring/models/template_page_image_status.rb +41 -0
  251. data/lib/docspring/models/template_page_processing_status.rb +275 -0
  252. data/lib/docspring/models/{create_webhook_data.rb → template_source_pdf.rb} +92 -103
  253. data/lib/docspring/models/{template_preview.rb → template_summary.rb} +436 -589
  254. data/lib/docspring/models/template_summary_list.rb +200 -0
  255. data/lib/docspring/models/template_type.rb +41 -0
  256. data/lib/docspring/models/template_version.rb +238 -0
  257. data/lib/docspring/models/template_version_type.rb +42 -0
  258. data/lib/docspring/models/text_alignment.rb +43 -0
  259. data/lib/docspring/models/text_overflow.rb +41 -0
  260. data/lib/docspring/models/text_vertical_alignment.rb +42 -0
  261. data/lib/docspring/models/typeface.rb +56 -0
  262. data/lib/docspring/models/{create_submission_data_request_data.rb → update_signature_request_request.rb} +72 -196
  263. data/lib/docspring/models/update_template_document_request.rb +205 -0
  264. data/lib/docspring/models/update_template_request.rb +514 -0
  265. data/lib/docspring/models/update_webhook_request.rb +344 -0
  266. data/lib/docspring/models/upload_method.rb +40 -0
  267. data/lib/docspring/models/{upload_presign_response.rb → upload_presign.rb} +93 -140
  268. data/lib/docspring/models/url_source_pdf.rb +212 -0
  269. data/lib/docspring/models/webhook.rb +97 -107
  270. data/lib/docspring/models/webhook_event_type.rb +64 -0
  271. data/lib/docspring/models/webhook_list.rb +200 -0
  272. data/lib/docspring/models/webhook_mode.rb +41 -0
  273. data/lib/docspring/request_schemas.json +3187 -0
  274. data/lib/docspring/request_validator.rb +396 -0
  275. data/lib/docspring/version.rb +4 -4
  276. data/lib/docspring.rb +125 -53
  277. data/spec/api/client_spec.rb +304 -277
  278. data/spec/models/ai_field_naming_language_spec.rb +30 -0
  279. data/spec/models/authentication_check_spec.rb +36 -0
  280. data/spec/models/barcode_symbology_spec.rb +30 -0
  281. data/spec/models/check_character_spec.rb +30 -0
  282. data/spec/models/combined_field_type_spec.rb +30 -0
  283. data/spec/models/combined_pdf_files_spec.rb +36 -0
  284. data/spec/models/combined_pdf_list_spec.rb +42 -0
  285. data/spec/models/combined_pdf_source_input_spec.rb +44 -0
  286. data/spec/models/combined_pdf_source_pdf_spec.rb +42 -0
  287. data/spec/models/{submission_data_request_token_spec.rb → combined_pdf_source_spec.rb} +18 -12
  288. data/spec/models/combined_pdf_source_type_spec.rb +30 -0
  289. data/spec/models/{combined_submission_spec.rb → combined_pdf_spec.rb} +20 -24
  290. data/spec/models/combined_pdf_state_spec.rb +30 -0
  291. data/spec/models/{copy_template_options_spec.rb → copy_template_request_spec.rb} +9 -9
  292. data/spec/models/{combine_pdfs_data_spec.rb → create_combined_pdf_request_spec.rb} +12 -18
  293. data/spec/models/{create_custom_file_data_spec.rb → create_custom_file_from_upload_request_spec.rb} +9 -9
  294. data/spec/models/{move_template_data_spec.rb → create_folder_request_spec.rb} +11 -11
  295. data/spec/models/{list_submissions_response_spec.rb → create_signature_request_event_request_spec.rb} +18 -12
  296. data/spec/models/create_signature_request_token_request_spec.rb +36 -0
  297. data/spec/models/{submission_batch_data_spec.rb → create_submission_batch_request_spec.rb} +13 -13
  298. data/spec/models/{create_pdf_submission_data_spec.rb → create_submission_request_spec.rb} +24 -18
  299. data/spec/models/{template_preview_spec.rb → create_template_request_spec.rb} +40 -118
  300. data/spec/models/create_webhook_request_spec.rb +96 -0
  301. data/spec/models/custom_file_list_spec.rb +42 -0
  302. data/spec/models/custom_file_source_pdf_spec.rb +42 -0
  303. data/spec/models/custom_file_spec.rb +29 -5
  304. data/spec/models/error_code_spec.rb +30 -0
  305. data/spec/models/{create_submission_response_spec.rb → error_detail_spec.rb} +14 -18
  306. data/spec/models/{batch_generate_pdfs201_response_spec.rb → error_info_spec.rb} +27 -19
  307. data/spec/models/error_response_spec.rb +4 -14
  308. data/spec/models/expiration_interval_spec.rb +30 -0
  309. data/spec/models/field_comparison_condition_spec.rb +48 -0
  310. data/spec/models/field_comparison_operator_spec.rb +30 -0
  311. data/spec/models/field_display_type_spec.rb +30 -0
  312. data/spec/models/field_equals_condition_spec.rb +48 -0
  313. data/spec/models/field_equals_operator_spec.rb +30 -0
  314. data/spec/models/field_in_condition_spec.rb +48 -0
  315. data/spec/models/field_override_spec.rb +408 -0
  316. data/spec/models/field_presence_condition_spec.rb +42 -0
  317. data/spec/models/field_presence_operator_spec.rb +30 -0
  318. data/spec/models/field_range_condition_spec.rb +54 -0
  319. data/spec/models/field_reimport_state_spec.rb +30 -0
  320. data/spec/models/field_setup_logic_spec.rb +30 -0
  321. data/spec/models/field_setup_naming_spec.rb +30 -0
  322. data/spec/models/field_setup_source_spec.rb +30 -0
  323. data/spec/models/folder_list_spec.rb +42 -0
  324. data/spec/models/folder_spec.rb +16 -4
  325. data/spec/models/generated_file_spec.rb +78 -0
  326. data/spec/models/generated_file_state_spec.rb +30 -0
  327. data/spec/models/html_engine_options_input_spec.rb +90 -0
  328. data/spec/models/html_engine_options_spec.rb +90 -0
  329. data/spec/models/image_gravity_spec.rb +30 -0
  330. data/spec/models/image_scale_type_spec.rb +30 -0
  331. data/spec/models/model_code_language_spec.rb +30 -0
  332. data/spec/models/move_folder_request_spec.rb +36 -0
  333. data/spec/models/move_template_request_spec.rb +36 -0
  334. data/spec/models/number_condition_type_spec.rb +30 -0
  335. data/spec/models/page_format_spec.rb +30 -0
  336. data/spec/models/{publish_version_data_spec.rb → publish_template_version_request_spec.rb} +11 -11
  337. data/spec/models/{rename_folder_data_spec.rb → rename_folder_request_spec.rb} +9 -9
  338. data/spec/models/restore_template_version_request_spec.rb +36 -0
  339. data/spec/models/shape_type_spec.rb +30 -0
  340. data/spec/models/signature_request_auth_second_factor_type_spec.rb +30 -0
  341. data/spec/models/signature_request_auth_type_spec.rb +30 -0
  342. data/spec/models/{submission_data_request_event_spec.rb → signature_request_event_spec.rb} +16 -18
  343. data/spec/models/signature_request_event_type_spec.rb +30 -0
  344. data/spec/models/{create_submission_data_request_data_spec.rb → signature_request_input_spec.rb} +28 -30
  345. data/spec/models/signature_request_message_type_spec.rb +30 -0
  346. data/spec/models/{submission_data_request_show_spec.rb → signature_request_spec.rb} +31 -31
  347. data/spec/models/signature_request_state_spec.rb +30 -0
  348. data/spec/models/signature_request_token_spec.rb +72 -0
  349. data/spec/models/signature_request_token_type_spec.rb +30 -0
  350. data/spec/models/string_condition_type_spec.rb +30 -0
  351. data/spec/models/submission_action_spec.rb +4 -22
  352. data/spec/models/submission_action_state_spec.rb +30 -0
  353. data/spec/models/submission_action_type_spec.rb +30 -0
  354. data/spec/models/submission_batch_spec.rb +27 -13
  355. data/spec/models/submission_batch_state_spec.rb +30 -0
  356. data/spec/models/submission_files_spec.rb +48 -0
  357. data/spec/models/submission_input_spec.rb +96 -0
  358. data/spec/models/submission_list_spec.rb +42 -0
  359. data/spec/models/submission_source_pdf_spec.rb +42 -0
  360. data/spec/models/submission_source_spec.rb +30 -0
  361. data/spec/models/submission_spec.rb +26 -56
  362. data/spec/models/submission_state_spec.rb +30 -0
  363. data/spec/models/template_actor_spec.rb +60 -0
  364. data/spec/models/template_actor_type_spec.rb +30 -0
  365. data/spec/models/{submission_data_request_spec.rb → template_defaults_input_spec.rb} +29 -53
  366. data/spec/models/template_defaults_spec.rb +150 -0
  367. data/spec/models/{json_schema_spec.rb → template_document_spec.rb} +21 -21
  368. data/spec/models/template_document_state_spec.rb +30 -0
  369. data/spec/models/template_field_dependency_action_spec.rb +30 -0
  370. data/spec/models/template_field_dependency_condition_input_spec.rb +44 -0
  371. data/spec/models/template_field_dependency_condition_spec.rb +54 -0
  372. data/spec/models/template_field_dependency_input_spec.rb +60 -0
  373. data/spec/models/template_field_dependency_match_spec.rb +30 -0
  374. data/spec/models/template_field_dependency_operator_spec.rb +30 -0
  375. data/spec/models/template_field_dependency_spec.rb +60 -0
  376. data/spec/models/template_field_logic_status_spec.rb +30 -0
  377. data/spec/models/template_form_mode_spec.rb +30 -0
  378. data/spec/models/{template_model_code_response_spec.rb → template_model_code_spec.rb} +9 -13
  379. data/spec/models/template_page_ai_error_spec.rb +30 -0
  380. data/spec/models/template_page_ai_naming_status_spec.rb +30 -0
  381. data/spec/models/template_page_fields_status_spec.rb +30 -0
  382. data/spec/models/template_page_image_status_spec.rb +30 -0
  383. data/spec/models/template_page_processing_status_spec.rb +60 -0
  384. data/spec/models/template_source_pdf_spec.rb +54 -0
  385. data/spec/models/template_spec.rb +40 -154
  386. data/spec/models/template_summary_list_spec.rb +42 -0
  387. data/spec/models/template_summary_spec.rb +252 -0
  388. data/spec/models/template_type_spec.rb +30 -0
  389. data/spec/models/template_version_spec.rb +54 -0
  390. data/spec/models/template_version_type_spec.rb +30 -0
  391. data/spec/models/text_alignment_spec.rb +30 -0
  392. data/spec/models/text_overflow_spec.rb +30 -0
  393. data/spec/models/text_vertical_alignment_spec.rb +30 -0
  394. data/spec/models/typeface_spec.rb +30 -0
  395. data/spec/models/{submission_batch_with_submissions_spec.rb → update_signature_request_request_spec.rb} +18 -22
  396. data/spec/models/update_template_document_request_spec.rb +48 -0
  397. data/spec/models/{submission_preview_spec.rb → update_template_request_spec.rb} +81 -41
  398. data/spec/models/update_webhook_request_spec.rb +96 -0
  399. data/spec/models/upload_method_spec.rb +30 -0
  400. data/spec/models/{upload_presign_response_spec.rb → upload_presign_spec.rb} +13 -17
  401. data/spec/models/url_source_pdf_spec.rb +42 -0
  402. data/spec/models/webhook_event_type_spec.rb +30 -0
  403. data/spec/models/webhook_list_spec.rb +42 -0
  404. data/spec/models/webhook_mode_spec.rb +30 -0
  405. data/spec/models/webhook_spec.rb +4 -8
  406. data/spec/spec_helper.rb +3 -3
  407. metadata +485 -202
  408. data/docs/AddFieldsData.md +0 -18
  409. data/docs/BatchGeneratePdfs201Response.md +0 -28
  410. data/docs/CombinePdfsData.md +0 -28
  411. data/docs/CombinedSubmission.md +0 -44
  412. data/docs/CombinedSubmissionAction.md +0 -30
  413. data/docs/CopyTemplateOptions.md +0 -22
  414. data/docs/CreateCombinedSubmissionResponse.md +0 -26
  415. data/docs/CreateCustomFileData.md +0 -18
  416. data/docs/CreateCustomFileResponse.md +0 -24
  417. data/docs/CreateHtmlTemplate.md +0 -18
  418. data/docs/CreatePdfSubmissionData.md +0 -34
  419. data/docs/CreatePdfTemplate.md +0 -18
  420. data/docs/CreateSubmissionDataRequestData.md +0 -44
  421. data/docs/CreateSubmissionDataRequestEventRequest.md +0 -24
  422. data/docs/CreateSubmissionDataRequestEventResponse.md +0 -24
  423. data/docs/CreateSubmissionDataRequestResponse.md +0 -24
  424. data/docs/CreateSubmissionDataRequestTokenResponse.md +0 -24
  425. data/docs/CreateSubmissionResponse.md +0 -26
  426. data/docs/ErrorOrMultipleErrorsResponse.md +0 -22
  427. data/docs/ForbiddenErrorResponse.md +0 -22
  428. data/docs/JsonSchema.md +0 -40
  429. data/docs/ListSubmissionsResponse.md +0 -22
  430. data/docs/MoveFolderData.md +0 -18
  431. data/docs/MoveTemplateData.md +0 -20
  432. data/docs/MultipleErrorsResponse.md +0 -20
  433. data/docs/PublishVersionData.md +0 -20
  434. data/docs/RestoreVersionData.md +0 -18
  435. data/docs/Submission422Response.md +0 -24
  436. data/docs/SubmissionBatchData.md +0 -26
  437. data/docs/SubmissionBatchWithSubmissions.md +0 -34
  438. data/docs/SubmissionDataRequest.md +0 -60
  439. data/docs/SubmissionDataRequestEvent.md +0 -30
  440. data/docs/SubmissionDataRequestShow.md +0 -62
  441. data/docs/SubmissionDataRequestToken.md +0 -24
  442. data/docs/SubmissionPreview.md +0 -64
  443. data/docs/SuccessErrorResponse.md +0 -20
  444. data/docs/SuccessMultipleErrorsResponse.md +0 -20
  445. data/docs/TemplateAddFieldsResponse.md +0 -22
  446. data/docs/TemplateDeleteResponse.md +0 -24
  447. data/docs/TemplateModelCodeResponse.md +0 -22
  448. data/docs/TemplatePreview.md +0 -116
  449. data/docs/TemplatePublishVersionResponse.md +0 -22
  450. data/docs/UpdateHtmlTemplate.md +0 -18
  451. data/docs/UpdatePdfTemplate.md +0 -18
  452. data/docs/UpdateSubmissionDataRequestData.md +0 -42
  453. data/docs/UploadPresignResponse.md +0 -24
  454. data/lib/docspring/models/batch_generate_pdfs201_response.rb +0 -352
  455. data/lib/docspring/models/combined_submission_action.rb +0 -384
  456. data/lib/docspring/models/create_combined_submission_response.rb +0 -324
  457. data/lib/docspring/models/create_custom_file_response.rb +0 -314
  458. data/lib/docspring/models/create_html_template.rb +0 -243
  459. data/lib/docspring/models/create_submission_data_request_event_response.rb +0 -314
  460. data/lib/docspring/models/create_submission_data_request_response.rb +0 -314
  461. data/lib/docspring/models/create_submission_data_request_token_response.rb +0 -314
  462. data/lib/docspring/models/create_submission_response.rb +0 -324
  463. data/lib/docspring/models/error_or_multiple_errors_response.rb +0 -290
  464. data/lib/docspring/models/forbidden_error_response.rb +0 -323
  465. data/lib/docspring/models/json_schema.rb +0 -329
  466. data/lib/docspring/models/list_submissions_response.rb +0 -283
  467. data/lib/docspring/models/multiple_errors_response.rb +0 -296
  468. data/lib/docspring/models/submission422_response.rb +0 -299
  469. data/lib/docspring/models/submission_batch_with_submissions.rb +0 -433
  470. data/lib/docspring/models/submission_data_request.rb +0 -570
  471. data/lib/docspring/models/submission_data_request_token.rb +0 -279
  472. data/lib/docspring/models/submission_preview.rb +0 -637
  473. data/lib/docspring/models/success_multiple_errors_response.rb +0 -279
  474. data/lib/docspring/models/template_add_fields_response.rb +0 -290
  475. data/lib/docspring/models/template_delete_response.rb +0 -300
  476. data/lib/docspring/models/template_publish_version_response.rb +0 -305
  477. data/lib/docspring/models/update_html_template.rb +0 -243
  478. data/lib/docspring/models/update_pdf_template.rb +0 -243
  479. data/spec/models/add_fields_data_spec.rb +0 -36
  480. data/spec/models/combined_submission_action_spec.rb +0 -84
  481. data/spec/models/create_combined_submission_response_spec.rb +0 -64
  482. data/spec/models/create_custom_file_response_spec.rb +0 -58
  483. data/spec/models/create_folder_data_spec.rb +0 -36
  484. data/spec/models/create_html_template_spec.rb +0 -36
  485. data/spec/models/create_pdf_template_spec.rb +0 -36
  486. data/spec/models/create_submission_data_request_event_request_spec.rb +0 -62
  487. data/spec/models/create_submission_data_request_event_response_spec.rb +0 -58
  488. data/spec/models/create_submission_data_request_response_spec.rb +0 -58
  489. data/spec/models/create_submission_data_request_token_response_spec.rb +0 -58
  490. data/spec/models/create_webhook_data_spec.rb +0 -36
  491. data/spec/models/error_or_multiple_errors_response_spec.rb +0 -52
  492. data/spec/models/forbidden_error_response_spec.rb +0 -56
  493. data/spec/models/move_folder_data_spec.rb +0 -36
  494. data/spec/models/multiple_errors_response_spec.rb +0 -46
  495. data/spec/models/restore_version_data_spec.rb +0 -36
  496. data/spec/models/submission422_response_spec.rb +0 -58
  497. data/spec/models/success_error_response_spec.rb +0 -46
  498. data/spec/models/success_multiple_errors_response_spec.rb +0 -46
  499. data/spec/models/template_add_fields_response_spec.rb +0 -52
  500. data/spec/models/template_delete_response_spec.rb +0 -58
  501. data/spec/models/template_publish_version_response_spec.rb +0 -52
  502. data/spec/models/update_html_template_spec.rb +0 -36
  503. data/spec/models/update_pdf_template_spec.rb +0 -36
  504. data/spec/models/update_submission_data_request_data_spec.rb +0 -116
  505. data/spec/models/update_webhook_data_spec.rb +0 -36
@@ -0,0 +1,396 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module DocSpring
6
+ # Raised before a request is sent when the API would reject it with a 422. `details` are the API's error details:
7
+ # hashes with 'code', 'message' and a 'pointer' into the body (or a 'parameter' for a query parameter).
8
+ class ValidationError < ArgumentError
9
+ attr_reader :details
10
+
11
+ def initialize(details)
12
+ @details = details
13
+ shown = details.first(3).map do |detail|
14
+ subject = detail['pointer'] == '' ? 'the request body' : (detail['pointer'] || detail['parameter'])
15
+ "#{subject} #{detail['message']}"
16
+ end
17
+ message = "Invalid request: #{shown.join('; ')}"
18
+ message += " (and #{details.size - 3} more)" if details.size > 3
19
+ super(message)
20
+ end
21
+ end
22
+
23
+ # Checks a request against API v2's request schemas (request_schemas.json, the schemas the API validates requests
24
+ # with) before it's sent, and says what the API would say about it. api_clients/validator_conformance checks that it
25
+ # agrees with the API.
26
+ module RequestValidator
27
+ TYPE_NAMES = {
28
+ 'string' => 'a string',
29
+ 'integer' => 'an integer',
30
+ 'number' => 'a number',
31
+ 'boolean' => 'true or false',
32
+ 'object' => 'an object',
33
+ 'array' => 'an array',
34
+ 'null' => 'null',
35
+ }.freeze
36
+ # What a multipart body's file field holds when the API checks it
37
+ FILE_PLACEHOLDER = '(file)'
38
+ # A date and time as the API reads it (Ruby's DateTime.rfc3339, then json_schemer's checks)
39
+ DATE_TIME = /\A\s*(-?\d{4})-(\d{2})-(\d{2})[Tt\s](\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:[Zz]|([+-])(\d{2}):(\d{2}))\z/
40
+ # An absolute URI as the API reads it (RFC 3986, as Ruby's URI parser has it), a little looser for IP addresses
41
+ # Lookaheads check the escapes, so only character classes repeat: Java and PHP recurse on each repetition of a group
42
+ URI_SEGMENT = '[%!$&-.0-9:;=@A-Z_a-z~/]'
43
+ URI_PATTERN = Regexp.new(
44
+ '\A(?![^?#]*%(?![0-9A-Fa-f]{2}))[A-Za-z][+\-.0-9A-Za-z]*:' \
45
+ '(?://(?:[%!$&-.0-9:;=A-Z_a-z~]*@)?' \
46
+ '(?:\[(?:[0-9A-Fa-f:.]+|[vV][0-9A-Fa-f]+\.[!$&-.0-9:;=A-Z_a-z~]+)\]|[%!$&-.0-9;=A-Z_a-z~]*)' \
47
+ "(?::[0-9]*)?(?:/#{URI_SEGMENT}*)?" \
48
+ "|/(?:(?!/)#{URI_SEGMENT}+)?" \
49
+ "|(?!/)#{URI_SEGMENT}+" \
50
+ '|)' \
51
+ '(?:\?[^#]*)?' \
52
+ '(?:#(?![^#]*%(?![0-9A-Fa-f]{2}))[%!$&-.0-9:;=@A-Z_a-z~/?]*)?\z'
53
+ )
54
+
55
+ class << self
56
+ def schemas
57
+ @schemas ||= JSON.parse(File.read(File.expand_path('request_schemas.json', __dir__)))
58
+ end
59
+
60
+ # Raises a ValidationError when the API would reject the request. `operation` is the SDK method's name
61
+ # (:"Client.create_submission"); `body` is the JSON the SDK sends, or a multipart body's params.
62
+ def validate!(operation, query: {}, body: nil)
63
+ operation_id = operation_ids[operation.to_s.split('.').last]
64
+ return unless operation_id
65
+
66
+ details = errors(operation_id, query: query, body: body)
67
+ raise ValidationError, details if details.any?
68
+ end
69
+
70
+ # The details for a request to an operation (`createSubmission`)
71
+ def errors(operation_id, query: {}, body: nil)
72
+ entry = schemas['operations'].fetch(operation_id)
73
+
74
+ details = []
75
+ if entry['query'] && query && !query.empty?
76
+ params = entry['query']
77
+ schema = {
78
+ 'type' => 'object',
79
+ 'properties' => params.transform_values { |param| param['schema'] },
80
+ 'required' => params.select { |_name, param| param['required'] }.keys,
81
+ 'additionalProperties' => false,
82
+ }
83
+ details.concat(validate_params(schema, stringify_keys(query), 'query'))
84
+ end
85
+ if entry['body'] && !body.nil?
86
+ details.concat(
87
+ if entry['body']['mediaType'] == 'multipart/form-data'
88
+ validate_params(entry['body']['schema'], multipart_values(body), 'body')
89
+ else
90
+ validate(entry['body']['schema'], body.is_a?(String) ? JSON.parse(body) : body, 'body')
91
+ end
92
+ )
93
+ end
94
+ details
95
+ end
96
+
97
+ # The details for `data` checked against `schema` at `location` ('body' or 'query')
98
+ def validate(schema, data, location)
99
+ details = []
100
+ check(schema, data, '', location, details)
101
+ details
102
+ end
103
+
104
+ private
105
+
106
+ def operation_ids
107
+ @operation_ids ||= schemas['operations'].keys.to_h do |operation_id|
108
+ [operation_id.gsub(/([A-Z])/) { "_#{Regexp.last_match(1).downcase}" }, operation_id]
109
+ end
110
+ end
111
+
112
+ def stringify_keys(hash)
113
+ hash.to_h { |key, value| [key.to_s, value] }
114
+ end
115
+
116
+ def multipart_values(body)
117
+ stringify_keys(body).transform_values do |value|
118
+ value.respond_to?(:read) || value.respond_to?(:path) ? FILE_PLACEHOLDER : value
119
+ end
120
+ end
121
+
122
+ # Query and multipart params arrive as strings, which the API converts where the schema types them
123
+ def validate_params(schema, data, location)
124
+ properties = schema['properties'] || {}
125
+ converted = data.to_h { |key, value| [key, convert_param(value, properties[key])] }
126
+ validate(schema, converted, location)
127
+ end
128
+
129
+ def convert_param(value, schema)
130
+ return value unless schema.is_a?(Hash)
131
+
132
+ types = Array(schema['type'])
133
+ return value.map { |item| convert_param(item, schema['items']) } if value.is_a?(Array) && types.include?('array')
134
+ return value unless value.is_a?(String)
135
+
136
+ if types.include?('integer') && value.match?(/\A-?\d+\z/)
137
+ Integer(value, 10)
138
+ elsif types.include?('number') && value.match?(/\A-?\d+(?:\.\d+)?\z/)
139
+ value.include?('.') ? Float(value) : Integer(value, 10)
140
+ elsif types.include?('boolean') && %w[true false].include?(value)
141
+ value == 'true'
142
+ else
143
+ value
144
+ end
145
+ end
146
+
147
+ def resolve(schema)
148
+ while schema.is_a?(Hash) && schema['$ref']
149
+ name = schema['$ref'].delete_prefix('#/components/schemas/')
150
+ schema = schemas['components']['schemas'].fetch(name)
151
+ end
152
+ schema
153
+ end
154
+
155
+ def check(schema, data, pointer, location, details)
156
+ schema = resolve(schema)
157
+ return unless schema.is_a?(Hash)
158
+ return check_union(schema, data, pointer, location, details) if schema['discriminator']
159
+
160
+ if schema.key?('type') && Array(schema['type']).none? { |type| type?(data, type) }
161
+ message = pointer.empty? && location == 'body' ? 'must be a JSON object' : type_message(Array(schema['type']))
162
+ details << detail(location, pointer, 'type', message)
163
+ end
164
+ if schema.key?('enum') && schema['enum'].none? { |value| json_equal?(value, data) }
165
+ details << detail(location, pointer, 'enum', "must be one of: #{schema['enum'].map { |value| to_json(value) }.join(', ')}")
166
+ end
167
+ if schema.key?('const') && !json_equal?(schema['const'], data)
168
+ details << detail(location, pointer, 'const', "must be #{to_json(schema['const'])}")
169
+ end
170
+
171
+ case data
172
+ when String then check_string(schema, data, pointer, location, details)
173
+ when Numeric then check_number(schema, data, pointer, location, details)
174
+ when Array then check_array(schema, data, pointer, location, details)
175
+ when Hash then check_object(schema, data, pointer, location, details)
176
+ end
177
+ end
178
+
179
+ # A union (oneOf with a discriminator): the discriminator property's value picks the variant, and only that one is
180
+ # checked, as the API does
181
+ def check_union(schema, data, pointer, location, details)
182
+ return details << detail(location, pointer, 'type', "must be #{TYPE_NAMES['object']}") unless data.is_a?(Hash)
183
+
184
+ name = schema['discriminator']['propertyName']
185
+ child = "#{pointer}/#{escape(name)}"
186
+ return details << detail(location, child, 'required', 'is required') unless data.key?(name)
187
+
188
+ # [value, $ref] pairs, in the order the API lists them
189
+ mapping = schema['discriminator']['mapping']
190
+ variant = mapping.find { |value, _ref| value == data[name] } if data[name].is_a?(String)
191
+ return check({ '$ref' => variant[1] }, data, pointer, location, details) if variant
192
+
193
+ details << detail(location, child, 'enum', "must be one of: #{mapping.map { |value, _ref| to_json(value) }.join(', ')}")
194
+ end
195
+
196
+ def check_string(schema, data, pointer, location, details)
197
+ length = data.length
198
+ if schema['minLength'] && length < schema['minLength']
199
+ details << detail(
200
+ location,
201
+ pointer,
202
+ 'minLength',
203
+ at_least(schema['minLength'], "must be at least #{count(schema['minLength'], 'character')}")
204
+ )
205
+ end
206
+ if schema['maxLength'] && length > schema['maxLength']
207
+ details << detail(location, pointer, 'maxLength', "must be at most #{count(schema['maxLength'], 'character')}")
208
+ end
209
+ if schema['pattern'] && !pattern(schema['pattern']).match?(data)
210
+ details << detail(location, pointer, 'pattern', schema['x-pattern-message'] || "must match the pattern #{schema['pattern']}")
211
+ end
212
+ return unless schema['format'] && !format?(schema['format'], data)
213
+
214
+ message = schemas['formatMessages'][schema['format']] || "must be a valid #{schema['format']}"
215
+ details << detail(location, pointer, 'format', message)
216
+ end
217
+
218
+ def check_number(schema, data, pointer, location, details)
219
+ details << detail(location, pointer, 'minimum', "must be at least #{schema['minimum']}") if schema['minimum'] && data < schema['minimum']
220
+ details << detail(location, pointer, 'maximum', "must be at most #{schema['maximum']}") if schema['maximum'] && data > schema['maximum']
221
+ if schema['exclusiveMinimum'] && data <= schema['exclusiveMinimum']
222
+ details << detail(location, pointer, 'exclusiveMinimum', "must be greater than #{schema['exclusiveMinimum']}")
223
+ end
224
+ return unless schema['exclusiveMaximum'] && data >= schema['exclusiveMaximum']
225
+
226
+ details << detail(location, pointer, 'exclusiveMaximum', "must be less than #{schema['exclusiveMaximum']}")
227
+ end
228
+
229
+ def check_array(schema, data, pointer, location, details)
230
+ if schema['minItems'] && data.size < schema['minItems']
231
+ details << detail(location, pointer, 'minItems', at_least(schema['minItems'], "must have at least #{count(schema['minItems'], 'item')}"))
232
+ end
233
+ if schema['maxItems'] && data.size > schema['maxItems']
234
+ details << detail(location, pointer, 'maxItems', "must have at most #{count(schema['maxItems'], 'item')}")
235
+ end
236
+ if schema['uniqueItems'] && !unique?(data)
237
+ duplicate = data.tally.find { |_value, times| times > 1 }
238
+ message = duplicate ? "has #{to_json(duplicate.first)} more than once" : "can't contain the same item twice"
239
+ details << detail(location, pointer, 'uniqueItems', message)
240
+ end
241
+ return unless schema['items']
242
+
243
+ data.each_with_index { |item, index| check(schema['items'], item, "#{pointer}/#{index}", location, details) }
244
+ end
245
+
246
+ def check_object(schema, data, pointer, location, details)
247
+ missing = Array(schema['required']).reject { |name| data.key?(name) }
248
+ missing.each { |name| details << detail(location, "#{pointer}/#{escape(name)}", 'required', 'is required') }
249
+
250
+ properties = schema['properties'] || {}
251
+ data.each do |name, value|
252
+ child = "#{pointer}/#{escape(name)}"
253
+ if properties.key?(name)
254
+ check(properties[name], value, child, location, details)
255
+ elsif schema['additionalProperties'] == false
256
+ details << unknown_property(schema, name, child, location)
257
+ elsif schema['additionalProperties'].is_a?(Hash)
258
+ check(schema['additionalProperties'], value, child, location, details)
259
+ end
260
+ end
261
+ end
262
+
263
+ def unknown_property(schema, name, pointer, location)
264
+ not_allowed = (schema['x-not-allowed-properties'] || {})[name]
265
+ return detail(location, pointer, 'not_allowed', not_allowed) if not_allowed
266
+
267
+ noun = location == 'query' ? 'query parameter' : 'property'
268
+ message = schema['x-unknown-property-message'] || "isn't a documented #{noun}"
269
+ snake = underscore(name)
270
+ if snake != name && (schema['properties'] || {}).key?(snake)
271
+ message += ". API v2 names #{noun == 'property' ? 'properties' : 'query parameters'} in snake_case: '#{snake}'"
272
+ message = "#{schema['x-unknown-property-message']}. API v2 names settings in snake_case: '#{snake}'" if schema['x-unknown-property-message']
273
+ end
274
+ detail(location, pointer, 'unknown_property', message)
275
+ end
276
+
277
+ def detail(location, pointer, code, message)
278
+ return { 'code' => code, 'message' => message, 'pointer' => pointer } unless location == 'query'
279
+
280
+ parameter = pointer.delete_prefix('/').split('/').first.to_s.gsub('~1', '/').gsub('~0', '~')
281
+ { 'code' => code, 'message' => message, 'parameter' => parameter }
282
+ end
283
+
284
+ def type?(data, type)
285
+ case type
286
+ when 'string' then data.is_a?(String)
287
+ when 'integer' then data.is_a?(Integer) || (data.is_a?(Float) && data.finite? && data == data.floor)
288
+ when 'number' then data.is_a?(Numeric)
289
+ when 'boolean' then [true, false].include?(data)
290
+ when 'object' then data.is_a?(Hash)
291
+ when 'array' then data.is_a?(Array)
292
+ when 'null' then data.nil?
293
+ else false
294
+ end
295
+ end
296
+
297
+ # Patterns are ECMA-262 regexps, as OpenAPI says: ^ and $ are the start and end of the value, not of a line. The
298
+ # API's patterns only use ^ as the first character and $ as the last (api_clients/scripts/extract_request_schemas).
299
+ def pattern(source)
300
+ (@patterns ||= {})[source] ||= begin
301
+ anchored = source.sub(/\A\^/) { '\A' }
302
+ # A $ after an even number of backslashes is the anchor
303
+ anchored = "#{anchored[0...-1]}\\z" if anchored.end_with?('$') && anchored[/\\*\$\z/].size.odd?
304
+ Regexp.new(anchored)
305
+ end
306
+ end
307
+
308
+ def format?(format, data)
309
+ case format
310
+ when 'uri' then uri?(data)
311
+ when 'date-time' then date_time?(data)
312
+ else true
313
+ end
314
+ end
315
+
316
+ # ASCII only, with no whitespace in the query
317
+ def uri?(data)
318
+ data.ascii_only? && !data.match?(/[ \t\n\v\f\r]/) && URI_PATTERN.match?(data)
319
+ end
320
+
321
+ def date_time?(data)
322
+ match = DATE_TIME.match(data)
323
+ return false unless match
324
+
325
+ year, month, day, hour, minute, second = match.captures.first(6).map { |value| Integer(value, 10) }
326
+ return false unless month.between?(1, 12) && day >= 1 && day <= days_in_month(year, month)
327
+ return false unless hour <= 23 && minute <= 59 && second <= 60
328
+
329
+ offset = 0
330
+ if match[7]
331
+ offset_hours = Integer(match[8], 10)
332
+ offset_minutes = Integer(match[9], 10)
333
+ return false unless offset_hours <= 23 && offset_minutes <= 59
334
+
335
+ offset = (match[7] == '-' ? -1 : 1) * ((offset_hours * 60) + offset_minutes)
336
+ end
337
+ # A leap second is only at the end of a UTC day
338
+ second < 60 || ((hour * 60) + minute - offset) % 1440 == 1439
339
+ end
340
+
341
+ # Before the Gregorian calendar (1582), the API's dates are Julian: every fourth year is a leap year
342
+ def days_in_month(year, month)
343
+ leap = (year % 4) == 0 && (year < 1583 || (year % 100).nonzero? || (year % 400) == 0)
344
+ return 29 if month == 2 && leap
345
+
346
+ [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1]
347
+ end
348
+
349
+ def unique?(data)
350
+ data.each_with_index.none? { |item, index| data[(index + 1)..].any? { |other| json_equal?(item, other) } }
351
+ end
352
+
353
+ # JSON equality: numbers by value, objects regardless of key order
354
+ def json_equal?(left, right)
355
+ if left.is_a?(Numeric) && right.is_a?(Numeric)
356
+ left == right
357
+ elsif left.is_a?(Hash) && right.is_a?(Hash)
358
+ left.size == right.size && left.all? { |key, value| right.key?(key) && json_equal?(value, right[key]) }
359
+ elsif left.is_a?(Array) && right.is_a?(Array)
360
+ left.size == right.size && left.zip(right).all? { |a, b| json_equal?(a, b) }
361
+ else
362
+ left == right && left.instance_of?(right.class)
363
+ end
364
+ end
365
+
366
+ def type_message(types)
367
+ names = types.map { |type| TYPE_NAMES.fetch(type, type) }
368
+ connector = names.size > 1 && names.any? { |name| name.include?(' or ') } ? ', or ' : ' or '
369
+ return "must be #{names.first}" if names.size == 1
370
+ return "must be #{names.join(connector)}" if names.size == 2
371
+
372
+ "must be #{names[0..-2].join(', ')}#{connector}#{names.last}"
373
+ end
374
+
375
+ def at_least(limit, message)
376
+ limit == 1 ? "can't be empty" : message
377
+ end
378
+
379
+ def count(number, noun)
380
+ "#{number} #{number == 1 ? noun : "#{noun}s"}"
381
+ end
382
+
383
+ def to_json(value)
384
+ JSON.generate(value, quirks_mode: true)
385
+ end
386
+
387
+ def escape(token)
388
+ token.to_s.gsub('~', '~0').gsub('/', '~1')
389
+ end
390
+
391
+ def underscore(name)
392
+ name.gsub(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2').gsub(/([a-z\d])([A-Z])/, '\1_\2').tr('-', '_').downcase
393
+ end
394
+ end
395
+ end
396
+ end
@@ -1,15 +1,15 @@
1
1
  =begin
2
2
  #DocSpring API
3
3
 
4
- #Use DocSpring's API to programmatically fill out PDF forms, convert HTML to PDFs, merge PDFs, or request legally binding e-signatures. Requests are rate limited per account, and live PDFs use credits: a request over the limit returns 429 with a Retry-After header, and one your credits can't cover returns 402. See [Credits & Rate Limits](https://docspring.com/docs/api-guide/credits-and-rate-limits/).
4
+ #Use DocSpring's API to programmatically fill out PDF forms, convert HTML to PDFs, merge PDFs, or request legally binding e-signatures.
5
5
 
6
- The version of the OpenAPI document: v1
6
+ The version of the OpenAPI document: v2
7
7
 
8
8
  Generated by: https://openapi-generator.tech
9
- Generator version: 7.16.0-DOCSPRING
9
+ Generator version: 7.26.0-DOCSPRING
10
10
 
11
11
  =end
12
12
 
13
13
  module DocSpring
14
- VERSION = '3.5.0'
14
+ VERSION = '4.0.0'
15
15
  end
data/lib/docspring.rb CHANGED
@@ -1,80 +1,152 @@
1
1
  =begin
2
2
  #DocSpring API
3
3
 
4
- #Use DocSpring's API to programmatically fill out PDF forms, convert HTML to PDFs, merge PDFs, or request legally binding e-signatures. Requests are rate limited per account, and live PDFs use credits: a request over the limit returns 429 with a Retry-After header, and one your credits can't cover returns 402. See [Credits & Rate Limits](https://docspring.com/docs/api-guide/credits-and-rate-limits/).
4
+ #Use DocSpring's API to programmatically fill out PDF forms, convert HTML to PDFs, merge PDFs, or request legally binding e-signatures.
5
5
 
6
- The version of the OpenAPI document: v1
6
+ The version of the OpenAPI document: v2
7
7
 
8
8
  Generated by: https://openapi-generator.tech
9
- Generator version: 7.16.0-DOCSPRING
9
+ Generator version: 7.26.0-DOCSPRING
10
10
 
11
11
  =end
12
12
 
13
13
  # Common files
14
14
  require 'docspring/api_client'
15
15
  require 'docspring/api_error'
16
+ require 'docspring/request_validator'
17
+ require 'docspring/api_model_base'
16
18
  require 'docspring/version'
17
19
  require 'docspring/configuration'
18
20
 
19
21
  # Models
20
- require 'docspring/models/add_fields_data'
21
- require 'docspring/models/batch_generate_pdfs201_response'
22
- require 'docspring/models/combine_pdfs_data'
23
- require 'docspring/models/combined_submission'
24
- require 'docspring/models/combined_submission_action'
25
- require 'docspring/models/copy_template_options'
26
- require 'docspring/models/create_combined_submission_response'
27
- require 'docspring/models/create_custom_file_data'
28
- require 'docspring/models/create_custom_file_response'
29
- require 'docspring/models/create_folder_data'
30
- require 'docspring/models/create_html_template'
31
- require 'docspring/models/create_pdf_submission_data'
32
- require 'docspring/models/create_pdf_template'
33
- require 'docspring/models/create_submission_data_request_data'
34
- require 'docspring/models/create_submission_data_request_event_request'
35
- require 'docspring/models/create_submission_data_request_event_response'
36
- require 'docspring/models/create_submission_data_request_response'
37
- require 'docspring/models/create_submission_data_request_token_response'
38
- require 'docspring/models/create_submission_response'
39
- require 'docspring/models/create_webhook_data'
22
+ require 'docspring/models/ai_field_naming_language'
23
+ require 'docspring/models/authentication_check'
24
+ require 'docspring/models/barcode_symbology'
25
+ require 'docspring/models/check_character'
26
+ require 'docspring/models/combined_field_type'
27
+ require 'docspring/models/combined_pdf'
28
+ require 'docspring/models/combined_pdf_files'
29
+ require 'docspring/models/combined_pdf_list'
30
+ require 'docspring/models/combined_pdf_source'
31
+ require 'docspring/models/combined_pdf_source_input'
32
+ require 'docspring/models/combined_pdf_source_pdf'
33
+ require 'docspring/models/combined_pdf_source_type'
34
+ require 'docspring/models/combined_pdf_state'
35
+ require 'docspring/models/copy_template_request'
36
+ require 'docspring/models/create_combined_pdf_request'
37
+ require 'docspring/models/create_custom_file_from_upload_request'
38
+ require 'docspring/models/create_folder_request'
39
+ require 'docspring/models/create_signature_request_event_request'
40
+ require 'docspring/models/create_signature_request_token_request'
41
+ require 'docspring/models/create_submission_batch_request'
42
+ require 'docspring/models/create_submission_request'
43
+ require 'docspring/models/create_template_request'
44
+ require 'docspring/models/create_webhook_request'
40
45
  require 'docspring/models/custom_file'
41
- require 'docspring/models/error_or_multiple_errors_response'
46
+ require 'docspring/models/custom_file_list'
47
+ require 'docspring/models/custom_file_source_pdf'
48
+ require 'docspring/models/error_code'
49
+ require 'docspring/models/error_detail'
50
+ require 'docspring/models/error_info'
42
51
  require 'docspring/models/error_response'
52
+ require 'docspring/models/expiration_interval'
53
+ require 'docspring/models/field_comparison_condition'
54
+ require 'docspring/models/field_comparison_operator'
55
+ require 'docspring/models/field_display_type'
56
+ require 'docspring/models/field_equals_condition'
57
+ require 'docspring/models/field_equals_operator'
58
+ require 'docspring/models/field_in_condition'
59
+ require 'docspring/models/field_override'
60
+ require 'docspring/models/field_presence_condition'
61
+ require 'docspring/models/field_presence_operator'
62
+ require 'docspring/models/field_range_condition'
63
+ require 'docspring/models/field_reimport_state'
64
+ require 'docspring/models/field_setup_logic'
65
+ require 'docspring/models/field_setup_naming'
66
+ require 'docspring/models/field_setup_source'
43
67
  require 'docspring/models/folder'
44
- require 'docspring/models/forbidden_error_response'
45
- require 'docspring/models/json_schema'
46
- require 'docspring/models/list_submissions_response'
47
- require 'docspring/models/move_folder_data'
48
- require 'docspring/models/move_template_data'
49
- require 'docspring/models/multiple_errors_response'
50
- require 'docspring/models/publish_version_data'
51
- require 'docspring/models/rename_folder_data'
52
- require 'docspring/models/restore_version_data'
68
+ require 'docspring/models/folder_list'
69
+ require 'docspring/models/generated_file'
70
+ require 'docspring/models/generated_file_state'
71
+ require 'docspring/models/html_engine_options'
72
+ require 'docspring/models/html_engine_options_input'
73
+ require 'docspring/models/image_gravity'
74
+ require 'docspring/models/image_scale_type'
75
+ require 'docspring/models/model_code_language'
76
+ require 'docspring/models/move_folder_request'
77
+ require 'docspring/models/move_template_request'
78
+ require 'docspring/models/number_condition_type'
79
+ require 'docspring/models/page_format'
80
+ require 'docspring/models/publish_template_version_request'
81
+ require 'docspring/models/rename_folder_request'
82
+ require 'docspring/models/restore_template_version_request'
83
+ require 'docspring/models/shape_type'
84
+ require 'docspring/models/signature_request'
85
+ require 'docspring/models/signature_request_auth_second_factor_type'
86
+ require 'docspring/models/signature_request_auth_type'
87
+ require 'docspring/models/signature_request_event'
88
+ require 'docspring/models/signature_request_event_type'
89
+ require 'docspring/models/signature_request_input'
90
+ require 'docspring/models/signature_request_message_type'
91
+ require 'docspring/models/signature_request_state'
92
+ require 'docspring/models/signature_request_token'
93
+ require 'docspring/models/signature_request_token_type'
94
+ require 'docspring/models/string_condition_type'
53
95
  require 'docspring/models/submission'
54
- require 'docspring/models/submission422_response'
55
96
  require 'docspring/models/submission_action'
97
+ require 'docspring/models/submission_action_state'
98
+ require 'docspring/models/submission_action_type'
56
99
  require 'docspring/models/submission_batch'
57
- require 'docspring/models/submission_batch_data'
58
- require 'docspring/models/submission_batch_with_submissions'
59
- require 'docspring/models/submission_data_request'
60
- require 'docspring/models/submission_data_request_event'
61
- require 'docspring/models/submission_data_request_show'
62
- require 'docspring/models/submission_data_request_token'
63
- require 'docspring/models/submission_preview'
64
- require 'docspring/models/success_error_response'
65
- require 'docspring/models/success_multiple_errors_response'
100
+ require 'docspring/models/submission_batch_state'
101
+ require 'docspring/models/submission_files'
102
+ require 'docspring/models/submission_input'
103
+ require 'docspring/models/submission_list'
104
+ require 'docspring/models/submission_source'
105
+ require 'docspring/models/submission_source_pdf'
106
+ require 'docspring/models/submission_state'
66
107
  require 'docspring/models/template'
67
- require 'docspring/models/template_add_fields_response'
68
- require 'docspring/models/template_delete_response'
69
- require 'docspring/models/template_model_code_response'
70
- require 'docspring/models/template_preview'
71
- require 'docspring/models/template_publish_version_response'
72
- require 'docspring/models/update_html_template'
73
- require 'docspring/models/update_pdf_template'
74
- require 'docspring/models/update_submission_data_request_data'
75
- require 'docspring/models/update_webhook_data'
76
- require 'docspring/models/upload_presign_response'
108
+ require 'docspring/models/template_actor'
109
+ require 'docspring/models/template_actor_type'
110
+ require 'docspring/models/template_defaults'
111
+ require 'docspring/models/template_defaults_input'
112
+ require 'docspring/models/template_document'
113
+ require 'docspring/models/template_document_state'
114
+ require 'docspring/models/template_field_dependency'
115
+ require 'docspring/models/template_field_dependency_action'
116
+ require 'docspring/models/template_field_dependency_condition'
117
+ require 'docspring/models/template_field_dependency_condition_input'
118
+ require 'docspring/models/template_field_dependency_input'
119
+ require 'docspring/models/template_field_dependency_match'
120
+ require 'docspring/models/template_field_dependency_operator'
121
+ require 'docspring/models/template_field_logic_status'
122
+ require 'docspring/models/template_form_mode'
123
+ require 'docspring/models/template_model_code'
124
+ require 'docspring/models/template_page_ai_error'
125
+ require 'docspring/models/template_page_ai_naming_status'
126
+ require 'docspring/models/template_page_fields_status'
127
+ require 'docspring/models/template_page_image_status'
128
+ require 'docspring/models/template_page_processing_status'
129
+ require 'docspring/models/template_source_pdf'
130
+ require 'docspring/models/template_summary'
131
+ require 'docspring/models/template_summary_list'
132
+ require 'docspring/models/template_type'
133
+ require 'docspring/models/template_version'
134
+ require 'docspring/models/template_version_type'
135
+ require 'docspring/models/text_alignment'
136
+ require 'docspring/models/text_overflow'
137
+ require 'docspring/models/text_vertical_alignment'
138
+ require 'docspring/models/typeface'
139
+ require 'docspring/models/update_signature_request_request'
140
+ require 'docspring/models/update_template_document_request'
141
+ require 'docspring/models/update_template_request'
142
+ require 'docspring/models/update_webhook_request'
143
+ require 'docspring/models/upload_method'
144
+ require 'docspring/models/upload_presign'
145
+ require 'docspring/models/url_source_pdf'
77
146
  require 'docspring/models/webhook'
147
+ require 'docspring/models/webhook_event_type'
148
+ require 'docspring/models/webhook_list'
149
+ require 'docspring/models/webhook_mode'
78
150
 
79
151
  # APIs
80
152
  require 'docspring/api/client'