mindee-lite 5.0.0.beta1

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 (510) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +24 -0
  3. data/.gitattributes +14 -0
  4. data/.gitignore +76 -0
  5. data/.gitmodules +3 -0
  6. data/.pre-commit-config.yaml +36 -0
  7. data/.rubocop.yml +49 -0
  8. data/.yardopts +4 -0
  9. data/CHANGELOG.md +515 -0
  10. data/CODE_OF_CONDUCT.md +129 -0
  11. data/CONTRIBUTING.md +107 -0
  12. data/Gemfile +14 -0
  13. data/LICENSE +21 -0
  14. data/README.md +42 -0
  15. data/Rakefile +40 -0
  16. data/Steepfile +30 -0
  17. data/bin/console +14 -0
  18. data/bin/mindee.rb +30 -0
  19. data/bin/v1/parser.rb +153 -0
  20. data/bin/v1/products.rb +88 -0
  21. data/bin/v2/parser.rb +235 -0
  22. data/bin/v2/products.rb +34 -0
  23. data/docs/code_samples/bank_account_details_v1.txt +24 -0
  24. data/docs/code_samples/bank_account_details_v2.txt +24 -0
  25. data/docs/code_samples/bank_statement_fr_v2_async.txt +24 -0
  26. data/docs/code_samples/barcode_reader_v1.txt +24 -0
  27. data/docs/code_samples/cropper_v1.txt +21 -0
  28. data/docs/code_samples/default.txt +30 -0
  29. data/docs/code_samples/default_async.txt +29 -0
  30. data/docs/code_samples/expense_receipts_v5.txt +25 -0
  31. data/docs/code_samples/expense_receipts_v5_async.txt +24 -0
  32. data/docs/code_samples/financial_document_v1.txt +25 -0
  33. data/docs/code_samples/financial_document_v1_async.txt +24 -0
  34. data/docs/code_samples/idcard_fr_v1.txt +24 -0
  35. data/docs/code_samples/idcard_fr_v2.txt +24 -0
  36. data/docs/code_samples/international_id_v2_async.txt +24 -0
  37. data/docs/code_samples/invoice_splitter_v1_async.txt +24 -0
  38. data/docs/code_samples/invoices_v4.txt +25 -0
  39. data/docs/code_samples/invoices_v4_async.txt +24 -0
  40. data/docs/code_samples/multi_receipts_detector_v1.txt +24 -0
  41. data/docs/code_samples/passport_v1.txt +24 -0
  42. data/docs/code_samples/resume_v1_async.txt +24 -0
  43. data/docs/code_samples/v2_classification.txt +30 -0
  44. data/docs/code_samples/v2_crop.txt +30 -0
  45. data/docs/code_samples/v2_extraction.txt +42 -0
  46. data/docs/code_samples/v2_extraction_webhook.txt +45 -0
  47. data/docs/code_samples/v2_ocr.txt +30 -0
  48. data/docs/code_samples/v2_split.txt +30 -0
  49. data/docs/code_samples/workflow_execution.txt +28 -0
  50. data/docs/code_samples/workflow_polling.txt +35 -0
  51. data/examples/auto_invoice_splitter_extraction.rb +48 -0
  52. data/examples/auto_multi_receipts_detector_extraction.rb +30 -0
  53. data/lib/mindee/dependency.rb +29 -0
  54. data/lib/mindee/error/mindee_error.rb +17 -0
  55. data/lib/mindee/error/mindee_http_error.rb +36 -0
  56. data/lib/mindee/error/mindee_http_error_v2.rb +45 -0
  57. data/lib/mindee/error/mindee_http_unknown_error_v2.rb +18 -0
  58. data/lib/mindee/error/mindee_input_error.rb +30 -0
  59. data/lib/mindee/error.rb +6 -0
  60. data/lib/mindee/geometry/min_max.rb +23 -0
  61. data/lib/mindee/geometry/point.rb +41 -0
  62. data/lib/mindee/geometry/polygon.rb +37 -0
  63. data/lib/mindee/geometry/quadrilateral.rb +50 -0
  64. data/lib/mindee/geometry/utils.rb +88 -0
  65. data/lib/mindee/geometry.rb +7 -0
  66. data/lib/mindee/http/.rubocop.yml +7 -0
  67. data/lib/mindee/http/http_error_handler.rb +106 -0
  68. data/lib/mindee/http/response_validation.rb +81 -0
  69. data/lib/mindee/http.rb +3 -0
  70. data/lib/mindee/image/extracted_image.rb +89 -0
  71. data/lib/mindee/image/image_compressor.rb +29 -0
  72. data/lib/mindee/image/image_extractor.rb +118 -0
  73. data/lib/mindee/image/image_utils.rb +165 -0
  74. data/lib/mindee/image.rb +6 -0
  75. data/lib/mindee/input/base_parameters.rb +149 -0
  76. data/lib/mindee/input/local_response.rb +80 -0
  77. data/lib/mindee/input/polling_options.rb +26 -0
  78. data/lib/mindee/input/sources/base64_input_source.rb +31 -0
  79. data/lib/mindee/input/sources/bytes_input_source.rb +21 -0
  80. data/lib/mindee/input/sources/file_input_source.rb +20 -0
  81. data/lib/mindee/input/sources/local_input_source.rb +216 -0
  82. data/lib/mindee/input/sources/path_input_source.rb +20 -0
  83. data/lib/mindee/input/sources/url_input_source.rb +130 -0
  84. data/lib/mindee/input/sources.rb +8 -0
  85. data/lib/mindee/input.rb +4 -0
  86. data/lib/mindee/logging/logger.rb +24 -0
  87. data/lib/mindee/logging.rb +3 -0
  88. data/lib/mindee/page_options.rb +24 -0
  89. data/lib/mindee/pdf/extracted_pdf.rb +70 -0
  90. data/lib/mindee/pdf/pdf_compressor.rb +121 -0
  91. data/lib/mindee/pdf/pdf_extractor.rb +121 -0
  92. data/lib/mindee/pdf/pdf_processor.rb +91 -0
  93. data/lib/mindee/pdf/pdf_tools.rb +201 -0
  94. data/lib/mindee/pdf.rb +7 -0
  95. data/lib/mindee/v1/client.rb +490 -0
  96. data/lib/mindee/v1/extraction/multi_receipts_extractor.rb +32 -0
  97. data/lib/mindee/v1/extraction.rb +3 -0
  98. data/lib/mindee/v1/http/.rubocop.yml +7 -0
  99. data/lib/mindee/v1/http/endpoint.rb +221 -0
  100. data/lib/mindee/v1/http/workflow_endpoint.rb +93 -0
  101. data/lib/mindee/v1/http.rb +4 -0
  102. data/lib/mindee/v1/parsing/common/api_request.rb +38 -0
  103. data/lib/mindee/v1/parsing/common/api_response.rb +63 -0
  104. data/lib/mindee/v1/parsing/common/document.rb +86 -0
  105. data/lib/mindee/v1/parsing/common/execution.rb +78 -0
  106. data/lib/mindee/v1/parsing/common/execution_file.rb +26 -0
  107. data/lib/mindee/v1/parsing/common/execution_priority.rb +38 -0
  108. data/lib/mindee/v1/parsing/common/extras/cropper_extra.rb +32 -0
  109. data/lib/mindee/v1/parsing/common/extras/extras.rb +62 -0
  110. data/lib/mindee/v1/parsing/common/extras/full_text_ocr_extra.rb +35 -0
  111. data/lib/mindee/v1/parsing/common/extras/rag_extra.rb +28 -0
  112. data/lib/mindee/v1/parsing/common/extras.rb +6 -0
  113. data/lib/mindee/v1/parsing/common/inference.rb +69 -0
  114. data/lib/mindee/v1/parsing/common/job.rb +48 -0
  115. data/lib/mindee/v1/parsing/common/ocr/mvision_v1.rb +52 -0
  116. data/lib/mindee/v1/parsing/common/ocr/ocr.rb +180 -0
  117. data/lib/mindee/v1/parsing/common/ocr.rb +3 -0
  118. data/lib/mindee/v1/parsing/common/orientation.rb +28 -0
  119. data/lib/mindee/v1/parsing/common/page.rb +49 -0
  120. data/lib/mindee/v1/parsing/common/prediction.rb +19 -0
  121. data/lib/mindee/v1/parsing/common/product.rb +26 -0
  122. data/lib/mindee/v1/parsing/common/workflow_response.rb +30 -0
  123. data/lib/mindee/v1/parsing/common.rb +15 -0
  124. data/lib/mindee/v1/parsing/standard/abstract_field.rb +74 -0
  125. data/lib/mindee/v1/parsing/standard/address_field.rb +51 -0
  126. data/lib/mindee/v1/parsing/standard/amount_field.rb +28 -0
  127. data/lib/mindee/v1/parsing/standard/base_field.rb +30 -0
  128. data/lib/mindee/v1/parsing/standard/boolean_field.rb +29 -0
  129. data/lib/mindee/v1/parsing/standard/classification_field.rb +18 -0
  130. data/lib/mindee/v1/parsing/standard/company_registration_field.rb +45 -0
  131. data/lib/mindee/v1/parsing/standard/date_field.rb +40 -0
  132. data/lib/mindee/v1/parsing/standard/feature_field.rb +26 -0
  133. data/lib/mindee/v1/parsing/standard/locale_field.rb +52 -0
  134. data/lib/mindee/v1/parsing/standard/payment_details_field.rb +44 -0
  135. data/lib/mindee/v1/parsing/standard/position_field.rb +61 -0
  136. data/lib/mindee/v1/parsing/standard/string_field.rb +26 -0
  137. data/lib/mindee/v1/parsing/standard/tax_field.rb +110 -0
  138. data/lib/mindee/v1/parsing/standard.rb +15 -0
  139. data/lib/mindee/v1/parsing/universal/universal_list_field.rb +60 -0
  140. data/lib/mindee/v1/parsing/universal/universal_object_field.rb +123 -0
  141. data/lib/mindee/v1/parsing/universal.rb +4 -0
  142. data/lib/mindee/v1/parsing.rb +5 -0
  143. data/lib/mindee/v1/product/.rubocop.yml +12 -0
  144. data/lib/mindee/v1/product/barcode_reader/barcode_reader_v1.rb +47 -0
  145. data/lib/mindee/v1/product/barcode_reader/barcode_reader_v1_document.rb +47 -0
  146. data/lib/mindee/v1/product/barcode_reader/barcode_reader_v1_page.rb +38 -0
  147. data/lib/mindee/v1/product/cropper/cropper_v1.rb +47 -0
  148. data/lib/mindee/v1/product/cropper/cropper_v1_document.rb +15 -0
  149. data/lib/mindee/v1/product/cropper/cropper_v1_page.rb +55 -0
  150. data/lib/mindee/v1/product/financial_document/financial_document_v1.rb +47 -0
  151. data/lib/mindee/v1/product/financial_document/financial_document_v1_document.rb +329 -0
  152. data/lib/mindee/v1/product/financial_document/financial_document_v1_line_item.rb +124 -0
  153. data/lib/mindee/v1/product/financial_document/financial_document_v1_line_items.rb +64 -0
  154. data/lib/mindee/v1/product/financial_document/financial_document_v1_page.rb +38 -0
  155. data/lib/mindee/v1/product/fr/bank_account_details/bank_account_details_v1.rb +49 -0
  156. data/lib/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.rb +49 -0
  157. data/lib/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_page.rb +40 -0
  158. data/lib/mindee/v1/product/fr/bank_account_details/bank_account_details_v2.rb +49 -0
  159. data/lib/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_bban.rb +63 -0
  160. data/lib/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.rb +60 -0
  161. data/lib/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_page.rb +40 -0
  162. data/lib/mindee/v1/product/fr/bank_statement/bank_statement_v2.rb +49 -0
  163. data/lib/mindee/v1/product/fr/bank_statement/bank_statement_v2_document.rb +169 -0
  164. data/lib/mindee/v1/product/fr/bank_statement/bank_statement_v2_page.rb +40 -0
  165. data/lib/mindee/v1/product/fr/bank_statement/bank_statement_v2_transaction.rb +78 -0
  166. data/lib/mindee/v1/product/fr/bank_statement/bank_statement_v2_transactions.rb +56 -0
  167. data/lib/mindee/v1/product/fr/id_card/id_card_v1.rb +49 -0
  168. data/lib/mindee/v1/product/fr/id_card/id_card_v1_document.rb +106 -0
  169. data/lib/mindee/v1/product/fr/id_card/id_card_v1_page.rb +57 -0
  170. data/lib/mindee/v1/product/fr/id_card/id_card_v2.rb +49 -0
  171. data/lib/mindee/v1/product/fr/id_card/id_card_v2_document.rb +143 -0
  172. data/lib/mindee/v1/product/fr/id_card/id_card_v2_page.rb +65 -0
  173. data/lib/mindee/v1/product/international_id/international_id_v2.rb +47 -0
  174. data/lib/mindee/v1/product/international_id/international_id_v2_document.rb +164 -0
  175. data/lib/mindee/v1/product/international_id/international_id_v2_page.rb +38 -0
  176. data/lib/mindee/v1/product/invoice/invoice_v4.rb +47 -0
  177. data/lib/mindee/v1/product/invoice/invoice_v4_document.rb +300 -0
  178. data/lib/mindee/v1/product/invoice/invoice_v4_line_item.rb +124 -0
  179. data/lib/mindee/v1/product/invoice/invoice_v4_line_items.rb +64 -0
  180. data/lib/mindee/v1/product/invoice/invoice_v4_page.rb +38 -0
  181. data/lib/mindee/v1/product/invoice_splitter/invoice_splitter_v1.rb +47 -0
  182. data/lib/mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.rb +66 -0
  183. data/lib/mindee/v1/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.rb +58 -0
  184. data/lib/mindee/v1/product/invoice_splitter/invoice_splitter_v1_invoice_page_groups.rb +50 -0
  185. data/lib/mindee/v1/product/invoice_splitter/invoice_splitter_v1_page.rb +38 -0
  186. data/lib/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.rb +47 -0
  187. data/lib/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.rb +38 -0
  188. data/lib/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_page.rb +38 -0
  189. data/lib/mindee/v1/product/passport/passport_v1.rb +47 -0
  190. data/lib/mindee/v1/product/passport/passport_v1_document.rb +112 -0
  191. data/lib/mindee/v1/product/passport/passport_v1_page.rb +38 -0
  192. data/lib/mindee/v1/product/receipt/receipt_v5.rb +47 -0
  193. data/lib/mindee/v1/product/receipt/receipt_v5_document.rb +187 -0
  194. data/lib/mindee/v1/product/receipt/receipt_v5_line_item.rb +88 -0
  195. data/lib/mindee/v1/product/receipt/receipt_v5_line_items.rb +56 -0
  196. data/lib/mindee/v1/product/receipt/receipt_v5_page.rb +38 -0
  197. data/lib/mindee/v1/product/resume/resume_v1.rb +47 -0
  198. data/lib/mindee/v1/product/resume/resume_v1_certificate.rb +82 -0
  199. data/lib/mindee/v1/product/resume/resume_v1_certificates.rb +60 -0
  200. data/lib/mindee/v1/product/resume/resume_v1_document.rb +340 -0
  201. data/lib/mindee/v1/product/resume/resume_v1_education.rb +106 -0
  202. data/lib/mindee/v1/product/resume/resume_v1_educations.rb +66 -0
  203. data/lib/mindee/v1/product/resume/resume_v1_language.rb +66 -0
  204. data/lib/mindee/v1/product/resume/resume_v1_languages.rb +56 -0
  205. data/lib/mindee/v1/product/resume/resume_v1_page.rb +38 -0
  206. data/lib/mindee/v1/product/resume/resume_v1_professional_experience.rb +122 -0
  207. data/lib/mindee/v1/product/resume/resume_v1_professional_experiences.rb +70 -0
  208. data/lib/mindee/v1/product/resume/resume_v1_social_networks_url.rb +66 -0
  209. data/lib/mindee/v1/product/resume/resume_v1_social_networks_urls.rb +56 -0
  210. data/lib/mindee/v1/product/universal/universal.rb +48 -0
  211. data/lib/mindee/v1/product/universal/universal_document.rb +35 -0
  212. data/lib/mindee/v1/product/universal/universal_page.rb +54 -0
  213. data/lib/mindee/v1/product/universal/universal_prediction.rb +128 -0
  214. data/lib/mindee/v1/product.rb +18 -0
  215. data/lib/mindee/v1.rb +7 -0
  216. data/lib/mindee/v2/client.rb +132 -0
  217. data/lib/mindee/v2/file_operation/crop.rb +51 -0
  218. data/lib/mindee/v2/file_operation/crop_files.rb +25 -0
  219. data/lib/mindee/v2/file_operation/split.rb +37 -0
  220. data/lib/mindee/v2/file_operation/split_files.rb +25 -0
  221. data/lib/mindee/v2/file_operation.rb +6 -0
  222. data/lib/mindee/v2/http/.rubocop.yml +7 -0
  223. data/lib/mindee/v2/http/api_v2_settings.rb +65 -0
  224. data/lib/mindee/v2/http/mindee_api_v2.rb +230 -0
  225. data/lib/mindee/v2/http.rb +4 -0
  226. data/lib/mindee/v2/parsing/base_inference.rb +44 -0
  227. data/lib/mindee/v2/parsing/base_response.rb +15 -0
  228. data/lib/mindee/v2/parsing/common_response.rb +20 -0
  229. data/lib/mindee/v2/parsing/error_item.rb +21 -0
  230. data/lib/mindee/v2/parsing/error_response.rb +51 -0
  231. data/lib/mindee/v2/parsing/field/base_field.rb +63 -0
  232. data/lib/mindee/v2/parsing/field/field_confidence.rb +128 -0
  233. data/lib/mindee/v2/parsing/field/field_location.rb +33 -0
  234. data/lib/mindee/v2/parsing/field/inference_fields.rb +105 -0
  235. data/lib/mindee/v2/parsing/field/list_field.rb +79 -0
  236. data/lib/mindee/v2/parsing/field/object_field.rb +138 -0
  237. data/lib/mindee/v2/parsing/field/simple_field.rb +60 -0
  238. data/lib/mindee/v2/parsing/field.rb +9 -0
  239. data/lib/mindee/v2/parsing/inference_active_options.rb +67 -0
  240. data/lib/mindee/v2/parsing/inference_file.rb +38 -0
  241. data/lib/mindee/v2/parsing/inference_job.rb +25 -0
  242. data/lib/mindee/v2/parsing/inference_model.rb +30 -0
  243. data/lib/mindee/v2/parsing/job.rb +93 -0
  244. data/lib/mindee/v2/parsing/job_response.rb +30 -0
  245. data/lib/mindee/v2/parsing/job_webhook.rb +59 -0
  246. data/lib/mindee/v2/parsing/rag_metadata.rb +17 -0
  247. data/lib/mindee/v2/parsing/raw_text.rb +27 -0
  248. data/lib/mindee/v2/parsing/raw_text_page.rb +24 -0
  249. data/lib/mindee/v2/parsing/search/pagination_metadata.rb +44 -0
  250. data/lib/mindee/v2/parsing/search/search_model.rb +38 -0
  251. data/lib/mindee/v2/parsing/search/search_models.rb +34 -0
  252. data/lib/mindee/v2/parsing/search/search_response.rb +38 -0
  253. data/lib/mindee/v2/parsing/search.rb +6 -0
  254. data/lib/mindee/v2/parsing.rb +16 -0
  255. data/lib/mindee/v2/product/base_product.rb +28 -0
  256. data/lib/mindee/v2/product/classification/classification.rb +20 -0
  257. data/lib/mindee/v2/product/classification/classification_classifier.rb +25 -0
  258. data/lib/mindee/v2/product/classification/classification_inference.rb +35 -0
  259. data/lib/mindee/v2/product/classification/classification_response.rb +32 -0
  260. data/lib/mindee/v2/product/classification/classification_result.rb +27 -0
  261. data/lib/mindee/v2/product/classification/params/classification_parameters.rb +47 -0
  262. data/lib/mindee/v2/product/crop/crop.rb +20 -0
  263. data/lib/mindee/v2/product/crop/crop_inference.rb +34 -0
  264. data/lib/mindee/v2/product/crop/crop_item.rb +39 -0
  265. data/lib/mindee/v2/product/crop/crop_response.rb +40 -0
  266. data/lib/mindee/v2/product/crop/crop_result.rb +34 -0
  267. data/lib/mindee/v2/product/crop/params/crop_parameters.rb +47 -0
  268. data/lib/mindee/v2/product/extraction/extraction.rb +21 -0
  269. data/lib/mindee/v2/product/extraction/extraction_inference.rb +40 -0
  270. data/lib/mindee/v2/product/extraction/extraction_response.rb +32 -0
  271. data/lib/mindee/v2/product/extraction/extraction_result.rb +44 -0
  272. data/lib/mindee/v2/product/extraction/params/data_schema.rb +51 -0
  273. data/lib/mindee/v2/product/extraction/params/data_schema_field.rb +69 -0
  274. data/lib/mindee/v2/product/extraction/params/data_schema_replace.rb +39 -0
  275. data/lib/mindee/v2/product/extraction/params/extraction_parameters.rb +125 -0
  276. data/lib/mindee/v2/product/ocr/ocr.rb +20 -0
  277. data/lib/mindee/v2/product/ocr/ocr_inference.rb +34 -0
  278. data/lib/mindee/v2/product/ocr/ocr_page.rb +33 -0
  279. data/lib/mindee/v2/product/ocr/ocr_response.rb +32 -0
  280. data/lib/mindee/v2/product/ocr/ocr_result.rb +34 -0
  281. data/lib/mindee/v2/product/ocr/ocr_word.rb +29 -0
  282. data/lib/mindee/v2/product/ocr/params/ocr_parameters.rb +47 -0
  283. data/lib/mindee/v2/product/split/params/split_parameters.rb +48 -0
  284. data/lib/mindee/v2/product/split/split.rb +19 -0
  285. data/lib/mindee/v2/product/split/split_inference.rb +34 -0
  286. data/lib/mindee/v2/product/split/split_range.rb +38 -0
  287. data/lib/mindee/v2/product/split/split_response.rb +40 -0
  288. data/lib/mindee/v2/product/split/split_result.rb +34 -0
  289. data/lib/mindee/v2/product.rb +7 -0
  290. data/lib/mindee/v2.rb +7 -0
  291. data/lib/mindee/version.rb +26 -0
  292. data/lib/mindee.rb +135 -0
  293. data/mindee-lite.gemspec +36 -0
  294. data/mindee.gemspec +44 -0
  295. data/sig/custom/marcel.rbs +3 -0
  296. data/sig/custom/mini_magick.rbs +31 -0
  297. data/sig/custom/net_http.rbs +43 -0
  298. data/sig/custom/origami.rbs +59 -0
  299. data/sig/mindee/dependency.rbs +13 -0
  300. data/sig/mindee/error/mindee_error.rbs +13 -0
  301. data/sig/mindee/error/mindee_http_error.rbs +17 -0
  302. data/sig/mindee/error/mindee_http_error_v2.rbs +15 -0
  303. data/sig/mindee/error/mindee_http_unknown_error_v2.rbs +9 -0
  304. data/sig/mindee/error/mindee_input_error.rbs +18 -0
  305. data/sig/mindee/geometry/min_max.rbs +11 -0
  306. data/sig/mindee/geometry/point.rbs +14 -0
  307. data/sig/mindee/geometry/polygon.rbs +12 -0
  308. data/sig/mindee/geometry/quadrilateral.rbs +15 -0
  309. data/sig/mindee/geometry/utils.rbs +13 -0
  310. data/sig/mindee/http/http_error_handler.rbs +15 -0
  311. data/sig/mindee/http/response_validation.rbs +11 -0
  312. data/sig/mindee/image/extracted_image.rbs +21 -0
  313. data/sig/mindee/image/image_compressor.rbs +8 -0
  314. data/sig/mindee/image/image_extractor.rbs +13 -0
  315. data/sig/mindee/image/image_utils.rbs +19 -0
  316. data/sig/mindee/input/base_parameters.rbs +35 -0
  317. data/sig/mindee/input/local_response.rbs +14 -0
  318. data/sig/mindee/input/polling_options.rbs +12 -0
  319. data/sig/mindee/input/sources/base64_input_source.rbs +11 -0
  320. data/sig/mindee/input/sources/bytes_input_source.rbs +10 -0
  321. data/sig/mindee/input/sources/file_input_source.rbs +10 -0
  322. data/sig/mindee/input/sources/local_input_source.rbs +30 -0
  323. data/sig/mindee/input/sources/path_input_source.rbs +10 -0
  324. data/sig/mindee/input/sources/url_input_source.rbs +20 -0
  325. data/sig/mindee/logging/logger.rbs +11 -0
  326. data/sig/mindee/page_options.rbs +11 -0
  327. data/sig/mindee/pdf/extracted_pdf.rbs +17 -0
  328. data/sig/mindee/pdf/pdf_compressor.rbs +15 -0
  329. data/sig/mindee/pdf/pdf_extractor.rbs +19 -0
  330. data/sig/mindee/pdf/pdf_processor.rbs +12 -0
  331. data/sig/mindee/pdf/pdf_tools.rbs +31 -0
  332. data/sig/mindee/v1/client.rbs +84 -0
  333. data/sig/mindee/v1/extraction/multi_receipts_extractor.rbs +8 -0
  334. data/sig/mindee/v1/http/endpoint.rbs +41 -0
  335. data/sig/mindee/v1/http/workflow_endpoint.rbs +22 -0
  336. data/sig/mindee/v1/parsing/common/api_request.rbs +22 -0
  337. data/sig/mindee/v1/parsing/common/api_response.rbs +31 -0
  338. data/sig/mindee/v1/parsing/common/document.rbs +32 -0
  339. data/sig/mindee/v1/parsing/common/execution.rbs +26 -0
  340. data/sig/mindee/v1/parsing/common/execution_file.rbs +16 -0
  341. data/sig/mindee/v1/parsing/common/execution_priority.rbs +16 -0
  342. data/sig/mindee/v1/parsing/common/extras/cropper_extra.rbs +18 -0
  343. data/sig/mindee/v1/parsing/common/extras/extras.rbs +24 -0
  344. data/sig/mindee/v1/parsing/common/extras/full_text_ocr_extra.rbs +22 -0
  345. data/sig/mindee/v1/parsing/common/extras/rag_extra.rbs +19 -0
  346. data/sig/mindee/v1/parsing/common/inference.rbs +31 -0
  347. data/sig/mindee/v1/parsing/common/job.rbs +24 -0
  348. data/sig/mindee/v1/parsing/common/ocr/mvision_v1.rbs +20 -0
  349. data/sig/mindee/v1/parsing/common/ocr/ocr.rbs +56 -0
  350. data/sig/mindee/v1/parsing/common/orientation.rbs +15 -0
  351. data/sig/mindee/v1/parsing/common/page.rbs +19 -0
  352. data/sig/mindee/v1/parsing/common/prediction.rbs +14 -0
  353. data/sig/mindee/v1/parsing/common/product.rbs +16 -0
  354. data/sig/mindee/v1/parsing/common/workflow_response.rbs +22 -0
  355. data/sig/mindee/v1/parsing/standard/abstract_field.rbs +30 -0
  356. data/sig/mindee/v1/parsing/standard/address_field.rbs +28 -0
  357. data/sig/mindee/v1/parsing/standard/amount_field.rbs +16 -0
  358. data/sig/mindee/v1/parsing/standard/base_field.rbs +16 -0
  359. data/sig/mindee/v1/parsing/standard/boolean_field.rbs +16 -0
  360. data/sig/mindee/v1/parsing/standard/classification_field.rbs +12 -0
  361. data/sig/mindee/v1/parsing/standard/company_registration_field.rbs +20 -0
  362. data/sig/mindee/v1/parsing/standard/date_field.rbs +20 -0
  363. data/sig/mindee/v1/parsing/standard/feature_field.rbs +12 -0
  364. data/sig/mindee/v1/parsing/standard/locale_field.rbs +24 -0
  365. data/sig/mindee/v1/parsing/standard/payment_details_field.rbs +19 -0
  366. data/sig/mindee/v1/parsing/standard/position_field.rbs +26 -0
  367. data/sig/mindee/v1/parsing/standard/string_field.rbs +16 -0
  368. data/sig/mindee/v1/parsing/standard/tax_field.rbs +33 -0
  369. data/sig/mindee/v1/parsing/universal/universal_list_field.rbs +21 -0
  370. data/sig/mindee/v1/parsing/universal/universal_object_field.rbs +38 -0
  371. data/sig/mindee/v1/product/barcode_reader/barcode_reader_v1.rbs +13 -0
  372. data/sig/mindee/v1/product/barcode_reader/barcode_reader_v1_document.rbs +16 -0
  373. data/sig/mindee/v1/product/barcode_reader/barcode_reader_v1_page.rbs +17 -0
  374. data/sig/mindee/v1/product/cropper/cropper_v1.rbs +13 -0
  375. data/sig/mindee/v1/product/cropper/cropper_v1_document.rbs +14 -0
  376. data/sig/mindee/v1/product/cropper/cropper_v1_page.rbs +19 -0
  377. data/sig/mindee/v1/product/financial_document/financial_document_v1.rbs +13 -0
  378. data/sig/mindee/v1/product/financial_document/financial_document_v1_document.rbs +49 -0
  379. data/sig/mindee/v1/product/financial_document/financial_document_v1_line_item.rbs +35 -0
  380. data/sig/mindee/v1/product/financial_document/financial_document_v1_line_items.rbs +15 -0
  381. data/sig/mindee/v1/product/financial_document/financial_document_v1_page.rbs +17 -0
  382. data/sig/mindee/v1/product/fr/bank_account_details/bank_account_details_v1.rbs +15 -0
  383. data/sig/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.rbs +19 -0
  384. data/sig/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_page.rbs +19 -0
  385. data/sig/mindee/v1/product/fr/bank_account_details/bank_account_details_v2.rbs +15 -0
  386. data/sig/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_bban.rbs +25 -0
  387. data/sig/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.rbs +20 -0
  388. data/sig/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_page.rbs +19 -0
  389. data/sig/mindee/v1/product/fr/bank_statement/bank_statement_v2.rbs +15 -0
  390. data/sig/mindee/v1/product/fr/bank_statement/bank_statement_v2_document.rbs +31 -0
  391. data/sig/mindee/v1/product/fr/bank_statement/bank_statement_v2_page.rbs +19 -0
  392. data/sig/mindee/v1/product/fr/bank_statement/bank_statement_v2_transaction.rbs +27 -0
  393. data/sig/mindee/v1/product/fr/bank_statement/bank_statement_v2_transactions.rbs +17 -0
  394. data/sig/mindee/v1/product/fr/id_card/id_card_v1.rbs +15 -0
  395. data/sig/mindee/v1/product/fr/id_card/id_card_v1_document.rbs +26 -0
  396. data/sig/mindee/v1/product/fr/id_card/id_card_v1_page.rbs +20 -0
  397. data/sig/mindee/v1/product/fr/id_card/id_card_v2.rbs +15 -0
  398. data/sig/mindee/v1/product/fr/id_card/id_card_v2_document.rbs +31 -0
  399. data/sig/mindee/v1/product/fr/id_card/id_card_v2_page.rbs +21 -0
  400. data/sig/mindee/v1/product/international_id/international_id_v2.rbs +13 -0
  401. data/sig/mindee/v1/product/international_id/international_id_v2_document.rbs +31 -0
  402. data/sig/mindee/v1/product/international_id/international_id_v2_page.rbs +17 -0
  403. data/sig/mindee/v1/product/invoice/invoice_v4.rbs +13 -0
  404. data/sig/mindee/v1/product/invoice/invoice_v4_document.rbs +45 -0
  405. data/sig/mindee/v1/product/invoice/invoice_v4_line_item.rbs +35 -0
  406. data/sig/mindee/v1/product/invoice/invoice_v4_line_items.rbs +15 -0
  407. data/sig/mindee/v1/product/invoice/invoice_v4_page.rbs +17 -0
  408. data/sig/mindee/v1/product/invoice_splitter/invoice_splitter_v1.rbs +13 -0
  409. data/sig/mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.rbs +17 -0
  410. data/sig/mindee/v1/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.rbs +21 -0
  411. data/sig/mindee/v1/product/invoice_splitter/invoice_splitter_v1_invoice_page_groups.rbs +15 -0
  412. data/sig/mindee/v1/product/invoice_splitter/invoice_splitter_v1_page.rbs +17 -0
  413. data/sig/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.rbs +14 -0
  414. data/sig/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.rbs +15 -0
  415. data/sig/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_page.rbs +17 -0
  416. data/sig/mindee/v1/product/passport/passport_v1.rbs +13 -0
  417. data/sig/mindee/v1/product/passport/passport_v1_document.rbs +25 -0
  418. data/sig/mindee/v1/product/passport/passport_v1_page.rbs +17 -0
  419. data/sig/mindee/v1/product/receipt/receipt_v5.rbs +13 -0
  420. data/sig/mindee/v1/product/receipt/receipt_v5_document.rbs +33 -0
  421. data/sig/mindee/v1/product/receipt/receipt_v5_line_item.rbs +27 -0
  422. data/sig/mindee/v1/product/receipt/receipt_v5_line_items.rbs +15 -0
  423. data/sig/mindee/v1/product/receipt/receipt_v5_page.rbs +17 -0
  424. data/sig/mindee/v1/product/resume/resume_v1.rbs +13 -0
  425. data/sig/mindee/v1/product/resume/resume_v1_certificate.rbs +27 -0
  426. data/sig/mindee/v1/product/resume/resume_v1_certificates.rbs +17 -0
  427. data/sig/mindee/v1/product/resume/resume_v1_document.rbs +69 -0
  428. data/sig/mindee/v1/product/resume/resume_v1_education.rbs +33 -0
  429. data/sig/mindee/v1/product/resume/resume_v1_educations.rbs +17 -0
  430. data/sig/mindee/v1/product/resume/resume_v1_language.rbs +23 -0
  431. data/sig/mindee/v1/product/resume/resume_v1_languages.rbs +17 -0
  432. data/sig/mindee/v1/product/resume/resume_v1_page.rbs +19 -0
  433. data/sig/mindee/v1/product/resume/resume_v1_professional_experience.rbs +37 -0
  434. data/sig/mindee/v1/product/resume/resume_v1_professional_experiences.rbs +17 -0
  435. data/sig/mindee/v1/product/resume/resume_v1_social_networks_url.rbs +23 -0
  436. data/sig/mindee/v1/product/resume/resume_v1_social_networks_urls.rbs +17 -0
  437. data/sig/mindee/v1/product/universal/universal.rbs +16 -0
  438. data/sig/mindee/v1/product/universal/universal_document.rbs +12 -0
  439. data/sig/mindee/v1/product/universal/universal_page.rbs +18 -0
  440. data/sig/mindee/v1/product/universal/universal_prediction.rbs +30 -0
  441. data/sig/mindee/v2/client.rbs +29 -0
  442. data/sig/mindee/v2/file_operation/crop.rbs +10 -0
  443. data/sig/mindee/v2/file_operation/crop_files.rbs +9 -0
  444. data/sig/mindee/v2/file_operation/split.rbs +11 -0
  445. data/sig/mindee/v2/file_operation/split_files.rbs +9 -0
  446. data/sig/mindee/v2/http/api_v2_settings.rbs +27 -0
  447. data/sig/mindee/v2/http/mindee_api_v2.rbs +52 -0
  448. data/sig/mindee/v2/parsing/base_inference.rbs +18 -0
  449. data/sig/mindee/v2/parsing/base_response.rbs +11 -0
  450. data/sig/mindee/v2/parsing/common_response.rbs +12 -0
  451. data/sig/mindee/v2/parsing/error_item.rbs +13 -0
  452. data/sig/mindee/v2/parsing/error_response.rbs +20 -0
  453. data/sig/mindee/v2/parsing/field/base_field.rbs +17 -0
  454. data/sig/mindee/v2/parsing/field/field_confidence.rbs +30 -0
  455. data/sig/mindee/v2/parsing/field/field_location.rbs +16 -0
  456. data/sig/mindee/v2/parsing/field/inference_fields.rbs +20 -0
  457. data/sig/mindee/v2/parsing/field/list_field.rbs +23 -0
  458. data/sig/mindee/v2/parsing/field/object_field.rbs +27 -0
  459. data/sig/mindee/v2/parsing/field/simple_field.rbs +16 -0
  460. data/sig/mindee/v2/parsing/inference_active_options.rbs +26 -0
  461. data/sig/mindee/v2/parsing/inference_file.rbs +17 -0
  462. data/sig/mindee/v2/parsing/inference_job.rbs +13 -0
  463. data/sig/mindee/v2/parsing/inference_model.rbs +12 -0
  464. data/sig/mindee/v2/parsing/job.rbs +24 -0
  465. data/sig/mindee/v2/parsing/job_response.rbs +14 -0
  466. data/sig/mindee/v2/parsing/job_webhook.rbs +19 -0
  467. data/sig/mindee/v2/parsing/rag_metadata.rbs +13 -0
  468. data/sig/mindee/v2/parsing/raw_text.rbs +12 -0
  469. data/sig/mindee/v2/parsing/raw_text_page.rbs +11 -0
  470. data/sig/mindee/v2/parsing/search/pagination_metadata.rbs +20 -0
  471. data/sig/mindee/v2/parsing/search/search_model.rbs +19 -0
  472. data/sig/mindee/v2/parsing/search/search_response.rbs +17 -0
  473. data/sig/mindee/v2/parsing/search_models.rbs +14 -0
  474. data/sig/mindee/v2/product/base_product.rbs +19 -0
  475. data/sig/mindee/v2/product/classification/classification.rbs +10 -0
  476. data/sig/mindee/v2/product/classification/classification_classifier.rbs +15 -0
  477. data/sig/mindee/v2/product/classification/classification_inference.rbs +15 -0
  478. data/sig/mindee/v2/product/classification/classification_response.rbs +23 -0
  479. data/sig/mindee/v2/product/classification/classification_result.rbs +15 -0
  480. data/sig/mindee/v2/product/classification/params/classification_parameters/classification_parameters.rbs +23 -0
  481. data/sig/mindee/v2/product/crop/crop.rbs +10 -0
  482. data/sig/mindee/v2/product/crop/crop_inference.rbs +14 -0
  483. data/sig/mindee/v2/product/crop/crop_item.rbs +18 -0
  484. data/sig/mindee/v2/product/crop/crop_response.rbs +25 -0
  485. data/sig/mindee/v2/product/crop/crop_result.rbs +14 -0
  486. data/sig/mindee/v2/product/crop/params/crop_parameters/crop_parameters.rbs +23 -0
  487. data/sig/mindee/v2/product/extraction/extraction.rbs +15 -0
  488. data/sig/mindee/v2/product/extraction/extraction_inference.rbs +19 -0
  489. data/sig/mindee/v2/product/extraction/extraction_response.rbs +24 -0
  490. data/sig/mindee/v2/product/extraction/extraction_result.rbs +18 -0
  491. data/sig/mindee/v2/product/extraction/params/data_schema.rbs +21 -0
  492. data/sig/mindee/v2/product/extraction/params/data_schema_field.rbs +29 -0
  493. data/sig/mindee/v2/product/extraction/params/data_schema_replace.rbs +21 -0
  494. data/sig/mindee/v2/product/extraction/params/extraction_parameters.rbs +38 -0
  495. data/sig/mindee/v2/product/ocr/ocr.rbs +10 -0
  496. data/sig/mindee/v2/product/ocr/ocr_inference.rbs +14 -0
  497. data/sig/mindee/v2/product/ocr/ocr_page.rbs +15 -0
  498. data/sig/mindee/v2/product/ocr/ocr_response.rbs +23 -0
  499. data/sig/mindee/v2/product/ocr/ocr_result.rbs +14 -0
  500. data/sig/mindee/v2/product/ocr/ocr_word.rbs +15 -0
  501. data/sig/mindee/v2/product/ocr/params/ocr_parameters/ocr_parameters.rbs +24 -0
  502. data/sig/mindee/v2/product/split/params/split_parameters/split_parameters.rbs +23 -0
  503. data/sig/mindee/v2/product/split/split.rbs +10 -0
  504. data/sig/mindee/v2/product/split/split_inference.rbs +14 -0
  505. data/sig/mindee/v2/product/split/split_range.rbs +18 -0
  506. data/sig/mindee/v2/product/split/split_response.rbs +25 -0
  507. data/sig/mindee/v2/product/split/split_result.rbs +14 -0
  508. data/sig/mindee/version.rbs +6 -0
  509. data/sig/mindee.rbs +62 -0
  510. metadata +600 -0
@@ -0,0 +1,221 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'net/http'
5
+ require_relative '../../http/http_error_handler'
6
+ require_relative '../../version'
7
+ require_relative '../../http/response_validation'
8
+
9
+ module Mindee
10
+ # Mindee internal HTTP module.
11
+ module V1
12
+ module HTTP
13
+ # API key's default environment key name.
14
+ API_KEY_ENV_NAME = 'MINDEE_API_KEY'
15
+ # API key's default value.
16
+ API_KEY_DEFAULT = nil
17
+
18
+ # Base URL default environment key name.
19
+ BASE_URL_ENV_NAME = 'MINDEE_BASE_URL'
20
+ # Base URL's default value.
21
+ BASE_URL_DEFAULT = 'https://api.mindee.net/v1'
22
+
23
+ # HTTP request timeout default environment key name.
24
+ REQUEST_TIMEOUT_ENV_NAME = 'MINDEE_REQUEST_TIMEOUT'
25
+ # HTTP request timeout default value.
26
+ TIMEOUT_DEFAULT = 120
27
+
28
+ # Default value for the user agent.
29
+ USER_AGENT = "mindee-api-ruby@v#{Mindee::VERSION} ruby-v#{RUBY_VERSION} #{Mindee::PLATFORM}".freeze
30
+
31
+ # Generic API endpoint for a product.
32
+ class Endpoint
33
+ # @return [String]
34
+ attr_reader :api_key
35
+ # @return [Integer]
36
+ attr_reader :request_timeout
37
+ # @return [String]
38
+ attr_reader :url_root
39
+ # @return [String]
40
+ attr_reader :base_url
41
+
42
+ def initialize(owner, url_name, version, api_key: '')
43
+ @owner = owner
44
+ @url_name = url_name
45
+ @version = version
46
+ @request_timeout = ENV.fetch(REQUEST_TIMEOUT_ENV_NAME, TIMEOUT_DEFAULT).to_i
47
+ if api_key.nil? && !ENV.fetch(API_KEY_ENV_NAME, API_KEY_DEFAULT).to_s.empty?
48
+ logger.debug('API key set from environment')
49
+ end
50
+ @api_key = api_key.nil? || api_key.empty? ? ENV.fetch(API_KEY_ENV_NAME, API_KEY_DEFAULT) : api_key
51
+ @base_url = ENV.fetch(BASE_URL_ENV_NAME, BASE_URL_DEFAULT).chomp('/')
52
+ @url_root = "#{@base_url}/products/#{@owner}/#{@url_name}/v#{@version}"
53
+ end
54
+
55
+ # Call the prediction API.
56
+ # @param input_source [Mindee::Input::Source::LocalInputSource, Mindee::Input::Source::URLInputSource]
57
+ # @param opts [ParseOptions] Parse options.
58
+ # @return [Array]
59
+ def predict(input_source, opts)
60
+ check_api_key
61
+ response = predict_req_post(
62
+ input_source,
63
+ opts
64
+ )
65
+ if !response.nil? && response.respond_to?(:body)
66
+ hashed_response = JSON.parse(response.body, object_class: Hash)
67
+ return [hashed_response, response.body] if Mindee::HTTP::ResponseValidation.valid_sync_response?(response)
68
+
69
+ Mindee::HTTP::ResponseValidation.clean_request!(response)
70
+ end
71
+
72
+ raise Error::MindeeError, 'Could not resolve server response.' if response.nil?
73
+
74
+ error = Mindee::HTTP::ErrorHandler.handle_error(@url_name, response)
75
+ raise error
76
+ end
77
+
78
+ # Call the prediction API.
79
+ # @param input_source [Mindee::Input::Source::LocalInputSource, Mindee::Input::Source::URLInputSource]
80
+ # @param opts [ParseOptions, Hash] Parse options.
81
+ # @return [Array]
82
+ def predict_async(input_source, opts)
83
+ check_api_key
84
+ response = document_queue_req_post(input_source, opts)
85
+ if !response.nil? && response.respond_to?(:body)
86
+ hashed_response = JSON.parse(response.body, object_class: Hash)
87
+ return [hashed_response, response.body] if Mindee::HTTP::ResponseValidation.valid_async_response?(response)
88
+
89
+ Mindee::HTTP::ResponseValidation.clean_request!(response)
90
+ end
91
+
92
+ raise Error::MindeeError, 'Could not resolve server response.' if response.nil?
93
+
94
+ raise Mindee::HTTP::ErrorHandler.handle_error(@url_name, response)
95
+ end
96
+
97
+ # Calls the parsed async doc.
98
+ # @param job_id [String]
99
+ # @return [Array]
100
+ def parse_async(job_id)
101
+ check_api_key
102
+ response = document_queue_req_get(job_id)
103
+ hashed_response = JSON.parse(response.body, object_class: Hash)
104
+ return [hashed_response, response.body] if Mindee::HTTP::ResponseValidation.valid_async_response?(response)
105
+
106
+ Mindee::HTTP::ResponseValidation.clean_request!(response)
107
+ error = Mindee::HTTP::ErrorHandler.handle_error(@url_name, response)
108
+ raise error
109
+ end
110
+
111
+ private
112
+
113
+ # @param input_source [Mindee::Input::Source::LocalInputSource, Mindee::Input::Source::URLInputSource]
114
+ # @param opts [ParseOptions] Parse options.
115
+ # @return [Net::HTTPResponse, nil]
116
+ def predict_req_post(input_source, opts)
117
+ uri = URI("#{@url_root}/predict")
118
+
119
+ params = {} # : Hash[String | Symbol, untyped]
120
+ params[:cropper] = 'true' if opts.cropper
121
+ params[:full_text_ocr] = 'true' if opts.full_text
122
+ uri.query = URI.encode_www_form(params)
123
+
124
+ headers = {
125
+ 'Authorization' => "Token #{@api_key}",
126
+ 'User-Agent' => USER_AGENT,
127
+ }
128
+ req = Net::HTTP::Post.new(uri, headers)
129
+ form_data = if input_source.is_a?(Mindee::Input::Source::URLInputSource)
130
+ [['document', input_source.url]] # : Array[untyped]
131
+ else
132
+ [['document', *input_source.read_contents(close: opts.close_file)]] # : Array[untyped]
133
+ end
134
+ form_data.push ['include_mvision', 'true'] if opts.all_words
135
+
136
+ req.set_form(form_data, 'multipart/form-data')
137
+ req['Transfer-Encoding'] = 'chunked'
138
+
139
+ Net::HTTP.start(uri.hostname, uri.port, use_ssl: true, read_timeout: @request_timeout) do |http|
140
+ return http.request(req)
141
+ end
142
+ raise Mindee::Error::MindeeError, 'Could not resolve server response.'
143
+ end
144
+
145
+ # @param input_source [Mindee::Input::Source::LocalInputSource, Mindee::Input::Source::URLInputSource]
146
+ # @param opts [ParseOptions] Parse options.
147
+ # @return [Net::HTTPResponse]
148
+ def document_queue_req_post(input_source, opts)
149
+ uri = if opts.workflow_id
150
+ URI("#{@base_url}/workflows/#{opts.workflow_id}/predict_async")
151
+ else
152
+ URI("#{@url_root}/predict_async")
153
+ end
154
+
155
+ params = {} # : Hash[String | Symbol, untyped]
156
+ params[:cropper] = 'true' if opts.cropper
157
+ params[:full_text_ocr] = 'true' if opts.full_text
158
+ params[:rag] = 'true' if opts.rag
159
+ uri.query = URI.encode_www_form(params)
160
+
161
+ headers = {
162
+ 'Authorization' => "Token #{@api_key}",
163
+ 'User-Agent' => USER_AGENT,
164
+ }
165
+ req = Net::HTTP::Post.new(uri, headers)
166
+ form_data = if input_source.is_a?(Mindee::Input::Source::URLInputSource)
167
+ [['document', input_source.url]] # : Array[untyped]
168
+ else
169
+ [['document', *input_source.read_contents(close: opts.close_file)]] # : Array[untyped]
170
+ end
171
+ form_data.push ['include_mvision', 'true'] if opts.all_words
172
+
173
+ req.set_form(form_data, 'multipart/form-data')
174
+ req['Transfer-Encoding'] = 'chunked'
175
+
176
+ Net::HTTP.start(uri.hostname, uri.port, use_ssl: true, read_timeout: @request_timeout) do |http|
177
+ return http.request(req)
178
+ end
179
+ raise Mindee::Error::MindeeError, 'Could not resolve server response.'
180
+ end
181
+
182
+ # @param job_id [String]
183
+ # @return [Net::HTTPResponse, nil]
184
+ def document_queue_req_get(job_id)
185
+ uri = URI("#{@url_root}/documents/queue/#{job_id}")
186
+
187
+ headers = {
188
+ 'Authorization' => "Token #{@api_key}",
189
+ 'User-Agent' => USER_AGENT,
190
+ }
191
+
192
+ req = Net::HTTP::Get.new(uri, headers)
193
+
194
+ response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true, read_timeout: @request_timeout) do |http|
195
+ http.request(req)
196
+ end
197
+
198
+ raise Error::MindeeError, 'Could not resolve server response.' if response.nil?
199
+
200
+ if response.code.to_i > 299 && response.code.to_i < 400
201
+ req = Net::HTTP::Get.new(response['location'], headers)
202
+ Net::HTTP.start(uri.hostname, uri.port, use_ssl: true, read_timeout: @request_timeout) do |http|
203
+ response = http.request(req)
204
+ end
205
+ end
206
+ response
207
+ end
208
+
209
+ # Checks API key
210
+ def check_api_key
211
+ return unless @api_key.nil? || @api_key.empty?
212
+
213
+ raise Error::MindeeAPIError,
214
+ "Missing API key for product \"'#{@url_name}' v#{@version}\" (belonging to \"#{@owner}\"), " \
215
+ "check your Client Configuration.\nYou can set this using the " \
216
+ "'#{HTTP::API_KEY_ENV_NAME}' environment variable."
217
+ end
218
+ end
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'net/http'
5
+ require_relative '../../http/http_error_handler'
6
+
7
+ module Mindee
8
+ module V1
9
+ module HTTP
10
+ # Handles the routing for workflow calls.
11
+ class WorkflowEndpoint
12
+ # @return [String]
13
+ attr_reader :api_key
14
+ # @return [Integer]
15
+ attr_reader :request_timeout
16
+ # @return [String]
17
+ attr_reader :url
18
+
19
+ def initialize(workflow_id, api_key: '')
20
+ @request_timeout = ENV.fetch(REQUEST_TIMEOUT_ENV_NAME, TIMEOUT_DEFAULT).to_i
21
+ @api_key = api_key.nil? || api_key.empty? ? ENV.fetch(API_KEY_ENV_NAME, API_KEY_DEFAULT) : api_key
22
+ base_url = ENV.fetch(BASE_URL_ENV_NAME, BASE_URL_DEFAULT)
23
+ @url = "#{base_url.chomp('/')}/workflows/#{workflow_id}/executions"
24
+ end
25
+
26
+ # Sends a document to the workflow.
27
+ # @param input_source [Mindee::Input::Source::LocalInputSource, Mindee::Input::Source::URLInputSource]
28
+ # @param opts [WorkflowOptions] Options to configure workflow execution behavior.
29
+ # @return [Array]
30
+ def execute_workflow(input_source, opts)
31
+ check_api_key
32
+ response = workflow_execution_req_post(input_source, opts)
33
+ if response.nil?
34
+ raise Mindee::Error::MindeeHTTPError.new(
35
+ { code: 0, details: 'Server response was nil.', message: 'Unknown error.' }, @url, 0
36
+ )
37
+ end
38
+
39
+ hashed_response = JSON.parse(response.body, object_class: Hash)
40
+ return [hashed_response, response.body] if Mindee::HTTP::ResponseValidation.valid_async_response?(response)
41
+
42
+ Mindee::HTTP::ResponseValidation.clean_request!(response)
43
+ error = Mindee::HTTP::ErrorHandler.handle_error(@url_name, response)
44
+ raise error
45
+ end
46
+
47
+ # @param input_source [Mindee::Input::Source::LocalInputSource, Mindee::Input::Source::URLInputSource]
48
+ # @param opts [WorkflowOptions] Options to configure workflow execution behavior.
49
+ # @return [Net::HTTPResponse, nil]
50
+ def workflow_execution_req_post(input_source, opts)
51
+ uri = URI(@url)
52
+ params = {} # : Hash[String | Symbol, untyped]
53
+ params[:full_text_ocr] = 'true' if opts.full_text
54
+ params[:rag] = 'true' if opts.rag
55
+ uri.query = URI.encode_www_form(params) if params.any?
56
+
57
+ headers = {
58
+ 'Authorization' => "Token #{@api_key}",
59
+ 'User-Agent' => USER_AGENT,
60
+ }
61
+ req = Net::HTTP::Post.new(uri, headers)
62
+ form_data = [] # : Array[untyped]
63
+ if input_source.is_a?(Mindee::Input::Source::URLInputSource)
64
+ form_data.push ['document', input_source.url]
65
+ else
66
+ form_data.push ['document', *input_source.read_contents(close: opts.close_file)]
67
+ end
68
+ form_data.push ['alias', opts.document_alias] if opts.document_alias
69
+ form_data.push ['public_url', opts.public_url] if opts.public_url
70
+ form_data.push ['priority', opts.priority.to_s] if opts.priority
71
+
72
+ req.set_form(form_data, 'multipart/form-data')
73
+ req['Transfer-Encoding'] = 'chunked'
74
+
75
+ response = nil
76
+ Net::HTTP.start(uri.hostname, uri.port, use_ssl: true, read_timeout: @request_timeout) do |http|
77
+ response = http.request(req)
78
+ end
79
+ response
80
+ end
81
+
82
+ # Checks API key
83
+ def check_api_key
84
+ return unless @api_key.nil? || @api_key.empty?
85
+
86
+ raise Error::MindeeConfigurationError, "Missing API key. Check your Client Configuration.\n" \
87
+ "You can set this using the '#{HTTP::API_KEY_ENV_NAME}'" \
88
+ 'environment variable.'
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'http/workflow_endpoint'
4
+ require_relative 'http/endpoint'
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mindee
4
+ module V1
5
+ module Parsing
6
+ module Common
7
+ # HTTP request response.
8
+ class ApiRequest
9
+ # @return [Hash]
10
+ attr_reader :error
11
+ # @return [Array<String>]
12
+ attr_reader :resources
13
+ # @return [RequestStatus, Symbol]
14
+ attr_reader :status
15
+ # @return [Integer]
16
+ attr_reader :status_code
17
+ # @return [String]
18
+ attr_reader :url
19
+
20
+ def initialize(server_response)
21
+ @error = server_response['error']
22
+ @resources = server_response['resources']
23
+
24
+ @status = if server_response['status'] == 'failure'
25
+ RequestStatus::FAILURE
26
+ elsif server_response['status'] == 'success'
27
+ RequestStatus::SUCCESS
28
+ else
29
+ server_response['status']&.to_sym
30
+ end
31
+ @status_code = server_response['status_code']
32
+ @url = server_response['url']
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'document'
4
+ require_relative '../../../logging'
5
+
6
+ module Mindee
7
+ module V1
8
+ module Parsing
9
+ module Common
10
+ # Potential values for queue in asynchronous calls.
11
+ module JobStatus
12
+ # Job is waiting.
13
+ WAITING = :waiting
14
+ # Job is processing.
15
+ PROCESSING = :processing
16
+ # Job is done.
17
+ COMPLETED = :completed
18
+ # Job failed.
19
+ FAILURE = :failed
20
+ end
21
+
22
+ # Potential values for requests.
23
+ module RequestStatus
24
+ # Failed.
25
+ FAILURE = :failure
26
+ # Success.
27
+ SUCCESS = :success
28
+ end
29
+
30
+ # Wrapper class for all predictions (synchronous and asynchronous)
31
+ class ApiResponse
32
+ # @return [Mindee::V1::Parsing::Common::Document, nil]
33
+ attr_reader :document
34
+ # @return [Mindee::V1::Parsing::Common::Job, nil]
35
+ attr_reader :job
36
+ # @return [Mindee::V1::Parsing::Common::ApiRequest]
37
+ attr_reader :api_request
38
+ # @return [String]
39
+ attr_reader :raw_http
40
+
41
+ # @param product_class [Mindee::Inference]
42
+ # @param http_response [Hash]
43
+ # @param raw_http [String]
44
+ def initialize(product_class, http_response, raw_http)
45
+ logger.debug('Handling API response')
46
+ @raw_http = raw_http
47
+ raise Error::MindeeAPIError, 'Invalid response format.' unless http_response.key?('api_request')
48
+
49
+ @api_request = Mindee::V1::Parsing::Common::ApiRequest.new(http_response['api_request'])
50
+
51
+ if http_response.key?('document') &&
52
+ (!http_response.key?('job') ||
53
+ http_response['job']['status'] == 'completed') &&
54
+ @api_request.status == RequestStatus::SUCCESS
55
+ @document = Mindee::V1::Parsing::Common::Document.new(product_class, http_response['document'])
56
+ end
57
+ @job = Mindee::V1::Parsing::Common::Job.new(http_response['job']) if http_response.key?('job')
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'inference'
4
+ require_relative 'extras'
5
+
6
+ module Mindee
7
+ module V1
8
+ module Parsing
9
+ module Common
10
+ # Stores all response attributes.
11
+ class Document
12
+ # @return [Mindee::Inference]
13
+ attr_reader :inference
14
+ # @return [String] Filename sent to the API
15
+ attr_reader :name
16
+ # @return [String] Mindee ID of the document
17
+ attr_reader :id
18
+ # @return [Mindee::V1::Parsing::Common::Extras::Extras] Potential Extras fields sent back along the prediction
19
+ attr_reader :extras
20
+ # @return [Mindee::V1::Parsing::Common::OCR::OCR, nil] OCR text results (limited availability)
21
+ attr_reader :ocr
22
+ # @return [Integer] Amount of pages of the document
23
+ attr_reader :n_pages
24
+
25
+ # Loads the MVision OCR response.
26
+ # @param http_response [Hash] Full HTTP contents of the response.
27
+ # @return [Mindee::V1::Parsing::Common::OCR::OCR]
28
+ def self.load_ocr(http_response)
29
+ ocr_prediction = http_response.fetch('ocr', nil)
30
+ return nil if ocr_prediction.nil? || ocr_prediction.fetch('mvision-v1', nil).nil?
31
+
32
+ OCR::OCR.new(ocr_prediction)
33
+ end
34
+
35
+ # Loads extras into the document prediction.
36
+ # @param http_response [Hash] Full HTTP contents of the response.
37
+ # @return [Mindee::V1::Parsing::Common::OCR::OCR]
38
+ def self.extract_extras(http_response)
39
+ extras_prediction = http_response['inference'].fetch('extras', nil)
40
+ return nil if extras_prediction.nil? || extras_prediction.fetch('mvision-v1', nil).nil?
41
+
42
+ Mindee::V1::Parsing::Common::Extras::Extras.new(extras_prediction)
43
+ end
44
+
45
+ # @param product_class [Mindee::Inference]
46
+ # @param http_response [Hash]
47
+ def initialize(product_class, http_response)
48
+ @id = http_response['id']
49
+ @name = http_response['name']
50
+ @inference = product_class.new(http_response['inference'])
51
+ @ocr = self.class.load_ocr(http_response)
52
+ @extras = self.class.extract_extras(http_response)
53
+ inject_full_text_ocr(http_response)
54
+ @n_pages = http_response['n_pages']
55
+ end
56
+
57
+ # @return [String]
58
+ def to_s
59
+ out_str = String.new
60
+ out_str << "########\nDocument\n########"
61
+ out_str << "\n:Mindee ID: #{@id}"
62
+ out_str << "\n:Filename: #{@name}"
63
+ out_str << "\n\n#{@inference}"
64
+ end
65
+
66
+ private
67
+
68
+ def inject_full_text_ocr(raw_prediction)
69
+ return unless raw_prediction.dig('inference', 'pages', 0, 'extras', 'full_text_ocr')
70
+
71
+ full_text_ocr = String.new
72
+ raw_prediction.dig('inference', 'pages').each do |page|
73
+ full_text_ocr << page['extras']['full_text_ocr']['content']
74
+ end
75
+ artificial_text_obj = { 'content' => full_text_ocr }
76
+ if @extras.nil? || @extras.empty?
77
+ @extras = Mindee::V1::Parsing::Common::Extras::Extras.new({ 'full_text_ocr' => artificial_text_obj })
78
+ else
79
+ @extras.add_artificial_extra({ 'full_text_ocr' => artificial_text_obj })
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mindee
4
+ module V1
5
+ module Parsing
6
+ module Common
7
+ # Identifier for the batch to which the execution belongs.
8
+ class Execution
9
+ # Identifier for the batch to which the execution belongs.
10
+ # @return [String]
11
+ attr_reader :batch_name
12
+ # The time at which the execution started.
13
+ # @return [Time, nil]
14
+ attr_reader :created_at
15
+ # File representation within a workflow execution.
16
+ # @return [ExecutionFile]
17
+ attr_reader :file
18
+ # Identifier for the execution.
19
+ # @return [String]
20
+ attr_reader :id
21
+ # Deserialized inference object.
22
+ # @return [Mindee::Inference]
23
+ attr_reader :inference
24
+ # Priority of the execution.
25
+ # @return [ExecutionPriority, Symbol, nil]
26
+ attr_reader :priority
27
+ # The time at which the file was tagged as reviewed.
28
+ # @return [Time, nil]
29
+ attr_reader :reviewed_at
30
+ # The time at which the file was uploaded to a workflow.
31
+ # @return [Time, nil]
32
+ attr_reader :available_at
33
+ # Reviewed fields and values.
34
+ # @return [Mindee::V1::Product::Universal::UniversalDocument]
35
+ attr_reader :reviewed_prediction
36
+ # Execution Status.
37
+ # @return [String]
38
+ attr_reader :status
39
+ # Execution type.
40
+ # @return [String]
41
+ attr_reader :type
42
+ # The time at which the file was uploaded to a workflow.
43
+ # @return [Time, nil]
44
+ attr_reader :uploaded_at
45
+ # Identifier for the workflow.
46
+ # @return [String]
47
+ attr_reader :workflow_id
48
+
49
+ # rubocop:disable Metrics/CyclomaticComplexity
50
+
51
+ # @param product_class [Mindee::Inference]
52
+ # @param http_response [Hash]
53
+ def initialize(product_class, http_response)
54
+ @batch_name = http_response['batch_name']
55
+ @created_at = Time.iso8601(http_response['created_at']) if http_response['created_at']
56
+ @file = ExecutionFile.new(http_response['file']) if http_response['file']
57
+ @id = http_response['id']
58
+ @inference = product_class.new(http_response['inference']) if http_response['inference']
59
+ @priority = Mindee::V1::Parsing::Common::ExecutionPriority.to_priority(http_response['priority'])
60
+ @reviewed_at = Time.iso8601(http_response['reviewed_at']) if http_response['reviewed_at']
61
+ @available_at = Time.iso8601(http_response['available_at']) if http_response['available_at']
62
+ if http_response['reviewed_prediction']
63
+ @reviewed_prediction = Mindee::V1::Product::Universal::UniversalDocument.new(
64
+ http_response['reviewed_prediction']
65
+ )
66
+ end
67
+ @status = http_response['status']
68
+ @type = http_response['type']
69
+ @uploaded_at = Time.iso8601(http_response['uploaded_at']) if http_response['uploaded_at']
70
+ @workflow_id = http_response['workflow_id']
71
+ end
72
+
73
+ # rubocop:enable Metrics/CyclomaticComplexity
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mindee
4
+ module V1
5
+ module Parsing
6
+ module Common
7
+ # Representation of a workflow execution's file data.
8
+ class ExecutionFile
9
+ # File name.
10
+ # @return [String]
11
+ attr_reader :name
12
+
13
+ # Optional alias for the file.
14
+ # @return [String]
15
+ attr_reader :alias
16
+
17
+ # @param http_response [Hash]
18
+ def initialize(http_response)
19
+ @name = http_response['name']
20
+ @alias = http_response['alias']
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mindee
4
+ module V1
5
+ module Parsing
6
+ module Common
7
+ # Execution policy priority values.
8
+ module ExecutionPriority
9
+ # Low priority execution.
10
+ # @return [Symbol] :low
11
+ LOW = :low
12
+ # Medium priority execution.
13
+ # @return [Symbol] :low
14
+ MEDIUM = :medium
15
+ # High priority execution.
16
+ # @return [Symbol] :low
17
+ HIGH = :high
18
+
19
+ # Sets the priority to one of its possibly values, defaults to nil otherwise.
20
+ # @param [String, nil] priority_str
21
+ # @return [Symbol, nil]
22
+ def self.to_priority(priority_str)
23
+ return nil if priority_str.nil?
24
+
25
+ case priority_str.downcase
26
+ when 'low'
27
+ :low
28
+ when 'high'
29
+ :high
30
+ else
31
+ :medium
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../standard/position_field'
4
+
5
+ module Mindee
6
+ module V1
7
+ module Parsing
8
+ module Common
9
+ module Extras
10
+ # Contains information on the cropping of a prediction.
11
+ class CropperExtra
12
+ # Cropper extra initialization.
13
+ # @return [Array<Mindee::V1::Parsing::Standard::PositionField>]
14
+ attr_reader :croppings
15
+
16
+ def initialize(raw_prediction, page_id = nil)
17
+ @croppings = [] # : Array[Mindee::V1::Parsing::Standard::PositionField]
18
+ raw_prediction['cropping']&.each do |crop|
19
+ @croppings.push(Mindee::V1::Parsing::Standard::PositionField.new(crop, page_id))
20
+ end
21
+ end
22
+
23
+ # @return [String]
24
+ def to_s
25
+ @croppings.join("\n ")
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end