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
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_field'
4
+
5
+ module Mindee
6
+ module Parsing
7
+ module V2
8
+ module Field
9
+ # Collection of inference fields that extends Hash functionality.
10
+ class InferenceFields < Hash
11
+ # @return [Integer] Level of indentation for rst display.
12
+ attr_reader :indent_level
13
+
14
+ # @param server_response [Hash] Raw server response hash.
15
+ # @param indent_level [Integer] Level of indentation for rst display.
16
+ def initialize(server_response, indent_level = 0)
17
+ super()
18
+ @indent_level = indent_level
19
+
20
+ server_response.each do |key, value|
21
+ self[key.to_s] = BaseField.create_field(value, 1)
22
+ end
23
+ end
24
+
25
+ # Get a field by key with nil fallback.
26
+ # @param key [String] Field key to retrieve.
27
+ # @return [BaseField, nil] The field or nil if not found.
28
+ def get(key)
29
+ self[key]
30
+ end
31
+
32
+ # Allow dot notation access to fields.
33
+ # @param method_name [Symbol] The method name (field key).
34
+ # @return [BaseField, nil] The field or nil if not found.
35
+ def method_missing(method_name, *args, &block)
36
+ key = method_name.to_s
37
+ if key?(key)
38
+ self[key]
39
+ else
40
+ super
41
+ end
42
+ end
43
+
44
+ # Check if method_missing should handle the method.
45
+ # @param method_name [Symbol] The method name.
46
+ # @return [Boolean] True if the method should be handled.
47
+ def respond_to_missing?(method_name, include_private = false)
48
+ key?(method_name.to_s) || super
49
+ end
50
+
51
+ # rubocop:disable Metrics/CyclomaticComplexity
52
+ # rubocop:disable Metrics/PerceivedComplexity
53
+ # Convert the fields to a string representation.
54
+ # @param indent [Integer, nil] Optional indentation level.
55
+ # @return [String] String representation of all fields.
56
+ def to_s(indent = 0)
57
+ return '' if empty?
58
+
59
+ indent ||= @indent_level
60
+ padding = ' ' * indent
61
+ lines = []
62
+
63
+ each do |field_key, field_value|
64
+ line = "#{padding}:#{field_key}:"
65
+
66
+ case (field_value.class.name || '').split('::').last
67
+ when 'ListField'
68
+ # Check if ListField has items and they're not empty
69
+ list_f = field_value # @type var list_f: ListField
70
+ if defined?(list_f.items) && list_f.items && !list_f.items.empty?
71
+ line += list_f.to_s
72
+ end
73
+ when 'ObjectField'
74
+ line += field_value.to_s
75
+ when 'SimpleField'
76
+ # Check if SimpleField has a non-empty value
77
+ simple_f = field_value # @type var simple_f: SimpleField
78
+ if defined?(simple_f.value) && simple_f.value && !simple_f.value.to_s.empty?
79
+ line += " #{simple_f}"
80
+ end
81
+ else
82
+ logger.debug("Unknown value was passed to the field creator: #{field_key} : #{field_value}")
83
+ end
84
+
85
+ lines << line
86
+ end
87
+
88
+ lines.join("\n").rstrip
89
+ end
90
+ # rubocop:enable Metrics/CyclomaticComplexity
91
+ # rubocop:enable Metrics/PerceivedComplexity
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_field'
4
+
5
+ module Mindee
6
+ module Parsing
7
+ module V2
8
+ module Field
9
+ # Represents a field that contains a list of items.
10
+ class ListField < BaseField
11
+ include Enumerable
12
+ # @return [Array<ListField | ObjectField | SimpleField>] Items contained in the list.
13
+ attr_reader :items
14
+
15
+ # @param server_response [Hash] Raw server response hash.
16
+ # @param indent_level [Integer] Level of indentation for rst display.
17
+ # @raise [MindeeError] If the 'items' key is missing or not an array.
18
+ def initialize(server_response, indent_level = 0)
19
+ super
20
+
21
+ unless server_response.key?('items') && server_response['items'].is_a?(Array)
22
+ raise Errors::MindeeError,
23
+ "Expected \"items\" to be an array in #{server_response.to_json}."
24
+ end
25
+
26
+ @items = []
27
+ server_response['items'].each do |item|
28
+ @items << BaseField.create_field(item, indent_level + 1)
29
+ end
30
+ end
31
+
32
+ # String representation of the list field.
33
+ # @return [String] Formatted string with bullet points for each item.
34
+ def to_s
35
+ return "\n" if @items.empty?
36
+
37
+ parts = ['']
38
+ @items.each do |item|
39
+ next unless item
40
+
41
+ parts << if item.is_a?(ObjectField)
42
+ item.to_s_from_list
43
+ else
44
+ item.to_s
45
+ end
46
+ end
47
+
48
+ parts.join("\n * ")
49
+ end
50
+
51
+ # Check if the list is empty.
52
+ # @return [Boolean] True if the list has no items.
53
+ def empty?
54
+ @items.empty?
55
+ end
56
+
57
+ # Get the number of items in the list.
58
+ # @return [Integer] Number of items.
59
+ def size
60
+ @items.size
61
+ end
62
+
63
+ # Get the number of items in the list (alias for size).
64
+ # @return [Integer] Number of items.
65
+ def length
66
+ @items.length
67
+ end
68
+
69
+ # Get an item by index.
70
+ # @param index [Integer] The index of the item to retrieve.
71
+ # @return [BaseField, nil] The item at the given index.
72
+ def [](index)
73
+ @items[index]
74
+ end
75
+
76
+ # Iterator for Enumerator inheritance.
77
+ # NOTE: Untyped due to incomplete support in steep.
78
+ def each(&block)
79
+ return to_enum(:each) unless block_given?
80
+
81
+ @items.each(&block)
82
+ self
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_field'
4
+ require_relative 'inference_fields'
5
+
6
+ module Mindee
7
+ module Parsing
8
+ module V2
9
+ module Field
10
+ # A field containing a nested set of inference fields.
11
+ class ObjectField < BaseField
12
+ # @return [InferenceFields] Fields contained in the object.
13
+ attr_reader :fields
14
+
15
+ # @param raw_prediction [Hash] Raw server response hash.
16
+ # @param indent_level [Integer] Level of indentation for rst display.
17
+ def initialize(raw_prediction, indent_level = 0)
18
+ super
19
+
20
+ inner_fields = raw_prediction.fetch('fields', raw_prediction)
21
+ @fields = InferenceFields.new(inner_fields, @indent_level + 1)
22
+ end
23
+
24
+ # String representation of the object field.
25
+ # @return [String] String representation with newline prefix.
26
+ def to_s
27
+ return "\n" unless @fields && !@fields.empty?
28
+
29
+ "\n#{@fields.to_s(1)}"
30
+ end
31
+
32
+ # String representation suitable for list display.
33
+ # @return [String] String representation without leading spaces.
34
+ def to_s_from_list
35
+ return '' if @fields.nil?
36
+ return '' unless @fields && !@fields.empty?
37
+
38
+ field_str = @fields.to_s(2)
39
+ field_str.length > 4 ? (field_str[4..] || '') : ''
40
+ end
41
+
42
+ # String representation of a single object field
43
+ # @return [String] Multi-line string with proper indentation.
44
+ def single_str
45
+ return '' unless @fields && !@fields.empty?
46
+
47
+ out_str = ''
48
+ indent = ' ' * @indent_level
49
+
50
+ @fields.each do |field_key, field_value|
51
+ value_str = field_value && !field_value.to_s.empty? ? field_value.to_s : ''
52
+ out_str += "\n#{indent} :#{field_key}: #{value_str}"
53
+ end
54
+
55
+ out_str
56
+ end
57
+
58
+ # String representation for multi-object display
59
+ # @return [String] Formatted string for list context.
60
+ def multi_str
61
+ return '' unless @fields && !@fields.empty?
62
+
63
+ out_str = ''
64
+ indent = ' ' * @indent_level
65
+ first = true
66
+
67
+ @fields.each do |field_key, field_value|
68
+ value_str = field_value ? field_value.to_s : ''
69
+
70
+ if first
71
+ out_str += "#{indent}:#{field_key}: #{value_str}"
72
+ first = false
73
+ else
74
+ out_str += "\n#{indent} :#{field_key}: #{value_str}"
75
+ end
76
+ end
77
+
78
+ out_str
79
+ end
80
+
81
+ # Allow dot notation access to nested fields.
82
+ # @param method_name [Symbol] The method name (field key).
83
+ # @return [ObjectField, nil] The field or nil if not found.
84
+ def method_missing(method_name, ...)
85
+ if @fields.respond_to?(method_name)
86
+ @fields.send(method_name, ...)
87
+ else
88
+ super
89
+ end
90
+ end
91
+
92
+ # Check if method_missing should handle the method.
93
+ # @param method_name [Symbol] The method name.
94
+ # @return [Boolean] True if the method should be handled.
95
+ def respond_to_missing?(method_name, include_private = false)
96
+ @fields.respond_to?(method_name) || super
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_field'
4
+
5
+ module Mindee
6
+ module Parsing
7
+ module V2
8
+ module Field
9
+ # A simple field with a scalar value.
10
+ class SimpleField < BaseField
11
+ # @return [String, Integer, Float, Boolean, nil] Value contained in the field.
12
+ attr_reader :value
13
+
14
+ # @param server_response [Hash] Raw server response hash.
15
+ # @param indent_level [Integer] Level of indentation for rst display.
16
+ def initialize(server_response, indent_level = 0)
17
+ super
18
+ @value = server_response.key?('value') ? server_response['value'] : nil
19
+ end
20
+
21
+ # String representation of the field value.
22
+ # @return [String] String representation of the value.
23
+ def to_s
24
+ return '' if @value.nil?
25
+
26
+ if @value.is_a?(TrueClass) || @value.is_a?(FalseClass)
27
+ @value ? 'True' : 'False'
28
+ elsif @value.is_a?(Integer) || @value.is_a?(Float)
29
+ # NOTE: explicitly typing because steep is very, very dumb
30
+ num = @value # @type var num: Integer | Float
31
+ format_numeric_value(num)
32
+ else
33
+ @value.to_s
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ # Format numeric values to display '.0' in string reps.
40
+ # @param value [Numeric] The numeric value to format.
41
+ # @return [String] Formatted numeric string.
42
+ def format_numeric_value(value)
43
+ float_value = value.to_f
44
+
45
+ if float_value == float_value.to_i
46
+ format('%.1f', float_value)
47
+ else
48
+ formatted = format('%.5f', float_value)
49
+ formatted.sub(%r{\.?0+$}, '')
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'field/base_field'
4
+ require_relative 'field/field_confidence'
5
+ require_relative 'field/field_location'
6
+ require_relative 'field/inference_fields'
7
+ require_relative 'field/list_field'
8
+ require_relative 'field/object_field'
9
+ require_relative 'field/simple_field'
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'inference_model'
4
+ require_relative 'inference_file'
5
+ require_relative 'inference_result'
6
+
7
+ module Mindee
8
+ module Parsing
9
+ module V2
10
+ # Complete data returned by an inference request.
11
+ class Inference
12
+ # @return [InferenceModel] Information about the model used.
13
+ attr_reader :model
14
+ # @return [InferenceFile] Information about the processed file.
15
+ attr_reader :file
16
+ # @return [InferenceResult] Result contents.
17
+ attr_reader :result
18
+ # @return [String] Identifier of the inference (when provided by API).
19
+ attr_reader :id
20
+
21
+ # @param server_response [Hash] Hash representation of the JSON returned by the service.
22
+ def initialize(server_response)
23
+ raise ArgumentError, 'server_response must be a Hash' unless server_response.is_a?(Hash)
24
+
25
+ @model = InferenceModel.new(server_response['model'])
26
+ @file = InferenceFile.new(server_response['file'])
27
+ @result = InferenceResult.new(server_response['result'])
28
+
29
+ @id = server_response['id']
30
+ end
31
+
32
+ # String representation.
33
+ # @return [String]
34
+ def to_s
35
+ [
36
+ 'Inference',
37
+ '#########',
38
+ 'Model',
39
+ '=====',
40
+ ":ID: #{@model.id}",
41
+ '',
42
+ @file.to_s,
43
+ @result.to_s,
44
+ '',
45
+ ].join("\n")
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mindee
4
+ module Parsing
5
+ module V2
6
+ # Information about a file returned in an inference.
7
+ class InferenceFile
8
+ # @return [String] File name.
9
+ attr_reader :name
10
+ # @return [String, nil] Optional alias for the file.
11
+ attr_reader :file_alias
12
+ # @return [Integer] Page count.
13
+ attr_reader :page_count
14
+ # @return [String] MIME type.
15
+ attr_reader :mime_type
16
+
17
+ # @param server_response [Hash] Raw JSON parsed into a Hash.
18
+ def initialize(server_response)
19
+ @name = server_response['name']
20
+ @file_alias = server_response['alias']
21
+ @page_count = server_response['page_count']
22
+ @mime_type = server_response['mime_type']
23
+ end
24
+
25
+ # String representation.
26
+ # @return [String]
27
+ def to_s
28
+ "File\n" \
29
+ "====\n" \
30
+ ":Name: #{@name}\n" \
31
+ ":Alias:#{" #{@file_alias}" if @file_alias}\n" \
32
+ ":Page Count: #{@page_count}\n" \
33
+ ":MIME Type: #{@mime_type}\n"
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mindee
4
+ module Parsing
5
+ module V2
6
+ # ID of the model that produced the inference.
7
+ class InferenceModel
8
+ # @return [String] Identifier of the model.
9
+ attr_reader :id
10
+
11
+ # @param server_response [Hash] Raw JSON parsed into a Hash.
12
+ def initialize(server_response)
13
+ @id = server_response['id']
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'common_response'
4
+ require_relative 'inference'
5
+
6
+ module Mindee
7
+ module Parsing
8
+ module V2
9
+ # HTTP response wrapper that embeds a V2 Inference.
10
+ class InferenceResponse < CommonResponse
11
+ # @return [Inference] Parsed inference payload.
12
+ attr_reader :inference
13
+
14
+ # @param server_response [Hash] Hash parsed from the API JSON response.
15
+ def initialize(server_response)
16
+ # CommonResponse takes care of the generic metadata (status, etc.)
17
+ super
18
+
19
+ @inference = Inference.new(server_response['inference'])
20
+ end
21
+
22
+ # String representation.
23
+ # @return [String]
24
+ def to_s
25
+ @inference.to_s
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'field/inference_fields'
4
+ require_relative 'inference_result_options'
5
+
6
+ module Mindee
7
+ module Parsing
8
+ module V2
9
+ # Wrapper for the result of a V2 inference request.
10
+ class InferenceResult
11
+ # @return [Mindee::Parsing::V2::Field::InferenceFields] Fields produced by the model.
12
+ attr_reader :fields
13
+ # @return [Mindee::Parsing::V2::InferenceResultOptions, nil] Optional extra data.
14
+ attr_reader :options
15
+
16
+ # @param server_response [Hash] Hash version of the JSON returned by the API.
17
+ def initialize(server_response)
18
+ raise ArgumentError, 'server_response must be a Hash' unless server_response.is_a?(Hash)
19
+
20
+ @fields = Field::InferenceFields.new(server_response['fields'])
21
+
22
+ return unless server_response.key?('options') && server_response['options']
23
+
24
+ @options = InferenceResultOptions.new(server_response['options'])
25
+ end
26
+
27
+ # String representation.
28
+ # @return [String]
29
+ def to_s
30
+ parts = [
31
+ 'Fields',
32
+ '======',
33
+ @fields.to_s,
34
+ ]
35
+
36
+ if @options
37
+ parts += [
38
+ 'Options',
39
+ '=======',
40
+ @options.to_s,
41
+ ]
42
+ end
43
+
44
+ parts.join("\n")
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'raw_text'
4
+
5
+ module Mindee
6
+ module Parsing
7
+ module V2
8
+ # Optional data returned alongside an inference.
9
+ class InferenceResultOptions
10
+ # @return [Array<RawText>] Collection of raw texts per page.
11
+ attr_reader :raw_texts
12
+
13
+ # @param server_response [Hash] Raw JSON parsed into a Hash.
14
+ def initialize(server_response)
15
+ raw = server_response['raw_texts']
16
+ @raw_texts = raw.is_a?(Array) ? raw.map { |rt| RawText.new(rt) } : []
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'date'
4
+ require_relative 'error_response'
5
+ require_relative 'job_webhook'
6
+
7
+ module Mindee
8
+ module Parsing
9
+ module V2
10
+ # Metadata returned when polling a job (asynchronous request).
11
+ class Job
12
+ # @return [String] Unique job identifier.
13
+ attr_reader :id
14
+ # @return [DateTime, nil] Timestamp of creation.
15
+ attr_reader :created_at
16
+ # @return [String] Identifier of the model used.
17
+ attr_reader :model_id
18
+ # @return [String] Name of the processed file.
19
+ attr_reader :filename
20
+ # @return [String] Optional alias for the file.
21
+ attr_reader :alias
22
+ # @return [String, nil] Current status (submitted, processing, done, …).
23
+ attr_reader :status
24
+ # @return [String] URL to query for updated status.
25
+ attr_reader :polling_url
26
+ # @return [String, nil] URL that redirects to the final result once ready.
27
+ attr_reader :result_url
28
+ # @return [Array<JobWebhook>] Webhooks triggered by the job.
29
+ attr_reader :webhooks
30
+ # @return [ErrorResponse, nil] Error details when the job failed.
31
+ attr_reader :error
32
+
33
+ # @param server_response [Hash] Parsed JSON payload from the API.
34
+ def initialize(server_response)
35
+ raise ArgumentError, 'server_response must be a Hash' unless server_response.is_a?(Hash)
36
+
37
+ @id = server_response['id']
38
+ @status = server_response['status'] if server_response.key?('status')
39
+ unless server_response['error'].nil? || server_response['error'].empty?
40
+ @error = ErrorResponse.new(server_response['error'])
41
+ end
42
+ @created_at = Time.iso8601(server_response['created_at'])
43
+ @model_id = server_response['model_id']
44
+ @polling_url = server_response['polling_url']
45
+ @filename = server_response['filename']
46
+ @result_url = server_response['result_url']
47
+ @alias = server_response['alias']
48
+ @webhooks = []
49
+ server_response['webhooks'].each do |webhook|
50
+ @webhooks.push JobWebhook.new(webhook)
51
+ end
52
+ end
53
+
54
+ # String representation.
55
+ # @return [String]
56
+ def to_s
57
+ lines = [
58
+ 'Job',
59
+ '###',
60
+ ":ID: #{@id}",
61
+ ":CreatedAt: #{@created_at}",
62
+ ":ModelID: #{@model_id}",
63
+ ":Filename: #{@filename}",
64
+ ":Alias: #{@alias}",
65
+ ":Status: #{@status}",
66
+ ":PollingURL: #{@polling_url}",
67
+ ":ResultURL: #{@result_url}",
68
+ ]
69
+
70
+ lines << @error.to_s if @error
71
+
72
+ unless @webhooks.empty?
73
+ lines += [
74
+ '',
75
+ 'Webhooks',
76
+ '=========',
77
+ @webhooks.map(&:to_s).join("\n\n"),
78
+ ]
79
+ end
80
+
81
+ lines.join("\n")
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'common_response'
4
+ require_relative 'job'
5
+
6
+ module Mindee
7
+ module Parsing
8
+ module V2
9
+ # HTTP response wrapper that embeds a V2 job.
10
+ class JobResponse < CommonResponse
11
+ # @return [Job] Parsed job payload.
12
+ attr_reader :job
13
+
14
+ # @param server_response [Hash] Hash parsed from the API JSON response.
15
+ def initialize(server_response)
16
+ # CommonResponse takes care of the generic metadata (status, etc.)
17
+ super
18
+
19
+ @job = Job.new(server_response['job'])
20
+ end
21
+
22
+ # String representation.
23
+ # @return [String]
24
+ def to_s
25
+ @job.to_s
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end