mindee 4.5.0 → 4.7.0.pre.rc1

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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/README.md +21 -222
  4. data/docs/code_samples/default_v2.txt +28 -0
  5. data/docs/global_products/financial_document_v1.md +19 -4
  6. data/docs/global_products/invoices_v4.md +19 -4
  7. data/lib/mindee/client.rb +11 -30
  8. data/lib/mindee/client_v2.rb +109 -0
  9. data/lib/mindee/errors/mindee_http_error_v2.rb +26 -0
  10. data/lib/mindee/errors.rb +1 -0
  11. data/lib/mindee/geometry/point.rb +2 -2
  12. data/lib/mindee/geometry/quadrilateral.rb +4 -4
  13. data/lib/mindee/geometry/utils.rb +1 -0
  14. data/lib/mindee/http/api_settings_v2.rb +61 -0
  15. data/lib/mindee/http/endpoint.rb +12 -6
  16. data/lib/mindee/http/http_error_handler.rb +17 -4
  17. data/lib/mindee/http/mindee_api_v2.rb +148 -0
  18. data/lib/mindee/http/response_validation.rb +20 -1
  19. data/lib/mindee/http/workflow_endpoint.rb +2 -2
  20. data/lib/mindee/http.rb +2 -0
  21. data/lib/mindee/image/extracted_image.rb +1 -1
  22. data/lib/mindee/image/image_extractor.rb +10 -10
  23. data/lib/mindee/input/inference_parameters.rb +116 -0
  24. data/lib/mindee/input/local_response.rb +10 -1
  25. data/lib/mindee/input/polling_options.rb +26 -0
  26. data/lib/mindee/input/sources/base64_input_source.rb +2 -2
  27. data/lib/mindee/input/sources/local_input_source.rb +19 -12
  28. data/lib/mindee/input.rb +2 -0
  29. data/lib/mindee/page_options.rb +24 -0
  30. data/lib/mindee/parsing/common/api_request.rb +2 -2
  31. data/lib/mindee/parsing/common/api_response.rb +4 -0
  32. data/lib/mindee/parsing/common/execution.rb +1 -1
  33. data/lib/mindee/parsing/common/extras/extras.rb +2 -2
  34. data/lib/mindee/parsing/common/extras/rag_extra.rb +2 -0
  35. data/lib/mindee/parsing/common/inference.rb +1 -1
  36. data/lib/mindee/parsing/common/ocr/ocr.rb +4 -6
  37. data/lib/mindee/parsing/common/orientation.rb +2 -2
  38. data/lib/mindee/parsing/common/product.rb +6 -1
  39. data/lib/mindee/parsing/standard/address_field.rb +49 -0
  40. data/lib/mindee/parsing/standard/amount_field.rb +2 -2
  41. data/lib/mindee/parsing/standard/feature_field.rb +1 -1
  42. data/lib/mindee/parsing/standard/tax_field.rb +1 -1
  43. data/lib/mindee/parsing/standard.rb +1 -0
  44. data/lib/mindee/parsing/universal/universal_list_field.rb +2 -2
  45. data/lib/mindee/parsing/universal/universal_object_field.rb +7 -4
  46. data/lib/mindee/parsing/v2/common_response.rb +18 -0
  47. data/lib/mindee/parsing/v2/error_response.rb +36 -0
  48. data/lib/mindee/parsing/v2/field/base_field.rb +60 -0
  49. data/lib/mindee/parsing/v2/field/field_confidence.rb +91 -0
  50. data/lib/mindee/parsing/v2/field/field_location.rb +36 -0
  51. data/lib/mindee/parsing/v2/field/inference_fields.rb +96 -0
  52. data/lib/mindee/parsing/v2/field/list_field.rb +88 -0
  53. data/lib/mindee/parsing/v2/field/object_field.rb +102 -0
  54. data/lib/mindee/parsing/v2/field/simple_field.rb +56 -0
  55. data/lib/mindee/parsing/v2/field.rb +9 -0
  56. data/lib/mindee/parsing/v2/inference.rb +50 -0
  57. data/lib/mindee/parsing/v2/inference_file.rb +38 -0
  58. data/lib/mindee/parsing/v2/inference_model.rb +18 -0
  59. data/lib/mindee/parsing/v2/inference_response.rb +30 -0
  60. data/lib/mindee/parsing/v2/inference_result.rb +49 -0
  61. data/lib/mindee/parsing/v2/inference_result_options.rb +21 -0
  62. data/lib/mindee/parsing/v2/job.rb +86 -0
  63. data/lib/mindee/parsing/v2/job_response.rb +30 -0
  64. data/lib/mindee/parsing/v2/job_webhook.rb +60 -0
  65. data/lib/mindee/parsing/v2/raw_text.rb +21 -0
  66. data/lib/mindee/parsing/v2.rb +15 -0
  67. data/lib/mindee/pdf/extracted_pdf.rb +5 -3
  68. data/lib/mindee/pdf/pdf_extractor.rb +11 -7
  69. data/lib/mindee/pdf/pdf_processor.rb +6 -6
  70. data/lib/mindee/pdf/pdf_tools.rb +4 -2
  71. data/lib/mindee/product/financial_document/financial_document_v1_document.rb +8 -8
  72. data/lib/mindee/product/invoice/invoice_v4_document.rb +8 -8
  73. data/lib/mindee/product/universal/universal_prediction.rb +4 -4
  74. data/lib/mindee/version.rb +2 -2
  75. data/lib/mindee.rb +6 -0
  76. data/mindee.gemspec +1 -1
  77. data/sig/custom/mini_magick.rbs +14 -7
  78. data/sig/custom/net_http.rbs +4 -4
  79. data/sig/custom/origami.rbs +9 -4
  80. data/sig/mindee/client.rbs +14 -19
  81. data/sig/mindee/client_v2.rbs +17 -0
  82. data/sig/mindee/errors/mindee_http_error.rbs +6 -5
  83. data/sig/mindee/errors/mindee_http_error_v2.rbs +12 -0
  84. data/sig/mindee/errors/mindee_input_error.rbs +3 -2
  85. data/sig/mindee/geometry/min_max.rbs +4 -3
  86. data/sig/mindee/geometry/point.rbs +5 -6
  87. data/sig/mindee/geometry/polygon.rbs +3 -3
  88. data/sig/mindee/geometry/quadrilateral.rbs +5 -8
  89. data/sig/mindee/geometry/utils.rbs +8 -8
  90. data/sig/mindee/http/api_settings_v2.rbs +23 -0
  91. data/sig/mindee/http/endpoint.rbs +12 -11
  92. data/sig/mindee/http/http_error_handler.rbs +8 -3
  93. data/sig/mindee/http/mindee_api_v2.rbs +18 -0
  94. data/sig/mindee/http/response_validation.rbs +1 -0
  95. data/sig/mindee/http/workflow_endpoint.rbs +1 -1
  96. data/sig/mindee/image/extracted_image.rbs +2 -2
  97. data/sig/mindee/image/image_compressor.rbs +1 -1
  98. data/sig/mindee/image/image_extractor.rbs +5 -5
  99. data/sig/mindee/image/image_utils.rbs +10 -10
  100. data/sig/mindee/input/inference_parameters.rbs +30 -0
  101. data/sig/mindee/input/local_response.rbs +6 -5
  102. data/sig/mindee/input/polling_options.rbs +12 -0
  103. data/sig/mindee/input/sources/base64_input_source.rbs +1 -1
  104. data/sig/mindee/input/sources/local_input_source.rbs +10 -7
  105. data/sig/mindee/input/sources/url_input_source.rbs +1 -1
  106. data/sig/mindee/logging/logger.rbs +2 -0
  107. data/sig/mindee/page_options.rbs +11 -0
  108. data/sig/mindee/parsing/common/api_request.rbs +6 -6
  109. data/sig/mindee/parsing/common/api_response.rbs +2 -2
  110. data/sig/mindee/parsing/common/document.rbs +10 -10
  111. data/sig/mindee/parsing/common/execution.rbs +15 -14
  112. data/sig/mindee/parsing/common/execution_file.rbs +3 -3
  113. data/sig/mindee/parsing/common/extras/cropper_extra.rbs +3 -2
  114. data/sig/mindee/parsing/common/extras/extras.rbs +6 -5
  115. data/sig/mindee/parsing/common/extras/full_text_ocr_extra.rbs +2 -1
  116. data/sig/mindee/parsing/common/inference.rbs +16 -9
  117. data/sig/mindee/parsing/common/job.rbs +2 -2
  118. data/sig/mindee/parsing/common/ocr/mvision_v1.rbs +2 -2
  119. data/sig/mindee/parsing/common/ocr/ocr.rbs +22 -20
  120. data/sig/mindee/parsing/common/orientation.rbs +4 -3
  121. data/sig/mindee/parsing/common/page.rbs +6 -5
  122. data/sig/mindee/parsing/common/product.rbs +4 -4
  123. data/sig/mindee/parsing/common/workflow_response.rbs +8 -4
  124. data/sig/mindee/parsing/standard/abstract_field.rbs +1 -1
  125. data/sig/mindee/parsing/standard/address_field.rbs +18 -0
  126. data/sig/mindee/parsing/standard/amount_field.rbs +6 -4
  127. data/sig/mindee/parsing/standard/base_field.rbs +1 -1
  128. data/sig/mindee/parsing/standard/boolean_field.rbs +1 -1
  129. data/sig/mindee/parsing/standard/company_registration_field.rbs +3 -2
  130. data/sig/mindee/parsing/standard/date_field.rbs +6 -6
  131. data/sig/mindee/parsing/standard/locale_field.rbs +1 -1
  132. data/sig/mindee/parsing/standard/payment_details_field.rbs +7 -6
  133. data/sig/mindee/parsing/standard/position_field.rbs +2 -2
  134. data/sig/mindee/parsing/standard/string_field.rbs +1 -1
  135. data/sig/mindee/parsing/standard/tax_field.rbs +8 -7
  136. data/sig/mindee/parsing/universal/universal_list_field.rbs +4 -5
  137. data/sig/mindee/parsing/universal/universal_object_field.rbs +17 -11
  138. data/sig/mindee/parsing/v2/common_response.rbs +11 -0
  139. data/sig/mindee/parsing/v2/error_response.rbs +16 -0
  140. data/sig/mindee/parsing/v2/field/base_field.rbs +17 -0
  141. data/sig/mindee/parsing/v2/field/field_confidence.rbs +27 -0
  142. data/sig/mindee/parsing/v2/field/field_location.rbs +16 -0
  143. data/sig/mindee/parsing/v2/field/inference_fields.rbs +19 -0
  144. data/sig/mindee/parsing/v2/field/list_field.rbs +22 -0
  145. data/sig/mindee/parsing/v2/field/object_field.rbs +21 -0
  146. data/sig/mindee/parsing/v2/field/simple_field.rbs +16 -0
  147. data/sig/mindee/parsing/v2/inference.rbs +16 -0
  148. data/sig/mindee/parsing/v2/inference_file.rbs +15 -0
  149. data/sig/mindee/parsing/v2/inference_model.rbs +11 -0
  150. data/sig/mindee/parsing/v2/inference_response.rbs +12 -0
  151. data/sig/mindee/parsing/v2/inference_result.rbs +13 -0
  152. data/sig/mindee/parsing/v2/inference_result_options.rbs +11 -0
  153. data/sig/mindee/parsing/v2/job.rbs +22 -0
  154. data/sig/mindee/parsing/v2/job_response.rbs +12 -0
  155. data/sig/mindee/parsing/v2/job_webhook.rbs +17 -0
  156. data/sig/mindee/parsing/v2/raw_text.rbs +12 -0
  157. data/sig/mindee/pdf/extracted_pdf.rbs +6 -6
  158. data/sig/mindee/pdf/pdf_compressor.rbs +4 -4
  159. data/sig/mindee/pdf/pdf_extractor.rbs +8 -7
  160. data/sig/mindee/pdf/pdf_processor.rbs +4 -4
  161. data/sig/mindee/pdf/pdf_tools.rbs +22 -16
  162. data/sig/mindee/product/barcode_reader/barcode_reader_v1.rbs +1 -1
  163. data/sig/mindee/product/barcode_reader/barcode_reader_v1_document.rbs +1 -1
  164. data/sig/mindee/product/barcode_reader/barcode_reader_v1_page.rbs +2 -2
  165. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1.rbs +1 -1
  166. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_carrier.rbs +2 -2
  167. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_carrier_item.rbs +3 -3
  168. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_consignee.rbs +2 -2
  169. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_document.rbs +1 -1
  170. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_notify_party.rbs +2 -2
  171. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_page.rbs +2 -2
  172. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_shipper.rbs +2 -2
  173. data/sig/mindee/product/business_card/business_card_v1.rbs +1 -1
  174. data/sig/mindee/product/business_card/business_card_v1_document.rbs +1 -1
  175. data/sig/mindee/product/business_card/business_card_v1_page.rbs +2 -2
  176. data/sig/mindee/product/cropper/cropper_v1.rbs +1 -1
  177. data/sig/mindee/product/cropper/cropper_v1_document.rbs +1 -1
  178. data/sig/mindee/product/cropper/cropper_v1_page.rbs +2 -2
  179. data/sig/mindee/product/delivery_note/delivery_note_v1.rbs +1 -1
  180. data/sig/mindee/product/delivery_note/delivery_note_v1_document.rbs +1 -1
  181. data/sig/mindee/product/delivery_note/delivery_note_v1_page.rbs +2 -2
  182. data/sig/mindee/product/driver_license/driver_license_v1.rbs +1 -1
  183. data/sig/mindee/product/driver_license/driver_license_v1_document.rbs +1 -1
  184. data/sig/mindee/product/driver_license/driver_license_v1_page.rbs +2 -2
  185. data/sig/mindee/product/financial_document/financial_document_v1.rbs +1 -1
  186. data/sig/mindee/product/financial_document/financial_document_v1_document.rbs +5 -5
  187. data/sig/mindee/product/financial_document/financial_document_v1_line_item.rbs +3 -3
  188. data/sig/mindee/product/financial_document/financial_document_v1_page.rbs +2 -2
  189. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v1.rbs +1 -1
  190. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v1_document.rbs +1 -1
  191. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v1_page.rbs +2 -2
  192. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v2.rbs +1 -1
  193. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v2_bban.rbs +2 -2
  194. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v2_document.rbs +1 -1
  195. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v2_page.rbs +2 -2
  196. data/sig/mindee/product/fr/bank_statement/bank_statement_v2.rbs +1 -1
  197. data/sig/mindee/product/fr/bank_statement/bank_statement_v2_document.rbs +1 -1
  198. data/sig/mindee/product/fr/bank_statement/bank_statement_v2_page.rbs +2 -2
  199. data/sig/mindee/product/fr/bank_statement/bank_statement_v2_transaction.rbs +3 -3
  200. data/sig/mindee/product/fr/carte_grise/carte_grise_v1.rbs +1 -1
  201. data/sig/mindee/product/fr/carte_grise/carte_grise_v1_document.rbs +1 -1
  202. data/sig/mindee/product/fr/carte_grise/carte_grise_v1_page.rbs +2 -2
  203. data/sig/mindee/product/fr/energy_bill/energy_bill_v1.rbs +1 -1
  204. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_document.rbs +1 -1
  205. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_energy_consumer.rbs +2 -2
  206. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_energy_supplier.rbs +2 -2
  207. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_energy_usage.rbs +3 -3
  208. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_meter_detail.rbs +2 -2
  209. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_page.rbs +2 -2
  210. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_subscription.rbs +3 -3
  211. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_taxes_and_contribution.rbs +3 -3
  212. data/sig/mindee/product/fr/health_card/health_card_v1.rbs +1 -1
  213. data/sig/mindee/product/fr/health_card/health_card_v1_document.rbs +1 -1
  214. data/sig/mindee/product/fr/health_card/health_card_v1_page.rbs +2 -2
  215. data/sig/mindee/product/fr/id_card/id_card_v1.rbs +1 -1
  216. data/sig/mindee/product/fr/id_card/id_card_v1_document.rbs +1 -1
  217. data/sig/mindee/product/fr/id_card/id_card_v1_page.rbs +2 -2
  218. data/sig/mindee/product/fr/id_card/id_card_v2.rbs +1 -1
  219. data/sig/mindee/product/fr/id_card/id_card_v2_document.rbs +1 -1
  220. data/sig/mindee/product/fr/id_card/id_card_v2_page.rbs +2 -2
  221. data/sig/mindee/product/fr/payslip/payslip_v2.rbs +1 -1
  222. data/sig/mindee/product/fr/payslip/payslip_v2_bank_account_detail.rbs +2 -2
  223. data/sig/mindee/product/fr/payslip/payslip_v2_document.rbs +1 -1
  224. data/sig/mindee/product/fr/payslip/payslip_v2_employee.rbs +2 -2
  225. data/sig/mindee/product/fr/payslip/payslip_v2_employer.rbs +2 -2
  226. data/sig/mindee/product/fr/payslip/payslip_v2_employment.rbs +2 -2
  227. data/sig/mindee/product/fr/payslip/payslip_v2_page.rbs +2 -2
  228. data/sig/mindee/product/fr/payslip/payslip_v2_pay_detail.rbs +2 -2
  229. data/sig/mindee/product/fr/payslip/payslip_v2_pay_period.rbs +2 -2
  230. data/sig/mindee/product/fr/payslip/payslip_v2_pto.rbs +2 -2
  231. data/sig/mindee/product/fr/payslip/payslip_v2_salary_detail.rbs +3 -3
  232. data/sig/mindee/product/fr/payslip/payslip_v3.rbs +1 -1
  233. data/sig/mindee/product/fr/payslip/payslip_v3_bank_account_detail.rbs +2 -2
  234. data/sig/mindee/product/fr/payslip/payslip_v3_document.rbs +1 -1
  235. data/sig/mindee/product/fr/payslip/payslip_v3_employee.rbs +2 -2
  236. data/sig/mindee/product/fr/payslip/payslip_v3_employer.rbs +2 -2
  237. data/sig/mindee/product/fr/payslip/payslip_v3_employment.rbs +2 -2
  238. data/sig/mindee/product/fr/payslip/payslip_v3_page.rbs +2 -2
  239. data/sig/mindee/product/fr/payslip/payslip_v3_paid_time_off.rbs +3 -3
  240. data/sig/mindee/product/fr/payslip/payslip_v3_pay_detail.rbs +2 -2
  241. data/sig/mindee/product/fr/payslip/payslip_v3_pay_period.rbs +2 -2
  242. data/sig/mindee/product/fr/payslip/payslip_v3_salary_detail.rbs +3 -3
  243. data/sig/mindee/product/ind/indian_passport/indian_passport_v1.rbs +1 -1
  244. data/sig/mindee/product/ind/indian_passport/indian_passport_v1_document.rbs +1 -1
  245. data/sig/mindee/product/ind/indian_passport/indian_passport_v1_page.rbs +2 -2
  246. data/sig/mindee/product/international_id/international_id_v2.rbs +1 -1
  247. data/sig/mindee/product/international_id/international_id_v2_document.rbs +1 -1
  248. data/sig/mindee/product/international_id/international_id_v2_page.rbs +2 -2
  249. data/sig/mindee/product/invoice/invoice_v4.rbs +1 -1
  250. data/sig/mindee/product/invoice/invoice_v4_document.rbs +5 -5
  251. data/sig/mindee/product/invoice/invoice_v4_line_item.rbs +3 -3
  252. data/sig/mindee/product/invoice/invoice_v4_page.rbs +2 -2
  253. data/sig/mindee/product/invoice_splitter/invoice_splitter_v1.rbs +1 -1
  254. data/sig/mindee/product/invoice_splitter/invoice_splitter_v1_document.rbs +1 -1
  255. data/sig/mindee/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.rbs +3 -3
  256. data/sig/mindee/product/invoice_splitter/invoice_splitter_v1_page.rbs +2 -2
  257. data/sig/mindee/product/multi_receipts_detector/multi_receipts_detector_v1.rbs +1 -1
  258. data/sig/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_document.rbs +1 -1
  259. data/sig/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_page.rbs +2 -2
  260. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1.rbs +1 -1
  261. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_added_sugar.rbs +2 -2
  262. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_calorie.rbs +2 -2
  263. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_cholesterol.rbs +2 -2
  264. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_dietary_fiber.rbs +2 -2
  265. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_document.rbs +1 -1
  266. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_nutrient.rbs +3 -3
  267. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_page.rbs +2 -2
  268. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_protein.rbs +2 -2
  269. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_saturated_fat.rbs +2 -2
  270. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_serving_size.rbs +2 -2
  271. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_sodium.rbs +2 -2
  272. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_carbohydrate.rbs +2 -2
  273. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_fat.rbs +2 -2
  274. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_sugar.rbs +2 -2
  275. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_trans_fat.rbs +2 -2
  276. data/sig/mindee/product/passport/passport_v1.rbs +1 -1
  277. data/sig/mindee/product/passport/passport_v1_document.rbs +1 -1
  278. data/sig/mindee/product/passport/passport_v1_page.rbs +2 -2
  279. data/sig/mindee/product/receipt/receipt_v5.rbs +1 -1
  280. data/sig/mindee/product/receipt/receipt_v5_document.rbs +1 -1
  281. data/sig/mindee/product/receipt/receipt_v5_line_item.rbs +3 -3
  282. data/sig/mindee/product/receipt/receipt_v5_page.rbs +2 -2
  283. data/sig/mindee/product/resume/resume_v1.rbs +1 -1
  284. data/sig/mindee/product/resume/resume_v1_certificate.rbs +3 -3
  285. data/sig/mindee/product/resume/resume_v1_document.rbs +1 -1
  286. data/sig/mindee/product/resume/resume_v1_education.rbs +3 -3
  287. data/sig/mindee/product/resume/resume_v1_language.rbs +3 -3
  288. data/sig/mindee/product/resume/resume_v1_page.rbs +2 -2
  289. data/sig/mindee/product/resume/resume_v1_professional_experience.rbs +3 -3
  290. data/sig/mindee/product/resume/resume_v1_social_networks_url.rbs +3 -3
  291. data/sig/mindee/product/universal/universal.rbs +5 -5
  292. data/sig/mindee/product/universal/universal_document.rbs +1 -1
  293. data/sig/mindee/product/universal/universal_page.rbs +2 -2
  294. data/sig/mindee/product/universal/universal_prediction.rbs +5 -5
  295. data/sig/mindee/product/us/bank_check/bank_check_v1.rbs +1 -1
  296. data/sig/mindee/product/us/bank_check/bank_check_v1_document.rbs +1 -1
  297. data/sig/mindee/product/us/bank_check/bank_check_v1_page.rbs +2 -2
  298. data/sig/mindee/product/us/healthcare_card/healthcare_card_v1.rbs +1 -1
  299. data/sig/mindee/product/us/healthcare_card/healthcare_card_v1_copay.rbs +3 -3
  300. data/sig/mindee/product/us/healthcare_card/healthcare_card_v1_document.rbs +1 -1
  301. data/sig/mindee/product/us/healthcare_card/healthcare_card_v1_page.rbs +2 -2
  302. data/sig/mindee/product/us/us_mail/us_mail_v2.rbs +1 -1
  303. data/sig/mindee/product/us/us_mail/us_mail_v2_document.rbs +1 -1
  304. data/sig/mindee/product/us/us_mail/us_mail_v2_page.rbs +2 -2
  305. data/sig/mindee/product/us/us_mail/us_mail_v2_recipient_address.rbs +3 -3
  306. data/sig/mindee/product/us/us_mail/us_mail_v2_sender_address.rbs +2 -2
  307. data/sig/mindee/product/us/us_mail/us_mail_v3.rbs +1 -1
  308. data/sig/mindee/product/us/us_mail/us_mail_v3_document.rbs +1 -1
  309. data/sig/mindee/product/us/us_mail/us_mail_v3_page.rbs +2 -2
  310. data/sig/mindee/product/us/us_mail/us_mail_v3_recipient_address.rbs +3 -3
  311. data/sig/mindee/product/us/us_mail/us_mail_v3_sender_address.rbs +2 -2
  312. data/sig/mindee/product/us/w9/w9_v1.rbs +1 -1
  313. data/sig/mindee/product/us/w9/w9_v1_document.rbs +1 -1
  314. data/sig/mindee/product/us/w9/w9_v1_page.rbs +2 -2
  315. data/sig/mindee/version.rbs +2 -2
  316. metadata +63 -6
@@ -27,7 +27,7 @@ module Mindee
27
27
  attr_reader :filename
28
28
  # @return [String]
29
29
  attr_reader :file_mimetype
30
- # @return [StringIO]
30
+ # @return [StringIO | File]
31
31
  attr_reader :io_stream
32
32
 
33
33
  # @param io_stream [StringIO, File]
@@ -60,7 +60,7 @@ module Mindee
60
60
  # Attempts to fix pdf files if mimetype is rejected.
61
61
  # "Broken PDFs" are often a result of third-party injecting invalid headers.
62
62
  # This attempts to remove them and send the file
63
- # @param stream [StringIO]
63
+ # @param stream [StringIO, File]
64
64
  def rescue_broken_pdf(stream)
65
65
  stream.gets('%PDF-')
66
66
  raise Errors::MindeePDFError if stream.eof? || stream.pos > 500
@@ -78,7 +78,7 @@ module Mindee
78
78
  @file_mimetype.to_s == 'application/pdf'
79
79
  end
80
80
 
81
- # Parses a PDF file according to provided options.
81
+ # Cuts a PDF file according to provided options.
82
82
  # @param options [PageOptions, nil] Page cutting/merge options:
83
83
  #
84
84
  # * `:page_indexes` Zero-based list of page indexes.
@@ -86,14 +86,20 @@ module Mindee
86
86
  # * `:KEEP_ONLY` - keep only the specified pages, and remove all others.
87
87
  # * `:REMOVE` - remove the specified pages, and keep all others.
88
88
  # * `:on_min_pages` Apply the operation only if document has at least this many pages.
89
- def process_pdf(options)
89
+ def apply_page_options(options)
90
90
  @io_stream.seek(0)
91
91
  @io_stream = PDF::PDFProcessor.parse(@io_stream, options)
92
92
  end
93
93
 
94
+ # @deprecated Use {#apply_page_options} instead.
95
+ # @see #apply_page_options
96
+ def process_pdf(options)
97
+ apply_page_options(options)
98
+ end
99
+
94
100
  # Reads a document.
95
101
  # @param close [bool]
96
- # @return [Array<String, [String, aBinaryString ], [Hash, nil] >]
102
+ # @return [Array<>]
97
103
  def read_contents(close: true)
98
104
  logger.debug("Reading data from: #{@filename}")
99
105
  @io_stream.seek(0)
@@ -101,20 +107,21 @@ module Mindee
101
107
  data = @io_stream.read
102
108
  @io_stream.rewind
103
109
  @io_stream.close if close
104
- ['document', data, { filename: Mindee::Input::Source.convert_to_unicode_escape(@filename) }]
110
+ [data, { filename: Mindee::Input::Source.convert_to_unicode_escape(@filename) }]
105
111
  end
106
112
 
107
113
  # Write the file to a given path. Uses the initial file name by default.
108
114
  # @param path [String] Path to write the file to.
109
115
  def write_to_file(path)
110
- full_path = if File.directory?(path) || path.end_with?('/')
111
- File.join(path, @filename)
112
- else
113
- path
114
- end
116
+ t_path = if File.directory?(path || '') || path.to_s.end_with?('/')
117
+ File.join(path || '', @filename)
118
+ else
119
+ path
120
+ end
121
+ full_path = File.expand_path(t_path || '')
115
122
  FileUtils.mkdir_p(File.dirname(full_path))
116
123
  @io_stream.rewind
117
- File.binwrite(full_path, @io_stream.read)
124
+ File.binwrite(full_path, @io_stream.read || '')
118
125
  logger.debug("Wrote file successfully to #{full_path}")
119
126
  @io_stream.rewind
120
127
  end
data/lib/mindee/input.rb CHANGED
@@ -1,3 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'input/inference_parameters'
4
+ require_relative 'input/polling_options'
3
5
  require_relative 'input/sources'
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mindee
4
+ # Class for page options in parse calls.
5
+ # @!attribute page_indexes [Array[Integer]] Zero-based list of page indexes.
6
+ # @!attribute operation [:KEEP_ONLY, :REMOVE] Operation to apply on the document, given the specified page indexes:
7
+ # * `:KEEP_ONLY` - keep only the specified pages, and remove all others.
8
+ # * `:REMOVE` - remove the specified pages, and keep all others.
9
+ # @!attribute on_min_pages [Integer, nil] Apply the operation only if the document has at least this many pages.
10
+ class PageOptions
11
+ attr_accessor :page_indexes, :operation, :on_min_pages
12
+
13
+ def initialize(params: {})
14
+ params ||= {}
15
+ params = params.transform_keys(&:to_sym)
16
+ @page_indexes = params.fetch(
17
+ :page_indexes,
18
+ [] # : Array[Integer]
19
+ )
20
+ @operation = params.fetch(:operation, :KEEP_ONLY)
21
+ @on_min_pages = params.fetch(:on_min_pages, nil)
22
+ end
23
+ end
24
+ end
@@ -8,7 +8,7 @@ module Mindee
8
8
  # @return [Hash]
9
9
  attr_reader :error
10
10
  # @return [Array<String>]
11
- attr_reader :ressources
11
+ attr_reader :resources
12
12
  # @return [RequestStatus, Symbol]
13
13
  attr_reader :status
14
14
  # @return [Integer]
@@ -18,7 +18,7 @@ module Mindee
18
18
 
19
19
  def initialize(server_response)
20
20
  @error = server_response['error']
21
- @ressources = server_response['ressources']
21
+ @resources = server_response['resources']
22
22
 
23
23
  @status = if server_response['status'] == 'failure'
24
24
  RequestStatus::FAILURE
@@ -8,9 +8,13 @@ module Mindee
8
8
  module Common
9
9
  # Potential values for queue in asynchronous calls.
10
10
  module JobStatus
11
+ # Job is waiting.
11
12
  WAITING = :waiting
13
+ # Job is processing.
12
14
  PROCESSING = :processing
15
+ # Job is done.
13
16
  COMPLETED = :completed
17
+ # Job failed.
14
18
  FAILURE = :failed
15
19
  end
16
20
 
@@ -21,7 +21,7 @@ module Mindee
21
21
  # @return [Mindee::Inference]
22
22
  attr_reader :inference
23
23
  # Priority of the execution.
24
- # @return [ExecutionPriority]
24
+ # @return [ExecutionPriority, Symbol, nil]
25
25
  attr_reader :priority
26
26
  # The time at which the file was tagged as reviewed.
27
27
  # @return [Time, nil]
@@ -11,7 +11,7 @@ module Mindee
11
11
  class Extras
12
12
  # @return [CropperExtra, nil]
13
13
  attr_reader :cropper
14
- # @return [Mindee::Parsing::Common::Extras::FullTextOCRExtra, nil]
14
+ # @return [Mindee::Parsing::Common::Extras::FullTextOCRExtra]
15
15
  attr_reader :full_text_ocr
16
16
  # @return [RAGExtra, nil]
17
17
  attr_reader :rag
@@ -26,7 +26,7 @@ module Mindee
26
26
  @rag = Mindee::Parsing::Common::Extras::RAGExtra.new(raw_prediction['rag']) if raw_prediction['rag']
27
27
 
28
28
  raw_prediction.each do |key, value|
29
- instance_variable_set("@#{key}", value) unless ['cropper', 'full_text_ocr', 'rag'].include?(key)
29
+ instance_variable_set("@#{key}", value) unless ['cropper', 'full_text_ocr', 'rag'].include?(key.to_s)
30
30
  end
31
31
  end
32
32
 
@@ -14,6 +14,8 @@ module Mindee
14
14
  @matching_document_id = raw_prediction['matching_document_id'] if raw_prediction['matching_document_id']
15
15
  end
16
16
 
17
+ # String representation.
18
+ # @return [String]
17
19
  def to_s
18
20
  @matching_document_id || ''
19
21
  end
@@ -53,7 +53,7 @@ module Mindee
53
53
  out_str << "\n:Product: #{@product.name} v#{@product.version}"
54
54
  out_str << "\n:Rotation applied: #{is_rotation_applied}"
55
55
  out_str << "\n\nPrediction\n=========="
56
- out_str << "\n#{@prediction.to_s.size.positive? ? "#{@prediction}\n" : ''}"
56
+ out_str << "\n#{"#{@prediction}\n" if @prediction.to_s.size.positive?}"
57
57
  if @pages.any? { |page| !page.prediction.nil? }
58
58
  out_str << "\nPage Predictions\n================\n\n"
59
59
  out_str << @pages.map(&:to_s).join("\n\n")
@@ -11,7 +11,7 @@ module Mindee
11
11
  class OCRWord
12
12
  # The confidence score, value will be between 0.0 and 1.0
13
13
  # @return [Float]
14
- attr_accessor :confidence
14
+ attr_reader :confidence
15
15
  # @return [String]
16
16
  attr_reader :text
17
17
  # @return [Mindee::Geometry::Quadrilateral]
@@ -36,7 +36,7 @@ module Mindee
36
36
  # A list of words which are on the same line.
37
37
  class OCRLine < Array
38
38
  # @param prediction [Hash, nil]
39
- # @param from_array [Array, nil]
39
+ # @param from_array [Array<OCRWord>, nil]
40
40
  def initialize(prediction = nil, from_array = nil)
41
41
  if !prediction.nil?
42
42
  super(prediction.map { |word_prediction| OCRWord.new(word_prediction) })
@@ -48,9 +48,7 @@ module Mindee
48
48
  # Sort the words on the line from left to right.
49
49
  # @return [OCRLine]
50
50
  def sort_on_x
51
- from_array = sort do |word1, word2|
52
- Geometry.get_min_max_x(word1.polygon).min <=> Geometry.get_min_max_x(word2.polygon).min
53
- end
51
+ from_array = sort_by { |word| Geometry.get_min_max_x(word.polygon).min }
54
52
  OCRLine.new(nil, from_array)
55
53
  end
56
54
 
@@ -104,7 +102,7 @@ module Mindee
104
102
  # @param indexes [Array<Integer>]
105
103
  # @param lines [Array<OCRLine>]
106
104
  def parse_one(sorted_words, current, indexes, lines)
107
- line = OCRLine.new([])
105
+ line = OCRLine.new(nil, [])
108
106
  sorted_words.each_with_index do |word, idx|
109
107
  next if indexes.include?(idx)
110
108
 
@@ -5,7 +5,7 @@ module Mindee
5
5
  module Common
6
6
  # Page orientation
7
7
  class Orientation
8
- # @return [Integer]
8
+ # @return [Integer, nil]
9
9
  attr_reader :page_id
10
10
  # A prediction among these 3 possible outputs:
11
11
  # * 0 degrees: the page is already upright
@@ -15,7 +15,7 @@ module Mindee
15
15
  attr_reader :value
16
16
 
17
17
  # @param prediction [Hash]
18
- # @param page_id [Integer]
18
+ # @param page_id [Integer, nil]
19
19
  def initialize(prediction, page_id)
20
20
  @value = prediction['value']
21
21
  @page_id = page_id
@@ -5,7 +5,12 @@ module Mindee
5
5
  module Common
6
6
  # Product information
7
7
  class Product
8
- attr_reader :name, :type, :version
8
+ # @return [String] Name of the product.
9
+ attr_reader :name
10
+ # @return [String?] Type of product.
11
+ attr_reader :type
12
+ # @return [String] Product version.
13
+ attr_reader :version
9
14
 
10
15
  # @param prediction [Hash]
11
16
  def initialize(prediction)
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'string_field'
4
+
5
+ module Mindee
6
+ module Parsing
7
+ module Standard
8
+ # Represents physical-address information.
9
+ class AddressField < Mindee::Parsing::Standard::StringField
10
+ # Street number
11
+ # @return [String, nil]
12
+ attr_reader :street_number
13
+ # Street name
14
+ # @return [String, nil]
15
+ attr_reader :street_name
16
+ # PO Box number
17
+ # @return [String, nil]
18
+ attr_reader :po_box
19
+ # Address complement
20
+ # @return [String, nil]
21
+ attr_reader :address_complement
22
+ # City name.
23
+ # @return [String, nil]
24
+ attr_reader :city
25
+ # Postal or ZIP code.
26
+ # @return [String, nil]
27
+ attr_reader :postal_code
28
+ # State, province or region.
29
+ # @return [String, nil]
30
+ attr_reader :state
31
+ # Country.
32
+ # @return [String, nil]
33
+ attr_reader :country
34
+
35
+ def initialize(prediction, page_id = nil, reconstructed: false)
36
+ super
37
+ @street_number = prediction['street_number']
38
+ @street_name = prediction['street_name']
39
+ @po_box = prediction['po_box']
40
+ @address_complement = prediction['address_complement']
41
+ @city = prediction['city']
42
+ @postal_code = prediction['postal_code']
43
+ @state = prediction['state']
44
+ @country = prediction['country']
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -13,12 +13,12 @@ module Mindee
13
13
 
14
14
  def initialize(prediction, page_id, reconstructed: false)
15
15
  super
16
- @value = @value.round(3) unless @value.nil?
16
+ @value = @value.to_f.round(3).to_f unless @value.to_s.empty?
17
17
  end
18
18
 
19
19
  # @return [String]
20
20
  def to_s
21
- BaseField.float_to_string(@value)
21
+ @value.nil? ? '' : BaseField.float_to_string(@value.to_f)
22
22
  end
23
23
  end
24
24
  end
@@ -16,7 +16,7 @@ module Mindee
16
16
  return in_str.to_s if max_col_size.nil?
17
17
 
18
18
  in_str = in_str.to_s.gsub(%r{[\n\r\t]}, "\n" => '\\n', "\r" => '\\r', "\t" => '\\t')
19
- in_str.to_s.length <= max_col_size.to_i ? in_str.to_s : "#{in_str[0..max_col_size.to_i - 4]}..."
19
+ in_str.to_s.length <= max_col_size.to_i ? in_str.to_s : "#{in_str[0..(max_col_size.to_i - 4)]}..."
20
20
  end
21
21
  end
22
22
  end
@@ -52,7 +52,7 @@ module Mindee
52
52
  out_h[:code] = @code.nil? ? '' : @code
53
53
  out_h[:base] = @base.nil? ? '' : print_float(@base)
54
54
  out_h[:rate] = @rate.nil? ? '' : print_float(@rate).to_s
55
- out_h[:value] = @value.nil? ? '' : print_float(@value).to_s
55
+ out_h[:value] = @value.to_s.empty? ? '' : print_float(@value.to_f).to_s
56
56
  out_h
57
57
  end
58
58
 
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'standard/address_field'
3
4
  require_relative 'standard/amount_field'
4
5
  require_relative 'standard/base_field'
5
6
  require_relative 'standard/boolean_field'
@@ -12,11 +12,11 @@ module Mindee
12
12
 
13
13
  # ID of the page (as given by the API).
14
14
  # @return [Integer]
15
- attr_accessor :page_id
15
+ attr_reader :page_id
16
16
 
17
17
  # List of word values
18
18
  # @return [Array<UniversalObjectField, StringField>]
19
- attr_accessor :values
19
+ attr_reader :values
20
20
 
21
21
  # ID of the page the object was found on.
22
22
  # List of word values.
@@ -15,15 +15,18 @@ module Mindee
15
15
  # @return [Float]
16
16
  attr_reader :confidence
17
17
  # Value as String
18
- # @return [Hash<Symbol | String, untyped>, nil]
19
- attr_accessor :raw_value
18
+ # @return [String]
19
+ attr_reader :raw_value
20
+ # All values
21
+ # @return [Hash]
22
+ attr_reader :all_values
20
23
 
21
24
  # ID of the page the object was found on.
22
25
  # Confidence with which the value was assessed.
23
26
  # Raw unprocessed value, as it was sent by the server.
24
27
 
25
28
  def initialize(raw_prediction, page_id = nil)
26
- @all_values = {} # : Hash[Symbol | String, untyped]
29
+ @all_values = {} # : Hash[String | Symbol, untyped]
27
30
  item_page_id = nil
28
31
  raw_prediction.each do |name, value|
29
32
  case name
@@ -95,7 +98,7 @@ module Mindee
95
98
  end
96
99
 
97
100
  def handle_default_field(name, value)
98
- @all_values[name] = value.nil? ? nil : value.to_s
101
+ @all_values[name] = value&.to_s
99
102
  end
100
103
  end
101
104
 
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mindee
4
+ module Parsing
5
+ module V2
6
+ # Base class for inference and job responses on the V2 API.
7
+ class CommonResponse
8
+ # @return [Hash]
9
+ attr_reader :raw_http
10
+
11
+ # @param http_response [Hash]
12
+ def initialize(http_response)
13
+ @raw_http = http_response
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mindee
4
+ module Parsing
5
+ module V2
6
+ # Encapsulates information returned by the API when an error occurs.
7
+ class ErrorResponse
8
+ # @return [Integer] HTTP status code.
9
+ attr_reader :status
10
+ # @return [String] Error detail.
11
+ attr_reader :detail
12
+
13
+ # @param server_response [Hash] Raw JSON parsed into a Hash.
14
+ def initialize(server_response)
15
+ @status = server_response['status']
16
+ @detail = server_response['detail']
17
+ end
18
+
19
+ # String representation.
20
+ # @return [String]
21
+ def to_s
22
+ "Error\n=====\n:Status: #{@status}\n:Detail: #{@detail}"
23
+ end
24
+
25
+ # Hash representation
26
+ # @return [Hash] Hash representation of the object.
27
+ def as_hash
28
+ {
29
+ status: @status,
30
+ detail: @detail,
31
+ }
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mindee
4
+ module Parsing
5
+ module V2
6
+ # Field submodule for V2.
7
+ module Field
8
+ # Base class for V2 fields.
9
+ class BaseField
10
+ # @return [Integer] Level of indentation for rst display.
11
+ attr_reader :indent_level
12
+
13
+ # @return [FieldConfidence, nil] Confidence score for the field.
14
+ attr_reader :confidence
15
+
16
+ # @return [Array<FieldLocation>] List of locations the field was found at.
17
+ attr_reader :locations
18
+
19
+ # @param raw_prediction [Hash] Raw prediction hash.
20
+ # @param indent_level [Integer] Level of indentation for rst display.
21
+ def initialize(raw_prediction, indent_level = 0)
22
+ @indent_level = indent_level
23
+ @confidence = raw_prediction.key?('confidence') ? raw_prediction['confidence'] : nil
24
+ @locations = if raw_prediction.key?('locations')
25
+ raw_prediction['locations'].map do |location|
26
+ FieldLocation.new(location)
27
+ end
28
+ else
29
+ []
30
+ end
31
+ end
32
+
33
+ # Factory method to create appropriate field types.
34
+ # @param raw_prediction [Hash] Raw prediction hash.
35
+ # @param indent_level [Integer] Level of indentation for rst display.
36
+ # @return [BaseField] Appropriate field instance.
37
+ # @raise [MindeeError] If the field type isn't recognized.
38
+ def self.create_field(raw_prediction, indent_level = 0)
39
+ if raw_prediction.key?('items')
40
+ require_relative 'list_field'
41
+ return ListField.new(raw_prediction, indent_level)
42
+ end
43
+
44
+ if raw_prediction.key?('fields')
45
+ require_relative 'object_field'
46
+ return ObjectField.new(raw_prediction, indent_level)
47
+ end
48
+
49
+ if raw_prediction.key?('value')
50
+ require_relative 'simple_field'
51
+ return SimpleField.new(raw_prediction, indent_level)
52
+ end
53
+
54
+ raise Errors::MindeeError, "Unrecognized field format in #{raw_prediction.to_json}"
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mindee
4
+ module Parsing
5
+ module V2
6
+ module Field
7
+ # Confidence level of a field as returned by the V2 API.
8
+ class FieldConfidence
9
+ # @return [String] The confidence level value.
10
+ attr_reader :value
11
+
12
+ # Absolute certainty about the field's extraction.
13
+ CERTAIN = 'Certain'
14
+ # High certainty about the field's extraction.
15
+ HIGH = 'High'
16
+ # Medium certainty about the field's extraction.
17
+ MEDIUM = 'Medium'
18
+ # Low certainty about the field's extraction.
19
+ LOW = 'Low'
20
+
21
+ # List of valid values, as frozen strings.
22
+ VALID_VALUES = [CERTAIN, HIGH, MEDIUM, LOW].freeze
23
+
24
+ # @param value [String] The confidence level value.
25
+ # @raise [ArgumentError] If the value is not a valid confidence level.
26
+ def initialize(value)
27
+ unless VALID_VALUES.include?(value)
28
+ raise ArgumentError,
29
+ "Invalid confidence level: #{value}. Must be one of: #{VALID_VALUES.join(', ')}"
30
+ end
31
+
32
+ @value = value
33
+ end
34
+
35
+ # Create a FieldConfidence from a string value.
36
+ # @param value [String] The confidence level string.
37
+ # @return [FieldConfidence] The confidence instance.
38
+ def self.from_string(value)
39
+ new(value)
40
+ end
41
+
42
+ # Check if this is a certain confidence level.
43
+ # @return [Boolean] True if confidence is certain.
44
+ def certain?
45
+ @value == CERTAIN
46
+ end
47
+
48
+ # Check if this is a high confidence level.
49
+ # @return [Boolean] True if confidence is high.
50
+ def high?
51
+ @value == HIGH
52
+ end
53
+
54
+ # Check if this is a medium confidence level.
55
+ # @return [Boolean] True if confidence is medium.
56
+ def medium?
57
+ @value == MEDIUM
58
+ end
59
+
60
+ # Check if this is a low confidence level.
61
+ # @return [Boolean] True if confidence is low.
62
+ def low?
63
+ @value == LOW
64
+ end
65
+
66
+ # String representation of the confidence level.
67
+ # @return [String] The confidence level value.
68
+ def to_s
69
+ @value
70
+ end
71
+
72
+ # Compare two FieldConfidence instances.
73
+ # @param other [FieldConfidence] The other confidence to compare.
74
+ # @return [Boolean] True if they have the same value.
75
+ def ==(other)
76
+ other.is_a?(FieldConfidence) && @value == other.value
77
+ end
78
+
79
+ # Make instances comparable and hashable
80
+ alias eql? ==
81
+
82
+ # Inspect method for debugging.
83
+ # @return [String] Debug representation.
84
+ def inspect
85
+ "#<#{self.class.name}:#{@value}>"
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../geometry/polygon'
4
+
5
+ module Mindee
6
+ module Parsing
7
+ module V2
8
+ module Field
9
+ # Location of a field.
10
+ class FieldLocation
11
+ # @return [Mindee::Geometry::Polygon, nil] Polygon corresponding to the field location.
12
+ attr_reader :polygon
13
+
14
+ # @return [Integer, nil] Page on which the field is located.
15
+ attr_reader :page
16
+
17
+ # @param server_response [Hash] Raw server response hash.
18
+ def initialize(server_response)
19
+ polygon_data = server_response['polygon'] || server_response[:polygon]
20
+ @polygon = polygon_data ? Mindee::Geometry::Polygon.new(polygon_data) : nil
21
+
22
+ page_id = server_response['page'] || server_response[:page]
23
+ @page = page_id.is_a?(Float) || page_id.is_a?(Integer) ? page_id.to_i : nil
24
+ end
25
+
26
+ # String representation of the polygon (empty string when none).
27
+ #
28
+ # @return [String]
29
+ def to_s
30
+ @polygon ? @polygon.to_s : ''
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end