docspring 3.5.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (588) hide show
  1. checksums.yaml +4 -4
  2. data/.openapi-generator/FILES +445 -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 +147 -0
  8. data/Gemfile.lock +7 -7
  9. data/README.md +69 -53
  10. data/docs/AddTemplateFieldsRequest.md +18 -0
  11. data/docs/{RenameFolderData.md → AiFieldNamingLanguage.md} +2 -5
  12. data/docs/AuthenticationCheck.md +18 -0
  13. data/docs/{CreateFolderData.md → BarcodeSymbology.md} +2 -5
  14. data/docs/{CreateWebhookData.md → CheckCharacter.md} +2 -5
  15. data/docs/Client.md +1570 -786
  16. data/docs/{UpdateWebhookData.md → CombinedFieldType.md} +2 -5
  17. data/docs/CombinedPdf.md +44 -0
  18. data/docs/CombinedPdfFiles.md +18 -0
  19. data/docs/CombinedPdfList.md +20 -0
  20. data/docs/CombinedPdfSource.md +26 -0
  21. data/docs/CombinedPdfSourceInput.md +88 -0
  22. data/docs/CombinedPdfSourcePdf.md +20 -0
  23. data/docs/CombinedPdfSourceType.md +15 -0
  24. data/docs/CombinedPdfState.md +15 -0
  25. data/docs/CopyTemplateRequest.md +22 -0
  26. data/docs/CreateCombinedPdfRequest.md +26 -0
  27. data/docs/CreateCustomFileFromUploadRequest.md +18 -0
  28. data/docs/CreateFolderRequest.md +20 -0
  29. data/docs/CreateSignatureRequestEventRequest.md +24 -0
  30. data/docs/CreateSignatureRequestTokenRequest.md +18 -0
  31. data/docs/CreateSubmissionBatchRequest.md +28 -0
  32. data/docs/CreateSubmissionRequest.md +38 -0
  33. data/docs/CreateTemplateRequest.md +102 -0
  34. data/docs/CreateWebhookRequest.md +38 -0
  35. data/docs/CustomFile.md +11 -3
  36. data/docs/CustomFileList.md +20 -0
  37. data/docs/CustomFileSourcePdf.md +20 -0
  38. data/docs/ErrorCode.md +15 -0
  39. data/docs/ErrorDetail.md +26 -0
  40. data/docs/ErrorInfo.md +32 -0
  41. data/docs/ErrorResponse.md +1 -3
  42. data/docs/ExpirationInterval.md +15 -0
  43. data/docs/Field.md +198 -0
  44. data/docs/FieldComparisonCondition.md +22 -0
  45. data/docs/FieldComparisonOperator.md +15 -0
  46. data/docs/FieldDependency.md +22 -0
  47. data/docs/FieldDependencyInput.md +22 -0
  48. data/docs/FieldDisplayType.md +15 -0
  49. data/docs/FieldEqualsCondition.md +22 -0
  50. data/docs/FieldEqualsOperator.md +15 -0
  51. data/docs/FieldGroup.md +32 -0
  52. data/docs/FieldGroupInput.md +30 -0
  53. data/docs/FieldGroupType.md +15 -0
  54. data/docs/FieldInCondition.md +22 -0
  55. data/docs/FieldInput.md +196 -0
  56. data/docs/FieldOverride.md +142 -0
  57. data/docs/FieldPresenceCondition.md +20 -0
  58. data/docs/FieldPresenceOperator.md +15 -0
  59. data/docs/FieldRangeCondition.md +24 -0
  60. data/docs/FieldReimportState.md +15 -0
  61. data/docs/FieldSetupLogic.md +15 -0
  62. data/docs/FieldSetupNaming.md +15 -0
  63. data/docs/FieldSetupSource.md +15 -0
  64. data/docs/FieldType.md +15 -0
  65. data/docs/Folder.md +9 -5
  66. data/docs/FolderList.md +20 -0
  67. data/docs/GenerateFilesFormat.md +15 -0
  68. data/docs/GenerateSubmissionFilesRequest.md +18 -0
  69. data/docs/GeneratedFile.md +32 -0
  70. data/docs/GeneratedFileState.md +15 -0
  71. data/docs/HtmlEngineOptions.md +36 -0
  72. data/docs/HtmlEngineOptionsInput.md +36 -0
  73. data/docs/ImageGravity.md +15 -0
  74. data/docs/ImageScaleType.md +15 -0
  75. data/docs/ModelCodeLanguage.md +15 -0
  76. data/docs/MoveFolderRequest.md +18 -0
  77. data/docs/MoveTemplateRequest.md +18 -0
  78. data/docs/NumberConditionType.md +15 -0
  79. data/docs/OutputFormat.md +15 -0
  80. data/docs/PageFormat.md +15 -0
  81. data/docs/PageImage.md +34 -0
  82. data/docs/PageImages.md +24 -0
  83. data/docs/PredefinedField.md +30 -0
  84. data/docs/PredefinedFieldInput.md +30 -0
  85. data/docs/PublishTemplateVersionRequest.md +20 -0
  86. data/docs/RemoveTemplateFieldsRequest.md +18 -0
  87. data/docs/RenameFolderRequest.md +18 -0
  88. data/docs/ReorderTemplateFieldsRequest.md +18 -0
  89. data/docs/RestoreTemplateVersionRequest.md +18 -0
  90. data/docs/ShapeType.md +15 -0
  91. data/docs/SignatureRequest.md +66 -0
  92. data/docs/SignatureRequestAuthSecondFactorType.md +15 -0
  93. data/docs/SignatureRequestAuthType.md +15 -0
  94. data/docs/SignatureRequestEvent.md +32 -0
  95. data/docs/SignatureRequestEventType.md +15 -0
  96. data/docs/SignatureRequestInput.md +46 -0
  97. data/docs/SignatureRequestMessageType.md +15 -0
  98. data/docs/SignatureRequestState.md +15 -0
  99. data/docs/SignatureRequestToken.md +30 -0
  100. data/docs/SignatureRequestTokenType.md +15 -0
  101. data/docs/StringConditionType.md +15 -0
  102. data/docs/Submission.md +43 -47
  103. data/docs/SubmissionAction.md +6 -8
  104. data/docs/SubmissionActionState.md +15 -0
  105. data/docs/SubmissionActionType.md +15 -0
  106. data/docs/SubmissionBatch.md +16 -10
  107. data/docs/SubmissionBatchState.md +15 -0
  108. data/docs/SubmissionFiles.md +24 -0
  109. data/docs/SubmissionInput.md +40 -0
  110. data/docs/SubmissionList.md +20 -0
  111. data/docs/SubmissionSource.md +15 -0
  112. data/docs/SubmissionSourcePdf.md +20 -0
  113. data/docs/SubmissionState.md +15 -0
  114. data/docs/SubmissionValidation.md +24 -0
  115. data/docs/Template.md +79 -107
  116. data/docs/TemplateActor.md +26 -0
  117. data/docs/TemplateActorType.md +15 -0
  118. data/docs/TemplateDefaults.md +56 -0
  119. data/docs/TemplateDefaultsInput.md +56 -0
  120. data/docs/TemplateDiff.md +30 -0
  121. data/docs/TemplateDiffSummary.md +28 -0
  122. data/docs/TemplateDocument.md +40 -0
  123. data/docs/TemplateDocumentState.md +15 -0
  124. data/docs/TemplateFieldChange.md +24 -0
  125. data/docs/TemplateFieldChanges.md +24 -0
  126. data/docs/TemplateFieldDependency.md +26 -0
  127. data/docs/TemplateFieldDependencyAction.md +15 -0
  128. data/docs/TemplateFieldDependencyCondition.md +24 -0
  129. data/docs/TemplateFieldDependencyConditionInput.md +93 -0
  130. data/docs/TemplateFieldDependencyInput.md +26 -0
  131. data/docs/TemplateFieldDependencyMatch.md +15 -0
  132. data/docs/TemplateFieldDependencyOperator.md +15 -0
  133. data/docs/TemplateFieldLogicStatus.md +15 -0
  134. data/docs/TemplateFieldMove.md +22 -0
  135. data/docs/TemplateFields.md +22 -0
  136. data/docs/TemplateFormMode.md +15 -0
  137. data/docs/TemplateModelCode.md +22 -0
  138. data/docs/TemplatePageAiError.md +15 -0
  139. data/docs/TemplatePageAiNamingStatus.md +15 -0
  140. data/docs/TemplatePageFieldsStatus.md +15 -0
  141. data/docs/TemplatePageImageStatus.md +15 -0
  142. data/docs/TemplatePageImages.md +24 -0
  143. data/docs/TemplatePageProcessingStatus.md +26 -0
  144. data/docs/TemplateSourcePdf.md +24 -0
  145. data/docs/TemplateSummary.md +90 -0
  146. data/docs/TemplateSummaryList.md +20 -0
  147. data/docs/TemplateType.md +15 -0
  148. data/docs/TemplateVersion.md +24 -0
  149. data/docs/TemplateVersionType.md +15 -0
  150. data/docs/TextAlignment.md +15 -0
  151. data/docs/TextOverflow.md +15 -0
  152. data/docs/TextVerticalAlignment.md +15 -0
  153. data/docs/Typeface.md +15 -0
  154. data/docs/UpdateSignatureRequestRequest.md +34 -0
  155. data/docs/UpdateTemplateDocumentRequest.md +26 -0
  156. data/docs/UpdateTemplateFieldsRequest.md +18 -0
  157. data/docs/UpdateTemplateRequest.md +86 -0
  158. data/docs/UpdateWebhookRequest.md +38 -0
  159. data/docs/UploadMethod.md +15 -0
  160. data/docs/UploadPresign.md +24 -0
  161. data/docs/UrlSourcePdf.md +20 -0
  162. data/docs/ValidateSubmissionRequest.md +38 -0
  163. data/docs/Webhook.md +20 -20
  164. data/docs/WebhookEventType.md +15 -0
  165. data/docs/WebhookList.md +20 -0
  166. data/docs/WebhookMode.md +15 -0
  167. data/docspring.gemspec +3 -3
  168. data/lib/docspring/api/client.rb +1606 -905
  169. data/lib/docspring/api_client.rb +14 -6
  170. data/lib/docspring/api_error.rb +3 -3
  171. data/lib/docspring/api_model_base.rb +88 -0
  172. data/lib/docspring/configuration.rb +12 -7
  173. data/lib/docspring/models/add_template_fields_request.rb +187 -0
  174. data/lib/docspring/models/ai_field_naming_language.rb +42 -0
  175. data/lib/docspring/models/authentication_check.rb +185 -0
  176. data/lib/docspring/models/barcode_symbology.rb +47 -0
  177. data/lib/docspring/models/check_character.rb +44 -0
  178. data/lib/docspring/models/combined_field_type.rb +41 -0
  179. data/lib/docspring/models/{combined_submission.rb → combined_pdf.rb} +228 -206
  180. data/lib/docspring/models/combined_pdf_files.rb +167 -0
  181. data/lib/docspring/models/combined_pdf_list.rb +200 -0
  182. data/lib/docspring/models/{create_webhook_data.rb → combined_pdf_source.rb} +107 -103
  183. data/lib/docspring/models/combined_pdf_source_input.rb +62 -0
  184. data/lib/docspring/models/combined_pdf_source_pdf.rb +212 -0
  185. data/lib/docspring/models/combined_pdf_source_type.rb +44 -0
  186. data/lib/docspring/models/combined_pdf_state.rb +44 -0
  187. data/lib/docspring/models/{copy_template_options.rb → copy_template_request.rb} +32 -87
  188. data/lib/docspring/models/{combine_pdfs_data.rb → create_combined_pdf_request.rb} +60 -123
  189. data/lib/docspring/models/{create_custom_file_data.rb → create_custom_file_from_upload_request.rb} +29 -96
  190. data/lib/docspring/models/{move_template_data.rb → create_folder_request.rb} +60 -102
  191. data/lib/docspring/models/{create_submission_data_request_event_request.rb → create_signature_request_event_request.rb} +50 -122
  192. data/lib/docspring/models/create_signature_request_token_request.rb +190 -0
  193. data/lib/docspring/models/{submission_batch_data.rb → create_submission_batch_request.rb} +75 -108
  194. data/lib/docspring/models/{create_pdf_submission_data.rb → create_submission_request.rb} +114 -144
  195. data/lib/docspring/models/create_template_request.rb +646 -0
  196. data/lib/docspring/models/create_webhook_request.rb +368 -0
  197. data/lib/docspring/models/custom_file.rb +132 -95
  198. data/lib/docspring/models/custom_file_list.rb +200 -0
  199. data/lib/docspring/models/custom_file_source_pdf.rb +212 -0
  200. data/lib/docspring/models/error_code.rb +60 -0
  201. data/lib/docspring/models/error_detail.rb +242 -0
  202. data/lib/docspring/models/error_info.rb +316 -0
  203. data/lib/docspring/models/error_response.rb +28 -138
  204. data/lib/docspring/models/expiration_interval.rb +42 -0
  205. data/lib/docspring/models/field.rb +2217 -0
  206. data/lib/docspring/models/field_comparison_condition.rb +247 -0
  207. data/lib/docspring/models/field_comparison_operator.rb +43 -0
  208. data/lib/docspring/models/field_dependency.rb +246 -0
  209. data/lib/docspring/models/field_dependency_input.rb +246 -0
  210. data/lib/docspring/models/field_display_type.rb +45 -0
  211. data/lib/docspring/models/field_equals_condition.rb +247 -0
  212. data/lib/docspring/models/field_equals_operator.rb +41 -0
  213. data/lib/docspring/models/field_group.rb +368 -0
  214. data/lib/docspring/models/field_group_input.rb +247 -0
  215. data/lib/docspring/models/field_group_type.rb +41 -0
  216. data/lib/docspring/models/{create_folder_data.rb → field_in_condition.rb} +101 -103
  217. data/lib/docspring/models/field_input.rb +1109 -0
  218. data/lib/docspring/models/field_override.rb +829 -0
  219. data/lib/docspring/models/field_presence_condition.rb +234 -0
  220. data/lib/docspring/models/field_presence_operator.rb +41 -0
  221. data/lib/docspring/models/field_range_condition.rb +234 -0
  222. data/lib/docspring/models/field_reimport_state.rb +43 -0
  223. data/lib/docspring/models/field_setup_logic.rb +41 -0
  224. data/lib/docspring/models/field_setup_naming.rb +41 -0
  225. data/lib/docspring/models/field_setup_source.rb +42 -0
  226. data/lib/docspring/models/field_type.rb +54 -0
  227. data/lib/docspring/models/folder.rb +134 -93
  228. data/lib/docspring/models/folder_list.rb +200 -0
  229. data/lib/docspring/models/generate_files_format.rb +40 -0
  230. data/lib/docspring/models/generate_submission_files_request.rb +187 -0
  231. data/lib/docspring/models/generated_file.rb +326 -0
  232. data/lib/docspring/models/generated_file_state.rb +42 -0
  233. data/lib/docspring/models/html_engine_options.rb +416 -0
  234. data/lib/docspring/models/html_engine_options_input.rb +280 -0
  235. data/lib/docspring/models/image_gravity.rb +48 -0
  236. data/lib/docspring/models/image_scale_type.rb +42 -0
  237. data/lib/docspring/models/model_code_language.rb +48 -0
  238. data/lib/docspring/models/{move_folder_data.rb → move_folder_request.rb} +31 -87
  239. data/lib/docspring/models/move_template_request.rb +171 -0
  240. data/lib/docspring/models/number_condition_type.rb +45 -0
  241. data/lib/docspring/models/output_format.rb +41 -0
  242. data/lib/docspring/models/page_format.rb +52 -0
  243. data/lib/docspring/models/page_image.rb +359 -0
  244. data/lib/docspring/models/page_images.rb +248 -0
  245. data/lib/docspring/models/predefined_field.rb +287 -0
  246. data/lib/docspring/models/predefined_field_input.rb +287 -0
  247. data/lib/docspring/models/{publish_version_data.rb → publish_template_version_request.rb} +64 -99
  248. data/lib/docspring/models/remove_template_fields_request.rb +187 -0
  249. data/lib/docspring/models/{rename_folder_data.rb → rename_folder_request.rb} +29 -87
  250. data/lib/docspring/models/reorder_template_fields_request.rb +187 -0
  251. data/lib/docspring/models/{restore_version_data.rb → restore_template_version_request.rb} +29 -87
  252. data/lib/docspring/models/shape_type.rb +45 -0
  253. data/lib/docspring/models/{submission_data_request_show.rb → signature_request.rb} +240 -171
  254. data/lib/docspring/models/signature_request_auth_second_factor_type.rb +45 -0
  255. data/lib/docspring/models/signature_request_auth_type.rb +46 -0
  256. data/lib/docspring/models/{submission_data_request_event.rb → signature_request_event.rb} +137 -122
  257. data/lib/docspring/models/signature_request_event_type.rb +45 -0
  258. data/lib/docspring/models/{update_submission_data_request_data.rb → signature_request_input.rb} +156 -173
  259. data/lib/docspring/models/signature_request_message_type.rb +48 -0
  260. data/lib/docspring/models/signature_request_state.rb +42 -0
  261. data/lib/docspring/models/signature_request_token.rb +369 -0
  262. data/lib/docspring/models/signature_request_token_type.rb +41 -0
  263. data/lib/docspring/models/string_condition_type.rb +44 -0
  264. data/lib/docspring/models/submission.rb +399 -335
  265. data/lib/docspring/models/submission_action.rb +64 -136
  266. data/lib/docspring/models/submission_action_state.rb +43 -0
  267. data/lib/docspring/models/submission_action_type.rb +46 -0
  268. data/lib/docspring/models/submission_batch.rb +157 -112
  269. data/lib/docspring/models/submission_batch_state.rb +42 -0
  270. data/lib/docspring/models/submission_files.rb +197 -0
  271. data/lib/docspring/models/submission_input.rb +296 -0
  272. data/lib/docspring/models/submission_list.rb +200 -0
  273. data/lib/docspring/models/submission_source.rb +43 -0
  274. data/lib/docspring/models/submission_source_pdf.rb +212 -0
  275. data/lib/docspring/models/submission_state.rb +52 -0
  276. data/lib/docspring/models/submission_validation.rb +234 -0
  277. data/lib/docspring/models/template.rb +528 -736
  278. data/lib/docspring/models/template_actor.rb +259 -0
  279. data/lib/docspring/models/template_actor_type.rb +42 -0
  280. data/lib/docspring/models/template_defaults.rb +395 -0
  281. data/lib/docspring/models/template_defaults_input.rb +395 -0
  282. data/lib/docspring/models/template_diff.rb +321 -0
  283. data/lib/docspring/models/template_diff_summary.rb +320 -0
  284. data/lib/docspring/models/template_document.rb +396 -0
  285. data/lib/docspring/models/template_document_state.rb +46 -0
  286. data/lib/docspring/models/template_field_change.rb +266 -0
  287. data/lib/docspring/models/template_field_changes.rb +274 -0
  288. data/lib/docspring/models/{success_error_response.rb → template_field_dependency.rb} +122 -114
  289. data/lib/docspring/models/template_field_dependency_action.rb +42 -0
  290. data/lib/docspring/models/{create_pdf_template.rb → template_field_dependency_condition.rb} +116 -103
  291. data/lib/docspring/models/template_field_dependency_condition_input.rb +67 -0
  292. data/lib/docspring/models/template_field_dependency_input.rb +285 -0
  293. data/lib/docspring/models/template_field_dependency_match.rb +41 -0
  294. data/lib/docspring/models/template_field_dependency_operator.rb +49 -0
  295. data/lib/docspring/models/template_field_logic_status.rb +44 -0
  296. data/lib/docspring/models/{update_webhook_data.rb → template_field_move.rb} +99 -103
  297. data/lib/docspring/models/{add_fields_data.rb → template_fields.rb} +71 -89
  298. data/lib/docspring/models/template_form_mode.rb +42 -0
  299. data/lib/docspring/models/{template_model_code_response.rb → template_model_code.rb} +37 -96
  300. data/lib/docspring/models/template_page_ai_error.rb +43 -0
  301. data/lib/docspring/models/template_page_ai_naming_status.rb +41 -0
  302. data/lib/docspring/models/template_page_fields_status.rb +44 -0
  303. data/lib/docspring/models/template_page_image_status.rb +41 -0
  304. data/lib/docspring/models/template_page_images.rb +254 -0
  305. data/lib/docspring/models/template_page_processing_status.rb +275 -0
  306. data/lib/docspring/models/{update_pdf_template.rb → template_source_pdf.rb} +92 -103
  307. data/lib/docspring/models/{template_preview.rb → template_summary.rb} +436 -589
  308. data/lib/docspring/models/template_summary_list.rb +200 -0
  309. data/lib/docspring/models/template_type.rb +41 -0
  310. data/lib/docspring/models/template_version.rb +238 -0
  311. data/lib/docspring/models/template_version_type.rb +42 -0
  312. data/lib/docspring/models/text_alignment.rb +43 -0
  313. data/lib/docspring/models/text_overflow.rb +41 -0
  314. data/lib/docspring/models/text_vertical_alignment.rb +42 -0
  315. data/lib/docspring/models/typeface.rb +56 -0
  316. data/lib/docspring/models/{create_submission_data_request_data.rb → update_signature_request_request.rb} +72 -196
  317. data/lib/docspring/models/update_template_document_request.rb +208 -0
  318. data/lib/docspring/models/update_template_fields_request.rb +187 -0
  319. data/lib/docspring/models/update_template_request.rb +551 -0
  320. data/lib/docspring/models/update_webhook_request.rb +344 -0
  321. data/lib/docspring/models/upload_method.rb +40 -0
  322. data/lib/docspring/models/{upload_presign_response.rb → upload_presign.rb} +93 -140
  323. data/lib/docspring/models/url_source_pdf.rb +212 -0
  324. data/lib/docspring/models/validate_submission_request.rb +288 -0
  325. data/lib/docspring/models/webhook.rb +97 -107
  326. data/lib/docspring/models/webhook_event_type.rb +64 -0
  327. data/lib/docspring/models/webhook_list.rb +200 -0
  328. data/lib/docspring/models/webhook_mode.rb +41 -0
  329. data/lib/docspring/request_schemas.json +4967 -0
  330. data/lib/docspring/request_validator.rb +396 -0
  331. data/lib/docspring/version.rb +4 -4
  332. data/lib/docspring.rb +153 -53
  333. data/spec/api/client_spec.rb +411 -265
  334. data/spec/models/add_template_fields_request_spec.rb +36 -0
  335. data/spec/models/ai_field_naming_language_spec.rb +30 -0
  336. data/spec/models/authentication_check_spec.rb +36 -0
  337. data/spec/models/barcode_symbology_spec.rb +30 -0
  338. data/spec/models/check_character_spec.rb +30 -0
  339. data/spec/models/combined_field_type_spec.rb +30 -0
  340. data/spec/models/combined_pdf_files_spec.rb +36 -0
  341. data/spec/models/combined_pdf_list_spec.rb +42 -0
  342. data/spec/models/combined_pdf_source_input_spec.rb +44 -0
  343. data/spec/models/combined_pdf_source_pdf_spec.rb +42 -0
  344. data/spec/models/{submission_data_request_token_spec.rb → combined_pdf_source_spec.rb} +18 -12
  345. data/spec/models/combined_pdf_source_type_spec.rb +30 -0
  346. data/spec/models/{combined_submission_spec.rb → combined_pdf_spec.rb} +20 -24
  347. data/spec/models/combined_pdf_state_spec.rb +30 -0
  348. data/spec/models/{copy_template_options_spec.rb → copy_template_request_spec.rb} +9 -9
  349. data/spec/models/{combine_pdfs_data_spec.rb → create_combined_pdf_request_spec.rb} +12 -18
  350. data/spec/models/{create_custom_file_data_spec.rb → create_custom_file_from_upload_request_spec.rb} +9 -9
  351. data/spec/models/{move_template_data_spec.rb → create_folder_request_spec.rb} +11 -11
  352. data/spec/models/{list_submissions_response_spec.rb → create_signature_request_event_request_spec.rb} +18 -12
  353. data/spec/models/create_signature_request_token_request_spec.rb +36 -0
  354. data/spec/models/{submission_batch_data_spec.rb → create_submission_batch_request_spec.rb} +19 -13
  355. data/spec/models/{create_pdf_submission_data_spec.rb → create_submission_request_spec.rb} +29 -17
  356. data/spec/models/{template_preview_spec.rb → create_template_request_spec.rb} +49 -103
  357. data/spec/models/create_webhook_request_spec.rb +96 -0
  358. data/spec/models/custom_file_list_spec.rb +42 -0
  359. data/spec/models/custom_file_source_pdf_spec.rb +42 -0
  360. data/spec/models/custom_file_spec.rb +29 -5
  361. data/spec/models/error_code_spec.rb +30 -0
  362. data/spec/models/{create_submission_response_spec.rb → error_detail_spec.rb} +14 -18
  363. data/spec/models/{batch_generate_pdfs201_response_spec.rb → error_info_spec.rb} +27 -19
  364. data/spec/models/error_response_spec.rb +4 -14
  365. data/spec/models/expiration_interval_spec.rb +30 -0
  366. data/spec/models/field_comparison_condition_spec.rb +48 -0
  367. data/spec/models/field_comparison_operator_spec.rb +30 -0
  368. data/spec/models/field_dependency_input_spec.rb +48 -0
  369. data/spec/models/field_dependency_spec.rb +48 -0
  370. data/spec/models/field_display_type_spec.rb +30 -0
  371. data/spec/models/field_equals_condition_spec.rb +48 -0
  372. data/spec/models/field_equals_operator_spec.rb +30 -0
  373. data/spec/models/field_group_input_spec.rb +72 -0
  374. data/spec/models/field_group_spec.rb +78 -0
  375. data/spec/models/field_group_type_spec.rb +30 -0
  376. data/spec/models/field_in_condition_spec.rb +48 -0
  377. data/spec/models/field_input_spec.rb +570 -0
  378. data/spec/models/field_override_spec.rb +408 -0
  379. data/spec/models/field_presence_condition_spec.rb +42 -0
  380. data/spec/models/field_presence_operator_spec.rb +30 -0
  381. data/spec/models/field_range_condition_spec.rb +54 -0
  382. data/spec/models/field_reimport_state_spec.rb +30 -0
  383. data/spec/models/field_setup_logic_spec.rb +30 -0
  384. data/spec/models/field_setup_naming_spec.rb +30 -0
  385. data/spec/models/field_setup_source_spec.rb +30 -0
  386. data/spec/models/field_spec.rb +576 -0
  387. data/spec/models/field_type_spec.rb +30 -0
  388. data/spec/models/folder_list_spec.rb +42 -0
  389. data/spec/models/folder_spec.rb +16 -4
  390. data/spec/models/generate_files_format_spec.rb +30 -0
  391. data/spec/models/generate_submission_files_request_spec.rb +36 -0
  392. data/spec/models/generated_file_spec.rb +78 -0
  393. data/spec/models/generated_file_state_spec.rb +30 -0
  394. data/spec/models/html_engine_options_input_spec.rb +90 -0
  395. data/spec/models/html_engine_options_spec.rb +90 -0
  396. data/spec/models/image_gravity_spec.rb +30 -0
  397. data/spec/models/image_scale_type_spec.rb +30 -0
  398. data/spec/models/model_code_language_spec.rb +30 -0
  399. data/spec/models/move_folder_request_spec.rb +36 -0
  400. data/spec/models/move_template_request_spec.rb +36 -0
  401. data/spec/models/number_condition_type_spec.rb +30 -0
  402. data/spec/models/output_format_spec.rb +30 -0
  403. data/spec/models/page_format_spec.rb +30 -0
  404. data/spec/models/page_image_spec.rb +84 -0
  405. data/spec/models/page_images_spec.rb +54 -0
  406. data/spec/models/predefined_field_input_spec.rb +72 -0
  407. data/spec/models/predefined_field_spec.rb +72 -0
  408. data/spec/models/{publish_version_data_spec.rb → publish_template_version_request_spec.rb} +11 -11
  409. data/spec/models/remove_template_fields_request_spec.rb +36 -0
  410. data/spec/models/{rename_folder_data_spec.rb → rename_folder_request_spec.rb} +9 -9
  411. data/spec/models/reorder_template_fields_request_spec.rb +36 -0
  412. data/spec/models/restore_template_version_request_spec.rb +36 -0
  413. data/spec/models/shape_type_spec.rb +30 -0
  414. data/spec/models/signature_request_auth_second_factor_type_spec.rb +30 -0
  415. data/spec/models/signature_request_auth_type_spec.rb +30 -0
  416. data/spec/models/{submission_data_request_event_spec.rb → signature_request_event_spec.rb} +16 -18
  417. data/spec/models/signature_request_event_type_spec.rb +30 -0
  418. data/spec/models/{create_submission_data_request_data_spec.rb → signature_request_input_spec.rb} +28 -30
  419. data/spec/models/signature_request_message_type_spec.rb +30 -0
  420. data/spec/models/{submission_data_request_show_spec.rb → signature_request_spec.rb} +31 -31
  421. data/spec/models/signature_request_state_spec.rb +30 -0
  422. data/spec/models/signature_request_token_spec.rb +72 -0
  423. data/spec/models/signature_request_token_type_spec.rb +30 -0
  424. data/spec/models/string_condition_type_spec.rb +30 -0
  425. data/spec/models/submission_action_spec.rb +4 -22
  426. data/spec/models/submission_action_state_spec.rb +30 -0
  427. data/spec/models/submission_action_type_spec.rb +30 -0
  428. data/spec/models/submission_batch_spec.rb +27 -13
  429. data/spec/models/submission_batch_state_spec.rb +30 -0
  430. data/spec/models/submission_files_spec.rb +54 -0
  431. data/spec/models/{json_schema_spec.rb → submission_input_spec.rb} +21 -21
  432. data/spec/models/submission_list_spec.rb +42 -0
  433. data/spec/models/submission_source_pdf_spec.rb +42 -0
  434. data/spec/models/submission_source_spec.rb +30 -0
  435. data/spec/models/submission_spec.rb +27 -51
  436. data/spec/models/submission_state_spec.rb +30 -0
  437. data/spec/models/submission_validation_spec.rb +54 -0
  438. data/spec/models/template_actor_spec.rb +60 -0
  439. data/spec/models/template_actor_type_spec.rb +30 -0
  440. data/spec/models/{submission_data_request_spec.rb → template_defaults_input_spec.rb} +29 -53
  441. data/spec/models/{submission_preview_spec.rb → template_defaults_spec.rb} +29 -61
  442. data/spec/models/template_diff_spec.rb +72 -0
  443. data/spec/models/template_diff_summary_spec.rb +66 -0
  444. data/spec/models/template_document_spec.rb +102 -0
  445. data/spec/models/template_document_state_spec.rb +30 -0
  446. data/spec/models/template_field_change_spec.rb +54 -0
  447. data/spec/models/template_field_changes_spec.rb +54 -0
  448. data/spec/models/template_field_dependency_action_spec.rb +30 -0
  449. data/spec/models/template_field_dependency_condition_input_spec.rb +44 -0
  450. data/spec/models/template_field_dependency_condition_spec.rb +54 -0
  451. data/spec/models/template_field_dependency_input_spec.rb +60 -0
  452. data/spec/models/template_field_dependency_match_spec.rb +30 -0
  453. data/spec/models/template_field_dependency_operator_spec.rb +30 -0
  454. data/spec/models/template_field_dependency_spec.rb +60 -0
  455. data/spec/models/template_field_logic_status_spec.rb +30 -0
  456. data/spec/models/template_field_move_spec.rb +48 -0
  457. data/spec/models/template_fields_spec.rb +48 -0
  458. data/spec/models/template_form_mode_spec.rb +30 -0
  459. data/spec/models/{template_model_code_response_spec.rb → template_model_code_spec.rb} +9 -13
  460. data/spec/models/template_page_ai_error_spec.rb +30 -0
  461. data/spec/models/template_page_ai_naming_status_spec.rb +30 -0
  462. data/spec/models/template_page_fields_status_spec.rb +30 -0
  463. data/spec/models/template_page_image_status_spec.rb +30 -0
  464. data/spec/models/template_page_images_spec.rb +54 -0
  465. data/spec/models/template_page_processing_status_spec.rb +60 -0
  466. data/spec/models/template_source_pdf_spec.rb +54 -0
  467. data/spec/models/template_spec.rb +44 -140
  468. data/spec/models/template_summary_list_spec.rb +42 -0
  469. data/spec/models/template_summary_spec.rb +252 -0
  470. data/spec/models/template_type_spec.rb +30 -0
  471. data/spec/models/template_version_spec.rb +54 -0
  472. data/spec/models/template_version_type_spec.rb +30 -0
  473. data/spec/models/text_alignment_spec.rb +30 -0
  474. data/spec/models/text_overflow_spec.rb +30 -0
  475. data/spec/models/text_vertical_alignment_spec.rb +30 -0
  476. data/spec/models/typeface_spec.rb +30 -0
  477. data/spec/models/{submission_batch_with_submissions_spec.rb → update_signature_request_request_spec.rb} +18 -22
  478. data/spec/models/update_template_document_request_spec.rb +60 -0
  479. data/spec/models/update_template_fields_request_spec.rb +36 -0
  480. data/spec/models/update_template_request_spec.rb +240 -0
  481. data/spec/models/update_webhook_request_spec.rb +96 -0
  482. data/spec/models/upload_method_spec.rb +30 -0
  483. data/spec/models/{upload_presign_response_spec.rb → upload_presign_spec.rb} +13 -17
  484. data/spec/models/url_source_pdf_spec.rb +42 -0
  485. data/spec/models/validate_submission_request_spec.rb +96 -0
  486. data/spec/models/webhook_event_type_spec.rb +30 -0
  487. data/spec/models/webhook_list_spec.rb +42 -0
  488. data/spec/models/webhook_mode_spec.rb +30 -0
  489. data/spec/models/webhook_spec.rb +4 -8
  490. data/spec/spec_helper.rb +3 -3
  491. metadata +597 -202
  492. data/docs/AddFieldsData.md +0 -18
  493. data/docs/BatchGeneratePdfs201Response.md +0 -28
  494. data/docs/CombinePdfsData.md +0 -28
  495. data/docs/CombinedSubmission.md +0 -44
  496. data/docs/CombinedSubmissionAction.md +0 -30
  497. data/docs/CopyTemplateOptions.md +0 -22
  498. data/docs/CreateCombinedSubmissionResponse.md +0 -26
  499. data/docs/CreateCustomFileData.md +0 -18
  500. data/docs/CreateCustomFileResponse.md +0 -24
  501. data/docs/CreateHtmlTemplate.md +0 -18
  502. data/docs/CreatePdfSubmissionData.md +0 -34
  503. data/docs/CreatePdfTemplate.md +0 -18
  504. data/docs/CreateSubmissionDataRequestData.md +0 -44
  505. data/docs/CreateSubmissionDataRequestEventRequest.md +0 -24
  506. data/docs/CreateSubmissionDataRequestEventResponse.md +0 -24
  507. data/docs/CreateSubmissionDataRequestResponse.md +0 -24
  508. data/docs/CreateSubmissionDataRequestTokenResponse.md +0 -24
  509. data/docs/CreateSubmissionResponse.md +0 -26
  510. data/docs/ErrorOrMultipleErrorsResponse.md +0 -22
  511. data/docs/ForbiddenErrorResponse.md +0 -22
  512. data/docs/JsonSchema.md +0 -40
  513. data/docs/ListSubmissionsResponse.md +0 -22
  514. data/docs/MoveFolderData.md +0 -18
  515. data/docs/MoveTemplateData.md +0 -20
  516. data/docs/MultipleErrorsResponse.md +0 -20
  517. data/docs/PublishVersionData.md +0 -20
  518. data/docs/RestoreVersionData.md +0 -18
  519. data/docs/Submission422Response.md +0 -24
  520. data/docs/SubmissionBatchData.md +0 -26
  521. data/docs/SubmissionBatchWithSubmissions.md +0 -34
  522. data/docs/SubmissionDataRequest.md +0 -60
  523. data/docs/SubmissionDataRequestEvent.md +0 -30
  524. data/docs/SubmissionDataRequestShow.md +0 -62
  525. data/docs/SubmissionDataRequestToken.md +0 -24
  526. data/docs/SubmissionPreview.md +0 -64
  527. data/docs/SuccessErrorResponse.md +0 -20
  528. data/docs/SuccessMultipleErrorsResponse.md +0 -20
  529. data/docs/TemplateAddFieldsResponse.md +0 -22
  530. data/docs/TemplateDeleteResponse.md +0 -24
  531. data/docs/TemplateModelCodeResponse.md +0 -22
  532. data/docs/TemplatePreview.md +0 -116
  533. data/docs/TemplatePublishVersionResponse.md +0 -22
  534. data/docs/UpdateHtmlTemplate.md +0 -18
  535. data/docs/UpdatePdfTemplate.md +0 -18
  536. data/docs/UpdateSubmissionDataRequestData.md +0 -42
  537. data/docs/UploadPresignResponse.md +0 -24
  538. data/lib/docspring/models/batch_generate_pdfs201_response.rb +0 -352
  539. data/lib/docspring/models/combined_submission_action.rb +0 -384
  540. data/lib/docspring/models/create_combined_submission_response.rb +0 -324
  541. data/lib/docspring/models/create_custom_file_response.rb +0 -314
  542. data/lib/docspring/models/create_html_template.rb +0 -243
  543. data/lib/docspring/models/create_submission_data_request_event_response.rb +0 -314
  544. data/lib/docspring/models/create_submission_data_request_response.rb +0 -314
  545. data/lib/docspring/models/create_submission_data_request_token_response.rb +0 -314
  546. data/lib/docspring/models/create_submission_response.rb +0 -324
  547. data/lib/docspring/models/error_or_multiple_errors_response.rb +0 -290
  548. data/lib/docspring/models/forbidden_error_response.rb +0 -323
  549. data/lib/docspring/models/json_schema.rb +0 -329
  550. data/lib/docspring/models/list_submissions_response.rb +0 -283
  551. data/lib/docspring/models/multiple_errors_response.rb +0 -296
  552. data/lib/docspring/models/submission422_response.rb +0 -299
  553. data/lib/docspring/models/submission_batch_with_submissions.rb +0 -433
  554. data/lib/docspring/models/submission_data_request.rb +0 -570
  555. data/lib/docspring/models/submission_data_request_token.rb +0 -279
  556. data/lib/docspring/models/submission_preview.rb +0 -637
  557. data/lib/docspring/models/success_multiple_errors_response.rb +0 -279
  558. data/lib/docspring/models/template_add_fields_response.rb +0 -290
  559. data/lib/docspring/models/template_delete_response.rb +0 -300
  560. data/lib/docspring/models/template_publish_version_response.rb +0 -305
  561. data/lib/docspring/models/update_html_template.rb +0 -243
  562. data/spec/models/add_fields_data_spec.rb +0 -36
  563. data/spec/models/combined_submission_action_spec.rb +0 -84
  564. data/spec/models/create_combined_submission_response_spec.rb +0 -64
  565. data/spec/models/create_custom_file_response_spec.rb +0 -58
  566. data/spec/models/create_folder_data_spec.rb +0 -36
  567. data/spec/models/create_html_template_spec.rb +0 -36
  568. data/spec/models/create_pdf_template_spec.rb +0 -36
  569. data/spec/models/create_submission_data_request_event_request_spec.rb +0 -62
  570. data/spec/models/create_submission_data_request_event_response_spec.rb +0 -58
  571. data/spec/models/create_submission_data_request_response_spec.rb +0 -58
  572. data/spec/models/create_submission_data_request_token_response_spec.rb +0 -58
  573. data/spec/models/create_webhook_data_spec.rb +0 -36
  574. data/spec/models/error_or_multiple_errors_response_spec.rb +0 -52
  575. data/spec/models/forbidden_error_response_spec.rb +0 -56
  576. data/spec/models/move_folder_data_spec.rb +0 -36
  577. data/spec/models/multiple_errors_response_spec.rb +0 -46
  578. data/spec/models/restore_version_data_spec.rb +0 -36
  579. data/spec/models/submission422_response_spec.rb +0 -58
  580. data/spec/models/success_error_response_spec.rb +0 -46
  581. data/spec/models/success_multiple_errors_response_spec.rb +0 -46
  582. data/spec/models/template_add_fields_response_spec.rb +0 -52
  583. data/spec/models/template_delete_response_spec.rb +0 -58
  584. data/spec/models/template_publish_version_response_spec.rb +0 -52
  585. data/spec/models/update_html_template_spec.rb +0 -36
  586. data/spec/models/update_pdf_template_spec.rb +0 -36
  587. data/spec/models/update_submission_data_request_data_spec.rb +0 -116
  588. 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.1.0'
15
15
  end
data/lib/docspring.rb CHANGED
@@ -1,80 +1,180 @@
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/add_template_fields_request'
23
+ require 'docspring/models/ai_field_naming_language'
24
+ require 'docspring/models/authentication_check'
25
+ require 'docspring/models/barcode_symbology'
26
+ require 'docspring/models/check_character'
27
+ require 'docspring/models/combined_field_type'
28
+ require 'docspring/models/combined_pdf'
29
+ require 'docspring/models/combined_pdf_files'
30
+ require 'docspring/models/combined_pdf_list'
31
+ require 'docspring/models/combined_pdf_source'
32
+ require 'docspring/models/combined_pdf_source_input'
33
+ require 'docspring/models/combined_pdf_source_pdf'
34
+ require 'docspring/models/combined_pdf_source_type'
35
+ require 'docspring/models/combined_pdf_state'
36
+ require 'docspring/models/copy_template_request'
37
+ require 'docspring/models/create_combined_pdf_request'
38
+ require 'docspring/models/create_custom_file_from_upload_request'
39
+ require 'docspring/models/create_folder_request'
40
+ require 'docspring/models/create_signature_request_event_request'
41
+ require 'docspring/models/create_signature_request_token_request'
42
+ require 'docspring/models/create_submission_batch_request'
43
+ require 'docspring/models/create_submission_request'
44
+ require 'docspring/models/create_template_request'
45
+ require 'docspring/models/create_webhook_request'
40
46
  require 'docspring/models/custom_file'
41
- require 'docspring/models/error_or_multiple_errors_response'
47
+ require 'docspring/models/custom_file_list'
48
+ require 'docspring/models/custom_file_source_pdf'
49
+ require 'docspring/models/error_code'
50
+ require 'docspring/models/error_detail'
51
+ require 'docspring/models/error_info'
42
52
  require 'docspring/models/error_response'
53
+ require 'docspring/models/expiration_interval'
54
+ require 'docspring/models/field'
55
+ require 'docspring/models/field_comparison_condition'
56
+ require 'docspring/models/field_comparison_operator'
57
+ require 'docspring/models/field_dependency'
58
+ require 'docspring/models/field_dependency_input'
59
+ require 'docspring/models/field_display_type'
60
+ require 'docspring/models/field_equals_condition'
61
+ require 'docspring/models/field_equals_operator'
62
+ require 'docspring/models/field_group'
63
+ require 'docspring/models/field_group_input'
64
+ require 'docspring/models/field_group_type'
65
+ require 'docspring/models/field_in_condition'
66
+ require 'docspring/models/field_input'
67
+ require 'docspring/models/field_override'
68
+ require 'docspring/models/field_presence_condition'
69
+ require 'docspring/models/field_presence_operator'
70
+ require 'docspring/models/field_range_condition'
71
+ require 'docspring/models/field_reimport_state'
72
+ require 'docspring/models/field_setup_logic'
73
+ require 'docspring/models/field_setup_naming'
74
+ require 'docspring/models/field_setup_source'
75
+ require 'docspring/models/field_type'
43
76
  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'
77
+ require 'docspring/models/folder_list'
78
+ require 'docspring/models/generate_files_format'
79
+ require 'docspring/models/generate_submission_files_request'
80
+ require 'docspring/models/generated_file'
81
+ require 'docspring/models/generated_file_state'
82
+ require 'docspring/models/html_engine_options'
83
+ require 'docspring/models/html_engine_options_input'
84
+ require 'docspring/models/image_gravity'
85
+ require 'docspring/models/image_scale_type'
86
+ require 'docspring/models/model_code_language'
87
+ require 'docspring/models/move_folder_request'
88
+ require 'docspring/models/move_template_request'
89
+ require 'docspring/models/number_condition_type'
90
+ require 'docspring/models/output_format'
91
+ require 'docspring/models/page_format'
92
+ require 'docspring/models/page_image'
93
+ require 'docspring/models/page_images'
94
+ require 'docspring/models/predefined_field'
95
+ require 'docspring/models/predefined_field_input'
96
+ require 'docspring/models/publish_template_version_request'
97
+ require 'docspring/models/remove_template_fields_request'
98
+ require 'docspring/models/rename_folder_request'
99
+ require 'docspring/models/reorder_template_fields_request'
100
+ require 'docspring/models/restore_template_version_request'
101
+ require 'docspring/models/shape_type'
102
+ require 'docspring/models/signature_request'
103
+ require 'docspring/models/signature_request_auth_second_factor_type'
104
+ require 'docspring/models/signature_request_auth_type'
105
+ require 'docspring/models/signature_request_event'
106
+ require 'docspring/models/signature_request_event_type'
107
+ require 'docspring/models/signature_request_input'
108
+ require 'docspring/models/signature_request_message_type'
109
+ require 'docspring/models/signature_request_state'
110
+ require 'docspring/models/signature_request_token'
111
+ require 'docspring/models/signature_request_token_type'
112
+ require 'docspring/models/string_condition_type'
53
113
  require 'docspring/models/submission'
54
- require 'docspring/models/submission422_response'
55
114
  require 'docspring/models/submission_action'
115
+ require 'docspring/models/submission_action_state'
116
+ require 'docspring/models/submission_action_type'
56
117
  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'
118
+ require 'docspring/models/submission_batch_state'
119
+ require 'docspring/models/submission_files'
120
+ require 'docspring/models/submission_input'
121
+ require 'docspring/models/submission_list'
122
+ require 'docspring/models/submission_source'
123
+ require 'docspring/models/submission_source_pdf'
124
+ require 'docspring/models/submission_state'
125
+ require 'docspring/models/submission_validation'
66
126
  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'
127
+ require 'docspring/models/template_actor'
128
+ require 'docspring/models/template_actor_type'
129
+ require 'docspring/models/template_defaults'
130
+ require 'docspring/models/template_defaults_input'
131
+ require 'docspring/models/template_diff'
132
+ require 'docspring/models/template_diff_summary'
133
+ require 'docspring/models/template_document'
134
+ require 'docspring/models/template_document_state'
135
+ require 'docspring/models/template_field_change'
136
+ require 'docspring/models/template_field_changes'
137
+ require 'docspring/models/template_field_dependency'
138
+ require 'docspring/models/template_field_dependency_action'
139
+ require 'docspring/models/template_field_dependency_condition'
140
+ require 'docspring/models/template_field_dependency_condition_input'
141
+ require 'docspring/models/template_field_dependency_input'
142
+ require 'docspring/models/template_field_dependency_match'
143
+ require 'docspring/models/template_field_dependency_operator'
144
+ require 'docspring/models/template_field_logic_status'
145
+ require 'docspring/models/template_field_move'
146
+ require 'docspring/models/template_fields'
147
+ require 'docspring/models/template_form_mode'
148
+ require 'docspring/models/template_model_code'
149
+ require 'docspring/models/template_page_ai_error'
150
+ require 'docspring/models/template_page_ai_naming_status'
151
+ require 'docspring/models/template_page_fields_status'
152
+ require 'docspring/models/template_page_image_status'
153
+ require 'docspring/models/template_page_images'
154
+ require 'docspring/models/template_page_processing_status'
155
+ require 'docspring/models/template_source_pdf'
156
+ require 'docspring/models/template_summary'
157
+ require 'docspring/models/template_summary_list'
158
+ require 'docspring/models/template_type'
159
+ require 'docspring/models/template_version'
160
+ require 'docspring/models/template_version_type'
161
+ require 'docspring/models/text_alignment'
162
+ require 'docspring/models/text_overflow'
163
+ require 'docspring/models/text_vertical_alignment'
164
+ require 'docspring/models/typeface'
165
+ require 'docspring/models/update_signature_request_request'
166
+ require 'docspring/models/update_template_document_request'
167
+ require 'docspring/models/update_template_fields_request'
168
+ require 'docspring/models/update_template_request'
169
+ require 'docspring/models/update_webhook_request'
170
+ require 'docspring/models/upload_method'
171
+ require 'docspring/models/upload_presign'
172
+ require 'docspring/models/url_source_pdf'
173
+ require 'docspring/models/validate_submission_request'
77
174
  require 'docspring/models/webhook'
175
+ require 'docspring/models/webhook_event_type'
176
+ require 'docspring/models/webhook_list'
177
+ require 'docspring/models/webhook_mode'
78
178
 
79
179
  # APIs
80
180
  require 'docspring/api/client'