mindee 4.0.2__tar.gz → 4.2.0__tar.gz

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 (199) hide show
  1. {mindee-4.0.2 → mindee-4.2.0}/PKG-INFO +27 -17
  2. {mindee-4.0.2 → mindee-4.2.0}/README.md +19 -11
  3. {mindee-4.0.2 → mindee-4.2.0}/mindee/cli.py +162 -138
  4. {mindee-4.0.2 → mindee-4.2.0}/mindee/client.py +76 -70
  5. {mindee-4.0.2 → mindee-4.2.0}/mindee/error/__init__.py +1 -1
  6. {mindee-4.0.2 → mindee-4.2.0}/mindee/error/mindee_error.py +4 -0
  7. {mindee-4.0.2 → mindee-4.2.0}/mindee/input/sources.py +48 -8
  8. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/async_predict_response.py +5 -5
  9. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/document.py +6 -2
  10. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/extras/cropper_extra.py +3 -1
  11. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/inference.py +1 -1
  12. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/job.py +3 -1
  13. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/predict_response.py +2 -2
  14. mindee-4.2.0/mindee/parsing/custom/__init__.py +3 -0
  15. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/custom/classification.py +1 -1
  16. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/custom/line_items.py +22 -25
  17. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/custom/list.py +12 -15
  18. mindee-4.2.0/mindee/parsing/generated/__init__.py +5 -0
  19. mindee-4.2.0/mindee/parsing/generated/generated_list.py +56 -0
  20. mindee-4.2.0/mindee/parsing/generated/generated_object.py +86 -0
  21. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/standard/amount.py +2 -1
  22. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/standard/base.py +10 -6
  23. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/standard/date.py +6 -2
  24. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/standard/locale.py +3 -3
  25. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/standard/payment_details.py +4 -4
  26. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/standard/position.py +5 -5
  27. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/standard/text.py +2 -1
  28. mindee-4.2.0/mindee/product/__init__.py +30 -0
  29. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/barcode_reader/barcode_reader_v1.py +6 -1
  30. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/barcode_reader/barcode_reader_v1_document.py +1 -0
  31. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/cropper/cropper_v1.py +6 -1
  32. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/custom/custom_v1.py +1 -1
  33. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/custom/custom_v1_document.py +8 -7
  34. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/custom/custom_v1_page.py +6 -5
  35. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/eu/license_plate/license_plate_v1.py +6 -1
  36. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/eu/license_plate/license_plate_v1_document.py +1 -0
  37. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/financial_document/financial_document_v1.py +6 -1
  38. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/financial_document/financial_document_v1_document.py +1 -0
  39. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/bank_account_details/bank_account_details_v1.py +6 -1
  40. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/bank_account_details/bank_account_details_v1_document.py +1 -0
  41. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/bank_account_details/bank_account_details_v2.py +6 -1
  42. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/bank_account_details/bank_account_details_v2_document.py +1 -0
  43. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/carte_grise/carte_grise_v1.py +6 -1
  44. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/carte_grise/carte_grise_v1_document.py +1 -0
  45. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/carte_vitale/carte_vitale_v1.py +6 -1
  46. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/carte_vitale/carte_vitale_v1_document.py +1 -0
  47. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/id_card/id_card_v1.py +6 -1
  48. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/id_card/id_card_v1_document.py +1 -0
  49. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/id_card/id_card_v2.py +6 -1
  50. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/id_card/id_card_v2_document.py +1 -0
  51. mindee-4.2.0/mindee/product/generated/__init__.py +5 -0
  52. mindee-4.2.0/mindee/product/generated/generated_v1.py +31 -0
  53. mindee-4.2.0/mindee/product/generated/generated_v1_document.py +39 -0
  54. mindee-4.2.0/mindee/product/generated/generated_v1_page.py +43 -0
  55. mindee-4.2.0/mindee/product/generated/generated_v1_prediction.py +77 -0
  56. mindee-4.2.0/mindee/product/international_id/__init__.py +4 -0
  57. mindee-4.2.0/mindee/product/international_id/international_id_v1.py +37 -0
  58. mindee-4.2.0/mindee/product/international_id/international_id_v1_document.py +136 -0
  59. mindee-4.2.0/mindee/product/invoice/__init__.py +3 -0
  60. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/invoice/invoice_v4.py +6 -1
  61. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/invoice/invoice_v4_document.py +1 -0
  62. mindee-4.2.0/mindee/product/invoice_splitter/__init__.py +7 -0
  63. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/invoice_splitter/invoice_splitter_v1_document.py +2 -0
  64. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/invoice_splitter/invoice_splitter_v1_page_group.py +3 -3
  65. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/material_certificate/material_certificate_v1.py +6 -1
  66. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/material_certificate/material_certificate_v1_document.py +1 -0
  67. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/multi_receipts_detector/multi_receipts_detector_v1.py +6 -1
  68. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_document.py +1 -0
  69. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/passport/passport_v1.py +6 -1
  70. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/passport/passport_v1_document.py +1 -0
  71. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/proof_of_address/proof_of_address_v1.py +6 -1
  72. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/proof_of_address/proof_of_address_v1_document.py +1 -0
  73. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/receipt/receipt_v5.py +6 -1
  74. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/receipt/receipt_v5_document.py +1 -0
  75. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/us/bank_check/bank_check_v1.py +6 -1
  76. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/us/bank_check/bank_check_v1_document.py +1 -0
  77. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/us/driver_license/driver_license_v1.py +6 -1
  78. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/us/driver_license/driver_license_v1_document.py +1 -0
  79. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/us/w9/w9_v1.py +6 -1
  80. mindee-4.2.0/mindee/version +1 -0
  81. {mindee-4.0.2 → mindee-4.2.0}/mindee.egg-info/PKG-INFO +27 -17
  82. {mindee-4.0.2 → mindee-4.2.0}/mindee.egg-info/SOURCES.txt +11 -0
  83. {mindee-4.0.2 → mindee-4.2.0}/mindee.egg-info/requires.txt +9 -5
  84. {mindee-4.0.2 → mindee-4.2.0}/pyproject.toml +11 -1
  85. {mindee-4.0.2 → mindee-4.2.0}/setup.cfg +7 -5
  86. {mindee-4.0.2 → mindee-4.2.0}/tests/test_cli.py +52 -0
  87. {mindee-4.0.2 → mindee-4.2.0}/tests/test_inputs.py +21 -0
  88. mindee-4.0.2/mindee/parsing/custom/__init__.py +0 -3
  89. mindee-4.0.2/mindee/product/__init__.py +0 -46
  90. mindee-4.0.2/mindee/product/invoice_splitter/__init__.py +0 -1
  91. mindee-4.0.2/mindee/version +0 -1
  92. mindee-4.0.2/tests/product/us/__init__.py +0 -0
  93. {mindee-4.0.2 → mindee-4.2.0}/LICENSE +0 -0
  94. {mindee-4.0.2 → mindee-4.2.0}/mindee/__init__.py +0 -0
  95. {mindee-4.0.2 → mindee-4.2.0}/mindee/__main__.py +0 -0
  96. {mindee-4.0.2 → mindee-4.2.0}/mindee/error/geometry_error.py +0 -0
  97. {mindee-4.0.2 → mindee-4.2.0}/mindee/error/mimetype_error.py +0 -0
  98. {mindee-4.0.2 → mindee-4.2.0}/mindee/error/mindee_http_error.py +0 -0
  99. {mindee-4.0.2 → mindee-4.2.0}/mindee/geometry/__init__.py +0 -0
  100. {mindee-4.0.2 → mindee-4.2.0}/mindee/geometry/bbox.py +0 -0
  101. {mindee-4.0.2 → mindee-4.2.0}/mindee/geometry/minmax.py +0 -0
  102. {mindee-4.0.2 → mindee-4.2.0}/mindee/geometry/point.py +0 -0
  103. {mindee-4.0.2 → mindee-4.2.0}/mindee/geometry/polygon.py +0 -0
  104. {mindee-4.0.2 → mindee-4.2.0}/mindee/geometry/polygon_utils.py +0 -0
  105. {mindee-4.0.2 → mindee-4.2.0}/mindee/geometry/quadrilateral.py +0 -0
  106. {mindee-4.0.2 → mindee-4.2.0}/mindee/input/__init__.py +0 -0
  107. {mindee-4.0.2 → mindee-4.2.0}/mindee/input/page_options.py +0 -0
  108. {mindee-4.0.2 → mindee-4.2.0}/mindee/logger.py +0 -0
  109. {mindee-4.0.2 → mindee-4.2.0}/mindee/mindee_http/__init__.py +0 -0
  110. {mindee-4.0.2 → mindee-4.2.0}/mindee/mindee_http/base_endpoint.py +0 -0
  111. {mindee-4.0.2 → mindee-4.2.0}/mindee/mindee_http/endpoint.py +0 -0
  112. {mindee-4.0.2 → mindee-4.2.0}/mindee/mindee_http/mindee_api.py +0 -0
  113. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/__init__.py +0 -0
  114. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/__init__.py +0 -0
  115. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/api_request.py +0 -0
  116. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/api_response.py +0 -0
  117. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/extras/__init__.py +0 -0
  118. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/extras/extras.py +0 -0
  119. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/feedback_response.py +0 -0
  120. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/ocr/__init__.py +0 -0
  121. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/ocr/mvision_v1.py +0 -0
  122. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/ocr/ocr.py +0 -0
  123. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/ocr/ocr_line.py +0 -0
  124. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/ocr/ocr_page.py +0 -0
  125. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/ocr/ocr_word.py +0 -0
  126. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/orientation.py +0 -0
  127. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/page.py +0 -0
  128. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/prediction.py +0 -0
  129. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/product.py +0 -0
  130. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/string_dict.py +0 -0
  131. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/common/summary_helper.py +0 -0
  132. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/standard/__init__.py +0 -0
  133. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/standard/classification.py +0 -0
  134. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/standard/company_registration.py +0 -0
  135. {mindee-4.0.2 → mindee-4.2.0}/mindee/parsing/standard/tax.py +0 -0
  136. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/barcode_reader/__init__.py +0 -0
  137. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/cropper/__init__.py +0 -0
  138. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/cropper/cropper_v1_document.py +0 -0
  139. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/cropper/cropper_v1_page.py +0 -0
  140. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/custom/__init__.py +0 -0
  141. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/eu/__init__.py +0 -0
  142. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/eu/license_plate/__init__.py +0 -0
  143. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/financial_document/__init__.py +0 -0
  144. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/financial_document/financial_document_v1_line_item.py +0 -0
  145. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/__init__.py +0 -0
  146. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/bank_account_details/__init__.py +0 -0
  147. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/bank_account_details/bank_account_details_v2_bban.py +0 -0
  148. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/carte_grise/__init__.py +0 -0
  149. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/carte_vitale/__init__.py +0 -0
  150. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/id_card/__init__.py +0 -0
  151. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/id_card/id_card_v1_page.py +0 -0
  152. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/id_card/id_card_v2_page.py +0 -0
  153. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/petrol_receipt/__init__.py +0 -0
  154. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/petrol_receipt/petrol_receipt_v1.py +0 -0
  155. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/petrol_receipt/petrol_receipt_v1_document.py +0 -0
  156. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/petrol_receipt/petrol_receipt_v1_fuel.py +0 -0
  157. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/fr/petrol_receipt/petrol_receipt_v1_total.py +0 -0
  158. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/invoice/invoice_v4_line_item.py +0 -0
  159. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/invoice_splitter/invoice_splitter_v1.py +0 -0
  160. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/material_certificate/__init__.py +0 -0
  161. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/multi_receipts_detector/__init__.py +0 -0
  162. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/passport/__init__.py +0 -0
  163. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/proof_of_address/__init__.py +0 -0
  164. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/receipt/__init__.py +0 -0
  165. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/receipt/receipt_v4.py +0 -0
  166. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/receipt/receipt_v4_document.py +0 -0
  167. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/receipt/receipt_v5_line_item.py +0 -0
  168. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/us/__init__.py +0 -0
  169. {mindee-4.0.2/mindee/product/invoice → mindee-4.2.0/mindee/product/us/bank_check}/__init__.py +0 -0
  170. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/us/bank_check/bank_check_v1_page.py +0 -0
  171. {mindee-4.0.2/mindee/product/us/bank_check → mindee-4.2.0/mindee/product/us/driver_license}/__init__.py +0 -0
  172. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/us/driver_license/driver_license_v1_page.py +0 -0
  173. {mindee-4.0.2/mindee/product/us/driver_license → mindee-4.2.0/mindee/product/us/w9}/__init__.py +0 -0
  174. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/us/w9/w9_v1_document.py +0 -0
  175. {mindee-4.0.2 → mindee-4.2.0}/mindee/product/us/w9/w9_v1_page.py +0 -0
  176. {mindee-4.0.2 → mindee-4.2.0}/mindee/py.typed +0 -0
  177. {mindee-4.0.2 → mindee-4.2.0}/mindee/versions.py +0 -0
  178. {mindee-4.0.2 → mindee-4.2.0}/mindee.egg-info/dependency_links.txt +0 -0
  179. {mindee-4.0.2 → mindee-4.2.0}/mindee.egg-info/entry_points.txt +0 -0
  180. {mindee-4.0.2 → mindee-4.2.0}/mindee.egg-info/not-zip-safe +0 -0
  181. {mindee-4.0.2 → mindee-4.2.0}/mindee.egg-info/top_level.txt +0 -0
  182. {mindee-4.0.2 → mindee-4.2.0}/setup.py +0 -0
  183. {mindee-4.0.2/mindee/product/us/w9 → mindee-4.2.0/tests/fields}/__init__.py +0 -0
  184. {mindee-4.0.2 → mindee-4.2.0}/tests/fields/test_amount.py +0 -0
  185. {mindee-4.0.2 → mindee-4.2.0}/tests/fields/test_date.py +0 -0
  186. {mindee-4.0.2 → mindee-4.2.0}/tests/fields/test_field.py +0 -0
  187. {mindee-4.0.2 → mindee-4.2.0}/tests/fields/test_locale.py +0 -0
  188. {mindee-4.0.2 → mindee-4.2.0}/tests/fields/test_ocr.py +0 -0
  189. {mindee-4.0.2 → mindee-4.2.0}/tests/fields/test_orientation.py +0 -0
  190. {mindee-4.0.2 → mindee-4.2.0}/tests/fields/test_payment_details.py +0 -0
  191. {mindee-4.0.2 → mindee-4.2.0}/tests/fields/test_position.py +0 -0
  192. {mindee-4.0.2 → mindee-4.2.0}/tests/fields/test_tax.py +0 -0
  193. {mindee-4.0.2 → mindee-4.2.0}/tests/product/__init__.py +0 -0
  194. {mindee-4.0.2/tests/fields → mindee-4.2.0/tests/product/eu}/__init__.py +0 -0
  195. {mindee-4.0.2/tests/product/eu → mindee-4.2.0/tests/product/fr}/__init__.py +0 -0
  196. {mindee-4.0.2/tests/product/fr → mindee-4.2.0/tests/product/us}/__init__.py +0 -0
  197. {mindee-4.0.2 → mindee-4.2.0}/tests/test_client.py +0 -0
  198. {mindee-4.0.2 → mindee-4.2.0}/tests/test_geometry.py +0 -0
  199. {mindee-4.0.2 → mindee-4.2.0}/tests/test_pkg_versions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mindee
3
- Version: 4.0.2
3
+ Version: 4.2.0
4
4
  Summary: Mindee API helper library for Python
5
5
  Home-page: https://mindee.com/
6
6
  Author: Mindee
@@ -14,6 +14,8 @@ Classifier: Programming Language :: Python :: 3.7
14
14
  Classifier: Programming Language :: Python :: 3.8
15
15
  Classifier: Programming Language :: Python :: 3.9
16
16
  Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
17
19
  Classifier: Operating System :: OS Independent
18
20
  Classifier: Development Status :: 5 - Production/Stable
19
21
  Classifier: Intended Audience :: Developers
@@ -22,14 +24,14 @@ Classifier: License :: OSI Approved :: MIT License
22
24
  Requires-Python: >=3.7
23
25
  Description-Content-Type: text/markdown
24
26
  License-File: LICENSE
25
- Requires-Dist: pikepdf~=6.2
27
+ Requires-Dist: pikepdf~=8.6; python_version >= "3.8"
28
+ Requires-Dist: pikepdf==6.2.9; python_version < "3.8"
26
29
  Requires-Dist: pytz>=2023.3
27
30
  Requires-Dist: requests~=2.31
28
31
  Provides-Extra: dev
29
- Requires-Dist: black==23.1.0; extra == "dev"
30
- Requires-Dist: mypy==1.4.1; extra == "dev"
31
- Requires-Dist: pip-tools~=6.14; extra == "dev"
32
- Requires-Dist: pylint==2.17.1; extra == "dev"
32
+ Requires-Dist: black==23.10.0; extra == "dev"
33
+ Requires-Dist: mypy==1.6.1; extra == "dev"
34
+ Requires-Dist: pylint==2.17.7; extra == "dev"
33
35
  Requires-Dist: setuptools==51.3.3; extra == "dev"
34
36
  Requires-Dist: isort==5.11.5; extra == "dev"
35
37
  Requires-Dist: pre-commit~=2.21.0; extra == "dev"
@@ -47,7 +49,7 @@ Provides-Extra: build
47
49
  Requires-Dist: build~=0.9; extra == "build"
48
50
  Requires-Dist: twine~=4.0; extra == "build"
49
51
 
50
- [![License: MIT](https://img.shields.io/github/license/mindee/mindee-api-python)](https://opensource.org/licenses/MIT) [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/mindee/mindee-api-python/test.yml)](https://github.com/mindee/mindee-api-python) [![PyPI Version](https://img.shields.io/pypi/v/mindee)](https://pypi.org/project/mindee/) [![Downloads](https://img.shields.io/pypi/dm/mindee)](https://pypi.org/project/mindee/)
52
+ [![License: MIT](https://img.shields.io/github/license/mindee/mindee-api-python)](https://opensource.org/licenses/MIT) [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/mindee/mindee-api-python/unit-test.yml)](https://github.com/mindee/mindee-api-python) [![PyPI Version](https://img.shields.io/pypi/v/mindee)](https://pypi.org/project/mindee/) [![Downloads](https://img.shields.io/pypi/dm/mindee)](https://pypi.org/project/mindee/)
51
53
 
52
54
  # Mindee API Helper Library for Python
53
55
  Quickly and easily connect to Mindee's API services using Python.
@@ -127,19 +129,25 @@ print(result.document)
127
129
  ```python
128
130
  from mindee import Client, product
129
131
 
130
- # Init a new client and add your custom endpoint (document)
132
+ # Init a new client
131
133
  mindee_client = Client(api_key="my-api-key")
132
- custom_endpoint = mindee_client.create_endpoint(
133
- account_name="john",
134
- endpoint_name="wnine",
134
+
135
+ # Add your custom endpoint (document)
136
+ my_endpoint = mindee_client.create_endpoint(
137
+ account_name="my-account",
138
+ endpoint_name="my-endpoint",
135
139
  )
136
140
 
137
141
  # Load a file from disk
138
142
  input_doc = mindee_client.source_from_path("/path/to/the/file.ext")
139
143
 
140
144
  # Parse the file.
141
- # The endpoint must be specified since it can't be determined from the class.
142
- result = parse(product.CustomV1, endpoint=custom_endpoint)
145
+ # The endpoint must be specified since it cannot be determined from the class.
146
+ result = mindee_client.parse(
147
+ product.CustomV1,
148
+ input_doc,
149
+ endpoint=my_endpoint
150
+ )
143
151
 
144
152
  # Print a brief summary of the parsed data
145
153
  print(result.document)
@@ -158,12 +166,14 @@ Allows sending only certain pages in a PDF.
158
166
  In this example we only send the first, penultimate and last pages:
159
167
 
160
168
  ```python
161
- api_response = mindee_client.parse(
162
- mindee.product.InvoiceV4,
169
+ from mindee import Client, product, PageOptions
170
+
171
+ result = mindee_client.parse(
172
+ product.InvoiceV4,
163
173
  input_source,
164
- page_options=mindee.PageOptions(
174
+ page_options=PageOptions(
165
175
  page_indexes=[0, -2, -1],
166
- operation: mindee.PageOptions.KEEP_ONLY,
176
+ operation=PageOptions.KEEP_ONLY,
167
177
  on_min_pages=2
168
178
  )
169
179
  )
@@ -1,4 +1,4 @@
1
- [![License: MIT](https://img.shields.io/github/license/mindee/mindee-api-python)](https://opensource.org/licenses/MIT) [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/mindee/mindee-api-python/test.yml)](https://github.com/mindee/mindee-api-python) [![PyPI Version](https://img.shields.io/pypi/v/mindee)](https://pypi.org/project/mindee/) [![Downloads](https://img.shields.io/pypi/dm/mindee)](https://pypi.org/project/mindee/)
1
+ [![License: MIT](https://img.shields.io/github/license/mindee/mindee-api-python)](https://opensource.org/licenses/MIT) [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/mindee/mindee-api-python/unit-test.yml)](https://github.com/mindee/mindee-api-python) [![PyPI Version](https://img.shields.io/pypi/v/mindee)](https://pypi.org/project/mindee/) [![Downloads](https://img.shields.io/pypi/dm/mindee)](https://pypi.org/project/mindee/)
2
2
 
3
3
  # Mindee API Helper Library for Python
4
4
  Quickly and easily connect to Mindee's API services using Python.
@@ -78,19 +78,25 @@ print(result.document)
78
78
  ```python
79
79
  from mindee import Client, product
80
80
 
81
- # Init a new client and add your custom endpoint (document)
81
+ # Init a new client
82
82
  mindee_client = Client(api_key="my-api-key")
83
- custom_endpoint = mindee_client.create_endpoint(
84
- account_name="john",
85
- endpoint_name="wnine",
83
+
84
+ # Add your custom endpoint (document)
85
+ my_endpoint = mindee_client.create_endpoint(
86
+ account_name="my-account",
87
+ endpoint_name="my-endpoint",
86
88
  )
87
89
 
88
90
  # Load a file from disk
89
91
  input_doc = mindee_client.source_from_path("/path/to/the/file.ext")
90
92
 
91
93
  # Parse the file.
92
- # The endpoint must be specified since it can't be determined from the class.
93
- result = parse(product.CustomV1, endpoint=custom_endpoint)
94
+ # The endpoint must be specified since it cannot be determined from the class.
95
+ result = mindee_client.parse(
96
+ product.CustomV1,
97
+ input_doc,
98
+ endpoint=my_endpoint
99
+ )
94
100
 
95
101
  # Print a brief summary of the parsed data
96
102
  print(result.document)
@@ -109,12 +115,14 @@ Allows sending only certain pages in a PDF.
109
115
  In this example we only send the first, penultimate and last pages:
110
116
 
111
117
  ```python
112
- api_response = mindee_client.parse(
113
- mindee.product.InvoiceV4,
118
+ from mindee import Client, product, PageOptions
119
+
120
+ result = mindee_client.parse(
121
+ product.InvoiceV4,
114
122
  input_source,
115
- page_options=mindee.PageOptions(
123
+ page_options=PageOptions(
116
124
  page_indexes=[0, -2, -1],
117
- operation: mindee.PageOptions.KEEP_ONLY,
125
+ operation=PageOptions.KEEP_ONLY,
118
126
  on_min_pages=2
119
127
  )
120
128
  )
@@ -22,8 +22,8 @@ class CommandConfig(Generic[TypeInference]):
22
22
 
23
23
  help: str
24
24
  doc_class: Type[TypeInference]
25
- is_sync: bool = False
26
- is_async: bool = False
25
+ is_sync: bool
26
+ is_async: bool
27
27
 
28
28
 
29
29
  DOCUMENTS: Dict[str, CommandConfig] = {
@@ -31,60 +31,84 @@ DOCUMENTS: Dict[str, CommandConfig] = {
31
31
  help="Barcode-reader tool",
32
32
  doc_class=product.BarcodeReaderV1,
33
33
  is_sync=True,
34
+ is_async=False,
34
35
  ),
35
36
  "cropper": CommandConfig(
36
37
  help="Cropper tool",
37
38
  doc_class=product.CropperV1,
38
39
  is_sync=True,
40
+ is_async=False,
39
41
  ),
40
42
  "custom": CommandConfig(
41
43
  help="Custom document type from API builder",
42
44
  doc_class=product.CustomV1,
43
45
  is_sync=True,
44
- is_async=True,
46
+ is_async=False,
45
47
  ),
46
48
  "eu-license-plate": CommandConfig(
47
49
  help="EU License Plate",
48
50
  doc_class=product.eu.LicensePlateV1,
49
51
  is_sync=True,
52
+ is_async=False,
50
53
  ),
51
54
  "financial-document": CommandConfig(
52
55
  help="Financial Document (receipt or invoice)",
53
56
  doc_class=product.FinancialDocumentV1,
54
57
  is_sync=True,
58
+ is_async=False,
55
59
  ),
56
60
  "fr-bank-account-details": CommandConfig(
57
61
  help="FR Bank Account Details",
58
62
  doc_class=product.fr.BankAccountDetailsV2,
59
63
  is_sync=True,
64
+ is_async=False,
60
65
  ),
61
66
  "fr-carte-grise": CommandConfig(
62
67
  help="FR Carte Grise",
63
68
  doc_class=product.fr.CarteGriseV1,
69
+ is_sync=True,
70
+ is_async=False,
64
71
  ),
65
72
  "fr-carte-vitale": CommandConfig(
66
73
  help="FR Carte Vitale",
67
74
  doc_class=product.fr.CarteVitaleV1,
68
75
  is_sync=True,
76
+ is_async=False,
69
77
  ),
70
78
  "fr-id-card": CommandConfig(
71
79
  help="FR ID Card",
72
80
  doc_class=product.fr.IdCardV2,
73
81
  is_sync=True,
82
+ is_async=False,
74
83
  ),
75
84
  "fr-petrol-receipt": CommandConfig(
76
85
  help="FR Petrol Receipt",
77
86
  doc_class=product.fr.PetrolReceiptV1,
78
87
  is_sync=True,
88
+ is_async=False,
89
+ ),
90
+ "generated": CommandConfig(
91
+ help="Generated",
92
+ doc_class=product.GeneratedV1,
93
+ is_sync=True,
94
+ is_async=True,
79
95
  ),
80
96
  "invoice": CommandConfig(
81
97
  help="Invoice",
82
98
  doc_class=product.InvoiceV4,
83
99
  is_sync=True,
100
+ is_async=False,
101
+ ),
102
+ "international-id": CommandConfig(
103
+ help="International ID",
104
+ doc_class=product.InternationalIdV1,
105
+ is_sync=False,
106
+ is_async=True,
84
107
  ),
85
108
  "invoice-splitter": CommandConfig(
86
109
  help="Invoice Splitter",
87
110
  doc_class=product.InvoiceSplitterV1,
111
+ is_sync=False,
88
112
  is_async=True,
89
113
  ),
90
114
  "material-certificate": CommandConfig(
@@ -97,44 +121,149 @@ DOCUMENTS: Dict[str, CommandConfig] = {
97
121
  help="Multi-receipts detector",
98
122
  doc_class=product.MultiReceiptsDetectorV1,
99
123
  is_sync=True,
124
+ is_async=False,
100
125
  ),
101
126
  "passport": CommandConfig(
102
127
  help="Passport",
103
128
  doc_class=product.PassportV1,
104
129
  is_sync=True,
130
+ is_async=False,
105
131
  ),
106
132
  "proof-of-address": CommandConfig(
107
133
  help="Proof of Address",
108
134
  doc_class=product.ProofOfAddressV1,
109
135
  is_sync=True,
136
+ is_async=False,
110
137
  ),
111
138
  "receipt": CommandConfig(
112
139
  help="Expense Receipt",
113
140
  doc_class=product.ReceiptV5,
114
141
  is_sync=True,
142
+ is_async=False,
115
143
  ),
116
144
  "us-bank-check": CommandConfig(
117
145
  help="US Bank Check",
118
146
  doc_class=product.us.BankCheckV1,
119
147
  is_sync=True,
148
+ is_async=False,
120
149
  ),
121
150
  "us-driver-license": CommandConfig(
122
151
  help="US Driver License",
123
152
  doc_class=product.us.DriverLicenseV1,
124
153
  is_sync=True,
154
+ is_async=False,
125
155
  ),
126
156
  "us-w9": CommandConfig(
127
157
  help="US W9",
128
158
  doc_class=product.us.W9V1,
129
159
  is_sync=True,
160
+ is_async=False,
130
161
  ),
131
162
  }
132
163
 
133
164
 
165
+ class MindeeArgumentParser(ArgumentParser):
166
+ """Custom parser to simplify adding various options."""
167
+
168
+ def add_main_options(self) -> None:
169
+ """Adds main options for most parsings."""
170
+ self.add_argument(
171
+ "-k",
172
+ "--key",
173
+ dest="api_key",
174
+ help="API key for the account",
175
+ required=False,
176
+ default=None,
177
+ )
178
+
179
+ def add_display_options(self) -> None:
180
+ """Adds options related to output/display of a document (parse, parse-queued)."""
181
+ self.add_argument(
182
+ "-o",
183
+ "--output-type",
184
+ dest="output_type",
185
+ choices=["summary", "raw", "parsed"],
186
+ default="summary",
187
+ help="Specify how to output the data.\n"
188
+ "- summary: a basic summary (default)\n"
189
+ "- raw: the raw HTTP response\n"
190
+ "- parsed: the validated and parsed data fields\n",
191
+ )
192
+
193
+ def add_sending_options(self) -> None:
194
+ """Adds options for sending requests (parse, enqueue)."""
195
+ self.add_argument(
196
+ "-i",
197
+ "--input-type",
198
+ dest="input_type",
199
+ choices=["path", "file", "base64", "bytes", "url"],
200
+ default="path",
201
+ help="Specify how to handle the input.\n"
202
+ "- path: open a path (default).\n"
203
+ "- file: open as a file handle.\n"
204
+ "- base64: open a base64 encoded text file.\n"
205
+ "- bytes: open the contents as raw bytes.\n"
206
+ "- url: open an URL.",
207
+ )
208
+ self.add_argument(
209
+ "-c",
210
+ "--cut-doc",
211
+ dest="cut_doc",
212
+ action="store_true",
213
+ help="Cut document pages",
214
+ )
215
+ self.add_argument(
216
+ "-p",
217
+ "--pages-keep",
218
+ dest="doc_pages",
219
+ type=int,
220
+ default=5,
221
+ help="Number of document pages to keep, default: 5",
222
+ )
223
+ self.add_argument(dest="path", help="Full path to the file")
224
+
225
+ def add_feedback_options(self) -> None:
226
+ """Adds the option to give feedback manually."""
227
+ self.add_argument(
228
+ dest="document_id",
229
+ help="Mindee UUID of the document.",
230
+ type=str,
231
+ )
232
+ self.add_argument(
233
+ dest="feedback",
234
+ type=json.loads,
235
+ help='Feedback JSON string to send, ex \'{"key": "value"}\'.',
236
+ )
237
+
238
+ def add_custom_options(self) -> None:
239
+ """Adds options to custom-type documents."""
240
+ self.add_argument(
241
+ "-a",
242
+ "--account",
243
+ dest="account_name",
244
+ required=True,
245
+ help="API account name for the endpoint (required)",
246
+ )
247
+ self.add_argument(
248
+ "-e",
249
+ "--endpoint",
250
+ dest="endpoint_name",
251
+ help="API endpoint name (required)",
252
+ required=True,
253
+ )
254
+ self.add_argument(
255
+ "-v",
256
+ "--version",
257
+ default="1",
258
+ dest="api_version",
259
+ help="Version for the endpoint. If not set, use the latest version of the model.",
260
+ )
261
+
262
+
134
263
  class MindeeParser:
135
264
  """Custom parser for the Mindee CLI."""
136
265
 
137
- parser: ArgumentParser
266
+ parser: MindeeArgumentParser
138
267
  """Parser options."""
139
268
  parsed_args: Namespace
140
269
  """Stores attributes relating to parsing."""
@@ -151,12 +280,14 @@ class MindeeParser:
151
280
 
152
281
  def __init__(
153
282
  self,
154
- parser: Optional[ArgumentParser] = None,
283
+ parser: Optional[MindeeArgumentParser] = None,
155
284
  parsed_args: Optional[Namespace] = None,
156
285
  client: Optional[Client] = None,
157
286
  document_info: Optional[CommandConfig] = None,
158
287
  ) -> None:
159
- self.parser = parser if parser else ArgumentParser(description="Mindee_API")
288
+ self.parser = (
289
+ parser if parser else MindeeArgumentParser(description="Mindee_API")
290
+ )
160
291
  self.parsed_args = parsed_args if parsed_args else self._set_args()
161
292
  self.client = (
162
293
  client
@@ -182,7 +313,7 @@ class MindeeParser:
182
313
  def call_feedback(self) -> None:
183
314
  """Sends feedback to an API."""
184
315
  custom_endpoint: Optional[Endpoint] = None
185
- if self.parsed_args.product_name == "custom":
316
+ if self.parsed_args.product_name in ("custom", "generated"):
186
317
  custom_endpoint = self.client.create_endpoint(
187
318
  self.parsed_args.endpoint_name,
188
319
  self.parsed_args.account_name,
@@ -234,16 +365,19 @@ class MindeeParser:
234
365
  range(self.parsed_args.doc_pages), on_min_pages=0
235
366
  )
236
367
  custom_endpoint: Optional[Endpoint] = None
237
- if self.parsed_args.product_name == "custom":
368
+ if self.parsed_args.product_name in ("custom", "generated"):
369
+ include_words = False
238
370
  custom_endpoint = self.client.create_endpoint(
239
371
  self.parsed_args.endpoint_name,
240
372
  self.parsed_args.account_name,
241
373
  self.parsed_args.api_version,
242
374
  )
375
+ else:
376
+ include_words = self.parsed_args.include_words
243
377
  return self.client.parse(
244
- self.document_info.doc_class,
245
- self.input_doc,
246
- self.parsed_args.include_words,
378
+ product_class=self.document_info.doc_class,
379
+ input_source=self.input_doc,
380
+ include_words=include_words,
247
381
  page_options=page_options,
248
382
  endpoint=custom_endpoint,
249
383
  )
@@ -256,21 +390,25 @@ class MindeeParser:
256
390
  range(self.parsed_args.doc_pages), on_min_pages=0
257
391
  )
258
392
  custom_endpoint: Optional[Endpoint] = None
259
- if self.parsed_args.product_name == "custom":
393
+ if self.parsed_args.product_name in ("custom", "generated"):
394
+ include_words = False
260
395
  custom_endpoint = self.client.create_endpoint(
261
396
  self.parsed_args.endpoint_name,
262
397
  self.parsed_args.account_name,
263
398
  self.parsed_args.api_version,
264
399
  )
400
+ else:
401
+ include_words = self.parsed_args.include_words
265
402
  return self.client.enqueue_and_parse(
266
- self.document_info.doc_class,
267
- self.input_doc,
268
- self.parsed_args.include_words,
403
+ product_class=self.document_info.doc_class,
404
+ input_source=self.input_doc,
405
+ include_words=include_words,
269
406
  page_options=page_options,
270
407
  endpoint=custom_endpoint,
271
408
  )
272
409
 
273
- def _doc_str(self, output_type: str, doc_response: Document) -> str:
410
+ @staticmethod
411
+ def _doc_str(output_type: str, doc_response: Document) -> str:
274
412
  if output_type == "parsed":
275
413
  return json.dumps(doc_response, indent=2, default=serialize_for_json)
276
414
  return str(doc_response)
@@ -291,11 +429,11 @@ class MindeeParser:
291
429
  parse_subp = call_parser.add_parser("parse")
292
430
  feedback_subp = call_parser.add_parser("feedback")
293
431
 
294
- self._add_main_options(parse_subp)
295
- self._add_sending_options(parse_subp)
296
- self._add_display_options(parse_subp)
297
- if name == "custom":
298
- self._add_custom_options(parse_subp)
432
+ parse_subp.add_main_options()
433
+ parse_subp.add_sending_options()
434
+ parse_subp.add_display_options()
435
+ if name in ("custom", "generated"):
436
+ parse_subp.add_custom_options()
299
437
  else:
300
438
  parse_subp.add_argument(
301
439
  "-t",
@@ -316,126 +454,12 @@ class MindeeParser:
316
454
  default=False,
317
455
  )
318
456
 
319
- self._add_main_options(feedback_subp)
320
- self._add_feedback_options(feedback_subp)
457
+ feedback_subp.add_main_options()
458
+ feedback_subp.add_feedback_options()
321
459
 
322
460
  parsed_args = self.parser.parse_args()
323
461
  return parsed_args
324
462
 
325
- def _add_main_options(self, parser: ArgumentParser) -> None:
326
- """
327
- Adds main options for most parsings.
328
-
329
- :param parser: current parser.
330
- """
331
- parser.add_argument(
332
- "-k",
333
- "--key",
334
- dest="api_key",
335
- help="API key for the account",
336
- required=False,
337
- default=None,
338
- )
339
-
340
- def _add_display_options(self, parser: ArgumentParser) -> None:
341
- """
342
- Adds options related to output/display of a document (parse, parse-queued).
343
-
344
- :param parser: current parser.
345
- """
346
- parser.add_argument(
347
- "-o",
348
- "--output-type",
349
- dest="output_type",
350
- choices=["summary", "raw", "parsed"],
351
- default="summary",
352
- help="Specify how to output the data.\n"
353
- "- summary: a basic summary (default)\n"
354
- "- raw: the raw HTTP response\n"
355
- "- parsed: the validated and parsed data fields\n",
356
- )
357
-
358
- def _add_sending_options(self, parser: ArgumentParser) -> None:
359
- """
360
- Adds options for sending requests (parse, enqueue).
361
-
362
- :param parser: current parser.
363
- """
364
- parser.add_argument(
365
- "-i",
366
- "--input-type",
367
- dest="input_type",
368
- choices=["path", "file", "base64", "bytes", "url"],
369
- default="path",
370
- help="Specify how to handle the input.\n"
371
- "- path: open a path (default).\n"
372
- "- file: open as a file handle.\n"
373
- "- base64: open a base64 encoded text file.\n"
374
- "- bytes: open the contents as raw bytes.\n"
375
- "- url: open an URL.",
376
- )
377
- parser.add_argument(
378
- "-c",
379
- "--cut-doc",
380
- dest="cut_doc",
381
- action="store_true",
382
- help="Cut document pages",
383
- )
384
- parser.add_argument(
385
- "-p",
386
- "--pages-keep",
387
- dest="doc_pages",
388
- type=int,
389
- default=5,
390
- help="Number of document pages to keep, default: 5",
391
- )
392
- parser.add_argument(dest="path", help="Full path to the file")
393
-
394
- def _add_feedback_options(self, parser: ArgumentParser):
395
- """
396
- Adds the option to give feedback manually.
397
-
398
- :param parser: current parser.
399
- """
400
- parser.add_argument(
401
- dest="document_id",
402
- help="Mindee UUID of the document.",
403
- type=str,
404
- )
405
- parser.add_argument(
406
- dest="feedback",
407
- type=json.loads,
408
- help='Feedback JSON string to send, ex \'{"key": "value"}\'.',
409
- )
410
-
411
- def _add_custom_options(self, parser: ArgumentParser):
412
- """
413
- Adds options to custom-type documents.
414
-
415
- :param parser: current parser.
416
- """
417
- parser.add_argument(
418
- "-a",
419
- "--account",
420
- dest="account_name",
421
- required=True,
422
- help="API account name for the endpoint (required)",
423
- )
424
- parser.add_argument(
425
- "-e",
426
- "--endpoint",
427
- dest="endpoint_name",
428
- help="API endpoint name (required)",
429
- required=True,
430
- )
431
- parser.add_argument(
432
- "-v",
433
- "--version",
434
- default="1",
435
- dest="api_version",
436
- help="Version for the endpoint. If not set, use the latest version of the model.",
437
- )
438
-
439
463
  def _get_input_doc(self) -> Union[LocalInputSource, UrlInputSource]:
440
464
  """Loads an input document."""
441
465
  if self.parsed_args.input_type == "file":
@@ -470,7 +494,7 @@ class MindeeParser:
470
494
  else:
471
495
  if (
472
496
  not self.parsed_args.feedback
473
- or not "feedback" in self.parsed_args.feedback
497
+ or "feedback" not in self.parsed_args.feedback
474
498
  ):
475
499
  raise MindeeClientError("Invalid feedback.")
476
500
  if not json_doc or "feedback" not in json_doc: