mindee 4.6.0 → 4.7.0.pre.rc2

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 (310) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/README.md +21 -222
  4. data/docs/code_samples/default_v2.txt +28 -0
  5. data/lib/mindee/client.rb +11 -30
  6. data/lib/mindee/client_v2.rb +109 -0
  7. data/lib/mindee/errors/mindee_http_error_v2.rb +26 -0
  8. data/lib/mindee/errors/mindee_input_error.rb +1 -1
  9. data/lib/mindee/errors.rb +1 -0
  10. data/lib/mindee/geometry/point.rb +2 -2
  11. data/lib/mindee/geometry/quadrilateral.rb +4 -4
  12. data/lib/mindee/geometry/utils.rb +1 -0
  13. data/lib/mindee/http/api_settings_v2.rb +61 -0
  14. data/lib/mindee/http/endpoint.rb +12 -6
  15. data/lib/mindee/http/http_error_handler.rb +17 -4
  16. data/lib/mindee/http/mindee_api_v2.rb +148 -0
  17. data/lib/mindee/http/response_validation.rb +20 -1
  18. data/lib/mindee/http/workflow_endpoint.rb +2 -2
  19. data/lib/mindee/http.rb +2 -0
  20. data/lib/mindee/image/extracted_image.rb +1 -1
  21. data/lib/mindee/image/image_extractor.rb +12 -15
  22. data/lib/mindee/input/inference_parameters.rb +116 -0
  23. data/lib/mindee/input/local_response.rb +10 -1
  24. data/lib/mindee/input/polling_options.rb +26 -0
  25. data/lib/mindee/input/sources/base64_input_source.rb +2 -2
  26. data/lib/mindee/input/sources/local_input_source.rb +49 -30
  27. data/lib/mindee/input.rb +2 -0
  28. data/lib/mindee/page_options.rb +24 -0
  29. data/lib/mindee/parsing/common/api_request.rb +2 -2
  30. data/lib/mindee/parsing/common/api_response.rb +4 -0
  31. data/lib/mindee/parsing/common/execution.rb +1 -1
  32. data/lib/mindee/parsing/common/extras/extras.rb +2 -2
  33. data/lib/mindee/parsing/common/extras/rag_extra.rb +2 -0
  34. data/lib/mindee/parsing/common/ocr/ocr.rb +4 -6
  35. data/lib/mindee/parsing/common/orientation.rb +2 -2
  36. data/lib/mindee/parsing/common/product.rb +6 -1
  37. data/lib/mindee/parsing/standard/amount_field.rb +2 -2
  38. data/lib/mindee/parsing/standard/feature_field.rb +1 -1
  39. data/lib/mindee/parsing/standard/tax_field.rb +1 -1
  40. data/lib/mindee/parsing/universal/universal_list_field.rb +2 -2
  41. data/lib/mindee/parsing/universal/universal_object_field.rb +7 -4
  42. data/lib/mindee/parsing/v2/common_response.rb +18 -0
  43. data/lib/mindee/parsing/v2/error_response.rb +36 -0
  44. data/lib/mindee/parsing/v2/field/base_field.rb +60 -0
  45. data/lib/mindee/parsing/v2/field/field_confidence.rb +91 -0
  46. data/lib/mindee/parsing/v2/field/field_location.rb +36 -0
  47. data/lib/mindee/parsing/v2/field/inference_fields.rb +96 -0
  48. data/lib/mindee/parsing/v2/field/list_field.rb +88 -0
  49. data/lib/mindee/parsing/v2/field/object_field.rb +102 -0
  50. data/lib/mindee/parsing/v2/field/simple_field.rb +55 -0
  51. data/lib/mindee/parsing/v2/field.rb +9 -0
  52. data/lib/mindee/parsing/v2/inference.rb +50 -0
  53. data/lib/mindee/parsing/v2/inference_file.rb +38 -0
  54. data/lib/mindee/parsing/v2/inference_model.rb +18 -0
  55. data/lib/mindee/parsing/v2/inference_response.rb +30 -0
  56. data/lib/mindee/parsing/v2/inference_result.rb +49 -0
  57. data/lib/mindee/parsing/v2/inference_result_options.rb +21 -0
  58. data/lib/mindee/parsing/v2/job.rb +86 -0
  59. data/lib/mindee/parsing/v2/job_response.rb +30 -0
  60. data/lib/mindee/parsing/v2/job_webhook.rb +60 -0
  61. data/lib/mindee/parsing/v2/raw_text.rb +21 -0
  62. data/lib/mindee/parsing/v2.rb +15 -0
  63. data/lib/mindee/pdf/extracted_pdf.rb +5 -3
  64. data/lib/mindee/pdf/pdf_extractor.rb +11 -7
  65. data/lib/mindee/pdf/pdf_processor.rb +6 -6
  66. data/lib/mindee/pdf/pdf_tools.rb +6 -4
  67. data/lib/mindee/product/universal/universal_prediction.rb +4 -4
  68. data/lib/mindee/version.rb +2 -2
  69. data/lib/mindee.rb +6 -0
  70. data/mindee.gemspec +1 -1
  71. data/sig/custom/mini_magick.rbs +14 -7
  72. data/sig/custom/net_http.rbs +4 -4
  73. data/sig/custom/origami.rbs +9 -4
  74. data/sig/mindee/client.rbs +14 -19
  75. data/sig/mindee/client_v2.rbs +17 -0
  76. data/sig/mindee/errors/mindee_http_error.rbs +6 -5
  77. data/sig/mindee/errors/mindee_http_error_v2.rbs +12 -0
  78. data/sig/mindee/errors/mindee_input_error.rbs +3 -2
  79. data/sig/mindee/geometry/min_max.rbs +4 -3
  80. data/sig/mindee/geometry/point.rbs +5 -6
  81. data/sig/mindee/geometry/polygon.rbs +3 -3
  82. data/sig/mindee/geometry/quadrilateral.rbs +5 -8
  83. data/sig/mindee/geometry/utils.rbs +8 -8
  84. data/sig/mindee/http/api_settings_v2.rbs +23 -0
  85. data/sig/mindee/http/endpoint.rbs +12 -11
  86. data/sig/mindee/http/http_error_handler.rbs +8 -3
  87. data/sig/mindee/http/mindee_api_v2.rbs +18 -0
  88. data/sig/mindee/http/response_validation.rbs +1 -0
  89. data/sig/mindee/http/workflow_endpoint.rbs +1 -1
  90. data/sig/mindee/image/extracted_image.rbs +2 -2
  91. data/sig/mindee/image/image_compressor.rbs +1 -1
  92. data/sig/mindee/image/image_extractor.rbs +5 -5
  93. data/sig/mindee/image/image_utils.rbs +10 -10
  94. data/sig/mindee/input/inference_parameters.rbs +30 -0
  95. data/sig/mindee/input/local_response.rbs +6 -5
  96. data/sig/mindee/input/polling_options.rbs +12 -0
  97. data/sig/mindee/input/sources/base64_input_source.rbs +1 -1
  98. data/sig/mindee/input/sources/local_input_source.rbs +14 -7
  99. data/sig/mindee/input/sources/url_input_source.rbs +1 -1
  100. data/sig/mindee/logging/logger.rbs +2 -0
  101. data/sig/mindee/page_options.rbs +11 -0
  102. data/sig/mindee/parsing/common/api_request.rbs +6 -6
  103. data/sig/mindee/parsing/common/api_response.rbs +2 -2
  104. data/sig/mindee/parsing/common/document.rbs +10 -10
  105. data/sig/mindee/parsing/common/execution.rbs +15 -14
  106. data/sig/mindee/parsing/common/execution_file.rbs +3 -3
  107. data/sig/mindee/parsing/common/extras/cropper_extra.rbs +3 -2
  108. data/sig/mindee/parsing/common/extras/extras.rbs +6 -5
  109. data/sig/mindee/parsing/common/extras/full_text_ocr_extra.rbs +2 -1
  110. data/sig/mindee/parsing/common/inference.rbs +16 -9
  111. data/sig/mindee/parsing/common/job.rbs +2 -2
  112. data/sig/mindee/parsing/common/ocr/mvision_v1.rbs +2 -2
  113. data/sig/mindee/parsing/common/ocr/ocr.rbs +22 -20
  114. data/sig/mindee/parsing/common/orientation.rbs +4 -3
  115. data/sig/mindee/parsing/common/page.rbs +6 -5
  116. data/sig/mindee/parsing/common/product.rbs +4 -4
  117. data/sig/mindee/parsing/common/workflow_response.rbs +8 -4
  118. data/sig/mindee/parsing/standard/abstract_field.rbs +1 -1
  119. data/sig/mindee/parsing/standard/address_field.rbs +1 -1
  120. data/sig/mindee/parsing/standard/amount_field.rbs +6 -4
  121. data/sig/mindee/parsing/standard/base_field.rbs +1 -1
  122. data/sig/mindee/parsing/standard/boolean_field.rbs +1 -1
  123. data/sig/mindee/parsing/standard/company_registration_field.rbs +3 -2
  124. data/sig/mindee/parsing/standard/date_field.rbs +6 -6
  125. data/sig/mindee/parsing/standard/locale_field.rbs +1 -1
  126. data/sig/mindee/parsing/standard/payment_details_field.rbs +7 -6
  127. data/sig/mindee/parsing/standard/position_field.rbs +2 -2
  128. data/sig/mindee/parsing/standard/string_field.rbs +1 -1
  129. data/sig/mindee/parsing/standard/tax_field.rbs +8 -7
  130. data/sig/mindee/parsing/universal/universal_list_field.rbs +4 -5
  131. data/sig/mindee/parsing/universal/universal_object_field.rbs +17 -11
  132. data/sig/mindee/parsing/v2/common_response.rbs +11 -0
  133. data/sig/mindee/parsing/v2/error_response.rbs +16 -0
  134. data/sig/mindee/parsing/v2/field/base_field.rbs +17 -0
  135. data/sig/mindee/parsing/v2/field/field_confidence.rbs +27 -0
  136. data/sig/mindee/parsing/v2/field/field_location.rbs +16 -0
  137. data/sig/mindee/parsing/v2/field/inference_fields.rbs +19 -0
  138. data/sig/mindee/parsing/v2/field/list_field.rbs +21 -0
  139. data/sig/mindee/parsing/v2/field/object_field.rbs +21 -0
  140. data/sig/mindee/parsing/v2/field/simple_field.rbs +16 -0
  141. data/sig/mindee/parsing/v2/inference.rbs +16 -0
  142. data/sig/mindee/parsing/v2/inference_file.rbs +15 -0
  143. data/sig/mindee/parsing/v2/inference_model.rbs +11 -0
  144. data/sig/mindee/parsing/v2/inference_response.rbs +12 -0
  145. data/sig/mindee/parsing/v2/inference_result.rbs +13 -0
  146. data/sig/mindee/parsing/v2/inference_result_options.rbs +11 -0
  147. data/sig/mindee/parsing/v2/job.rbs +22 -0
  148. data/sig/mindee/parsing/v2/job_response.rbs +12 -0
  149. data/sig/mindee/parsing/v2/job_webhook.rbs +17 -0
  150. data/sig/mindee/parsing/v2/raw_text.rbs +12 -0
  151. data/sig/mindee/pdf/extracted_pdf.rbs +6 -6
  152. data/sig/mindee/pdf/pdf_compressor.rbs +4 -4
  153. data/sig/mindee/pdf/pdf_extractor.rbs +8 -7
  154. data/sig/mindee/pdf/pdf_processor.rbs +4 -4
  155. data/sig/mindee/pdf/pdf_tools.rbs +22 -16
  156. data/sig/mindee/product/barcode_reader/barcode_reader_v1.rbs +1 -1
  157. data/sig/mindee/product/barcode_reader/barcode_reader_v1_document.rbs +1 -1
  158. data/sig/mindee/product/barcode_reader/barcode_reader_v1_page.rbs +2 -2
  159. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1.rbs +1 -1
  160. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_carrier.rbs +2 -2
  161. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_carrier_item.rbs +3 -3
  162. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_consignee.rbs +2 -2
  163. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_document.rbs +1 -1
  164. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_notify_party.rbs +2 -2
  165. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_page.rbs +2 -2
  166. data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_shipper.rbs +2 -2
  167. data/sig/mindee/product/business_card/business_card_v1.rbs +1 -1
  168. data/sig/mindee/product/business_card/business_card_v1_document.rbs +1 -1
  169. data/sig/mindee/product/business_card/business_card_v1_page.rbs +2 -2
  170. data/sig/mindee/product/cropper/cropper_v1.rbs +1 -1
  171. data/sig/mindee/product/cropper/cropper_v1_document.rbs +1 -1
  172. data/sig/mindee/product/cropper/cropper_v1_page.rbs +2 -2
  173. data/sig/mindee/product/delivery_note/delivery_note_v1.rbs +1 -1
  174. data/sig/mindee/product/delivery_note/delivery_note_v1_document.rbs +1 -1
  175. data/sig/mindee/product/delivery_note/delivery_note_v1_page.rbs +2 -2
  176. data/sig/mindee/product/driver_license/driver_license_v1.rbs +1 -1
  177. data/sig/mindee/product/driver_license/driver_license_v1_document.rbs +1 -1
  178. data/sig/mindee/product/driver_license/driver_license_v1_page.rbs +2 -2
  179. data/sig/mindee/product/financial_document/financial_document_v1.rbs +1 -1
  180. data/sig/mindee/product/financial_document/financial_document_v1_document.rbs +1 -1
  181. data/sig/mindee/product/financial_document/financial_document_v1_line_item.rbs +3 -3
  182. data/sig/mindee/product/financial_document/financial_document_v1_page.rbs +2 -2
  183. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v1.rbs +1 -1
  184. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v1_document.rbs +1 -1
  185. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v1_page.rbs +2 -2
  186. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v2.rbs +1 -1
  187. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v2_bban.rbs +2 -2
  188. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v2_document.rbs +1 -1
  189. data/sig/mindee/product/fr/bank_account_details/bank_account_details_v2_page.rbs +2 -2
  190. data/sig/mindee/product/fr/bank_statement/bank_statement_v2.rbs +1 -1
  191. data/sig/mindee/product/fr/bank_statement/bank_statement_v2_document.rbs +1 -1
  192. data/sig/mindee/product/fr/bank_statement/bank_statement_v2_page.rbs +2 -2
  193. data/sig/mindee/product/fr/bank_statement/bank_statement_v2_transaction.rbs +3 -3
  194. data/sig/mindee/product/fr/carte_grise/carte_grise_v1.rbs +1 -1
  195. data/sig/mindee/product/fr/carte_grise/carte_grise_v1_document.rbs +1 -1
  196. data/sig/mindee/product/fr/carte_grise/carte_grise_v1_page.rbs +2 -2
  197. data/sig/mindee/product/fr/energy_bill/energy_bill_v1.rbs +1 -1
  198. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_document.rbs +1 -1
  199. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_energy_consumer.rbs +2 -2
  200. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_energy_supplier.rbs +2 -2
  201. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_energy_usage.rbs +3 -3
  202. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_meter_detail.rbs +2 -2
  203. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_page.rbs +2 -2
  204. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_subscription.rbs +3 -3
  205. data/sig/mindee/product/fr/energy_bill/energy_bill_v1_taxes_and_contribution.rbs +3 -3
  206. data/sig/mindee/product/fr/health_card/health_card_v1.rbs +1 -1
  207. data/sig/mindee/product/fr/health_card/health_card_v1_document.rbs +1 -1
  208. data/sig/mindee/product/fr/health_card/health_card_v1_page.rbs +2 -2
  209. data/sig/mindee/product/fr/id_card/id_card_v1.rbs +1 -1
  210. data/sig/mindee/product/fr/id_card/id_card_v1_document.rbs +1 -1
  211. data/sig/mindee/product/fr/id_card/id_card_v1_page.rbs +2 -2
  212. data/sig/mindee/product/fr/id_card/id_card_v2.rbs +1 -1
  213. data/sig/mindee/product/fr/id_card/id_card_v2_document.rbs +1 -1
  214. data/sig/mindee/product/fr/id_card/id_card_v2_page.rbs +2 -2
  215. data/sig/mindee/product/fr/payslip/payslip_v2.rbs +1 -1
  216. data/sig/mindee/product/fr/payslip/payslip_v2_bank_account_detail.rbs +2 -2
  217. data/sig/mindee/product/fr/payslip/payslip_v2_document.rbs +1 -1
  218. data/sig/mindee/product/fr/payslip/payslip_v2_employee.rbs +2 -2
  219. data/sig/mindee/product/fr/payslip/payslip_v2_employer.rbs +2 -2
  220. data/sig/mindee/product/fr/payslip/payslip_v2_employment.rbs +2 -2
  221. data/sig/mindee/product/fr/payslip/payslip_v2_page.rbs +2 -2
  222. data/sig/mindee/product/fr/payslip/payslip_v2_pay_detail.rbs +2 -2
  223. data/sig/mindee/product/fr/payslip/payslip_v2_pay_period.rbs +2 -2
  224. data/sig/mindee/product/fr/payslip/payslip_v2_pto.rbs +2 -2
  225. data/sig/mindee/product/fr/payslip/payslip_v2_salary_detail.rbs +3 -3
  226. data/sig/mindee/product/fr/payslip/payslip_v3.rbs +1 -1
  227. data/sig/mindee/product/fr/payslip/payslip_v3_bank_account_detail.rbs +2 -2
  228. data/sig/mindee/product/fr/payslip/payslip_v3_document.rbs +1 -1
  229. data/sig/mindee/product/fr/payslip/payslip_v3_employee.rbs +2 -2
  230. data/sig/mindee/product/fr/payslip/payslip_v3_employer.rbs +2 -2
  231. data/sig/mindee/product/fr/payslip/payslip_v3_employment.rbs +2 -2
  232. data/sig/mindee/product/fr/payslip/payslip_v3_page.rbs +2 -2
  233. data/sig/mindee/product/fr/payslip/payslip_v3_paid_time_off.rbs +3 -3
  234. data/sig/mindee/product/fr/payslip/payslip_v3_pay_detail.rbs +2 -2
  235. data/sig/mindee/product/fr/payslip/payslip_v3_pay_period.rbs +2 -2
  236. data/sig/mindee/product/fr/payslip/payslip_v3_salary_detail.rbs +3 -3
  237. data/sig/mindee/product/ind/indian_passport/indian_passport_v1.rbs +1 -1
  238. data/sig/mindee/product/ind/indian_passport/indian_passport_v1_document.rbs +1 -1
  239. data/sig/mindee/product/ind/indian_passport/indian_passport_v1_page.rbs +2 -2
  240. data/sig/mindee/product/international_id/international_id_v2.rbs +1 -1
  241. data/sig/mindee/product/international_id/international_id_v2_document.rbs +1 -1
  242. data/sig/mindee/product/international_id/international_id_v2_page.rbs +2 -2
  243. data/sig/mindee/product/invoice/invoice_v4.rbs +1 -1
  244. data/sig/mindee/product/invoice/invoice_v4_document.rbs +1 -1
  245. data/sig/mindee/product/invoice/invoice_v4_line_item.rbs +3 -3
  246. data/sig/mindee/product/invoice/invoice_v4_page.rbs +2 -2
  247. data/sig/mindee/product/invoice_splitter/invoice_splitter_v1.rbs +1 -1
  248. data/sig/mindee/product/invoice_splitter/invoice_splitter_v1_document.rbs +1 -1
  249. data/sig/mindee/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.rbs +3 -3
  250. data/sig/mindee/product/invoice_splitter/invoice_splitter_v1_page.rbs +2 -2
  251. data/sig/mindee/product/multi_receipts_detector/multi_receipts_detector_v1.rbs +1 -1
  252. data/sig/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_document.rbs +1 -1
  253. data/sig/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_page.rbs +2 -2
  254. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1.rbs +1 -1
  255. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_added_sugar.rbs +2 -2
  256. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_calorie.rbs +2 -2
  257. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_cholesterol.rbs +2 -2
  258. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_dietary_fiber.rbs +2 -2
  259. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_document.rbs +1 -1
  260. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_nutrient.rbs +3 -3
  261. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_page.rbs +2 -2
  262. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_protein.rbs +2 -2
  263. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_saturated_fat.rbs +2 -2
  264. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_serving_size.rbs +2 -2
  265. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_sodium.rbs +2 -2
  266. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_carbohydrate.rbs +2 -2
  267. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_fat.rbs +2 -2
  268. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_sugar.rbs +2 -2
  269. data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_trans_fat.rbs +2 -2
  270. data/sig/mindee/product/passport/passport_v1.rbs +1 -1
  271. data/sig/mindee/product/passport/passport_v1_document.rbs +1 -1
  272. data/sig/mindee/product/passport/passport_v1_page.rbs +2 -2
  273. data/sig/mindee/product/receipt/receipt_v5.rbs +1 -1
  274. data/sig/mindee/product/receipt/receipt_v5_document.rbs +1 -1
  275. data/sig/mindee/product/receipt/receipt_v5_line_item.rbs +3 -3
  276. data/sig/mindee/product/receipt/receipt_v5_page.rbs +2 -2
  277. data/sig/mindee/product/resume/resume_v1.rbs +1 -1
  278. data/sig/mindee/product/resume/resume_v1_certificate.rbs +3 -3
  279. data/sig/mindee/product/resume/resume_v1_document.rbs +1 -1
  280. data/sig/mindee/product/resume/resume_v1_education.rbs +3 -3
  281. data/sig/mindee/product/resume/resume_v1_language.rbs +3 -3
  282. data/sig/mindee/product/resume/resume_v1_page.rbs +2 -2
  283. data/sig/mindee/product/resume/resume_v1_professional_experience.rbs +3 -3
  284. data/sig/mindee/product/resume/resume_v1_social_networks_url.rbs +3 -3
  285. data/sig/mindee/product/universal/universal.rbs +5 -5
  286. data/sig/mindee/product/universal/universal_document.rbs +1 -1
  287. data/sig/mindee/product/universal/universal_page.rbs +2 -2
  288. data/sig/mindee/product/universal/universal_prediction.rbs +5 -5
  289. data/sig/mindee/product/us/bank_check/bank_check_v1.rbs +1 -1
  290. data/sig/mindee/product/us/bank_check/bank_check_v1_document.rbs +1 -1
  291. data/sig/mindee/product/us/bank_check/bank_check_v1_page.rbs +2 -2
  292. data/sig/mindee/product/us/healthcare_card/healthcare_card_v1.rbs +1 -1
  293. data/sig/mindee/product/us/healthcare_card/healthcare_card_v1_copay.rbs +3 -3
  294. data/sig/mindee/product/us/healthcare_card/healthcare_card_v1_document.rbs +1 -1
  295. data/sig/mindee/product/us/healthcare_card/healthcare_card_v1_page.rbs +2 -2
  296. data/sig/mindee/product/us/us_mail/us_mail_v2.rbs +1 -1
  297. data/sig/mindee/product/us/us_mail/us_mail_v2_document.rbs +1 -1
  298. data/sig/mindee/product/us/us_mail/us_mail_v2_page.rbs +2 -2
  299. data/sig/mindee/product/us/us_mail/us_mail_v2_recipient_address.rbs +3 -3
  300. data/sig/mindee/product/us/us_mail/us_mail_v2_sender_address.rbs +2 -2
  301. data/sig/mindee/product/us/us_mail/us_mail_v3.rbs +1 -1
  302. data/sig/mindee/product/us/us_mail/us_mail_v3_document.rbs +1 -1
  303. data/sig/mindee/product/us/us_mail/us_mail_v3_page.rbs +2 -2
  304. data/sig/mindee/product/us/us_mail/us_mail_v3_recipient_address.rbs +3 -3
  305. data/sig/mindee/product/us/us_mail/us_mail_v3_sender_address.rbs +2 -2
  306. data/sig/mindee/product/us/w9/w9_v1.rbs +1 -1
  307. data/sig/mindee/product/us/w9/w9_v1_document.rbs +1 -1
  308. data/sig/mindee/product/us/w9/w9_v1_page.rbs +2 -2
  309. data/sig/mindee/version.rbs +2 -2
  310. metadata +61 -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]
@@ -47,8 +47,7 @@ module Mindee
47
47
  end
48
48
 
49
49
  if filename.end_with?('.pdf') && repair_pdf
50
- rescue_broken_pdf(@io_stream)
51
- @file_mimetype = Marcel::MimeType.for @io_stream
50
+ fix_pdf!
52
51
 
53
52
  logger.debug("Loaded new input #{@filename} from #{self.class}")
54
53
  return if ALLOWED_MIME_TYPES.include? @file_mimetype
@@ -57,28 +56,41 @@ module Mindee
57
56
  raise Errors::MindeeMimeTypeError, @file_mimetype.to_s
58
57
  end
59
58
 
60
- # Attempts to fix pdf files if mimetype is rejected.
61
- # "Broken PDFs" are often a result of third-party injecting invalid headers.
62
- # This attempts to remove them and send the file
63
- # @param stream [StringIO]
64
- def rescue_broken_pdf(stream)
65
- stream.gets('%PDF-')
66
- raise Errors::MindeePDFError if stream.eof? || stream.pos > 500
67
-
68
- stream.pos = stream.pos - 5
69
- data = stream.read
70
- @io_stream.close
71
-
72
- @io_stream = StringIO.new
73
- @io_stream << data
59
+ # @deprecated See {#fix_pdf!} or {#self.fix_pdf} instead.
60
+ def rescue_broken_pdf(_)
61
+ fix_pdf!
74
62
  end
75
63
 
76
- # Shorthand for pdf mimetype validation.
64
+ # Shorthand for PDF mimetype validation.
77
65
  def pdf?
78
66
  @file_mimetype.to_s == 'application/pdf'
79
67
  end
80
68
 
81
- # Parses a PDF file according to provided options.
69
+ # Attempts to fix the PDF data in the file.
70
+ # @param maximum_offset [Integer] Maximum offset to look for the PDF header.
71
+ # @return [void]
72
+ # @raise [Mindee::Errors::MindeePDFError]
73
+ def fix_pdf!(maximum_offset: 500)
74
+ @io_stream = LocalInputSource.fix_pdf(@io_stream, maximum_offset: maximum_offset)
75
+ @io_stream.rewind
76
+ @file_mimetype = Marcel::MimeType.for @io_stream
77
+ end
78
+
79
+ # Attempt to fix the PDF data in the given stream.
80
+ # @param stream [StringIO] The stream to fix.
81
+ # @param maximum_offset [Integer] Maximum offset to look for the PDF header.
82
+ # @return [StringIO] The fixed stream.
83
+ # @raise [Mindee::Errors::MindeePDFError]
84
+ def self.fix_pdf(stream, maximum_offset: 500)
85
+ out_stream = StringIO.new
86
+ stream.gets('%PDF-')
87
+ raise Errors::MindeePDFError if stream.eof? || stream.pos > maximum_offset
88
+
89
+ stream.pos = stream.pos - 5
90
+ out_stream << stream.read
91
+ end
92
+
93
+ # Cuts a PDF file according to provided options.
82
94
  # @param options [PageOptions, nil] Page cutting/merge options:
83
95
  #
84
96
  # * `:page_indexes` Zero-based list of page indexes.
@@ -86,14 +98,20 @@ module Mindee
86
98
  # * `:KEEP_ONLY` - keep only the specified pages, and remove all others.
87
99
  # * `:REMOVE` - remove the specified pages, and keep all others.
88
100
  # * `:on_min_pages` Apply the operation only if document has at least this many pages.
89
- def process_pdf(options)
101
+ def apply_page_options(options)
90
102
  @io_stream.seek(0)
91
103
  @io_stream = PDF::PDFProcessor.parse(@io_stream, options)
92
104
  end
93
105
 
106
+ # @deprecated Use {#apply_page_options} instead.
107
+ # @see #apply_page_options
108
+ def process_pdf(options)
109
+ apply_page_options(options)
110
+ end
111
+
94
112
  # Reads a document.
95
113
  # @param close [bool]
96
- # @return [Array<String, [String, aBinaryString ], [Hash, nil] >]
114
+ # @return [Array<>]
97
115
  def read_contents(close: true)
98
116
  logger.debug("Reading data from: #{@filename}")
99
117
  @io_stream.seek(0)
@@ -101,20 +119,21 @@ module Mindee
101
119
  data = @io_stream.read
102
120
  @io_stream.rewind
103
121
  @io_stream.close if close
104
- ['document', data, { filename: Mindee::Input::Source.convert_to_unicode_escape(@filename) }]
122
+ [data, { filename: Mindee::Input::Source.convert_to_unicode_escape(@filename) }]
105
123
  end
106
124
 
107
125
  # Write the file to a given path. Uses the initial file name by default.
108
126
  # @param path [String] Path to write the file to.
109
127
  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
128
+ t_path = if File.directory?(path || '') || path.to_s.end_with?('/')
129
+ File.join(path || '', @filename)
130
+ else
131
+ path
132
+ end
133
+ full_path = File.expand_path(t_path || '')
115
134
  FileUtils.mkdir_p(File.dirname(full_path))
116
135
  @io_stream.rewind
117
- File.binwrite(full_path, @io_stream.read)
136
+ File.binwrite(full_path, @io_stream.read || '')
118
137
  logger.debug("Wrote file successfully to #{full_path}")
119
138
  @io_stream.rewind
120
139
  end
@@ -159,8 +178,8 @@ module Mindee
159
178
  @io_stream.rewind
160
179
  end
161
180
 
162
- # Checks whether the file has source text if it is a pdf. False otherwise
163
- # @return [bool] True if the file is a PDF and has source text.
181
+ # Checks whether the file has source text if it is a pdf. `false` otherwise
182
+ # @return [bool] `true` if the file is a PDF and has source text.
164
183
  def source_text?
165
184
  Mindee::PDF::PDFTools.source_text?(@io_stream)
166
185
  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
@@ -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)
@@ -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
 
@@ -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
@@ -75,7 +78,7 @@ module Mindee
75
78
  #
76
79
  # @param method_name [Symbol] The name of the method being checked.
77
80
  # @param include_private [bool] Whether to include private methods in the check.
78
- # @return [bool] True if the method can be responded to, false otherwise.
81
+ # @return [bool] `true` if the method can be responded to, false otherwise.
79
82
  def respond_to_missing?(method_name, include_private = false)
80
83
  @all_values.key?(method_name.to_s) || super
81
84
  end
@@ -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