From 0eb93d93f856fe4a3768dc3e51841102d0796b1e Mon Sep 17 00:00:00 2001 From: sebastianMindee <130448732+sebastianMindee@users.noreply.github.com> Date: Fri, 29 May 2026 12:52:14 +0200 Subject: [PATCH 01/10] :arrow_up: bump minimum python version to 3.10 --- .github/workflows/_smoke-test.yml | 2 +- .github/workflows/_test-integrations.yml | 2 +- .github/workflows/_test-regressions.yml | 2 +- .github/workflows/_test-units.yml | 4 +--- mindee/versions.py | 2 +- pyproject.toml | 11 +++++------ 6 files changed, 10 insertions(+), 13 deletions(-) diff --git a/.github/workflows/_smoke-test.yml b/.github/workflows/_smoke-test.yml index 1a5d078c..f7beaf61 100644 --- a/.github/workflows/_smoke-test.yml +++ b/.github/workflows/_smoke-test.yml @@ -21,7 +21,7 @@ jobs: max-parallel: 2 matrix: python-version: - - "3.8" + - "3.10" - "3.14" runs-on: "ubuntu-22.04" steps: diff --git a/.github/workflows/_test-integrations.yml b/.github/workflows/_test-integrations.yml index e5c25981..11ba9b1a 100644 --- a/.github/workflows/_test-integrations.yml +++ b/.github/workflows/_test-integrations.yml @@ -17,7 +17,7 @@ jobs: - "ubuntu-22.04" - "windows-2022" python-version: - - "3.8" + - "3.10" - "3.14" runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/_test-regressions.yml b/.github/workflows/_test-regressions.yml index 91d7f904..f685ea9e 100644 --- a/.github/workflows/_test-regressions.yml +++ b/.github/workflows/_test-regressions.yml @@ -17,7 +17,7 @@ jobs: - "ubuntu-22.04" - "windows-2022" python-version: - - "3.8" + - "3.10" - "3.14" runs-on: ${{ matrix.os }} steps: diff --git a/.github/workflows/_test-units.yml b/.github/workflows/_test-units.yml index 7e13748f..ac23cdc9 100644 --- a/.github/workflows/_test-units.yml +++ b/.github/workflows/_test-units.yml @@ -16,8 +16,6 @@ jobs: - "ubuntu-22.04" - "windows-2022" python-version: - - "3.8" - - "3.9" - "3.10" - "3.11" - "3.12" @@ -38,7 +36,7 @@ jobs: uses: actions/cache@v5 with: path: ~/.cache/pip - key: ${{ runner.os }}-test-${{ hashFiles('setup.cfg') }} + key: ${{ runner.os }}-test-${{ hashFiles('pyproject.toml') }} restore-keys: | ${{ runner.os }}-test- diff --git a/mindee/versions.py b/mindee/versions.py index 6a528858..ab996f10 100644 --- a/mindee/versions.py +++ b/mindee/versions.py @@ -1,6 +1,6 @@ import sys -__version__ = "4.36.1" +__version__ = "5.0.0a1" PYTHON_VERSION = f"{sys.version_info[0]}.{sys.version_info[1]}" diff --git a/pyproject.toml b/pyproject.toml index 3c1520c4..5f4ff6b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["setuptools >= 68.0.0", "wheel >= 0.40.0"] +requires = ["setuptools >= 77.0.3", "wheel >= 0.40.0"] build-backend = "setuptools.build_meta" [project] @@ -10,10 +10,10 @@ authors = [ dynamic = ["version"] description = "Mindee API helper library for Python" readme = "README.md" -license = {file = "LICENSE"} +license = "MIT" +license-files = ["LICENSE"] classifiers = [ "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", @@ -23,10 +23,9 @@ classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Topic :: Software Development :: Libraries", - "License :: OSI Approved :: MIT License", ] -requires-python = ">=3.8" +requires-python = ">=3.10" dependencies = [ "pypdfium2>=4.0,<4.30.1", @@ -82,7 +81,7 @@ version = {attr = "mindee.versions.__version__"} [tool.ruff] line-length = 88 indent-width = 4 -target-version = "py38" +target-version = "py310" [tool.ruff.format] quote-style = "double" From 0708131daf7a0e4f860e7f3ec9d7a17c627df79b Mon Sep 17 00:00:00 2001 From: sebastianMindee <130448732+sebastianMindee@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:16:29 +0200 Subject: [PATCH 02/10] :boom: :coffin: remove support for all unused V1 prompt APIs (#406) --- .../code_samples/bill_of_lading_v1_async.txt | 21 -- .../code_samples/business_card_v1_async.txt | 21 -- .../code_samples/delivery_notes_v1_async.txt | 21 -- .../code_samples/driver_license_v1_async.txt | 21 -- .../code_samples/energy_bill_fra_v1_async.txt | 21 -- .../french_healthcard_v1_async.txt | 21 -- .../code_samples/ind_passport_v1_async.txt | 21 -- .../material_certificate_v1_async.txt | 21 -- .../code_samples/nutrition_facts_v1_async.txt | 21 -- .../code_samples/payslip_fra_v3_async.txt | 21 -- docs/extras/code_samples/resume_v1_async.txt | 21 -- .../us_healthcare_cards_v1_async.txt | 21 -- docs/extras/code_samples/us_mail_v3_async.txt | 21 -- docs/product/bill_of_lading_v1.rst | 35 -- docs/product/business_card_v1.rst | 15 - docs/product/delivery_note_v1.rst | 15 - docs/product/driver_license_v1.rst | 15 - docs/product/fr/energy_bill_v1.rst | 39 --- docs/product/fr/health_card_v1.rst | 15 - docs/product/fr/payslip_v3.rst | 47 --- docs/product/ind/index.rst | 8 - docs/product/ind/indian_passport_v1.rst | 15 - docs/product/index.rst | 1 - docs/product/material_certificate_v1.rst | 15 - docs/product/nutrition_facts_label_v1.rst | 67 ---- docs/product/resume_v1.rst | 35 -- docs/product/us/healthcare_card_v1.rst | 19 -- docs/product/us/us_mail_v3.rst | 23 -- mindee/commands/cli_products.py | 78 ----- mindee/product/__init__.py | 141 +------- mindee/product/bill_of_lading/__init__.py | 30 -- .../bill_of_lading/bill_of_lading_v1.py | 39 --- .../bill_of_lading_v1_carrier.py | 62 ---- .../bill_of_lading_v1_carrier_item.py | 96 ------ .../bill_of_lading_v1_consignee.py | 68 ---- .../bill_of_lading_v1_document.py | 151 --------- .../bill_of_lading_v1_notify_party.py | 68 ---- .../bill_of_lading_v1_shipper.py | 68 ---- mindee/product/business_card/__init__.py | 9 - .../product/business_card/business_card_v1.py | 39 --- .../business_card_v1_document.py | 107 ------ mindee/product/delivery_note/__init__.py | 9 - .../product/delivery_note/delivery_note_v1.py | 39 --- .../delivery_note_v1_document.py | 78 ----- mindee/product/driver_license/__init__.py | 9 - .../driver_license/driver_license_v1.py | 39 --- .../driver_license_v1_document.py | 119 ------- mindee/product/fr/__init__.py | 74 ----- mindee/product/fr/energy_bill/__init__.py | 39 --- .../product/fr/energy_bill/energy_bill_v1.py | 39 --- .../fr/energy_bill/energy_bill_v1_document.py | 247 -------------- .../energy_bill_v1_energy_consumer.py | 56 ---- .../energy_bill_v1_energy_supplier.py | 56 ---- .../energy_bill_v1_energy_usage.py | 110 ------ .../energy_bill_v1_meter_detail.py | 62 ---- .../energy_bill_v1_subscription.py | 96 ------ .../energy_bill_v1_taxes_and_contribution.py | 96 ------ mindee/product/fr/health_card/__init__.py | 9 - .../product/fr/health_card/health_card_v1.py | 39 --- .../fr/health_card/health_card_v1_document.py | 59 ---- mindee/product/fr/payslip/__init__.py | 41 --- mindee/product/fr/payslip/payslip_v3.py | 39 --- .../payslip/payslip_v3_bank_account_detail.py | 62 ---- .../product/fr/payslip/payslip_v3_document.py | 152 --------- .../product/fr/payslip/payslip_v3_employee.py | 88 ----- .../product/fr/payslip/payslip_v3_employer.py | 86 ----- .../fr/payslip/payslip_v3_employment.py | 86 ----- .../fr/payslip/payslip_v3_paid_time_off.py | 89 ----- .../fr/payslip/payslip_v3_pay_detail.py | 115 ------- .../fr/payslip/payslip_v3_pay_period.py | 74 ----- .../fr/payslip/payslip_v3_salary_detail.py | 89 ----- mindee/product/ind/__init__.py | 9 - .../product/ind/indian_passport/__init__.py | 9 - .../ind/indian_passport/indian_passport_v1.py | 39 --- .../indian_passport_v1_document.py | 190 ----------- .../product/material_certificate/__init__.py | 11 - .../material_certificate_v1.py | 39 --- .../material_certificate_v1_document.py | 48 --- .../product/nutrition_facts_label/__init__.py | 64 ---- .../nutrition_facts_label_v1.py | 39 --- .../nutrition_facts_label_v1_added_sugar.py | 67 ---- .../nutrition_facts_label_v1_calorie.py | 67 ---- .../nutrition_facts_label_v1_cholesterol.py | 67 ---- .../nutrition_facts_label_v1_dietary_fiber.py | 67 ---- .../nutrition_facts_label_v1_document.py | 193 ----------- .../nutrition_facts_label_v1_nutrient.py | 89 ----- .../nutrition_facts_label_v1_protein.py | 67 ---- .../nutrition_facts_label_v1_saturated_fat.py | 67 ---- .../nutrition_facts_label_v1_serving_size.py | 61 ---- .../nutrition_facts_label_v1_sodium.py | 73 ---- ...ition_facts_label_v1_total_carbohydrate.py | 67 ---- .../nutrition_facts_label_v1_total_fat.py | 67 ---- .../nutrition_facts_label_v1_total_sugar.py | 67 ---- .../nutrition_facts_label_v1_trans_fat.py | 67 ---- mindee/product/resume/__init__.py | 29 -- mindee/product/resume/resume_v1.py | 39 --- .../product/resume/resume_v1_certificate.py | 77 ----- mindee/product/resume/resume_v1_document.py | 313 ------------------ mindee/product/resume/resume_v1_education.py | 98 ------ mindee/product/resume/resume_v1_language.py | 63 ---- .../resume_v1_professional_experience.py | 112 ------- .../resume/resume_v1_social_networks_url.py | 63 ---- mindee/product/us/__init__.py | 24 -- mindee/product/us/healthcare_card/__init__.py | 13 - .../us/healthcare_card/healthcare_card_v1.py | 39 --- .../healthcare_card_v1_copay.py | 68 ---- .../healthcare_card_v1_document.py | 155 --------- mindee/product/us/us_mail/__init__.py | 17 - mindee/product/us/us_mail/us_mail_v3.py | 39 --- .../product/us/us_mail/us_mail_v3_document.py | 105 ------ .../us_mail/us_mail_v3_recipient_address.py | 114 ------- .../us/us_mail/us_mail_v3_sender_address.py | 74 ----- tests/v1/product/bill_of_lading/__init__.py | 0 .../bill_of_lading/test_bill_of_lading_v1.py | 67 ---- tests/v1/product/business_card/__init__.py | 0 .../business_card/test_business_card_v1.py | 56 ---- tests/v1/product/delivery_note/__init__.py | 0 .../delivery_note/test_delivery_note_v1.py | 52 --- tests/v1/product/driver_license/__init__.py | 0 .../driver_license/test_driver_license_v1.py | 58 ---- tests/v1/product/fr/energy_bill/__init__.py | 0 .../fr/energy_bill/test_energy_bill_v1.py | 63 ---- tests/v1/product/fr/health_card/__init__.py | 0 .../fr/health_card/test_health_card_v1.py | 49 --- tests/v1/product/fr/payslip/__init__.py | 0 .../v1/product/fr/payslip/test_payslip_v3.py | 86 ----- tests/v1/product/ind/__init__.py | 0 .../product/ind/indian_passport/__init__.py | 0 .../test_indian_passport_v1.py | 66 ---- .../product/material_certificate/__init__.py | 0 .../test_material_certificate_v1.py | 50 --- .../product/nutrition_facts_label/__init__.py | 0 .../test_nutrition_facts_label_v1.py | 85 ----- tests/v1/product/resume/__init__.py | 0 tests/v1/product/resume/test_resume_v1.py | 61 ---- .../v1/product/us/healthcare_card/__init__.py | 0 .../test_healthcare_card_v1.py | 59 ---- tests/v1/product/us/us_mail/__init__.py | 0 .../v1/product/us/us_mail/test_us_mail_v3.py | 54 --- 139 files changed, 1 insertion(+), 7570 deletions(-) delete mode 100644 docs/extras/code_samples/bill_of_lading_v1_async.txt delete mode 100644 docs/extras/code_samples/business_card_v1_async.txt delete mode 100644 docs/extras/code_samples/delivery_notes_v1_async.txt delete mode 100644 docs/extras/code_samples/driver_license_v1_async.txt delete mode 100644 docs/extras/code_samples/energy_bill_fra_v1_async.txt delete mode 100644 docs/extras/code_samples/french_healthcard_v1_async.txt delete mode 100644 docs/extras/code_samples/ind_passport_v1_async.txt delete mode 100644 docs/extras/code_samples/material_certificate_v1_async.txt delete mode 100644 docs/extras/code_samples/nutrition_facts_v1_async.txt delete mode 100644 docs/extras/code_samples/payslip_fra_v3_async.txt delete mode 100644 docs/extras/code_samples/resume_v1_async.txt delete mode 100644 docs/extras/code_samples/us_healthcare_cards_v1_async.txt delete mode 100644 docs/extras/code_samples/us_mail_v3_async.txt delete mode 100644 docs/product/bill_of_lading_v1.rst delete mode 100644 docs/product/business_card_v1.rst delete mode 100644 docs/product/delivery_note_v1.rst delete mode 100644 docs/product/driver_license_v1.rst delete mode 100644 docs/product/fr/energy_bill_v1.rst delete mode 100644 docs/product/fr/health_card_v1.rst delete mode 100644 docs/product/fr/payslip_v3.rst delete mode 100644 docs/product/ind/index.rst delete mode 100644 docs/product/ind/indian_passport_v1.rst delete mode 100644 docs/product/material_certificate_v1.rst delete mode 100644 docs/product/nutrition_facts_label_v1.rst delete mode 100644 docs/product/resume_v1.rst delete mode 100644 docs/product/us/healthcare_card_v1.rst delete mode 100644 docs/product/us/us_mail_v3.rst delete mode 100644 mindee/product/bill_of_lading/__init__.py delete mode 100644 mindee/product/bill_of_lading/bill_of_lading_v1.py delete mode 100644 mindee/product/bill_of_lading/bill_of_lading_v1_carrier.py delete mode 100644 mindee/product/bill_of_lading/bill_of_lading_v1_carrier_item.py delete mode 100644 mindee/product/bill_of_lading/bill_of_lading_v1_consignee.py delete mode 100644 mindee/product/bill_of_lading/bill_of_lading_v1_document.py delete mode 100644 mindee/product/bill_of_lading/bill_of_lading_v1_notify_party.py delete mode 100644 mindee/product/bill_of_lading/bill_of_lading_v1_shipper.py delete mode 100644 mindee/product/business_card/__init__.py delete mode 100644 mindee/product/business_card/business_card_v1.py delete mode 100644 mindee/product/business_card/business_card_v1_document.py delete mode 100644 mindee/product/delivery_note/__init__.py delete mode 100644 mindee/product/delivery_note/delivery_note_v1.py delete mode 100644 mindee/product/delivery_note/delivery_note_v1_document.py delete mode 100644 mindee/product/driver_license/__init__.py delete mode 100644 mindee/product/driver_license/driver_license_v1.py delete mode 100644 mindee/product/driver_license/driver_license_v1_document.py delete mode 100644 mindee/product/fr/energy_bill/__init__.py delete mode 100644 mindee/product/fr/energy_bill/energy_bill_v1.py delete mode 100644 mindee/product/fr/energy_bill/energy_bill_v1_document.py delete mode 100644 mindee/product/fr/energy_bill/energy_bill_v1_energy_consumer.py delete mode 100644 mindee/product/fr/energy_bill/energy_bill_v1_energy_supplier.py delete mode 100644 mindee/product/fr/energy_bill/energy_bill_v1_energy_usage.py delete mode 100644 mindee/product/fr/energy_bill/energy_bill_v1_meter_detail.py delete mode 100644 mindee/product/fr/energy_bill/energy_bill_v1_subscription.py delete mode 100644 mindee/product/fr/energy_bill/energy_bill_v1_taxes_and_contribution.py delete mode 100644 mindee/product/fr/health_card/__init__.py delete mode 100644 mindee/product/fr/health_card/health_card_v1.py delete mode 100644 mindee/product/fr/health_card/health_card_v1_document.py delete mode 100644 mindee/product/fr/payslip/__init__.py delete mode 100644 mindee/product/fr/payslip/payslip_v3.py delete mode 100644 mindee/product/fr/payslip/payslip_v3_bank_account_detail.py delete mode 100644 mindee/product/fr/payslip/payslip_v3_document.py delete mode 100644 mindee/product/fr/payslip/payslip_v3_employee.py delete mode 100644 mindee/product/fr/payslip/payslip_v3_employer.py delete mode 100644 mindee/product/fr/payslip/payslip_v3_employment.py delete mode 100644 mindee/product/fr/payslip/payslip_v3_paid_time_off.py delete mode 100644 mindee/product/fr/payslip/payslip_v3_pay_detail.py delete mode 100644 mindee/product/fr/payslip/payslip_v3_pay_period.py delete mode 100644 mindee/product/fr/payslip/payslip_v3_salary_detail.py delete mode 100644 mindee/product/ind/__init__.py delete mode 100644 mindee/product/ind/indian_passport/__init__.py delete mode 100644 mindee/product/ind/indian_passport/indian_passport_v1.py delete mode 100644 mindee/product/ind/indian_passport/indian_passport_v1_document.py delete mode 100644 mindee/product/material_certificate/__init__.py delete mode 100644 mindee/product/material_certificate/material_certificate_v1.py delete mode 100644 mindee/product/material_certificate/material_certificate_v1_document.py delete mode 100644 mindee/product/nutrition_facts_label/__init__.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_added_sugar.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_calorie.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_cholesterol.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_dietary_fiber.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_document.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_nutrient.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_protein.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_saturated_fat.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_serving_size.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_sodium.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_carbohydrate.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_fat.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_sugar.py delete mode 100644 mindee/product/nutrition_facts_label/nutrition_facts_label_v1_trans_fat.py delete mode 100644 mindee/product/resume/__init__.py delete mode 100644 mindee/product/resume/resume_v1.py delete mode 100644 mindee/product/resume/resume_v1_certificate.py delete mode 100644 mindee/product/resume/resume_v1_document.py delete mode 100644 mindee/product/resume/resume_v1_education.py delete mode 100644 mindee/product/resume/resume_v1_language.py delete mode 100644 mindee/product/resume/resume_v1_professional_experience.py delete mode 100644 mindee/product/resume/resume_v1_social_networks_url.py delete mode 100644 mindee/product/us/healthcare_card/__init__.py delete mode 100644 mindee/product/us/healthcare_card/healthcare_card_v1.py delete mode 100644 mindee/product/us/healthcare_card/healthcare_card_v1_copay.py delete mode 100644 mindee/product/us/healthcare_card/healthcare_card_v1_document.py delete mode 100644 mindee/product/us/us_mail/__init__.py delete mode 100644 mindee/product/us/us_mail/us_mail_v3.py delete mode 100644 mindee/product/us/us_mail/us_mail_v3_document.py delete mode 100644 mindee/product/us/us_mail/us_mail_v3_recipient_address.py delete mode 100644 mindee/product/us/us_mail/us_mail_v3_sender_address.py delete mode 100644 tests/v1/product/bill_of_lading/__init__.py delete mode 100644 tests/v1/product/bill_of_lading/test_bill_of_lading_v1.py delete mode 100644 tests/v1/product/business_card/__init__.py delete mode 100644 tests/v1/product/business_card/test_business_card_v1.py delete mode 100644 tests/v1/product/delivery_note/__init__.py delete mode 100644 tests/v1/product/delivery_note/test_delivery_note_v1.py delete mode 100644 tests/v1/product/driver_license/__init__.py delete mode 100644 tests/v1/product/driver_license/test_driver_license_v1.py delete mode 100644 tests/v1/product/fr/energy_bill/__init__.py delete mode 100644 tests/v1/product/fr/energy_bill/test_energy_bill_v1.py delete mode 100644 tests/v1/product/fr/health_card/__init__.py delete mode 100644 tests/v1/product/fr/health_card/test_health_card_v1.py delete mode 100644 tests/v1/product/fr/payslip/__init__.py delete mode 100644 tests/v1/product/fr/payslip/test_payslip_v3.py delete mode 100644 tests/v1/product/ind/__init__.py delete mode 100644 tests/v1/product/ind/indian_passport/__init__.py delete mode 100644 tests/v1/product/ind/indian_passport/test_indian_passport_v1.py delete mode 100644 tests/v1/product/material_certificate/__init__.py delete mode 100644 tests/v1/product/material_certificate/test_material_certificate_v1.py delete mode 100644 tests/v1/product/nutrition_facts_label/__init__.py delete mode 100644 tests/v1/product/nutrition_facts_label/test_nutrition_facts_label_v1.py delete mode 100644 tests/v1/product/resume/__init__.py delete mode 100644 tests/v1/product/resume/test_resume_v1.py delete mode 100644 tests/v1/product/us/healthcare_card/__init__.py delete mode 100644 tests/v1/product/us/healthcare_card/test_healthcare_card_v1.py delete mode 100644 tests/v1/product/us/us_mail/__init__.py delete mode 100644 tests/v1/product/us/us_mail/test_us_mail_v3.py diff --git a/docs/extras/code_samples/bill_of_lading_v1_async.txt b/docs/extras/code_samples/bill_of_lading_v1_async.txt deleted file mode 100644 index a6569e39..00000000 --- a/docs/extras/code_samples/bill_of_lading_v1_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.BillOfLadingV1, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/extras/code_samples/business_card_v1_async.txt b/docs/extras/code_samples/business_card_v1_async.txt deleted file mode 100644 index 745ebbe6..00000000 --- a/docs/extras/code_samples/business_card_v1_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.BusinessCardV1, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/extras/code_samples/delivery_notes_v1_async.txt b/docs/extras/code_samples/delivery_notes_v1_async.txt deleted file mode 100644 index 4ca941a4..00000000 --- a/docs/extras/code_samples/delivery_notes_v1_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.DeliveryNoteV1, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/extras/code_samples/driver_license_v1_async.txt b/docs/extras/code_samples/driver_license_v1_async.txt deleted file mode 100644 index cf3abfce..00000000 --- a/docs/extras/code_samples/driver_license_v1_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.DriverLicenseV1, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/extras/code_samples/energy_bill_fra_v1_async.txt b/docs/extras/code_samples/energy_bill_fra_v1_async.txt deleted file mode 100644 index a953dcb1..00000000 --- a/docs/extras/code_samples/energy_bill_fra_v1_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.fr.EnergyBillV1, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/extras/code_samples/french_healthcard_v1_async.txt b/docs/extras/code_samples/french_healthcard_v1_async.txt deleted file mode 100644 index 4200e4f1..00000000 --- a/docs/extras/code_samples/french_healthcard_v1_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.fr.HealthCardV1, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/extras/code_samples/ind_passport_v1_async.txt b/docs/extras/code_samples/ind_passport_v1_async.txt deleted file mode 100644 index dd163da4..00000000 --- a/docs/extras/code_samples/ind_passport_v1_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.ind.IndianPassportV1, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/extras/code_samples/material_certificate_v1_async.txt b/docs/extras/code_samples/material_certificate_v1_async.txt deleted file mode 100644 index a0997d88..00000000 --- a/docs/extras/code_samples/material_certificate_v1_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.MaterialCertificateV1, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/extras/code_samples/nutrition_facts_v1_async.txt b/docs/extras/code_samples/nutrition_facts_v1_async.txt deleted file mode 100644 index 65c6e670..00000000 --- a/docs/extras/code_samples/nutrition_facts_v1_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.NutritionFactsLabelV1, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/extras/code_samples/payslip_fra_v3_async.txt b/docs/extras/code_samples/payslip_fra_v3_async.txt deleted file mode 100644 index 21f66657..00000000 --- a/docs/extras/code_samples/payslip_fra_v3_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.fr.PayslipV3, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/extras/code_samples/resume_v1_async.txt b/docs/extras/code_samples/resume_v1_async.txt deleted file mode 100644 index 4e6c4a40..00000000 --- a/docs/extras/code_samples/resume_v1_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.ResumeV1, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/extras/code_samples/us_healthcare_cards_v1_async.txt b/docs/extras/code_samples/us_healthcare_cards_v1_async.txt deleted file mode 100644 index 77da99b0..00000000 --- a/docs/extras/code_samples/us_healthcare_cards_v1_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.us.HealthcareCardV1, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/extras/code_samples/us_mail_v3_async.txt b/docs/extras/code_samples/us_mail_v3_async.txt deleted file mode 100644 index 797f34a5..00000000 --- a/docs/extras/code_samples/us_mail_v3_async.txt +++ /dev/null @@ -1,21 +0,0 @@ -# -# Install the Python client library by running: -# pip install mindee -# - -from mindee import Client, product, AsyncPredictResponse - -# Init a new client -mindee_client = Client(api_key="my-api-key") - -# Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") - -# Load a file from disk and enqueue it. -result: AsyncPredictResponse = mindee_client.enqueue_and_parse( - product.us.UsMailV3, - input_doc, -) - -# Print a brief summary of the parsed data -print(result.document) diff --git a/docs/product/bill_of_lading_v1.rst b/docs/product/bill_of_lading_v1.rst deleted file mode 100644 index 52cd1dfa..00000000 --- a/docs/product/bill_of_lading_v1.rst +++ /dev/null @@ -1,35 +0,0 @@ -Bill of Lading V1 ------------------ - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/bill_of_lading_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.bill_of_lading.bill_of_lading_v1.BillOfLadingV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.bill_of_lading.bill_of_lading_v1_document.BillOfLadingV1Document - :members: - :inherited-members: - -.. autoclass:: mindee.product.bill_of_lading.bill_of_lading_v1_shipper.BillOfLadingV1Shipper - :members: - :inherited-members: - -.. autoclass:: mindee.product.bill_of_lading.bill_of_lading_v1_consignee.BillOfLadingV1Consignee - :members: - :inherited-members: - -.. autoclass:: mindee.product.bill_of_lading.bill_of_lading_v1_notify_party.BillOfLadingV1NotifyParty - :members: - :inherited-members: - -.. autoclass:: mindee.product.bill_of_lading.bill_of_lading_v1_carrier.BillOfLadingV1Carrier - :members: - :inherited-members: - -.. autoclass:: mindee.product.bill_of_lading.bill_of_lading_v1_carrier_item.BillOfLadingV1CarrierItem - :members: - :inherited-members: diff --git a/docs/product/business_card_v1.rst b/docs/product/business_card_v1.rst deleted file mode 100644 index bab5ac7a..00000000 --- a/docs/product/business_card_v1.rst +++ /dev/null @@ -1,15 +0,0 @@ -Business Card V1 ----------------- - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/business_card_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.business_card.business_card_v1.BusinessCardV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.business_card.business_card_v1_document.BusinessCardV1Document - :members: - :inherited-members: diff --git a/docs/product/delivery_note_v1.rst b/docs/product/delivery_note_v1.rst deleted file mode 100644 index 998b0154..00000000 --- a/docs/product/delivery_note_v1.rst +++ /dev/null @@ -1,15 +0,0 @@ -Delivery note V1 ----------------- - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/delivery_notes_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.delivery_note.delivery_note_v1.DeliveryNoteV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.delivery_note.delivery_note_v1_document.DeliveryNoteV1Document - :members: - :inherited-members: diff --git a/docs/product/driver_license_v1.rst b/docs/product/driver_license_v1.rst deleted file mode 100644 index e5545c15..00000000 --- a/docs/product/driver_license_v1.rst +++ /dev/null @@ -1,15 +0,0 @@ -Driver License V1 ------------------ - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/driver_license_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.driver_license.driver_license_v1.DriverLicenseV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.driver_license.driver_license_v1_document.DriverLicenseV1Document - :members: - :inherited-members: diff --git a/docs/product/fr/energy_bill_v1.rst b/docs/product/fr/energy_bill_v1.rst deleted file mode 100644 index b06d09b9..00000000 --- a/docs/product/fr/energy_bill_v1.rst +++ /dev/null @@ -1,39 +0,0 @@ -Energy Bill V1 --------------- - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/energy_bill_fra_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.fr.energy_bill.energy_bill_v1.EnergyBillV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.energy_bill.energy_bill_v1_document.EnergyBillV1Document - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.energy_bill.energy_bill_v1_energy_supplier.EnergyBillV1EnergySupplier - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.energy_bill.energy_bill_v1_energy_consumer.EnergyBillV1EnergyConsumer - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.energy_bill.energy_bill_v1_subscription.EnergyBillV1Subscription - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.energy_bill.energy_bill_v1_energy_usage.EnergyBillV1EnergyUsage - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.energy_bill.energy_bill_v1_taxes_and_contribution.EnergyBillV1TaxesAndContribution - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.energy_bill.energy_bill_v1_meter_detail.EnergyBillV1MeterDetail - :members: - :inherited-members: diff --git a/docs/product/fr/health_card_v1.rst b/docs/product/fr/health_card_v1.rst deleted file mode 100644 index 11b6464d..00000000 --- a/docs/product/fr/health_card_v1.rst +++ /dev/null @@ -1,15 +0,0 @@ -Health Card V1 --------------- - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/french_healthcard_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.fr.health_card.health_card_v1.HealthCardV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.health_card.health_card_v1_document.HealthCardV1Document - :members: - :inherited-members: diff --git a/docs/product/fr/payslip_v3.rst b/docs/product/fr/payslip_v3.rst deleted file mode 100644 index ca26cd47..00000000 --- a/docs/product/fr/payslip_v3.rst +++ /dev/null @@ -1,47 +0,0 @@ -Payslip V3 ----------- - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/payslip_fra_v3_async.txt - :language: Python - -.. autoclass:: mindee.product.fr.payslip.payslip_v3.PayslipV3 - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.payslip.payslip_v3_document.PayslipV3Document - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.payslip.payslip_v3_pay_period.PayslipV3PayPeriod - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.payslip.payslip_v3_employee.PayslipV3Employee - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.payslip.payslip_v3_employer.PayslipV3Employer - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.payslip.payslip_v3_bank_account_detail.PayslipV3BankAccountDetail - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.payslip.payslip_v3_employment.PayslipV3Employment - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.payslip.payslip_v3_salary_detail.PayslipV3SalaryDetail - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.payslip.payslip_v3_pay_detail.PayslipV3PayDetail - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.payslip.payslip_v3_paid_time_off.PayslipV3PaidTimeOff - :members: - :inherited-members: diff --git a/docs/product/ind/index.rst b/docs/product/ind/index.rst deleted file mode 100644 index e41cafa6..00000000 --- a/docs/product/ind/index.rst +++ /dev/null @@ -1,8 +0,0 @@ -India ------ - -.. toctree:: - :maxdepth: 1 - :glob: - - ./* diff --git a/docs/product/ind/indian_passport_v1.rst b/docs/product/ind/indian_passport_v1.rst deleted file mode 100644 index 1bd99232..00000000 --- a/docs/product/ind/indian_passport_v1.rst +++ /dev/null @@ -1,15 +0,0 @@ -Passport - India V1 -------------------- - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/ind_passport_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.ind.indian_passport.indian_passport_v1.IndianPassportV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.ind.indian_passport.indian_passport_v1_document.IndianPassportV1Document - :members: - :inherited-members: diff --git a/docs/product/index.rst b/docs/product/index.rst index a63ff603..ef773210 100644 --- a/docs/product/index.rst +++ b/docs/product/index.rst @@ -10,7 +10,6 @@ Region-Specific :maxdepth: 1 ./fr/index - ./ind/index ./us/index International diff --git a/docs/product/material_certificate_v1.rst b/docs/product/material_certificate_v1.rst deleted file mode 100644 index dfd25e8d..00000000 --- a/docs/product/material_certificate_v1.rst +++ /dev/null @@ -1,15 +0,0 @@ -Material Certificate V1 ------------------------ - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/material_certificate_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.material_certificate.material_certificate_v1.MaterialCertificateV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.material_certificate.material_certificate_v1_document.MaterialCertificateV1Document - :members: - :inherited-members: diff --git a/docs/product/nutrition_facts_label_v1.rst b/docs/product/nutrition_facts_label_v1.rst deleted file mode 100644 index 00ec5fec..00000000 --- a/docs/product/nutrition_facts_label_v1.rst +++ /dev/null @@ -1,67 +0,0 @@ -Nutrition Facts Label V1 ------------------------- - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/nutrition_facts_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1.NutritionFactsLabelV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_document.NutritionFactsLabelV1Document - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_serving_size.NutritionFactsLabelV1ServingSize - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_calorie.NutritionFactsLabelV1Calorie - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_total_fat.NutritionFactsLabelV1TotalFat - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_saturated_fat.NutritionFactsLabelV1SaturatedFat - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_trans_fat.NutritionFactsLabelV1TransFat - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_cholesterol.NutritionFactsLabelV1Cholesterol - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_total_carbohydrate.NutritionFactsLabelV1TotalCarbohydrate - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_dietary_fiber.NutritionFactsLabelV1DietaryFiber - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_total_sugar.NutritionFactsLabelV1TotalSugar - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_added_sugar.NutritionFactsLabelV1AddedSugar - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_protein.NutritionFactsLabelV1Protein - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_sodium.NutritionFactsLabelV1Sodium - :members: - :inherited-members: - -.. autoclass:: mindee.product.nutrition_facts_label.nutrition_facts_label_v1_nutrient.NutritionFactsLabelV1Nutrient - :members: - :inherited-members: diff --git a/docs/product/resume_v1.rst b/docs/product/resume_v1.rst deleted file mode 100644 index 6a7459e3..00000000 --- a/docs/product/resume_v1.rst +++ /dev/null @@ -1,35 +0,0 @@ -Resume V1 ---------- - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/resume_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.resume.resume_v1.ResumeV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.resume.resume_v1_document.ResumeV1Document - :members: - :inherited-members: - -.. autoclass:: mindee.product.resume.resume_v1_social_networks_url.ResumeV1SocialNetworksUrl - :members: - :inherited-members: - -.. autoclass:: mindee.product.resume.resume_v1_language.ResumeV1Language - :members: - :inherited-members: - -.. autoclass:: mindee.product.resume.resume_v1_education.ResumeV1Education - :members: - :inherited-members: - -.. autoclass:: mindee.product.resume.resume_v1_professional_experience.ResumeV1ProfessionalExperience - :members: - :inherited-members: - -.. autoclass:: mindee.product.resume.resume_v1_certificate.ResumeV1Certificate - :members: - :inherited-members: diff --git a/docs/product/us/healthcare_card_v1.rst b/docs/product/us/healthcare_card_v1.rst deleted file mode 100644 index ee6fd476..00000000 --- a/docs/product/us/healthcare_card_v1.rst +++ /dev/null @@ -1,19 +0,0 @@ -Healthcare Card V1 ------------------- - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/us_healthcare_cards_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.us.healthcare_card.healthcare_card_v1.HealthcareCardV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.us.healthcare_card.healthcare_card_v1_document.HealthcareCardV1Document - :members: - :inherited-members: - -.. autoclass:: mindee.product.us.healthcare_card.healthcare_card_v1_copay.HealthcareCardV1Copay - :members: - :inherited-members: diff --git a/docs/product/us/us_mail_v3.rst b/docs/product/us/us_mail_v3.rst deleted file mode 100644 index a689a7fd..00000000 --- a/docs/product/us/us_mail_v3.rst +++ /dev/null @@ -1,23 +0,0 @@ -US Mail V3 ----------- - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/us_mail_v3_async.txt - :language: Python - -.. autoclass:: mindee.product.us.us_mail.us_mail_v3.UsMailV3 - :members: - :inherited-members: - -.. autoclass:: mindee.product.us.us_mail.us_mail_v3_document.UsMailV3Document - :members: - :inherited-members: - -.. autoclass:: mindee.product.us.us_mail.us_mail_v3_sender_address.UsMailV3SenderAddress - :members: - :inherited-members: - -.. autoclass:: mindee.product.us.us_mail.us_mail_v3_recipient_address.UsMailV3RecipientAddress - :members: - :inherited-members: diff --git a/mindee/commands/cli_products.py b/mindee/commands/cli_products.py index 68795b0a..7679899d 100644 --- a/mindee/commands/cli_products.py +++ b/mindee/commands/cli_products.py @@ -34,36 +34,12 @@ class CommandConfig(Generic[TypeInference]): is_sync=True, is_async=False, ), - "bill-of-lading": CommandConfig( - help="Bill of Lading", - doc_class=product.BillOfLadingV1, - is_sync=False, - is_async=True, - ), - "business-card": CommandConfig( - help="Business Card", - doc_class=product.BusinessCardV1, - is_sync=False, - is_async=True, - ), "cropper": CommandConfig( help="Cropper", doc_class=product.CropperV1, is_sync=True, is_async=False, ), - "delivery-note": CommandConfig( - help="Delivery note", - doc_class=product.DeliveryNoteV1, - is_sync=False, - is_async=True, - ), - "driver-license": CommandConfig( - help="Driver License", - doc_class=product.DriverLicenseV1, - is_sync=False, - is_async=True, - ), "financial-document": CommandConfig( help="Financial Document", doc_class=product.FinancialDocumentV1, @@ -82,36 +58,12 @@ class CommandConfig(Generic[TypeInference]): is_sync=True, is_async=False, ), - "fr-energy-bill": CommandConfig( - help="Energy Bill", - doc_class=product.fr.EnergyBillV1, - is_sync=False, - is_async=True, - ), - "fr-health-card": CommandConfig( - help="Health Card", - doc_class=product.fr.HealthCardV1, - is_sync=False, - is_async=True, - ), "fr-carte-nationale-d-identite": CommandConfig( help="Carte Nationale d'Identité", doc_class=product.fr.IdCardV2, is_sync=True, is_async=False, ), - "fr-payslip": CommandConfig( - help="Payslip", - doc_class=product.fr.PayslipV3, - is_sync=False, - is_async=True, - ), - "ind-passport-india": CommandConfig( - help="Passport - India", - doc_class=product.ind.IndianPassportV1, - is_sync=False, - is_async=True, - ), "international-id": CommandConfig( help="International ID", doc_class=product.InternationalIdV2, @@ -130,24 +82,12 @@ class CommandConfig(Generic[TypeInference]): is_sync=False, is_async=True, ), - "material-certificate": CommandConfig( - help="Material Certificate", - doc_class=product.MaterialCertificateV1, - is_sync=False, - is_async=True, - ), "multi-receipts-detector": CommandConfig( help="Multi Receipts Detector", doc_class=product.MultiReceiptsDetectorV1, is_sync=True, is_async=False, ), - "nutrition-facts-label": CommandConfig( - help="Nutrition Facts Label", - doc_class=product.NutritionFactsLabelV1, - is_sync=False, - is_async=True, - ), "passport": CommandConfig( help="Passport", doc_class=product.PassportV1, @@ -160,28 +100,10 @@ class CommandConfig(Generic[TypeInference]): is_sync=True, is_async=True, ), - "resume": CommandConfig( - help="Resume", - doc_class=product.ResumeV1, - is_sync=False, - is_async=True, - ), "us-bank-check": CommandConfig( help="Bank Check", doc_class=product.us.BankCheckV1, is_sync=True, is_async=False, ), - "us-healthcare-card": CommandConfig( - help="Healthcare Card", - doc_class=product.us.HealthcareCardV1, - is_sync=False, - is_async=True, - ), - "us-us-mail": CommandConfig( - help="US Mail", - doc_class=product.us.UsMailV3, - is_sync=False, - is_async=True, - ), } diff --git a/mindee/product/__init__.py b/mindee/product/__init__.py index ff7d99c2..168b3c7c 100644 --- a/mindee/product/__init__.py +++ b/mindee/product/__init__.py @@ -1,31 +1,8 @@ -from mindee.product import fr, ind, us +from mindee.product import fr, us from mindee.product.barcode_reader.barcode_reader_v1 import BarcodeReaderV1 from mindee.product.barcode_reader.barcode_reader_v1_document import ( BarcodeReaderV1Document, ) -from mindee.product.bill_of_lading.bill_of_lading_v1 import BillOfLadingV1 -from mindee.product.bill_of_lading.bill_of_lading_v1_carrier import ( - BillOfLadingV1Carrier, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_carrier_item import ( - BillOfLadingV1CarrierItem, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_consignee import ( - BillOfLadingV1Consignee, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_document import ( - BillOfLadingV1Document, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_notify_party import ( - BillOfLadingV1NotifyParty, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_shipper import ( - BillOfLadingV1Shipper, -) -from mindee.product.business_card.business_card_v1 import BusinessCardV1 -from mindee.product.business_card.business_card_v1_document import ( - BusinessCardV1Document, -) from mindee.product.cropper.cropper_v1 import CropperV1 from mindee.product.cropper.cropper_v1_document import ( CropperV1Document, @@ -34,14 +11,6 @@ CropperV1Page, ) from mindee.product.custom import CustomV1, CustomV1Document, CustomV1Page -from mindee.product.delivery_note.delivery_note_v1 import DeliveryNoteV1 -from mindee.product.delivery_note.delivery_note_v1_document import ( - DeliveryNoteV1Document, -) -from mindee.product.driver_license.driver_license_v1 import DriverLicenseV1 -from mindee.product.driver_license.driver_license_v1_document import ( - DriverLicenseV1Document, -) from mindee.product.financial_document.financial_document_v1 import FinancialDocumentV1 from mindee.product.financial_document.financial_document_v1_document import ( FinancialDocumentV1Document, @@ -68,63 +37,12 @@ from mindee.product.invoice_splitter.invoice_splitter_v1_invoice_page_group import ( InvoiceSplitterV1InvoicePageGroup, ) -from mindee.product.material_certificate.material_certificate_v1 import ( - MaterialCertificateV1, -) -from mindee.product.material_certificate.material_certificate_v1_document import ( - MaterialCertificateV1Document, -) from mindee.product.multi_receipts_detector.multi_receipts_detector_v1 import ( MultiReceiptsDetectorV1, ) from mindee.product.multi_receipts_detector.multi_receipts_detector_v1_document import ( MultiReceiptsDetectorV1Document, ) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1 import ( - NutritionFactsLabelV1, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_added_sugar import ( - NutritionFactsLabelV1AddedSugar, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_calorie import ( - NutritionFactsLabelV1Calorie, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_cholesterol import ( - NutritionFactsLabelV1Cholesterol, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_dietary_fiber import ( - NutritionFactsLabelV1DietaryFiber, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_document import ( - NutritionFactsLabelV1Document, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_nutrient import ( - NutritionFactsLabelV1Nutrient, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_protein import ( - NutritionFactsLabelV1Protein, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_saturated_fat import ( - NutritionFactsLabelV1SaturatedFat, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_serving_size import ( - NutritionFactsLabelV1ServingSize, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_sodium import ( - NutritionFactsLabelV1Sodium, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_total_carbohydrate import ( - NutritionFactsLabelV1TotalCarbohydrate, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_total_fat import ( - NutritionFactsLabelV1TotalFat, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_total_sugar import ( - NutritionFactsLabelV1TotalSugar, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_trans_fat import ( - NutritionFactsLabelV1TransFat, -) from mindee.product.passport.passport_v1 import PassportV1 from mindee.product.passport.passport_v1_document import ( PassportV1Document, @@ -136,51 +54,18 @@ from mindee.product.receipt.receipt_v5_line_item import ( ReceiptV5LineItem, ) -from mindee.product.resume.resume_v1 import ResumeV1 -from mindee.product.resume.resume_v1_certificate import ( - ResumeV1Certificate, -) -from mindee.product.resume.resume_v1_document import ( - ResumeV1Document, -) -from mindee.product.resume.resume_v1_education import ( - ResumeV1Education, -) -from mindee.product.resume.resume_v1_language import ( - ResumeV1Language, -) -from mindee.product.resume.resume_v1_professional_experience import ( - ResumeV1ProfessionalExperience, -) -from mindee.product.resume.resume_v1_social_networks_url import ( - ResumeV1SocialNetworksUrl, -) __all__ = [ "fr", - "ind", "us", "BarcodeReaderV1", "BarcodeReaderV1Document", - "BillOfLadingV1", - "BillOfLadingV1Carrier", - "BillOfLadingV1CarrierItem", - "BillOfLadingV1Consignee", - "BillOfLadingV1Document", - "BillOfLadingV1NotifyParty", - "BillOfLadingV1Shipper", - "BusinessCardV1", - "BusinessCardV1Document", "CropperV1", "CropperV1Document", "CropperV1Page", "CustomV1", "CustomV1Document", "CustomV1Page", - "DeliveryNoteV1", - "DeliveryNoteV1Document", - "DriverLicenseV1", - "DriverLicenseV1Document", "FinancialDocumentV1", "FinancialDocumentV1Document", "FinancialDocumentV1LineItem", @@ -195,35 +80,11 @@ "InvoiceSplitterV1", "InvoiceSplitterV1Document", "InvoiceSplitterV1InvoicePageGroup", - "MaterialCertificateV1", - "MaterialCertificateV1Document", "MultiReceiptsDetectorV1", "MultiReceiptsDetectorV1Document", - "NutritionFactsLabelV1", - "NutritionFactsLabelV1AddedSugar", - "NutritionFactsLabelV1Calorie", - "NutritionFactsLabelV1Cholesterol", - "NutritionFactsLabelV1DietaryFiber", - "NutritionFactsLabelV1Document", - "NutritionFactsLabelV1Nutrient", - "NutritionFactsLabelV1Protein", - "NutritionFactsLabelV1SaturatedFat", - "NutritionFactsLabelV1ServingSize", - "NutritionFactsLabelV1Sodium", - "NutritionFactsLabelV1TotalCarbohydrate", - "NutritionFactsLabelV1TotalFat", - "NutritionFactsLabelV1TotalSugar", - "NutritionFactsLabelV1TransFat", "PassportV1", "PassportV1Document", "ReceiptV5", "ReceiptV5Document", "ReceiptV5LineItem", - "ResumeV1", - "ResumeV1Certificate", - "ResumeV1Document", - "ResumeV1Education", - "ResumeV1Language", - "ResumeV1ProfessionalExperience", - "ResumeV1SocialNetworksUrl", ] diff --git a/mindee/product/bill_of_lading/__init__.py b/mindee/product/bill_of_lading/__init__.py deleted file mode 100644 index 31d47801..00000000 --- a/mindee/product/bill_of_lading/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -from mindee.product.bill_of_lading.bill_of_lading_v1 import BillOfLadingV1 -from mindee.product.bill_of_lading.bill_of_lading_v1_carrier import ( - BillOfLadingV1Carrier, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_carrier_item import ( - BillOfLadingV1CarrierItem, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_consignee import ( - BillOfLadingV1Consignee, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_document import ( - BillOfLadingV1Document, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_notify_party import ( - BillOfLadingV1NotifyParty, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_shipper import ( - BillOfLadingV1Shipper, -) - -__all__ = [ - "BillOfLadingV1", - "BillOfLadingV1Carrier", - "BillOfLadingV1CarrierItem", - "BillOfLadingV1Consignee", - "BillOfLadingV1Document", - "BillOfLadingV1NotifyParty", - "BillOfLadingV1Shipper", - "BillOfLadingV1Document", -] diff --git a/mindee/product/bill_of_lading/bill_of_lading_v1.py b/mindee/product/bill_of_lading/bill_of_lading_v1.py deleted file mode 100644 index 9bc6c26e..00000000 --- a/mindee/product/bill_of_lading/bill_of_lading_v1.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.bill_of_lading.bill_of_lading_v1_document import ( - BillOfLadingV1Document, -) - - -class BillOfLadingV1(Inference): - """Bill of Lading API version 1 inference prediction.""" - - prediction: BillOfLadingV1Document - """Document-level prediction.""" - pages: List[Page[BillOfLadingV1Document]] - """Page-level prediction(s).""" - endpoint_name = "bill_of_lading" - """Name of the endpoint.""" - endpoint_version = "1" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - Bill of Lading v1 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = BillOfLadingV1Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(BillOfLadingV1Document, page)) diff --git a/mindee/product/bill_of_lading/bill_of_lading_v1_carrier.py b/mindee/product/bill_of_lading/bill_of_lading_v1_carrier.py deleted file mode 100644 index d0629362..00000000 --- a/mindee/product/bill_of_lading/bill_of_lading_v1_carrier.py +++ /dev/null @@ -1,62 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class BillOfLadingV1Carrier(FieldPositionMixin, FieldConfidenceMixin): - """The shipping company responsible for transporting the goods.""" - - name: Optional[str] - """The name of the carrier.""" - professional_number: Optional[str] - """The professional number of the carrier.""" - scac: Optional[str] - """The Standard Carrier Alpha Code (SCAC) of the carrier.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.name = raw_prediction["name"] - self.professional_number = raw_prediction["professional_number"] - self.scac = raw_prediction["scac"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["name"] = format_for_display(self.name) - out_dict["professional_number"] = format_for_display(self.professional_number) - out_dict["scac"] = format_for_display(self.scac) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Name: {printable['name']}\n" - out_str += f" :Professional Number: {printable['professional_number']}\n" - out_str += f" :SCAC: {printable['scac']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Name: {printable['name']}, \n" - out_str += f"Professional Number: {printable['professional_number']}, \n" - out_str += f"SCAC: {printable['scac']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/bill_of_lading/bill_of_lading_v1_carrier_item.py b/mindee/product/bill_of_lading/bill_of_lading_v1_carrier_item.py deleted file mode 100644 index 13bfc0ac..00000000 --- a/mindee/product/bill_of_lading/bill_of_lading_v1_carrier_item.py +++ /dev/null @@ -1,96 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class BillOfLadingV1CarrierItem(FieldPositionMixin, FieldConfidenceMixin): - """The goods being shipped.""" - - description: Optional[str] - """A description of the item.""" - gross_weight: Optional[float] - """The gross weight of the item.""" - measurement: Optional[float] - """The measurement of the item.""" - measurement_unit: Optional[str] - """The unit of measurement for the measurement.""" - quantity: Optional[float] - """The quantity of the item being shipped.""" - weight_unit: Optional[str] - """The unit of measurement for weights.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.description = raw_prediction["description"] - self.gross_weight = to_opt_float(raw_prediction, "gross_weight") - self.measurement = to_opt_float(raw_prediction, "measurement") - self.measurement_unit = raw_prediction["measurement_unit"] - self.quantity = to_opt_float(raw_prediction, "quantity") - self.weight_unit = raw_prediction["weight_unit"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["description"] = format_for_display(self.description) - out_dict["gross_weight"] = float_to_string(self.gross_weight) - out_dict["measurement"] = float_to_string(self.measurement) - out_dict["measurement_unit"] = format_for_display(self.measurement_unit) - out_dict["quantity"] = float_to_string(self.quantity) - out_dict["weight_unit"] = format_for_display(self.weight_unit) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["description"] = format_for_display(self.description, 36) - out_dict["gross_weight"] = float_to_string(self.gross_weight) - out_dict["measurement"] = float_to_string(self.measurement) - out_dict["measurement_unit"] = format_for_display(self.measurement_unit, None) - out_dict["quantity"] = float_to_string(self.quantity) - out_dict["weight_unit"] = format_for_display(self.weight_unit, None) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['description']:<36} | " - out_str += f"{printable['gross_weight']:<12} | " - out_str += f"{printable['measurement']:<11} | " - out_str += f"{printable['measurement_unit']:<16} | " - out_str += f"{printable['quantity']:<8} | " - out_str += f"{printable['weight_unit']:<11} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Description: {printable['description']}, \n" - out_str += f"Gross Weight: {printable['gross_weight']}, \n" - out_str += f"Measurement: {printable['measurement']}, \n" - out_str += f"Measurement Unit: {printable['measurement_unit']}, \n" - out_str += f"Quantity: {printable['quantity']}, \n" - out_str += f"Weight Unit: {printable['weight_unit']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/bill_of_lading/bill_of_lading_v1_consignee.py b/mindee/product/bill_of_lading/bill_of_lading_v1_consignee.py deleted file mode 100644 index 6f219d04..00000000 --- a/mindee/product/bill_of_lading/bill_of_lading_v1_consignee.py +++ /dev/null @@ -1,68 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class BillOfLadingV1Consignee(FieldPositionMixin, FieldConfidenceMixin): - """The party to whom the goods are being shipped.""" - - address: Optional[str] - """The address of the consignee.""" - email: Optional[str] - """The email of the shipper.""" - name: Optional[str] - """The name of the consignee.""" - phone: Optional[str] - """The phone number of the consignee.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.address = raw_prediction["address"] - self.email = raw_prediction["email"] - self.name = raw_prediction["name"] - self.phone = raw_prediction["phone"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["address"] = format_for_display(self.address) - out_dict["email"] = format_for_display(self.email) - out_dict["name"] = format_for_display(self.name) - out_dict["phone"] = format_for_display(self.phone) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Address: {printable['address']}\n" - out_str += f" :Email: {printable['email']}\n" - out_str += f" :Name: {printable['name']}\n" - out_str += f" :Phone: {printable['phone']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Address: {printable['address']}, \n" - out_str += f"Email: {printable['email']}, \n" - out_str += f"Name: {printable['name']}, \n" - out_str += f"Phone: {printable['phone']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/bill_of_lading/bill_of_lading_v1_document.py b/mindee/product/bill_of_lading/bill_of_lading_v1_document.py deleted file mode 100644 index 1e194ada..00000000 --- a/mindee/product/bill_of_lading/bill_of_lading_v1_document.py +++ /dev/null @@ -1,151 +0,0 @@ -from typing import List, Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField -from mindee.product.bill_of_lading.bill_of_lading_v1_carrier import ( - BillOfLadingV1Carrier, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_carrier_item import ( - BillOfLadingV1CarrierItem, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_consignee import ( - BillOfLadingV1Consignee, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_notify_party import ( - BillOfLadingV1NotifyParty, -) -from mindee.product.bill_of_lading.bill_of_lading_v1_shipper import ( - BillOfLadingV1Shipper, -) - - -class BillOfLadingV1Document(Prediction): - """Bill of Lading API version 1.1 document data.""" - - bill_of_lading_number: StringField - """A unique identifier assigned to a Bill of Lading document.""" - carrier: BillOfLadingV1Carrier - """The shipping company responsible for transporting the goods.""" - carrier_items: List[BillOfLadingV1CarrierItem] - """The goods being shipped.""" - consignee: BillOfLadingV1Consignee - """The party to whom the goods are being shipped.""" - date_of_issue: DateField - """The date when the bill of lading is issued.""" - departure_date: DateField - """The date when the vessel departs from the port of loading.""" - notify_party: BillOfLadingV1NotifyParty - """The party to be notified of the arrival of the goods.""" - place_of_delivery: StringField - """The place where the goods are to be delivered.""" - port_of_discharge: StringField - """The port where the goods are unloaded from the vessel.""" - port_of_loading: StringField - """The port where the goods are loaded onto the vessel.""" - shipper: BillOfLadingV1Shipper - """The party responsible for shipping the goods.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - Bill of Lading document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.bill_of_lading_number = StringField( - raw_prediction["bill_of_lading_number"], - page_id=page_id, - ) - self.carrier = BillOfLadingV1Carrier( - raw_prediction["carrier"], - page_id=page_id, - ) - self.carrier_items = [ - BillOfLadingV1CarrierItem(prediction, page_id=page_id) - for prediction in raw_prediction["carrier_items"] - ] - self.consignee = BillOfLadingV1Consignee( - raw_prediction["consignee"], - page_id=page_id, - ) - self.date_of_issue = DateField( - raw_prediction["date_of_issue"], - page_id=page_id, - ) - self.departure_date = DateField( - raw_prediction["departure_date"], - page_id=page_id, - ) - self.notify_party = BillOfLadingV1NotifyParty( - raw_prediction["notify_party"], - page_id=page_id, - ) - self.place_of_delivery = StringField( - raw_prediction["place_of_delivery"], - page_id=page_id, - ) - self.port_of_discharge = StringField( - raw_prediction["port_of_discharge"], - page_id=page_id, - ) - self.port_of_loading = StringField( - raw_prediction["port_of_loading"], - page_id=page_id, - ) - self.shipper = BillOfLadingV1Shipper( - raw_prediction["shipper"], - page_id=page_id, - ) - - @staticmethod - def _carrier_items_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 38}" - out_str += f"+{char * 14}" - out_str += f"+{char * 13}" - out_str += f"+{char * 18}" - out_str += f"+{char * 10}" - out_str += f"+{char * 13}" - return out_str + "+" - - def _carrier_items_to_str(self) -> str: - if not self.carrier_items: - return "" - - lines = f"\n{self._carrier_items_separator('-')}\n ".join( - [item.to_table_line() for item in self.carrier_items] - ) - out_str = "" - out_str += f"\n{self._carrier_items_separator('-')}\n " - out_str += " | Description " - out_str += " | Gross Weight" - out_str += " | Measurement" - out_str += " | Measurement Unit" - out_str += " | Quantity" - out_str += " | Weight Unit" - out_str += f" |\n{self._carrier_items_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._carrier_items_separator('-')}" - return out_str - - def __str__(self) -> str: - out_str: str = f":Bill of Lading Number: {self.bill_of_lading_number}\n" - out_str += f":Shipper:\n{self.shipper.to_field_list()}\n" - out_str += f":Consignee:\n{self.consignee.to_field_list()}\n" - out_str += f":Notify Party:\n{self.notify_party.to_field_list()}\n" - out_str += f":Carrier:\n{self.carrier.to_field_list()}\n" - out_str += f":Items: {self._carrier_items_to_str()}\n" - out_str += f":Port of Loading: {self.port_of_loading}\n" - out_str += f":Port of Discharge: {self.port_of_discharge}\n" - out_str += f":Place of Delivery: {self.place_of_delivery}\n" - out_str += f":Date of issue: {self.date_of_issue}\n" - out_str += f":Departure Date: {self.departure_date}\n" - return clean_out_string(out_str) diff --git a/mindee/product/bill_of_lading/bill_of_lading_v1_notify_party.py b/mindee/product/bill_of_lading/bill_of_lading_v1_notify_party.py deleted file mode 100644 index f4dd14ff..00000000 --- a/mindee/product/bill_of_lading/bill_of_lading_v1_notify_party.py +++ /dev/null @@ -1,68 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class BillOfLadingV1NotifyParty(FieldPositionMixin, FieldConfidenceMixin): - """The party to be notified of the arrival of the goods.""" - - address: Optional[str] - """The address of the notify party.""" - email: Optional[str] - """The email of the shipper.""" - name: Optional[str] - """The name of the notify party.""" - phone: Optional[str] - """The phone number of the notify party.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.address = raw_prediction["address"] - self.email = raw_prediction["email"] - self.name = raw_prediction["name"] - self.phone = raw_prediction["phone"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["address"] = format_for_display(self.address) - out_dict["email"] = format_for_display(self.email) - out_dict["name"] = format_for_display(self.name) - out_dict["phone"] = format_for_display(self.phone) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Address: {printable['address']}\n" - out_str += f" :Email: {printable['email']}\n" - out_str += f" :Name: {printable['name']}\n" - out_str += f" :Phone: {printable['phone']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Address: {printable['address']}, \n" - out_str += f"Email: {printable['email']}, \n" - out_str += f"Name: {printable['name']}, \n" - out_str += f"Phone: {printable['phone']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/bill_of_lading/bill_of_lading_v1_shipper.py b/mindee/product/bill_of_lading/bill_of_lading_v1_shipper.py deleted file mode 100644 index 3c80c42d..00000000 --- a/mindee/product/bill_of_lading/bill_of_lading_v1_shipper.py +++ /dev/null @@ -1,68 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class BillOfLadingV1Shipper(FieldPositionMixin, FieldConfidenceMixin): - """The party responsible for shipping the goods.""" - - address: Optional[str] - """The address of the shipper.""" - email: Optional[str] - """The email of the shipper.""" - name: Optional[str] - """The name of the shipper.""" - phone: Optional[str] - """The phone number of the shipper.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.address = raw_prediction["address"] - self.email = raw_prediction["email"] - self.name = raw_prediction["name"] - self.phone = raw_prediction["phone"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["address"] = format_for_display(self.address) - out_dict["email"] = format_for_display(self.email) - out_dict["name"] = format_for_display(self.name) - out_dict["phone"] = format_for_display(self.phone) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Address: {printable['address']}\n" - out_str += f" :Email: {printable['email']}\n" - out_str += f" :Name: {printable['name']}\n" - out_str += f" :Phone: {printable['phone']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Address: {printable['address']}, \n" - out_str += f"Email: {printable['email']}, \n" - out_str += f"Name: {printable['name']}, \n" - out_str += f"Phone: {printable['phone']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/business_card/__init__.py b/mindee/product/business_card/__init__.py deleted file mode 100644 index a952f866..00000000 --- a/mindee/product/business_card/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from mindee.product.business_card.business_card_v1 import BusinessCardV1 -from mindee.product.business_card.business_card_v1_document import ( - BusinessCardV1Document, -) - -__all__ = [ - "BusinessCardV1", - "BusinessCardV1Document", -] diff --git a/mindee/product/business_card/business_card_v1.py b/mindee/product/business_card/business_card_v1.py deleted file mode 100644 index abf379c8..00000000 --- a/mindee/product/business_card/business_card_v1.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.business_card.business_card_v1_document import ( - BusinessCardV1Document, -) - - -class BusinessCardV1(Inference): - """Business Card API version 1 inference prediction.""" - - prediction: BusinessCardV1Document - """Document-level prediction.""" - pages: List[Page[BusinessCardV1Document]] - """Page-level prediction(s).""" - endpoint_name = "business_card" - """Name of the endpoint.""" - endpoint_version = "1" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - Business Card v1 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = BusinessCardV1Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(BusinessCardV1Document, page)) diff --git a/mindee/product/business_card/business_card_v1_document.py b/mindee/product/business_card/business_card_v1_document.py deleted file mode 100644 index 89021c14..00000000 --- a/mindee/product/business_card/business_card_v1_document.py +++ /dev/null @@ -1,107 +0,0 @@ -from typing import List, Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.text import StringField - - -class BusinessCardV1Document(Prediction): - """Business Card API version 1.0 document data.""" - - address: StringField - """The address of the person.""" - company: StringField - """The company the person works for.""" - email: StringField - """The email address of the person.""" - fax_number: StringField - """The Fax number of the person.""" - firstname: StringField - """The given name of the person.""" - job_title: StringField - """The job title of the person.""" - lastname: StringField - """The lastname of the person.""" - mobile_number: StringField - """The mobile number of the person.""" - phone_number: StringField - """The phone number of the person.""" - social_media: List[StringField] - """The social media profiles of the person or company.""" - website: StringField - """The website of the person or company.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - Business Card document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.address = StringField( - raw_prediction["address"], - page_id=page_id, - ) - self.company = StringField( - raw_prediction["company"], - page_id=page_id, - ) - self.email = StringField( - raw_prediction["email"], - page_id=page_id, - ) - self.fax_number = StringField( - raw_prediction["fax_number"], - page_id=page_id, - ) - self.firstname = StringField( - raw_prediction["firstname"], - page_id=page_id, - ) - self.job_title = StringField( - raw_prediction["job_title"], - page_id=page_id, - ) - self.lastname = StringField( - raw_prediction["lastname"], - page_id=page_id, - ) - self.mobile_number = StringField( - raw_prediction["mobile_number"], - page_id=page_id, - ) - self.phone_number = StringField( - raw_prediction["phone_number"], - page_id=page_id, - ) - self.social_media = [ - StringField(prediction, page_id=page_id) - for prediction in raw_prediction["social_media"] - ] - self.website = StringField( - raw_prediction["website"], - page_id=page_id, - ) - - def __str__(self) -> str: - social_media = f"\n {' ' * 14}".join( - [str(item) for item in self.social_media], - ) - out_str: str = f":Firstname: {self.firstname}\n" - out_str += f":Lastname: {self.lastname}\n" - out_str += f":Job Title: {self.job_title}\n" - out_str += f":Company: {self.company}\n" - out_str += f":Email: {self.email}\n" - out_str += f":Phone Number: {self.phone_number}\n" - out_str += f":Mobile Number: {self.mobile_number}\n" - out_str += f":Fax Number: {self.fax_number}\n" - out_str += f":Address: {self.address}\n" - out_str += f":Website: {self.website}\n" - out_str += f":Social Media: {social_media}\n" - return clean_out_string(out_str) diff --git a/mindee/product/delivery_note/__init__.py b/mindee/product/delivery_note/__init__.py deleted file mode 100644 index 39142341..00000000 --- a/mindee/product/delivery_note/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from mindee.product.delivery_note.delivery_note_v1 import DeliveryNoteV1 -from mindee.product.delivery_note.delivery_note_v1_document import ( - DeliveryNoteV1Document, -) - -__all__ = [ - "DeliveryNoteV1", - "DeliveryNoteV1Document", -] diff --git a/mindee/product/delivery_note/delivery_note_v1.py b/mindee/product/delivery_note/delivery_note_v1.py deleted file mode 100644 index 7cea46e7..00000000 --- a/mindee/product/delivery_note/delivery_note_v1.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.delivery_note.delivery_note_v1_document import ( - DeliveryNoteV1Document, -) - - -class DeliveryNoteV1(Inference): - """Delivery note API version 1 inference prediction.""" - - prediction: DeliveryNoteV1Document - """Document-level prediction.""" - pages: List[Page[DeliveryNoteV1Document]] - """Page-level prediction(s).""" - endpoint_name = "delivery_notes" - """Name of the endpoint.""" - endpoint_version = "1" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - Delivery note v1 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = DeliveryNoteV1Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(DeliveryNoteV1Document, page)) diff --git a/mindee/product/delivery_note/delivery_note_v1_document.py b/mindee/product/delivery_note/delivery_note_v1_document.py deleted file mode 100644 index c58c61d5..00000000 --- a/mindee/product/delivery_note/delivery_note_v1_document.py +++ /dev/null @@ -1,78 +0,0 @@ -from typing import Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.amount import AmountField -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField - - -class DeliveryNoteV1Document(Prediction): - """Delivery note API version 1.2 document data.""" - - customer_address: StringField - """The address of the customer receiving the goods.""" - customer_name: StringField - """The name of the customer receiving the goods.""" - delivery_date: DateField - """The date on which the delivery is scheduled to arrive.""" - delivery_number: StringField - """A unique identifier for the delivery note.""" - supplier_address: StringField - """The address of the supplier providing the goods.""" - supplier_name: StringField - """The name of the supplier providing the goods.""" - total_amount: AmountField - """The total monetary value of the goods being delivered.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - Delivery note document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.customer_address = StringField( - raw_prediction["customer_address"], - page_id=page_id, - ) - self.customer_name = StringField( - raw_prediction["customer_name"], - page_id=page_id, - ) - self.delivery_date = DateField( - raw_prediction["delivery_date"], - page_id=page_id, - ) - self.delivery_number = StringField( - raw_prediction["delivery_number"], - page_id=page_id, - ) - self.supplier_address = StringField( - raw_prediction["supplier_address"], - page_id=page_id, - ) - self.supplier_name = StringField( - raw_prediction["supplier_name"], - page_id=page_id, - ) - self.total_amount = AmountField( - raw_prediction["total_amount"], - page_id=page_id, - ) - - def __str__(self) -> str: - out_str: str = f":Delivery Date: {self.delivery_date}\n" - out_str += f":Delivery Number: {self.delivery_number}\n" - out_str += f":Supplier Name: {self.supplier_name}\n" - out_str += f":Supplier Address: {self.supplier_address}\n" - out_str += f":Customer Name: {self.customer_name}\n" - out_str += f":Customer Address: {self.customer_address}\n" - out_str += f":Total Amount: {self.total_amount}\n" - return clean_out_string(out_str) diff --git a/mindee/product/driver_license/__init__.py b/mindee/product/driver_license/__init__.py deleted file mode 100644 index 257c0e91..00000000 --- a/mindee/product/driver_license/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from mindee.product.driver_license.driver_license_v1 import DriverLicenseV1 -from mindee.product.driver_license.driver_license_v1_document import ( - DriverLicenseV1Document, -) - -__all__ = [ - "DriverLicenseV1", - "DriverLicenseV1Document", -] diff --git a/mindee/product/driver_license/driver_license_v1.py b/mindee/product/driver_license/driver_license_v1.py deleted file mode 100644 index 2e75992b..00000000 --- a/mindee/product/driver_license/driver_license_v1.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.driver_license.driver_license_v1_document import ( - DriverLicenseV1Document, -) - - -class DriverLicenseV1(Inference): - """Driver License API version 1 inference prediction.""" - - prediction: DriverLicenseV1Document - """Document-level prediction.""" - pages: List[Page[DriverLicenseV1Document]] - """Page-level prediction(s).""" - endpoint_name = "driver_license" - """Name of the endpoint.""" - endpoint_version = "1" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - Driver License v1 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = DriverLicenseV1Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(DriverLicenseV1Document, page)) diff --git a/mindee/product/driver_license/driver_license_v1_document.py b/mindee/product/driver_license/driver_license_v1_document.py deleted file mode 100644 index dda62a9a..00000000 --- a/mindee/product/driver_license/driver_license_v1_document.py +++ /dev/null @@ -1,119 +0,0 @@ -from typing import Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField - - -class DriverLicenseV1Document(Prediction): - """Driver License API version 1.0 document data.""" - - category: StringField - """The category or class of the driver license.""" - country_code: StringField - """The alpha-3 ISO 3166 code of the country where the driver license was issued.""" - date_of_birth: DateField - """The date of birth of the driver license holder.""" - dd_number: StringField - """The DD number of the driver license.""" - expiry_date: DateField - """The expiry date of the driver license.""" - first_name: StringField - """The first name of the driver license holder.""" - id: StringField - """The unique identifier of the driver license.""" - issued_date: DateField - """The date when the driver license was issued.""" - issuing_authority: StringField - """The authority that issued the driver license.""" - last_name: StringField - """The last name of the driver license holder.""" - mrz: StringField - """The Machine Readable Zone (MRZ) of the driver license.""" - place_of_birth: StringField - """The place of birth of the driver license holder.""" - state: StringField - """Second part of the ISO 3166-2 code, consisting of two letters indicating the US State.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - Driver License document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.category = StringField( - raw_prediction["category"], - page_id=page_id, - ) - self.country_code = StringField( - raw_prediction["country_code"], - page_id=page_id, - ) - self.date_of_birth = DateField( - raw_prediction["date_of_birth"], - page_id=page_id, - ) - self.dd_number = StringField( - raw_prediction["dd_number"], - page_id=page_id, - ) - self.expiry_date = DateField( - raw_prediction["expiry_date"], - page_id=page_id, - ) - self.first_name = StringField( - raw_prediction["first_name"], - page_id=page_id, - ) - self.id = StringField( - raw_prediction["id"], - page_id=page_id, - ) - self.issued_date = DateField( - raw_prediction["issued_date"], - page_id=page_id, - ) - self.issuing_authority = StringField( - raw_prediction["issuing_authority"], - page_id=page_id, - ) - self.last_name = StringField( - raw_prediction["last_name"], - page_id=page_id, - ) - self.mrz = StringField( - raw_prediction["mrz"], - page_id=page_id, - ) - self.place_of_birth = StringField( - raw_prediction["place_of_birth"], - page_id=page_id, - ) - self.state = StringField( - raw_prediction["state"], - page_id=page_id, - ) - - def __str__(self) -> str: - out_str: str = f":Country Code: {self.country_code}\n" - out_str += f":State: {self.state}\n" - out_str += f":ID: {self.id}\n" - out_str += f":Category: {self.category}\n" - out_str += f":Last Name: {self.last_name}\n" - out_str += f":First Name: {self.first_name}\n" - out_str += f":Date of Birth: {self.date_of_birth}\n" - out_str += f":Place of Birth: {self.place_of_birth}\n" - out_str += f":Expiry Date: {self.expiry_date}\n" - out_str += f":Issued Date: {self.issued_date}\n" - out_str += f":Issuing Authority: {self.issuing_authority}\n" - out_str += f":MRZ: {self.mrz}\n" - out_str += f":DD Number: {self.dd_number}\n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/__init__.py b/mindee/product/fr/__init__.py index 14b1a204..e9fdfd06 100644 --- a/mindee/product/fr/__init__.py +++ b/mindee/product/fr/__init__.py @@ -17,32 +17,6 @@ from mindee.product.fr.carte_grise.carte_grise_v1_document import ( CarteGriseV1Document, ) -from mindee.product.fr.energy_bill.energy_bill_v1 import EnergyBillV1 -from mindee.product.fr.energy_bill.energy_bill_v1_document import ( - EnergyBillV1Document, -) -from mindee.product.fr.energy_bill.energy_bill_v1_energy_consumer import ( - EnergyBillV1EnergyConsumer, -) -from mindee.product.fr.energy_bill.energy_bill_v1_energy_supplier import ( - EnergyBillV1EnergySupplier, -) -from mindee.product.fr.energy_bill.energy_bill_v1_energy_usage import ( - EnergyBillV1EnergyUsage, -) -from mindee.product.fr.energy_bill.energy_bill_v1_meter_detail import ( - EnergyBillV1MeterDetail, -) -from mindee.product.fr.energy_bill.energy_bill_v1_subscription import ( - EnergyBillV1Subscription, -) -from mindee.product.fr.energy_bill.energy_bill_v1_taxes_and_contribution import ( - EnergyBillV1TaxesAndContribution, -) -from mindee.product.fr.health_card.health_card_v1 import HealthCardV1 -from mindee.product.fr.health_card.health_card_v1_document import ( - HealthCardV1Document, -) from mindee.product.fr.id_card.id_card_v1 import IdCardV1 from mindee.product.fr.id_card.id_card_v1_document import ( IdCardV1Document, @@ -57,34 +31,6 @@ from mindee.product.fr.id_card.id_card_v2_page import ( IdCardV2Page, ) -from mindee.product.fr.payslip.payslip_v3 import PayslipV3 -from mindee.product.fr.payslip.payslip_v3_bank_account_detail import ( - PayslipV3BankAccountDetail, -) -from mindee.product.fr.payslip.payslip_v3_document import ( - PayslipV3Document, -) -from mindee.product.fr.payslip.payslip_v3_employee import ( - PayslipV3Employee, -) -from mindee.product.fr.payslip.payslip_v3_employer import ( - PayslipV3Employer, -) -from mindee.product.fr.payslip.payslip_v3_employment import ( - PayslipV3Employment, -) -from mindee.product.fr.payslip.payslip_v3_paid_time_off import ( - PayslipV3PaidTimeOff, -) -from mindee.product.fr.payslip.payslip_v3_pay_detail import ( - PayslipV3PayDetail, -) -from mindee.product.fr.payslip.payslip_v3_pay_period import ( - PayslipV3PayPeriod, -) -from mindee.product.fr.payslip.payslip_v3_salary_detail import ( - PayslipV3SalaryDetail, -) __all__ = [ "BankAccountDetailsV1", @@ -94,30 +40,10 @@ "BankAccountDetailsV2Document", "CarteGriseV1", "CarteGriseV1Document", - "EnergyBillV1", - "EnergyBillV1Document", - "EnergyBillV1EnergyConsumer", - "EnergyBillV1EnergySupplier", - "EnergyBillV1EnergyUsage", - "EnergyBillV1MeterDetail", - "EnergyBillV1Subscription", - "EnergyBillV1TaxesAndContribution", - "HealthCardV1", - "HealthCardV1Document", "IdCardV1", "IdCardV1Document", "IdCardV1Page", "IdCardV2", "IdCardV2Document", "IdCardV2Page", - "PayslipV3", - "PayslipV3BankAccountDetail", - "PayslipV3Document", - "PayslipV3Employee", - "PayslipV3Employer", - "PayslipV3Employment", - "PayslipV3PaidTimeOff", - "PayslipV3PayDetail", - "PayslipV3PayPeriod", - "PayslipV3SalaryDetail", ] diff --git a/mindee/product/fr/energy_bill/__init__.py b/mindee/product/fr/energy_bill/__init__.py deleted file mode 100644 index 471fa777..00000000 --- a/mindee/product/fr/energy_bill/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -from mindee.product.fr.energy_bill.energy_bill_v1 import EnergyBillV1 -from mindee.product.fr.energy_bill.energy_bill_v1_document import ( - EnergyBillV1Document, -) -from mindee.product.fr.energy_bill.energy_bill_v1_energy_consumer import ( - EnergyBillV1EnergyConsumer, -) -from mindee.product.fr.energy_bill.energy_bill_v1_energy_supplier import ( - EnergyBillV1EnergySupplier, -) -from mindee.product.fr.energy_bill.energy_bill_v1_energy_usage import ( - EnergyBillV1EnergyUsage, -) -from mindee.product.fr.energy_bill.energy_bill_v1_meter_detail import ( - EnergyBillV1MeterDetail, -) -from mindee.product.fr.energy_bill.energy_bill_v1_subscription import ( - EnergyBillV1Subscription, -) -from mindee.product.fr.energy_bill.energy_bill_v1_taxes_and_contribution import ( - EnergyBillV1TaxesAndContribution, -) - -__all__ = [ - "EnergyBillV1", - "EnergyBillV1Document", - "EnergyBillV1EnergyConsumer", - "EnergyBillV1EnergySupplier", - "EnergyBillV1EnergyUsage", - "EnergyBillV1MeterDetail", - "EnergyBillV1Subscription", - "EnergyBillV1TaxesAndContribution", - "EnergyBillV1Document", - "EnergyBillV1EnergyConsumer", - "EnergyBillV1EnergySupplier", - "EnergyBillV1EnergyUsage", - "EnergyBillV1MeterDetail", - "EnergyBillV1Subscription", -] diff --git a/mindee/product/fr/energy_bill/energy_bill_v1.py b/mindee/product/fr/energy_bill/energy_bill_v1.py deleted file mode 100644 index a344522e..00000000 --- a/mindee/product/fr/energy_bill/energy_bill_v1.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.fr.energy_bill.energy_bill_v1_document import ( - EnergyBillV1Document, -) - - -class EnergyBillV1(Inference): - """Energy Bill API version 1 inference prediction.""" - - prediction: EnergyBillV1Document - """Document-level prediction.""" - pages: List[Page[EnergyBillV1Document]] - """Page-level prediction(s).""" - endpoint_name = "energy_bill_fra" - """Name of the endpoint.""" - endpoint_version = "1" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - Energy Bill v1 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = EnergyBillV1Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(EnergyBillV1Document, page)) diff --git a/mindee/product/fr/energy_bill/energy_bill_v1_document.py b/mindee/product/fr/energy_bill/energy_bill_v1_document.py deleted file mode 100644 index a663b3fa..00000000 --- a/mindee/product/fr/energy_bill/energy_bill_v1_document.py +++ /dev/null @@ -1,247 +0,0 @@ -from typing import List, Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.amount import AmountField -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField -from mindee.product.fr.energy_bill.energy_bill_v1_energy_consumer import ( - EnergyBillV1EnergyConsumer, -) -from mindee.product.fr.energy_bill.energy_bill_v1_energy_supplier import ( - EnergyBillV1EnergySupplier, -) -from mindee.product.fr.energy_bill.energy_bill_v1_energy_usage import ( - EnergyBillV1EnergyUsage, -) -from mindee.product.fr.energy_bill.energy_bill_v1_meter_detail import ( - EnergyBillV1MeterDetail, -) -from mindee.product.fr.energy_bill.energy_bill_v1_subscription import ( - EnergyBillV1Subscription, -) -from mindee.product.fr.energy_bill.energy_bill_v1_taxes_and_contribution import ( - EnergyBillV1TaxesAndContribution, -) - - -class EnergyBillV1Document(Prediction): - """Energy Bill API version 1.2 document data.""" - - contract_id: StringField - """The unique identifier associated with a specific contract.""" - delivery_point: StringField - """ - The unique identifier assigned to each electricity or gas consumption point. It specifies the exact - location where the energy is delivered. - """ - due_date: DateField - """The date by which the payment for the energy invoice is due.""" - energy_consumer: EnergyBillV1EnergyConsumer - """The entity that consumes the energy.""" - energy_supplier: EnergyBillV1EnergySupplier - """The company that supplies the energy.""" - energy_usage: List[EnergyBillV1EnergyUsage] - """Details of energy consumption.""" - invoice_date: DateField - """The date when the energy invoice was issued.""" - invoice_number: StringField - """The unique identifier of the energy invoice.""" - meter_details: EnergyBillV1MeterDetail - """Information about the energy meter.""" - subscription: List[EnergyBillV1Subscription] - """The subscription details fee for the energy service.""" - taxes_and_contributions: List[EnergyBillV1TaxesAndContribution] - """Details of Taxes and Contributions.""" - total_amount: AmountField - """The total amount to be paid for the energy invoice.""" - total_before_taxes: AmountField - """The total amount to be paid for the energy invoice before taxes.""" - total_taxes: AmountField - """Total of taxes applied to the invoice.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - Energy Bill document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.contract_id = StringField( - raw_prediction["contract_id"], - page_id=page_id, - ) - self.delivery_point = StringField( - raw_prediction["delivery_point"], - page_id=page_id, - ) - self.due_date = DateField( - raw_prediction["due_date"], - page_id=page_id, - ) - self.energy_consumer = EnergyBillV1EnergyConsumer( - raw_prediction["energy_consumer"], - page_id=page_id, - ) - self.energy_supplier = EnergyBillV1EnergySupplier( - raw_prediction["energy_supplier"], - page_id=page_id, - ) - self.energy_usage = [ - EnergyBillV1EnergyUsage(prediction, page_id=page_id) - for prediction in raw_prediction["energy_usage"] - ] - self.invoice_date = DateField( - raw_prediction["invoice_date"], - page_id=page_id, - ) - self.invoice_number = StringField( - raw_prediction["invoice_number"], - page_id=page_id, - ) - self.meter_details = EnergyBillV1MeterDetail( - raw_prediction["meter_details"], - page_id=page_id, - ) - self.subscription = [ - EnergyBillV1Subscription(prediction, page_id=page_id) - for prediction in raw_prediction["subscription"] - ] - self.taxes_and_contributions = [ - EnergyBillV1TaxesAndContribution(prediction, page_id=page_id) - for prediction in raw_prediction["taxes_and_contributions"] - ] - self.total_amount = AmountField( - raw_prediction["total_amount"], - page_id=page_id, - ) - self.total_before_taxes = AmountField( - raw_prediction["total_before_taxes"], - page_id=page_id, - ) - self.total_taxes = AmountField( - raw_prediction["total_taxes"], - page_id=page_id, - ) - - @staticmethod - def _subscription_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 38}" - out_str += f"+{char * 12}" - out_str += f"+{char * 12}" - out_str += f"+{char * 10}" - out_str += f"+{char * 11}" - out_str += f"+{char * 12}" - return out_str + "+" - - def _subscription_to_str(self) -> str: - if not self.subscription: - return "" - - lines = f"\n{self._subscription_separator('-')}\n ".join( - [item.to_table_line() for item in self.subscription] - ) - out_str = "" - out_str += f"\n{self._subscription_separator('-')}\n " - out_str += " | Description " - out_str += " | End Date " - out_str += " | Start Date" - out_str += " | Tax Rate" - out_str += " | Total " - out_str += " | Unit Price" - out_str += f" |\n{self._subscription_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._subscription_separator('-')}" - return out_str - - @staticmethod - def _energy_usage_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 13}" - out_str += f"+{char * 38}" - out_str += f"+{char * 12}" - out_str += f"+{char * 12}" - out_str += f"+{char * 10}" - out_str += f"+{char * 11}" - out_str += f"+{char * 17}" - out_str += f"+{char * 12}" - return out_str + "+" - - def _energy_usage_to_str(self) -> str: - if not self.energy_usage: - return "" - - lines = f"\n{self._energy_usage_separator('-')}\n ".join( - [item.to_table_line() for item in self.energy_usage] - ) - out_str = "" - out_str += f"\n{self._energy_usage_separator('-')}\n " - out_str += " | Consumption" - out_str += " | Description " - out_str += " | End Date " - out_str += " | Start Date" - out_str += " | Tax Rate" - out_str += " | Total " - out_str += " | Unit of Measure" - out_str += " | Unit Price" - out_str += f" |\n{self._energy_usage_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._energy_usage_separator('-')}" - return out_str - - @staticmethod - def _taxes_and_contributions_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 38}" - out_str += f"+{char * 12}" - out_str += f"+{char * 12}" - out_str += f"+{char * 10}" - out_str += f"+{char * 11}" - out_str += f"+{char * 12}" - return out_str + "+" - - def _taxes_and_contributions_to_str(self) -> str: - if not self.taxes_and_contributions: - return "" - - lines = f"\n{self._taxes_and_contributions_separator('-')}\n ".join( - [item.to_table_line() for item in self.taxes_and_contributions] - ) - out_str = "" - out_str += f"\n{self._taxes_and_contributions_separator('-')}\n " - out_str += " | Description " - out_str += " | End Date " - out_str += " | Start Date" - out_str += " | Tax Rate" - out_str += " | Total " - out_str += " | Unit Price" - out_str += f" |\n{self._taxes_and_contributions_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._taxes_and_contributions_separator('-')}" - return out_str - - def __str__(self) -> str: - out_str: str = f":Invoice Number: {self.invoice_number}\n" - out_str += f":Contract ID: {self.contract_id}\n" - out_str += f":Delivery Point: {self.delivery_point}\n" - out_str += f":Invoice Date: {self.invoice_date}\n" - out_str += f":Due Date: {self.due_date}\n" - out_str += f":Total Before Taxes: {self.total_before_taxes}\n" - out_str += f":Total Taxes: {self.total_taxes}\n" - out_str += f":Total Amount: {self.total_amount}\n" - out_str += f":Energy Supplier:\n{self.energy_supplier.to_field_list()}\n" - out_str += f":Energy Consumer:\n{self.energy_consumer.to_field_list()}\n" - out_str += f":Subscription: {self._subscription_to_str()}\n" - out_str += f":Energy Usage: {self._energy_usage_to_str()}\n" - out_str += ( - f":Taxes and Contributions: {self._taxes_and_contributions_to_str()}\n" - ) - out_str += f":Meter Details:\n{self.meter_details.to_field_list()}\n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/energy_bill/energy_bill_v1_energy_consumer.py b/mindee/product/fr/energy_bill/energy_bill_v1_energy_consumer.py deleted file mode 100644 index 3b03d04b..00000000 --- a/mindee/product/fr/energy_bill/energy_bill_v1_energy_consumer.py +++ /dev/null @@ -1,56 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class EnergyBillV1EnergyConsumer(FieldPositionMixin, FieldConfidenceMixin): - """The entity that consumes the energy.""" - - address: Optional[str] - """The address of the energy consumer.""" - name: Optional[str] - """The name of the energy consumer.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.address = raw_prediction["address"] - self.name = raw_prediction["name"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["address"] = format_for_display(self.address) - out_dict["name"] = format_for_display(self.name) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Address: {printable['address']}\n" - out_str += f" :Name: {printable['name']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Address: {printable['address']}, \n" - out_str += f"Name: {printable['name']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/energy_bill/energy_bill_v1_energy_supplier.py b/mindee/product/fr/energy_bill/energy_bill_v1_energy_supplier.py deleted file mode 100644 index 0523ce4c..00000000 --- a/mindee/product/fr/energy_bill/energy_bill_v1_energy_supplier.py +++ /dev/null @@ -1,56 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class EnergyBillV1EnergySupplier(FieldPositionMixin, FieldConfidenceMixin): - """The company that supplies the energy.""" - - address: Optional[str] - """The address of the energy supplier.""" - name: Optional[str] - """The name of the energy supplier.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.address = raw_prediction["address"] - self.name = raw_prediction["name"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["address"] = format_for_display(self.address) - out_dict["name"] = format_for_display(self.name) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Address: {printable['address']}\n" - out_str += f" :Name: {printable['name']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Address: {printable['address']}, \n" - out_str += f"Name: {printable['name']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/energy_bill/energy_bill_v1_energy_usage.py b/mindee/product/fr/energy_bill/energy_bill_v1_energy_usage.py deleted file mode 100644 index e218d41f..00000000 --- a/mindee/product/fr/energy_bill/energy_bill_v1_energy_usage.py +++ /dev/null @@ -1,110 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class EnergyBillV1EnergyUsage(FieldPositionMixin, FieldConfidenceMixin): - """Details of energy consumption.""" - - consumption: Optional[float] - """The price per unit of energy consumed.""" - description: Optional[str] - """Description or details of the energy usage.""" - end_date: Optional[str] - """The end date of the energy usage.""" - start_date: Optional[str] - """The start date of the energy usage.""" - tax_rate: Optional[float] - """The rate of tax applied to the total cost.""" - total: Optional[float] - """The total cost of energy consumed.""" - unit: Optional[str] - """The unit of measurement for energy consumption.""" - unit_price: Optional[float] - """The price per unit of energy consumed.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.consumption = to_opt_float(raw_prediction, "consumption") - self.description = raw_prediction["description"] - self.end_date = raw_prediction["end_date"] - self.start_date = raw_prediction["start_date"] - self.tax_rate = to_opt_float(raw_prediction, "tax_rate") - self.total = to_opt_float(raw_prediction, "total") - self.unit = raw_prediction["unit"] - self.unit_price = to_opt_float(raw_prediction, "unit_price") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["consumption"] = float_to_string(self.consumption) - out_dict["description"] = format_for_display(self.description) - out_dict["end_date"] = format_for_display(self.end_date) - out_dict["start_date"] = format_for_display(self.start_date) - out_dict["tax_rate"] = float_to_string(self.tax_rate) - out_dict["total"] = float_to_string(self.total) - out_dict["unit"] = format_for_display(self.unit) - out_dict["unit_price"] = float_to_string(self.unit_price) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["consumption"] = float_to_string(self.consumption) - out_dict["description"] = format_for_display(self.description, 36) - out_dict["end_date"] = format_for_display(self.end_date, 10) - out_dict["start_date"] = format_for_display(self.start_date, None) - out_dict["tax_rate"] = float_to_string(self.tax_rate) - out_dict["total"] = float_to_string(self.total) - out_dict["unit"] = format_for_display(self.unit, None) - out_dict["unit_price"] = float_to_string(self.unit_price) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['consumption']:<11} | " - out_str += f"{printable['description']:<36} | " - out_str += f"{printable['end_date']:<10} | " - out_str += f"{printable['start_date']:<10} | " - out_str += f"{printable['tax_rate']:<8} | " - out_str += f"{printable['total']:<9} | " - out_str += f"{printable['unit']:<15} | " - out_str += f"{printable['unit_price']:<10} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Consumption: {printable['consumption']}, \n" - out_str += f"Description: {printable['description']}, \n" - out_str += f"End Date: {printable['end_date']}, \n" - out_str += f"Start Date: {printable['start_date']}, \n" - out_str += f"Tax Rate: {printable['tax_rate']}, \n" - out_str += f"Total: {printable['total']}, \n" - out_str += f"Unit of Measure: {printable['unit']}, \n" - out_str += f"Unit Price: {printable['unit_price']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/energy_bill/energy_bill_v1_meter_detail.py b/mindee/product/fr/energy_bill/energy_bill_v1_meter_detail.py deleted file mode 100644 index 4d4c160b..00000000 --- a/mindee/product/fr/energy_bill/energy_bill_v1_meter_detail.py +++ /dev/null @@ -1,62 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class EnergyBillV1MeterDetail(FieldPositionMixin, FieldConfidenceMixin): - """Information about the energy meter.""" - - meter_number: Optional[str] - """The unique identifier of the energy meter.""" - meter_type: Optional[str] - """The type of energy meter.""" - unit: Optional[str] - """The unit of power for energy consumption.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.meter_number = raw_prediction["meter_number"] - self.meter_type = raw_prediction["meter_type"] - self.unit = raw_prediction["unit"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["meter_number"] = format_for_display(self.meter_number) - out_dict["meter_type"] = format_for_display(self.meter_type) - out_dict["unit"] = format_for_display(self.unit) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Meter Number: {printable['meter_number']}\n" - out_str += f" :Meter Type: {printable['meter_type']}\n" - out_str += f" :Unit of Power: {printable['unit']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Meter Number: {printable['meter_number']}, \n" - out_str += f"Meter Type: {printable['meter_type']}, \n" - out_str += f"Unit of Power: {printable['unit']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/energy_bill/energy_bill_v1_subscription.py b/mindee/product/fr/energy_bill/energy_bill_v1_subscription.py deleted file mode 100644 index a370f30a..00000000 --- a/mindee/product/fr/energy_bill/energy_bill_v1_subscription.py +++ /dev/null @@ -1,96 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class EnergyBillV1Subscription(FieldPositionMixin, FieldConfidenceMixin): - """The subscription details fee for the energy service.""" - - description: Optional[str] - """Description or details of the subscription.""" - end_date: Optional[str] - """The end date of the subscription.""" - start_date: Optional[str] - """The start date of the subscription.""" - tax_rate: Optional[float] - """The rate of tax applied to the total cost.""" - total: Optional[float] - """The total cost of subscription.""" - unit_price: Optional[float] - """The price per unit of subscription.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.description = raw_prediction["description"] - self.end_date = raw_prediction["end_date"] - self.start_date = raw_prediction["start_date"] - self.tax_rate = to_opt_float(raw_prediction, "tax_rate") - self.total = to_opt_float(raw_prediction, "total") - self.unit_price = to_opt_float(raw_prediction, "unit_price") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["description"] = format_for_display(self.description) - out_dict["end_date"] = format_for_display(self.end_date) - out_dict["start_date"] = format_for_display(self.start_date) - out_dict["tax_rate"] = float_to_string(self.tax_rate) - out_dict["total"] = float_to_string(self.total) - out_dict["unit_price"] = float_to_string(self.unit_price) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["description"] = format_for_display(self.description, 36) - out_dict["end_date"] = format_for_display(self.end_date, 10) - out_dict["start_date"] = format_for_display(self.start_date, None) - out_dict["tax_rate"] = float_to_string(self.tax_rate) - out_dict["total"] = float_to_string(self.total) - out_dict["unit_price"] = float_to_string(self.unit_price) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['description']:<36} | " - out_str += f"{printable['end_date']:<10} | " - out_str += f"{printable['start_date']:<10} | " - out_str += f"{printable['tax_rate']:<8} | " - out_str += f"{printable['total']:<9} | " - out_str += f"{printable['unit_price']:<10} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Description: {printable['description']}, \n" - out_str += f"End Date: {printable['end_date']}, \n" - out_str += f"Start Date: {printable['start_date']}, \n" - out_str += f"Tax Rate: {printable['tax_rate']}, \n" - out_str += f"Total: {printable['total']}, \n" - out_str += f"Unit Price: {printable['unit_price']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/energy_bill/energy_bill_v1_taxes_and_contribution.py b/mindee/product/fr/energy_bill/energy_bill_v1_taxes_and_contribution.py deleted file mode 100644 index ede9191d..00000000 --- a/mindee/product/fr/energy_bill/energy_bill_v1_taxes_and_contribution.py +++ /dev/null @@ -1,96 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class EnergyBillV1TaxesAndContribution(FieldPositionMixin, FieldConfidenceMixin): - """Details of Taxes and Contributions.""" - - description: Optional[str] - """Description or details of the Taxes and Contributions.""" - end_date: Optional[str] - """The end date of the Taxes and Contributions.""" - start_date: Optional[str] - """The start date of the Taxes and Contributions.""" - tax_rate: Optional[float] - """The rate of tax applied to the total cost.""" - total: Optional[float] - """The total cost of Taxes and Contributions.""" - unit_price: Optional[float] - """The price per unit of Taxes and Contributions.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.description = raw_prediction["description"] - self.end_date = raw_prediction["end_date"] - self.start_date = raw_prediction["start_date"] - self.tax_rate = to_opt_float(raw_prediction, "tax_rate") - self.total = to_opt_float(raw_prediction, "total") - self.unit_price = to_opt_float(raw_prediction, "unit_price") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["description"] = format_for_display(self.description) - out_dict["end_date"] = format_for_display(self.end_date) - out_dict["start_date"] = format_for_display(self.start_date) - out_dict["tax_rate"] = float_to_string(self.tax_rate) - out_dict["total"] = float_to_string(self.total) - out_dict["unit_price"] = float_to_string(self.unit_price) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["description"] = format_for_display(self.description, 36) - out_dict["end_date"] = format_for_display(self.end_date, 10) - out_dict["start_date"] = format_for_display(self.start_date, None) - out_dict["tax_rate"] = float_to_string(self.tax_rate) - out_dict["total"] = float_to_string(self.total) - out_dict["unit_price"] = float_to_string(self.unit_price) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['description']:<36} | " - out_str += f"{printable['end_date']:<10} | " - out_str += f"{printable['start_date']:<10} | " - out_str += f"{printable['tax_rate']:<8} | " - out_str += f"{printable['total']:<9} | " - out_str += f"{printable['unit_price']:<10} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Description: {printable['description']}, \n" - out_str += f"End Date: {printable['end_date']}, \n" - out_str += f"Start Date: {printable['start_date']}, \n" - out_str += f"Tax Rate: {printable['tax_rate']}, \n" - out_str += f"Total: {printable['total']}, \n" - out_str += f"Unit Price: {printable['unit_price']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/health_card/__init__.py b/mindee/product/fr/health_card/__init__.py deleted file mode 100644 index af8a3138..00000000 --- a/mindee/product/fr/health_card/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from mindee.product.fr.health_card.health_card_v1 import HealthCardV1 -from mindee.product.fr.health_card.health_card_v1_document import ( - HealthCardV1Document, -) - -__all__ = [ - "HealthCardV1", - "HealthCardV1Document", -] diff --git a/mindee/product/fr/health_card/health_card_v1.py b/mindee/product/fr/health_card/health_card_v1.py deleted file mode 100644 index d3772ccf..00000000 --- a/mindee/product/fr/health_card/health_card_v1.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.fr.health_card.health_card_v1_document import ( - HealthCardV1Document, -) - - -class HealthCardV1(Inference): - """Health Card API version 1 inference prediction.""" - - prediction: HealthCardV1Document - """Document-level prediction.""" - pages: List[Page[HealthCardV1Document]] - """Page-level prediction(s).""" - endpoint_name = "french_healthcard" - """Name of the endpoint.""" - endpoint_version = "1" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - Health Card v1 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = HealthCardV1Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(HealthCardV1Document, page)) diff --git a/mindee/product/fr/health_card/health_card_v1_document.py b/mindee/product/fr/health_card/health_card_v1_document.py deleted file mode 100644 index 27486792..00000000 --- a/mindee/product/fr/health_card/health_card_v1_document.py +++ /dev/null @@ -1,59 +0,0 @@ -from typing import List, Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField - - -class HealthCardV1Document(Prediction): - """Health Card API version 1.0 document data.""" - - given_names: List[StringField] - """The given names of the card holder.""" - issuance_date: DateField - """The date when the carte vitale document was issued.""" - social_security: StringField - """The social security number of the card holder.""" - surname: StringField - """The surname of the card holder.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - Health Card document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.given_names = [ - StringField(prediction, page_id=page_id) - for prediction in raw_prediction["given_names"] - ] - self.issuance_date = DateField( - raw_prediction["issuance_date"], - page_id=page_id, - ) - self.social_security = StringField( - raw_prediction["social_security"], - page_id=page_id, - ) - self.surname = StringField( - raw_prediction["surname"], - page_id=page_id, - ) - - def __str__(self) -> str: - given_names = f"\n {' ' * 15}".join( - [str(item) for item in self.given_names], - ) - out_str: str = f":Given Name(s): {given_names}\n" - out_str += f":Surname: {self.surname}\n" - out_str += f":Social Security Number: {self.social_security}\n" - out_str += f":Issuance Date: {self.issuance_date}\n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/payslip/__init__.py b/mindee/product/fr/payslip/__init__.py deleted file mode 100644 index dad14e0d..00000000 --- a/mindee/product/fr/payslip/__init__.py +++ /dev/null @@ -1,41 +0,0 @@ -from mindee.product.fr.payslip.payslip_v3 import PayslipV3 -from mindee.product.fr.payslip.payslip_v3_bank_account_detail import ( - PayslipV3BankAccountDetail, -) -from mindee.product.fr.payslip.payslip_v3_document import ( - PayslipV3Document, -) -from mindee.product.fr.payslip.payslip_v3_employee import ( - PayslipV3Employee, -) -from mindee.product.fr.payslip.payslip_v3_employer import ( - PayslipV3Employer, -) -from mindee.product.fr.payslip.payslip_v3_employment import ( - PayslipV3Employment, -) -from mindee.product.fr.payslip.payslip_v3_paid_time_off import ( - PayslipV3PaidTimeOff, -) -from mindee.product.fr.payslip.payslip_v3_pay_detail import ( - PayslipV3PayDetail, -) -from mindee.product.fr.payslip.payslip_v3_pay_period import ( - PayslipV3PayPeriod, -) -from mindee.product.fr.payslip.payslip_v3_salary_detail import ( - PayslipV3SalaryDetail, -) - -__all__ = [ - "PayslipV3", - "PayslipV3BankAccountDetail", - "PayslipV3Document", - "PayslipV3Employee", - "PayslipV3Employer", - "PayslipV3Employment", - "PayslipV3PaidTimeOff", - "PayslipV3PayDetail", - "PayslipV3PayPeriod", - "PayslipV3SalaryDetail", -] diff --git a/mindee/product/fr/payslip/payslip_v3.py b/mindee/product/fr/payslip/payslip_v3.py deleted file mode 100644 index 4b2eeec0..00000000 --- a/mindee/product/fr/payslip/payslip_v3.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.fr.payslip.payslip_v3_document import ( - PayslipV3Document, -) - - -class PayslipV3(Inference): - """Payslip API version 3 inference prediction.""" - - prediction: PayslipV3Document - """Document-level prediction.""" - pages: List[Page[PayslipV3Document]] - """Page-level prediction(s).""" - endpoint_name = "payslip_fra" - """Name of the endpoint.""" - endpoint_version = "3" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - Payslip v3 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = PayslipV3Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(PayslipV3Document, page)) diff --git a/mindee/product/fr/payslip/payslip_v3_bank_account_detail.py b/mindee/product/fr/payslip/payslip_v3_bank_account_detail.py deleted file mode 100644 index 7e7fc39b..00000000 --- a/mindee/product/fr/payslip/payslip_v3_bank_account_detail.py +++ /dev/null @@ -1,62 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class PayslipV3BankAccountDetail(FieldPositionMixin, FieldConfidenceMixin): - """Information about the employee's bank account.""" - - bank_name: Optional[str] - """The name of the bank.""" - iban: Optional[str] - """The IBAN of the bank account.""" - swift: Optional[str] - """The SWIFT code of the bank.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.bank_name = raw_prediction["bank_name"] - self.iban = raw_prediction["iban"] - self.swift = raw_prediction["swift"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["bank_name"] = format_for_display(self.bank_name) - out_dict["iban"] = format_for_display(self.iban) - out_dict["swift"] = format_for_display(self.swift) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Bank Name: {printable['bank_name']}\n" - out_str += f" :IBAN: {printable['iban']}\n" - out_str += f" :SWIFT: {printable['swift']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Bank Name: {printable['bank_name']}, \n" - out_str += f"IBAN: {printable['iban']}, \n" - out_str += f"SWIFT: {printable['swift']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/payslip/payslip_v3_document.py b/mindee/product/fr/payslip/payslip_v3_document.py deleted file mode 100644 index fad4b82b..00000000 --- a/mindee/product/fr/payslip/payslip_v3_document.py +++ /dev/null @@ -1,152 +0,0 @@ -from typing import List, Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.product.fr.payslip.payslip_v3_bank_account_detail import ( - PayslipV3BankAccountDetail, -) -from mindee.product.fr.payslip.payslip_v3_employee import PayslipV3Employee -from mindee.product.fr.payslip.payslip_v3_employer import PayslipV3Employer -from mindee.product.fr.payslip.payslip_v3_employment import PayslipV3Employment -from mindee.product.fr.payslip.payslip_v3_paid_time_off import PayslipV3PaidTimeOff -from mindee.product.fr.payslip.payslip_v3_pay_detail import PayslipV3PayDetail -from mindee.product.fr.payslip.payslip_v3_pay_period import PayslipV3PayPeriod -from mindee.product.fr.payslip.payslip_v3_salary_detail import PayslipV3SalaryDetail - - -class PayslipV3Document(Prediction): - """Payslip API version 3.0 document data.""" - - bank_account_details: PayslipV3BankAccountDetail - """Information about the employee's bank account.""" - employee: PayslipV3Employee - """Information about the employee.""" - employer: PayslipV3Employer - """Information about the employer.""" - employment: PayslipV3Employment - """Information about the employment.""" - paid_time_off: List[PayslipV3PaidTimeOff] - """Information about paid time off.""" - pay_detail: PayslipV3PayDetail - """Detailed information about the pay.""" - pay_period: PayslipV3PayPeriod - """Information about the pay period.""" - salary_details: List[PayslipV3SalaryDetail] - """Detailed information about the earnings.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - Payslip document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.bank_account_details = PayslipV3BankAccountDetail( - raw_prediction["bank_account_details"], - page_id=page_id, - ) - self.employee = PayslipV3Employee( - raw_prediction["employee"], - page_id=page_id, - ) - self.employer = PayslipV3Employer( - raw_prediction["employer"], - page_id=page_id, - ) - self.employment = PayslipV3Employment( - raw_prediction["employment"], - page_id=page_id, - ) - self.paid_time_off = [ - PayslipV3PaidTimeOff(prediction, page_id=page_id) - for prediction in raw_prediction["paid_time_off"] - ] - self.pay_detail = PayslipV3PayDetail( - raw_prediction["pay_detail"], - page_id=page_id, - ) - self.pay_period = PayslipV3PayPeriod( - raw_prediction["pay_period"], - page_id=page_id, - ) - self.salary_details = [ - PayslipV3SalaryDetail(prediction, page_id=page_id) - for prediction in raw_prediction["salary_details"] - ] - - @staticmethod - def _salary_details_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 14}" - out_str += f"+{char * 11}" - out_str += f"+{char * 38}" - out_str += f"+{char * 8}" - out_str += f"+{char * 11}" - return out_str + "+" - - def _salary_details_to_str(self) -> str: - if not self.salary_details: - return "" - - lines = f"\n{self._salary_details_separator('-')}\n ".join( - [item.to_table_line() for item in self.salary_details] - ) - out_str = "" - out_str += f"\n{self._salary_details_separator('-')}\n " - out_str += " | Amount " - out_str += " | Base " - out_str += " | Description " - out_str += " | Number" - out_str += " | Rate " - out_str += f" |\n{self._salary_details_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._salary_details_separator('-')}" - return out_str - - @staticmethod - def _paid_time_off_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 11}" - out_str += f"+{char * 8}" - out_str += f"+{char * 13}" - out_str += f"+{char * 11}" - out_str += f"+{char * 11}" - return out_str + "+" - - def _paid_time_off_to_str(self) -> str: - if not self.paid_time_off: - return "" - - lines = f"\n{self._paid_time_off_separator('-')}\n ".join( - [item.to_table_line() for item in self.paid_time_off] - ) - out_str = "" - out_str += f"\n{self._paid_time_off_separator('-')}\n " - out_str += " | Accrued " - out_str += " | Period" - out_str += " | Type " - out_str += " | Remaining" - out_str += " | Used " - out_str += f" |\n{self._paid_time_off_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._paid_time_off_separator('-')}" - return out_str - - def __str__(self) -> str: - out_str: str = f":Pay Period:\n{self.pay_period.to_field_list()}\n" - out_str += f":Employee:\n{self.employee.to_field_list()}\n" - out_str += f":Employer:\n{self.employer.to_field_list()}\n" - out_str += ( - f":Bank Account Details:\n{self.bank_account_details.to_field_list()}\n" - ) - out_str += f":Employment:\n{self.employment.to_field_list()}\n" - out_str += f":Salary Details: {self._salary_details_to_str()}\n" - out_str += f":Pay Detail:\n{self.pay_detail.to_field_list()}\n" - out_str += f":Paid Time Off: {self._paid_time_off_to_str()}\n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/payslip/payslip_v3_employee.py b/mindee/product/fr/payslip/payslip_v3_employee.py deleted file mode 100644 index d7f42251..00000000 --- a/mindee/product/fr/payslip/payslip_v3_employee.py +++ /dev/null @@ -1,88 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class PayslipV3Employee(FieldPositionMixin, FieldConfidenceMixin): - """Information about the employee.""" - - address: Optional[str] - """The address of the employee.""" - date_of_birth: Optional[str] - """The date of birth of the employee.""" - first_name: Optional[str] - """The first name of the employee.""" - last_name: Optional[str] - """The last name of the employee.""" - phone_number: Optional[str] - """The phone number of the employee.""" - registration_number: Optional[str] - """The registration number of the employee.""" - social_security_number: Optional[str] - """The social security number of the employee.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.address = raw_prediction["address"] - self.date_of_birth = raw_prediction["date_of_birth"] - self.first_name = raw_prediction["first_name"] - self.last_name = raw_prediction["last_name"] - self.phone_number = raw_prediction["phone_number"] - self.registration_number = raw_prediction["registration_number"] - self.social_security_number = raw_prediction["social_security_number"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["address"] = format_for_display(self.address) - out_dict["date_of_birth"] = format_for_display(self.date_of_birth) - out_dict["first_name"] = format_for_display(self.first_name) - out_dict["last_name"] = format_for_display(self.last_name) - out_dict["phone_number"] = format_for_display(self.phone_number) - out_dict["registration_number"] = format_for_display(self.registration_number) - out_dict["social_security_number"] = format_for_display( - self.social_security_number - ) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Address: {printable['address']}\n" - out_str += f" :Date of Birth: {printable['date_of_birth']}\n" - out_str += f" :First Name: {printable['first_name']}\n" - out_str += f" :Last Name: {printable['last_name']}\n" - out_str += f" :Phone Number: {printable['phone_number']}\n" - out_str += f" :Registration Number: {printable['registration_number']}\n" - out_str += f" :Social Security Number: {printable['social_security_number']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Address: {printable['address']}, \n" - out_str += f"Date of Birth: {printable['date_of_birth']}, \n" - out_str += f"First Name: {printable['first_name']}, \n" - out_str += f"Last Name: {printable['last_name']}, \n" - out_str += f"Phone Number: {printable['phone_number']}, \n" - out_str += f"Registration Number: {printable['registration_number']}, \n" - out_str += f"Social Security Number: {printable['social_security_number']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/payslip/payslip_v3_employer.py b/mindee/product/fr/payslip/payslip_v3_employer.py deleted file mode 100644 index f53d1c61..00000000 --- a/mindee/product/fr/payslip/payslip_v3_employer.py +++ /dev/null @@ -1,86 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class PayslipV3Employer(FieldPositionMixin, FieldConfidenceMixin): - """Information about the employer.""" - - address: Optional[str] - """The address of the employer.""" - company_id: Optional[str] - """The company ID of the employer.""" - company_site: Optional[str] - """The site of the company.""" - naf_code: Optional[str] - """The NAF code of the employer.""" - name: Optional[str] - """The name of the employer.""" - phone_number: Optional[str] - """The phone number of the employer.""" - urssaf_number: Optional[str] - """The URSSAF number of the employer.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.address = raw_prediction["address"] - self.company_id = raw_prediction["company_id"] - self.company_site = raw_prediction["company_site"] - self.naf_code = raw_prediction["naf_code"] - self.name = raw_prediction["name"] - self.phone_number = raw_prediction["phone_number"] - self.urssaf_number = raw_prediction["urssaf_number"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["address"] = format_for_display(self.address) - out_dict["company_id"] = format_for_display(self.company_id) - out_dict["company_site"] = format_for_display(self.company_site) - out_dict["naf_code"] = format_for_display(self.naf_code) - out_dict["name"] = format_for_display(self.name) - out_dict["phone_number"] = format_for_display(self.phone_number) - out_dict["urssaf_number"] = format_for_display(self.urssaf_number) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Address: {printable['address']}\n" - out_str += f" :Company ID: {printable['company_id']}\n" - out_str += f" :Company Site: {printable['company_site']}\n" - out_str += f" :NAF Code: {printable['naf_code']}\n" - out_str += f" :Name: {printable['name']}\n" - out_str += f" :Phone Number: {printable['phone_number']}\n" - out_str += f" :URSSAF Number: {printable['urssaf_number']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Address: {printable['address']}, \n" - out_str += f"Company ID: {printable['company_id']}, \n" - out_str += f"Company Site: {printable['company_site']}, \n" - out_str += f"NAF Code: {printable['naf_code']}, \n" - out_str += f"Name: {printable['name']}, \n" - out_str += f"Phone Number: {printable['phone_number']}, \n" - out_str += f"URSSAF Number: {printable['urssaf_number']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/payslip/payslip_v3_employment.py b/mindee/product/fr/payslip/payslip_v3_employment.py deleted file mode 100644 index 92c67e32..00000000 --- a/mindee/product/fr/payslip/payslip_v3_employment.py +++ /dev/null @@ -1,86 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class PayslipV3Employment(FieldPositionMixin, FieldConfidenceMixin): - """Information about the employment.""" - - category: Optional[str] - """The category of the employment.""" - coefficient: Optional[str] - """The coefficient of the employment.""" - collective_agreement: Optional[str] - """The collective agreement of the employment.""" - job_title: Optional[str] - """The job title of the employee.""" - position_level: Optional[str] - """The position level of the employment.""" - seniority_date: Optional[str] - """The seniority date of the employment.""" - start_date: Optional[str] - """The start date of the employment.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.category = raw_prediction["category"] - self.coefficient = raw_prediction["coefficient"] - self.collective_agreement = raw_prediction["collective_agreement"] - self.job_title = raw_prediction["job_title"] - self.position_level = raw_prediction["position_level"] - self.seniority_date = raw_prediction["seniority_date"] - self.start_date = raw_prediction["start_date"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["category"] = format_for_display(self.category) - out_dict["coefficient"] = format_for_display(self.coefficient) - out_dict["collective_agreement"] = format_for_display(self.collective_agreement) - out_dict["job_title"] = format_for_display(self.job_title) - out_dict["position_level"] = format_for_display(self.position_level) - out_dict["seniority_date"] = format_for_display(self.seniority_date) - out_dict["start_date"] = format_for_display(self.start_date) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Category: {printable['category']}\n" - out_str += f" :Coefficient: {printable['coefficient']}\n" - out_str += f" :Collective Agreement: {printable['collective_agreement']}\n" - out_str += f" :Job Title: {printable['job_title']}\n" - out_str += f" :Position Level: {printable['position_level']}\n" - out_str += f" :Seniority Date: {printable['seniority_date']}\n" - out_str += f" :Start Date: {printable['start_date']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Category: {printable['category']}, \n" - out_str += f"Coefficient: {printable['coefficient']}, \n" - out_str += f"Collective Agreement: {printable['collective_agreement']}, \n" - out_str += f"Job Title: {printable['job_title']}, \n" - out_str += f"Position Level: {printable['position_level']}, \n" - out_str += f"Seniority Date: {printable['seniority_date']}, \n" - out_str += f"Start Date: {printable['start_date']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/payslip/payslip_v3_paid_time_off.py b/mindee/product/fr/payslip/payslip_v3_paid_time_off.py deleted file mode 100644 index fe4e6f7f..00000000 --- a/mindee/product/fr/payslip/payslip_v3_paid_time_off.py +++ /dev/null @@ -1,89 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class PayslipV3PaidTimeOff(FieldPositionMixin, FieldConfidenceMixin): - """Information about paid time off.""" - - accrued: Optional[float] - """The amount of paid time off accrued in the period.""" - period: Optional[str] - """The paid time off period.""" - pto_type: Optional[str] - """The type of paid time off.""" - remaining: Optional[float] - """The remaining amount of paid time off at the end of the period.""" - used: Optional[float] - """The amount of paid time off used in the period.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.accrued = to_opt_float(raw_prediction, "accrued") - self.period = raw_prediction["period"] - self.pto_type = raw_prediction["pto_type"] - self.remaining = to_opt_float(raw_prediction, "remaining") - self.used = to_opt_float(raw_prediction, "used") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["accrued"] = float_to_string(self.accrued) - out_dict["period"] = format_for_display(self.period) - out_dict["pto_type"] = format_for_display(self.pto_type) - out_dict["remaining"] = float_to_string(self.remaining) - out_dict["used"] = float_to_string(self.used) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["accrued"] = float_to_string(self.accrued) - out_dict["period"] = format_for_display(self.period, 6) - out_dict["pto_type"] = format_for_display(self.pto_type, 11) - out_dict["remaining"] = float_to_string(self.remaining) - out_dict["used"] = float_to_string(self.used) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['accrued']:<9} | " - out_str += f"{printable['period']:<6} | " - out_str += f"{printable['pto_type']:<11} | " - out_str += f"{printable['remaining']:<9} | " - out_str += f"{printable['used']:<9} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Accrued: {printable['accrued']}, \n" - out_str += f"Period: {printable['period']}, \n" - out_str += f"Type: {printable['pto_type']}, \n" - out_str += f"Remaining: {printable['remaining']}, \n" - out_str += f"Used: {printable['used']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/payslip/payslip_v3_pay_detail.py b/mindee/product/fr/payslip/payslip_v3_pay_detail.py deleted file mode 100644 index a9bd183f..00000000 --- a/mindee/product/fr/payslip/payslip_v3_pay_detail.py +++ /dev/null @@ -1,115 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class PayslipV3PayDetail(FieldPositionMixin, FieldConfidenceMixin): - """Detailed information about the pay.""" - - gross_salary: Optional[float] - """The gross salary of the employee.""" - gross_salary_ytd: Optional[float] - """The year-to-date gross salary of the employee.""" - income_tax_rate: Optional[float] - """The income tax rate of the employee.""" - income_tax_withheld: Optional[float] - """The income tax withheld from the employee's pay.""" - net_paid: Optional[float] - """The net paid amount of the employee.""" - net_paid_before_tax: Optional[float] - """The net paid amount before tax of the employee.""" - net_taxable: Optional[float] - """The net taxable amount of the employee.""" - net_taxable_ytd: Optional[float] - """The year-to-date net taxable amount of the employee.""" - total_cost_employer: Optional[float] - """The total cost to the employer.""" - total_taxes_and_deductions: Optional[float] - """The total taxes and deductions of the employee.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.gross_salary = to_opt_float(raw_prediction, "gross_salary") - self.gross_salary_ytd = to_opt_float(raw_prediction, "gross_salary_ytd") - self.income_tax_rate = to_opt_float(raw_prediction, "income_tax_rate") - self.income_tax_withheld = to_opt_float(raw_prediction, "income_tax_withheld") - self.net_paid = to_opt_float(raw_prediction, "net_paid") - self.net_paid_before_tax = to_opt_float(raw_prediction, "net_paid_before_tax") - self.net_taxable = to_opt_float(raw_prediction, "net_taxable") - self.net_taxable_ytd = to_opt_float(raw_prediction, "net_taxable_ytd") - self.total_cost_employer = to_opt_float(raw_prediction, "total_cost_employer") - self.total_taxes_and_deductions = to_opt_float( - raw_prediction, "total_taxes_and_deductions" - ) - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["gross_salary"] = float_to_string(self.gross_salary) - out_dict["gross_salary_ytd"] = float_to_string(self.gross_salary_ytd) - out_dict["income_tax_rate"] = float_to_string(self.income_tax_rate) - out_dict["income_tax_withheld"] = float_to_string(self.income_tax_withheld) - out_dict["net_paid"] = float_to_string(self.net_paid) - out_dict["net_paid_before_tax"] = float_to_string(self.net_paid_before_tax) - out_dict["net_taxable"] = float_to_string(self.net_taxable) - out_dict["net_taxable_ytd"] = float_to_string(self.net_taxable_ytd) - out_dict["total_cost_employer"] = float_to_string(self.total_cost_employer) - out_dict["total_taxes_and_deductions"] = float_to_string( - self.total_taxes_and_deductions - ) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Gross Salary: {printable['gross_salary']}\n" - out_str += f" :Gross Salary YTD: {printable['gross_salary_ytd']}\n" - out_str += f" :Income Tax Rate: {printable['income_tax_rate']}\n" - out_str += f" :Income Tax Withheld: {printable['income_tax_withheld']}\n" - out_str += f" :Net Paid: {printable['net_paid']}\n" - out_str += f" :Net Paid Before Tax: {printable['net_paid_before_tax']}\n" - out_str += f" :Net Taxable: {printable['net_taxable']}\n" - out_str += f" :Net Taxable YTD: {printable['net_taxable_ytd']}\n" - out_str += f" :Total Cost Employer: {printable['total_cost_employer']}\n" - out_str += f" :Total Taxes and Deductions: {printable['total_taxes_and_deductions']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Gross Salary: {printable['gross_salary']}, \n" - out_str += f"Gross Salary YTD: {printable['gross_salary_ytd']}, \n" - out_str += f"Income Tax Rate: {printable['income_tax_rate']}, \n" - out_str += f"Income Tax Withheld: {printable['income_tax_withheld']}, \n" - out_str += f"Net Paid: {printable['net_paid']}, \n" - out_str += f"Net Paid Before Tax: {printable['net_paid_before_tax']}, \n" - out_str += f"Net Taxable: {printable['net_taxable']}, \n" - out_str += f"Net Taxable YTD: {printable['net_taxable_ytd']}, \n" - out_str += f"Total Cost Employer: {printable['total_cost_employer']}, \n" - out_str += ( - f"Total Taxes and Deductions: {printable['total_taxes_and_deductions']}, \n" - ) - return clean_out_string(out_str) diff --git a/mindee/product/fr/payslip/payslip_v3_pay_period.py b/mindee/product/fr/payslip/payslip_v3_pay_period.py deleted file mode 100644 index c7ed38f9..00000000 --- a/mindee/product/fr/payslip/payslip_v3_pay_period.py +++ /dev/null @@ -1,74 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class PayslipV3PayPeriod(FieldPositionMixin, FieldConfidenceMixin): - """Information about the pay period.""" - - end_date: Optional[str] - """The end date of the pay period.""" - month: Optional[str] - """The month of the pay period.""" - payment_date: Optional[str] - """The date of payment for the pay period.""" - start_date: Optional[str] - """The start date of the pay period.""" - year: Optional[str] - """The year of the pay period.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.end_date = raw_prediction["end_date"] - self.month = raw_prediction["month"] - self.payment_date = raw_prediction["payment_date"] - self.start_date = raw_prediction["start_date"] - self.year = raw_prediction["year"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["end_date"] = format_for_display(self.end_date) - out_dict["month"] = format_for_display(self.month) - out_dict["payment_date"] = format_for_display(self.payment_date) - out_dict["start_date"] = format_for_display(self.start_date) - out_dict["year"] = format_for_display(self.year) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :End Date: {printable['end_date']}\n" - out_str += f" :Month: {printable['month']}\n" - out_str += f" :Payment Date: {printable['payment_date']}\n" - out_str += f" :Start Date: {printable['start_date']}\n" - out_str += f" :Year: {printable['year']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"End Date: {printable['end_date']}, \n" - out_str += f"Month: {printable['month']}, \n" - out_str += f"Payment Date: {printable['payment_date']}, \n" - out_str += f"Start Date: {printable['start_date']}, \n" - out_str += f"Year: {printable['year']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/fr/payslip/payslip_v3_salary_detail.py b/mindee/product/fr/payslip/payslip_v3_salary_detail.py deleted file mode 100644 index 324ab105..00000000 --- a/mindee/product/fr/payslip/payslip_v3_salary_detail.py +++ /dev/null @@ -1,89 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class PayslipV3SalaryDetail(FieldPositionMixin, FieldConfidenceMixin): - """Detailed information about the earnings.""" - - amount: Optional[float] - """The amount of the earning.""" - base: Optional[float] - """The base rate value of the earning.""" - description: Optional[str] - """The description of the earnings.""" - number: Optional[float] - """The number of units in the earning.""" - rate: Optional[float] - """The rate of the earning.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.amount = to_opt_float(raw_prediction, "amount") - self.base = to_opt_float(raw_prediction, "base") - self.description = raw_prediction["description"] - self.number = to_opt_float(raw_prediction, "number") - self.rate = to_opt_float(raw_prediction, "rate") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["amount"] = float_to_string(self.amount) - out_dict["base"] = float_to_string(self.base) - out_dict["description"] = format_for_display(self.description) - out_dict["number"] = float_to_string(self.number) - out_dict["rate"] = float_to_string(self.rate) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["amount"] = float_to_string(self.amount) - out_dict["base"] = float_to_string(self.base) - out_dict["description"] = format_for_display(self.description, 36) - out_dict["number"] = float_to_string(self.number) - out_dict["rate"] = float_to_string(self.rate) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['amount']:<12} | " - out_str += f"{printable['base']:<9} | " - out_str += f"{printable['description']:<36} | " - out_str += f"{printable['number']:<6} | " - out_str += f"{printable['rate']:<9} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Amount: {printable['amount']}, \n" - out_str += f"Base: {printable['base']}, \n" - out_str += f"Description: {printable['description']}, \n" - out_str += f"Number: {printable['number']}, \n" - out_str += f"Rate: {printable['rate']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/ind/__init__.py b/mindee/product/ind/__init__.py deleted file mode 100644 index aac8be5f..00000000 --- a/mindee/product/ind/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from mindee.product.ind.indian_passport.indian_passport_v1 import IndianPassportV1 -from mindee.product.ind.indian_passport.indian_passport_v1_document import ( - IndianPassportV1Document, -) - -__all__ = [ - "IndianPassportV1", - "IndianPassportV1Document", -] diff --git a/mindee/product/ind/indian_passport/__init__.py b/mindee/product/ind/indian_passport/__init__.py deleted file mode 100644 index aac8be5f..00000000 --- a/mindee/product/ind/indian_passport/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from mindee.product.ind.indian_passport.indian_passport_v1 import IndianPassportV1 -from mindee.product.ind.indian_passport.indian_passport_v1_document import ( - IndianPassportV1Document, -) - -__all__ = [ - "IndianPassportV1", - "IndianPassportV1Document", -] diff --git a/mindee/product/ind/indian_passport/indian_passport_v1.py b/mindee/product/ind/indian_passport/indian_passport_v1.py deleted file mode 100644 index 2a676f5f..00000000 --- a/mindee/product/ind/indian_passport/indian_passport_v1.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.ind.indian_passport.indian_passport_v1_document import ( - IndianPassportV1Document, -) - - -class IndianPassportV1(Inference): - """Passport - India API version 1 inference prediction.""" - - prediction: IndianPassportV1Document - """Document-level prediction.""" - pages: List[Page[IndianPassportV1Document]] - """Page-level prediction(s).""" - endpoint_name = "ind_passport" - """Name of the endpoint.""" - endpoint_version = "1" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - Passport - India v1 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = IndianPassportV1Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(IndianPassportV1Document, page)) diff --git a/mindee/product/ind/indian_passport/indian_passport_v1_document.py b/mindee/product/ind/indian_passport/indian_passport_v1_document.py deleted file mode 100644 index 0576129f..00000000 --- a/mindee/product/ind/indian_passport/indian_passport_v1_document.py +++ /dev/null @@ -1,190 +0,0 @@ -from typing import Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.classification import ClassificationField -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField - - -class IndianPassportV1Document(Prediction): - """Passport - India API version 1.2 document data.""" - - address1: StringField - """The first line of the address of the passport holder.""" - address2: StringField - """The second line of the address of the passport holder.""" - address3: StringField - """The third line of the address of the passport holder.""" - birth_date: DateField - """The birth date of the passport holder, ISO format: YYYY-MM-DD.""" - birth_place: StringField - """The birth place of the passport holder.""" - country: StringField - """ISO 3166-1 alpha-3 country code (3 letters format).""" - expiry_date: DateField - """The date when the passport will expire, ISO format: YYYY-MM-DD.""" - file_number: StringField - """The file number of the passport document.""" - gender: ClassificationField - """The gender of the passport holder.""" - given_names: StringField - """The given names of the passport holder.""" - id_number: StringField - """The identification number of the passport document.""" - issuance_date: DateField - """The date when the passport was issued, ISO format: YYYY-MM-DD.""" - issuance_place: StringField - """The place where the passport was issued.""" - legal_guardian: StringField - """The name of the legal guardian of the passport holder (if applicable).""" - mrz1: StringField - """The first line of the machine-readable zone (MRZ) of the passport document.""" - mrz2: StringField - """The second line of the machine-readable zone (MRZ) of the passport document.""" - name_of_mother: StringField - """The name of the mother of the passport holder.""" - name_of_spouse: StringField - """The name of the spouse of the passport holder (if applicable).""" - old_passport_date_of_issue: DateField - """The date of issue of the old passport (if applicable), ISO format: YYYY-MM-DD.""" - old_passport_number: StringField - """The number of the old passport (if applicable).""" - old_passport_place_of_issue: StringField - """The place of issue of the old passport (if applicable).""" - page_number: ClassificationField - """The page number of the passport document.""" - surname: StringField - """The surname of the passport holder.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - Passport - India document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.address1 = StringField( - raw_prediction["address1"], - page_id=page_id, - ) - self.address2 = StringField( - raw_prediction["address2"], - page_id=page_id, - ) - self.address3 = StringField( - raw_prediction["address3"], - page_id=page_id, - ) - self.birth_date = DateField( - raw_prediction["birth_date"], - page_id=page_id, - ) - self.birth_place = StringField( - raw_prediction["birth_place"], - page_id=page_id, - ) - self.country = StringField( - raw_prediction["country"], - page_id=page_id, - ) - self.expiry_date = DateField( - raw_prediction["expiry_date"], - page_id=page_id, - ) - self.file_number = StringField( - raw_prediction["file_number"], - page_id=page_id, - ) - self.gender = ClassificationField( - raw_prediction["gender"], - page_id=page_id, - ) - self.given_names = StringField( - raw_prediction["given_names"], - page_id=page_id, - ) - self.id_number = StringField( - raw_prediction["id_number"], - page_id=page_id, - ) - self.issuance_date = DateField( - raw_prediction["issuance_date"], - page_id=page_id, - ) - self.issuance_place = StringField( - raw_prediction["issuance_place"], - page_id=page_id, - ) - self.legal_guardian = StringField( - raw_prediction["legal_guardian"], - page_id=page_id, - ) - self.mrz1 = StringField( - raw_prediction["mrz1"], - page_id=page_id, - ) - self.mrz2 = StringField( - raw_prediction["mrz2"], - page_id=page_id, - ) - self.name_of_mother = StringField( - raw_prediction["name_of_mother"], - page_id=page_id, - ) - self.name_of_spouse = StringField( - raw_prediction["name_of_spouse"], - page_id=page_id, - ) - self.old_passport_date_of_issue = DateField( - raw_prediction["old_passport_date_of_issue"], - page_id=page_id, - ) - self.old_passport_number = StringField( - raw_prediction["old_passport_number"], - page_id=page_id, - ) - self.old_passport_place_of_issue = StringField( - raw_prediction["old_passport_place_of_issue"], - page_id=page_id, - ) - self.page_number = ClassificationField( - raw_prediction["page_number"], - page_id=page_id, - ) - self.surname = StringField( - raw_prediction["surname"], - page_id=page_id, - ) - - def __str__(self) -> str: - out_str: str = f":Page Number: {self.page_number}\n" - out_str += f":Country: {self.country}\n" - out_str += f":ID Number: {self.id_number}\n" - out_str += f":Given Names: {self.given_names}\n" - out_str += f":Surname: {self.surname}\n" - out_str += f":Birth Date: {self.birth_date}\n" - out_str += f":Birth Place: {self.birth_place}\n" - out_str += f":Issuance Place: {self.issuance_place}\n" - out_str += f":Gender: {self.gender}\n" - out_str += f":Issuance Date: {self.issuance_date}\n" - out_str += f":Expiry Date: {self.expiry_date}\n" - out_str += f":MRZ Line 1: {self.mrz1}\n" - out_str += f":MRZ Line 2: {self.mrz2}\n" - out_str += f":Legal Guardian: {self.legal_guardian}\n" - out_str += f":Name of Spouse: {self.name_of_spouse}\n" - out_str += f":Name of Mother: {self.name_of_mother}\n" - out_str += f":Old Passport Date of Issue: {self.old_passport_date_of_issue}\n" - out_str += f":Old Passport Number: {self.old_passport_number}\n" - out_str += f":Old Passport Place of Issue: {self.old_passport_place_of_issue}\n" - out_str += f":Address Line 1: {self.address1}\n" - out_str += f":Address Line 2: {self.address2}\n" - out_str += f":Address Line 3: {self.address3}\n" - out_str += f":File Number: {self.file_number}\n" - return clean_out_string(out_str) diff --git a/mindee/product/material_certificate/__init__.py b/mindee/product/material_certificate/__init__.py deleted file mode 100644 index e0a8dbd3..00000000 --- a/mindee/product/material_certificate/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from mindee.product.material_certificate.material_certificate_v1 import ( - MaterialCertificateV1, -) -from mindee.product.material_certificate.material_certificate_v1_document import ( - MaterialCertificateV1Document, -) - -__all__ = [ - "MaterialCertificateV1", - "MaterialCertificateV1Document", -] diff --git a/mindee/product/material_certificate/material_certificate_v1.py b/mindee/product/material_certificate/material_certificate_v1.py deleted file mode 100644 index 9b3efd5b..00000000 --- a/mindee/product/material_certificate/material_certificate_v1.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.material_certificate.material_certificate_v1_document import ( - MaterialCertificateV1Document, -) - - -class MaterialCertificateV1(Inference): - """Material Certificate API version 1 inference prediction.""" - - prediction: MaterialCertificateV1Document - """Document-level prediction.""" - pages: List[Page[MaterialCertificateV1Document]] - """Page-level prediction(s).""" - endpoint_name = "material_certificate" - """Name of the endpoint.""" - endpoint_version = "1" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - Material Certificate v1 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = MaterialCertificateV1Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(MaterialCertificateV1Document, page)) diff --git a/mindee/product/material_certificate/material_certificate_v1_document.py b/mindee/product/material_certificate/material_certificate_v1_document.py deleted file mode 100644 index 78c5d657..00000000 --- a/mindee/product/material_certificate/material_certificate_v1_document.py +++ /dev/null @@ -1,48 +0,0 @@ -from typing import Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.text import StringField - - -class MaterialCertificateV1Document(Prediction): - """Material Certificate API version 1.0 document data.""" - - certificate_type: StringField - """The type of certification.""" - heat_number: StringField - """Heat Number is a unique identifier assigned to a batch of material produced in a manufacturing process.""" - norm: StringField - """The international standard used for certification.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - Material Certificate document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.certificate_type = StringField( - raw_prediction["certificate_type"], - page_id=page_id, - ) - self.heat_number = StringField( - raw_prediction["heat_number"], - page_id=page_id, - ) - self.norm = StringField( - raw_prediction["norm"], - page_id=page_id, - ) - - def __str__(self) -> str: - out_str: str = f":Certificate Type: {self.certificate_type}\n" - out_str += f":Norm: {self.norm}\n" - out_str += f":Heat Number: {self.heat_number}\n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/__init__.py b/mindee/product/nutrition_facts_label/__init__.py deleted file mode 100644 index e2df071e..00000000 --- a/mindee/product/nutrition_facts_label/__init__.py +++ /dev/null @@ -1,64 +0,0 @@ -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1 import ( - NutritionFactsLabelV1, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_added_sugar import ( - NutritionFactsLabelV1AddedSugar, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_calorie import ( - NutritionFactsLabelV1Calorie, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_cholesterol import ( - NutritionFactsLabelV1Cholesterol, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_dietary_fiber import ( - NutritionFactsLabelV1DietaryFiber, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_document import ( - NutritionFactsLabelV1Document, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_nutrient import ( - NutritionFactsLabelV1Nutrient, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_protein import ( - NutritionFactsLabelV1Protein, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_saturated_fat import ( - NutritionFactsLabelV1SaturatedFat, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_serving_size import ( - NutritionFactsLabelV1ServingSize, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_sodium import ( - NutritionFactsLabelV1Sodium, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_total_carbohydrate import ( - NutritionFactsLabelV1TotalCarbohydrate, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_total_fat import ( - NutritionFactsLabelV1TotalFat, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_total_sugar import ( - NutritionFactsLabelV1TotalSugar, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_trans_fat import ( - NutritionFactsLabelV1TransFat, -) - - -__all__ = [ - "NutritionFactsLabelV1", - "NutritionFactsLabelV1Document", - "NutritionFactsLabelV1Nutrient", - "NutritionFactsLabelV1Protein", - "NutritionFactsLabelV1TransFat", - "NutritionFactsLabelV1TotalSugar", - "NutritionFactsLabelV1TotalFat", - "NutritionFactsLabelV1TotalCarbohydrate", - "NutritionFactsLabelV1Sodium", - "NutritionFactsLabelV1ServingSize", - "NutritionFactsLabelV1SaturatedFat", - "NutritionFactsLabelV1AddedSugar", - "NutritionFactsLabelV1DietaryFiber", - "NutritionFactsLabelV1Cholesterol", - "NutritionFactsLabelV1Calorie", -] diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1.py deleted file mode 100644 index 129110be..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_document import ( - NutritionFactsLabelV1Document, -) - - -class NutritionFactsLabelV1(Inference): - """Nutrition Facts Label API version 1 inference prediction.""" - - prediction: NutritionFactsLabelV1Document - """Document-level prediction.""" - pages: List[Page[NutritionFactsLabelV1Document]] - """Page-level prediction(s).""" - endpoint_name = "nutrition_facts" - """Name of the endpoint.""" - endpoint_version = "1" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - Nutrition Facts Label v1 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = NutritionFactsLabelV1Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(NutritionFactsLabelV1Document, page)) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_added_sugar.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_added_sugar.py deleted file mode 100644 index 70d03e68..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_added_sugar.py +++ /dev/null @@ -1,67 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1AddedSugar(FieldPositionMixin, FieldConfidenceMixin): - """The amount of added sugars in the product.""" - - daily_value: Optional[float] - """DVs are the recommended amounts of added sugars to consume or not to exceed each day.""" - per_100g: Optional[float] - """The amount of added sugars per 100g of the product.""" - per_serving: Optional[float] - """The amount of added sugars per serving of the product.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.daily_value = to_opt_float(raw_prediction, "daily_value") - self.per_100g = to_opt_float(raw_prediction, "per_100g") - self.per_serving = to_opt_float(raw_prediction, "per_serving") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Daily Value: {printable['daily_value']}\n" - out_str += f" :Per 100g: {printable['per_100g']}\n" - out_str += f" :Per Serving: {printable['per_serving']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Daily Value: {printable['daily_value']}, \n" - out_str += f"Per 100g: {printable['per_100g']}, \n" - out_str += f"Per Serving: {printable['per_serving']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_calorie.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_calorie.py deleted file mode 100644 index 4da5bba2..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_calorie.py +++ /dev/null @@ -1,67 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1Calorie(FieldPositionMixin, FieldConfidenceMixin): - """The amount of calories in the product.""" - - daily_value: Optional[float] - """DVs are the recommended amounts of calories to consume or not to exceed each day.""" - per_100g: Optional[float] - """The amount of calories per 100g of the product.""" - per_serving: Optional[float] - """The amount of calories per serving of the product.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.daily_value = to_opt_float(raw_prediction, "daily_value") - self.per_100g = to_opt_float(raw_prediction, "per_100g") - self.per_serving = to_opt_float(raw_prediction, "per_serving") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Daily Value: {printable['daily_value']}\n" - out_str += f" :Per 100g: {printable['per_100g']}\n" - out_str += f" :Per Serving: {printable['per_serving']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Daily Value: {printable['daily_value']}, \n" - out_str += f"Per 100g: {printable['per_100g']}, \n" - out_str += f"Per Serving: {printable['per_serving']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_cholesterol.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_cholesterol.py deleted file mode 100644 index 579d6135..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_cholesterol.py +++ /dev/null @@ -1,67 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1Cholesterol(FieldPositionMixin, FieldConfidenceMixin): - """The amount of cholesterol in the product.""" - - daily_value: Optional[float] - """DVs are the recommended amounts of cholesterol to consume or not to exceed each day.""" - per_100g: Optional[float] - """The amount of cholesterol per 100g of the product.""" - per_serving: Optional[float] - """The amount of cholesterol per serving of the product.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.daily_value = to_opt_float(raw_prediction, "daily_value") - self.per_100g = to_opt_float(raw_prediction, "per_100g") - self.per_serving = to_opt_float(raw_prediction, "per_serving") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Daily Value: {printable['daily_value']}\n" - out_str += f" :Per 100g: {printable['per_100g']}\n" - out_str += f" :Per Serving: {printable['per_serving']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Daily Value: {printable['daily_value']}, \n" - out_str += f"Per 100g: {printable['per_100g']}, \n" - out_str += f"Per Serving: {printable['per_serving']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_dietary_fiber.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_dietary_fiber.py deleted file mode 100644 index 0a560286..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_dietary_fiber.py +++ /dev/null @@ -1,67 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1DietaryFiber(FieldPositionMixin, FieldConfidenceMixin): - """The amount of dietary fiber in the product.""" - - daily_value: Optional[float] - """DVs are the recommended amounts of dietary fiber to consume or not to exceed each day.""" - per_100g: Optional[float] - """The amount of dietary fiber per 100g of the product.""" - per_serving: Optional[float] - """The amount of dietary fiber per serving of the product.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.daily_value = to_opt_float(raw_prediction, "daily_value") - self.per_100g = to_opt_float(raw_prediction, "per_100g") - self.per_serving = to_opt_float(raw_prediction, "per_serving") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Daily Value: {printable['daily_value']}\n" - out_str += f" :Per 100g: {printable['per_100g']}\n" - out_str += f" :Per Serving: {printable['per_serving']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Daily Value: {printable['daily_value']}, \n" - out_str += f"Per 100g: {printable['per_100g']}, \n" - out_str += f"Per Serving: {printable['per_serving']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_document.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_document.py deleted file mode 100644 index 2cd74147..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_document.py +++ /dev/null @@ -1,193 +0,0 @@ -from typing import List, Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.amount import AmountField -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_added_sugar import ( - NutritionFactsLabelV1AddedSugar, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_calorie import ( - NutritionFactsLabelV1Calorie, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_cholesterol import ( - NutritionFactsLabelV1Cholesterol, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_dietary_fiber import ( - NutritionFactsLabelV1DietaryFiber, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_nutrient import ( - NutritionFactsLabelV1Nutrient, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_protein import ( - NutritionFactsLabelV1Protein, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_saturated_fat import ( - NutritionFactsLabelV1SaturatedFat, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_serving_size import ( - NutritionFactsLabelV1ServingSize, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_sodium import ( - NutritionFactsLabelV1Sodium, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_total_carbohydrate import ( - NutritionFactsLabelV1TotalCarbohydrate, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_total_fat import ( - NutritionFactsLabelV1TotalFat, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_total_sugar import ( - NutritionFactsLabelV1TotalSugar, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_trans_fat import ( - NutritionFactsLabelV1TransFat, -) - - -class NutritionFactsLabelV1Document(Prediction): - """Nutrition Facts Label API version 1.0 document data.""" - - added_sugars: NutritionFactsLabelV1AddedSugar - """The amount of added sugars in the product.""" - calories: NutritionFactsLabelV1Calorie - """The amount of calories in the product.""" - cholesterol: NutritionFactsLabelV1Cholesterol - """The amount of cholesterol in the product.""" - dietary_fiber: NutritionFactsLabelV1DietaryFiber - """The amount of dietary fiber in the product.""" - nutrients: List[NutritionFactsLabelV1Nutrient] - """The amount of nutrients in the product.""" - protein: NutritionFactsLabelV1Protein - """The amount of protein in the product.""" - saturated_fat: NutritionFactsLabelV1SaturatedFat - """The amount of saturated fat in the product.""" - serving_per_box: AmountField - """The number of servings in each box of the product.""" - serving_size: NutritionFactsLabelV1ServingSize - """The size of a single serving of the product.""" - sodium: NutritionFactsLabelV1Sodium - """The amount of sodium in the product.""" - total_carbohydrate: NutritionFactsLabelV1TotalCarbohydrate - """The total amount of carbohydrates in the product.""" - total_fat: NutritionFactsLabelV1TotalFat - """The total amount of fat in the product.""" - total_sugars: NutritionFactsLabelV1TotalSugar - """The total amount of sugars in the product.""" - trans_fat: NutritionFactsLabelV1TransFat - """The amount of trans fat in the product.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - Nutrition Facts Label document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.added_sugars = NutritionFactsLabelV1AddedSugar( - raw_prediction["added_sugars"], - page_id=page_id, - ) - self.calories = NutritionFactsLabelV1Calorie( - raw_prediction["calories"], - page_id=page_id, - ) - self.cholesterol = NutritionFactsLabelV1Cholesterol( - raw_prediction["cholesterol"], - page_id=page_id, - ) - self.dietary_fiber = NutritionFactsLabelV1DietaryFiber( - raw_prediction["dietary_fiber"], - page_id=page_id, - ) - self.nutrients = [ - NutritionFactsLabelV1Nutrient(prediction, page_id=page_id) - for prediction in raw_prediction["nutrients"] - ] - self.protein = NutritionFactsLabelV1Protein( - raw_prediction["protein"], - page_id=page_id, - ) - self.saturated_fat = NutritionFactsLabelV1SaturatedFat( - raw_prediction["saturated_fat"], - page_id=page_id, - ) - self.serving_per_box = AmountField( - raw_prediction["serving_per_box"], - page_id=page_id, - ) - self.serving_size = NutritionFactsLabelV1ServingSize( - raw_prediction["serving_size"], - page_id=page_id, - ) - self.sodium = NutritionFactsLabelV1Sodium( - raw_prediction["sodium"], - page_id=page_id, - ) - self.total_carbohydrate = NutritionFactsLabelV1TotalCarbohydrate( - raw_prediction["total_carbohydrate"], - page_id=page_id, - ) - self.total_fat = NutritionFactsLabelV1TotalFat( - raw_prediction["total_fat"], - page_id=page_id, - ) - self.total_sugars = NutritionFactsLabelV1TotalSugar( - raw_prediction["total_sugars"], - page_id=page_id, - ) - self.trans_fat = NutritionFactsLabelV1TransFat( - raw_prediction["trans_fat"], - page_id=page_id, - ) - - @staticmethod - def _nutrients_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 13}" - out_str += f"+{char * 22}" - out_str += f"+{char * 10}" - out_str += f"+{char * 13}" - out_str += f"+{char * 6}" - return out_str + "+" - - def _nutrients_to_str(self) -> str: - if not self.nutrients: - return "" - - lines = f"\n{self._nutrients_separator('-')}\n ".join( - [item.to_table_line() for item in self.nutrients] - ) - out_str = "" - out_str += f"\n{self._nutrients_separator('-')}\n " - out_str += " | Daily Value" - out_str += " | Name " - out_str += " | Per 100g" - out_str += " | Per Serving" - out_str += " | Unit" - out_str += f" |\n{self._nutrients_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._nutrients_separator('-')}" - return out_str - - def __str__(self) -> str: - out_str: str = f":Serving per Box: {self.serving_per_box}\n" - out_str += f":Serving Size:\n{self.serving_size.to_field_list()}\n" - out_str += f":Calories:\n{self.calories.to_field_list()}\n" - out_str += f":Total Fat:\n{self.total_fat.to_field_list()}\n" - out_str += f":Saturated Fat:\n{self.saturated_fat.to_field_list()}\n" - out_str += f":Trans Fat:\n{self.trans_fat.to_field_list()}\n" - out_str += f":Cholesterol:\n{self.cholesterol.to_field_list()}\n" - out_str += f":Total Carbohydrate:\n{self.total_carbohydrate.to_field_list()}\n" - out_str += f":Dietary Fiber:\n{self.dietary_fiber.to_field_list()}\n" - out_str += f":Total Sugars:\n{self.total_sugars.to_field_list()}\n" - out_str += f":Added Sugars:\n{self.added_sugars.to_field_list()}\n" - out_str += f":Protein:\n{self.protein.to_field_list()}\n" - out_str += f":sodium:\n{self.sodium.to_field_list()}\n" - out_str += f":nutrients: {self._nutrients_to_str()}\n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_nutrient.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_nutrient.py deleted file mode 100644 index 0138d26b..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_nutrient.py +++ /dev/null @@ -1,89 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1Nutrient(FieldPositionMixin, FieldConfidenceMixin): - """The amount of nutrients in the product.""" - - daily_value: Optional[float] - """DVs are the recommended amounts of nutrients to consume or not to exceed each day.""" - name: Optional[str] - """The name of nutrients of the product.""" - per_100g: Optional[float] - """The amount of nutrients per 100g of the product.""" - per_serving: Optional[float] - """The amount of nutrients per serving of the product.""" - unit: Optional[str] - """The unit of measurement for the amount of nutrients.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.daily_value = to_opt_float(raw_prediction, "daily_value") - self.name = raw_prediction["name"] - self.per_100g = to_opt_float(raw_prediction, "per_100g") - self.per_serving = to_opt_float(raw_prediction, "per_serving") - self.unit = raw_prediction["unit"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["name"] = format_for_display(self.name) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - out_dict["unit"] = format_for_display(self.unit) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["name"] = format_for_display(self.name, 20) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - out_dict["unit"] = format_for_display(self.unit, None) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['daily_value']:<11} | " - out_str += f"{printable['name']:<20} | " - out_str += f"{printable['per_100g']:<8} | " - out_str += f"{printable['per_serving']:<11} | " - out_str += f"{printable['unit']:<4} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Daily Value: {printable['daily_value']}, \n" - out_str += f"Name: {printable['name']}, \n" - out_str += f"Per 100g: {printable['per_100g']}, \n" - out_str += f"Per Serving: {printable['per_serving']}, \n" - out_str += f"Unit: {printable['unit']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_protein.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_protein.py deleted file mode 100644 index 2c04ffce..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_protein.py +++ /dev/null @@ -1,67 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1Protein(FieldPositionMixin, FieldConfidenceMixin): - """The amount of protein in the product.""" - - daily_value: Optional[float] - """DVs are the recommended amounts of protein to consume or not to exceed each day.""" - per_100g: Optional[float] - """The amount of protein per 100g of the product.""" - per_serving: Optional[float] - """The amount of protein per serving of the product.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.daily_value = to_opt_float(raw_prediction, "daily_value") - self.per_100g = to_opt_float(raw_prediction, "per_100g") - self.per_serving = to_opt_float(raw_prediction, "per_serving") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Daily Value: {printable['daily_value']}\n" - out_str += f" :Per 100g: {printable['per_100g']}\n" - out_str += f" :Per Serving: {printable['per_serving']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Daily Value: {printable['daily_value']}, \n" - out_str += f"Per 100g: {printable['per_100g']}, \n" - out_str += f"Per Serving: {printable['per_serving']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_saturated_fat.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_saturated_fat.py deleted file mode 100644 index 4fab4a77..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_saturated_fat.py +++ /dev/null @@ -1,67 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1SaturatedFat(FieldPositionMixin, FieldConfidenceMixin): - """The amount of saturated fat in the product.""" - - daily_value: Optional[float] - """DVs are the recommended amounts of saturated fat to consume or not to exceed each day.""" - per_100g: Optional[float] - """The amount of saturated fat per 100g of the product.""" - per_serving: Optional[float] - """The amount of saturated fat per serving of the product.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.daily_value = to_opt_float(raw_prediction, "daily_value") - self.per_100g = to_opt_float(raw_prediction, "per_100g") - self.per_serving = to_opt_float(raw_prediction, "per_serving") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Daily Value: {printable['daily_value']}\n" - out_str += f" :Per 100g: {printable['per_100g']}\n" - out_str += f" :Per Serving: {printable['per_serving']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Daily Value: {printable['daily_value']}, \n" - out_str += f"Per 100g: {printable['per_100g']}, \n" - out_str += f"Per Serving: {printable['per_serving']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_serving_size.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_serving_size.py deleted file mode 100644 index 211ba215..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_serving_size.py +++ /dev/null @@ -1,61 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1ServingSize(FieldPositionMixin, FieldConfidenceMixin): - """The size of a single serving of the product.""" - - amount: Optional[float] - """The amount of a single serving.""" - unit: Optional[str] - """The unit for the amount of a single serving.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.amount = to_opt_float(raw_prediction, "amount") - self.unit = raw_prediction["unit"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["amount"] = float_to_string(self.amount) - out_dict["unit"] = format_for_display(self.unit) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Amount: {printable['amount']}\n" - out_str += f" :Unit: {printable['unit']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Amount: {printable['amount']}, \n" - out_str += f"Unit: {printable['unit']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_sodium.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_sodium.py deleted file mode 100644 index ce8e654f..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_sodium.py +++ /dev/null @@ -1,73 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1Sodium(FieldPositionMixin, FieldConfidenceMixin): - """The amount of sodium in the product.""" - - daily_value: Optional[float] - """DVs are the recommended amounts of sodium to consume or not to exceed each day.""" - per_100g: Optional[float] - """The amount of sodium per 100g of the product.""" - per_serving: Optional[float] - """The amount of sodium per serving of the product.""" - unit: Optional[str] - """The unit of measurement for the amount of sodium.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.daily_value = to_opt_float(raw_prediction, "daily_value") - self.per_100g = to_opt_float(raw_prediction, "per_100g") - self.per_serving = to_opt_float(raw_prediction, "per_serving") - self.unit = raw_prediction["unit"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - out_dict["unit"] = format_for_display(self.unit) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Daily Value: {printable['daily_value']}\n" - out_str += f" :Per 100g: {printable['per_100g']}\n" - out_str += f" :Per Serving: {printable['per_serving']}\n" - out_str += f" :Unit: {printable['unit']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Daily Value: {printable['daily_value']}, \n" - out_str += f"Per 100g: {printable['per_100g']}, \n" - out_str += f"Per Serving: {printable['per_serving']}, \n" - out_str += f"Unit: {printable['unit']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_carbohydrate.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_carbohydrate.py deleted file mode 100644 index 8ab62b06..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_carbohydrate.py +++ /dev/null @@ -1,67 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1TotalCarbohydrate(FieldPositionMixin, FieldConfidenceMixin): - """The total amount of carbohydrates in the product.""" - - daily_value: Optional[float] - """DVs are the recommended amounts of total carbohydrates to consume or not to exceed each day.""" - per_100g: Optional[float] - """The amount of total carbohydrates per 100g of the product.""" - per_serving: Optional[float] - """The amount of total carbohydrates per serving of the product.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.daily_value = to_opt_float(raw_prediction, "daily_value") - self.per_100g = to_opt_float(raw_prediction, "per_100g") - self.per_serving = to_opt_float(raw_prediction, "per_serving") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Daily Value: {printable['daily_value']}\n" - out_str += f" :Per 100g: {printable['per_100g']}\n" - out_str += f" :Per Serving: {printable['per_serving']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Daily Value: {printable['daily_value']}, \n" - out_str += f"Per 100g: {printable['per_100g']}, \n" - out_str += f"Per Serving: {printable['per_serving']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_fat.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_fat.py deleted file mode 100644 index befb9986..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_fat.py +++ /dev/null @@ -1,67 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1TotalFat(FieldPositionMixin, FieldConfidenceMixin): - """The total amount of fat in the product.""" - - daily_value: Optional[float] - """DVs are the recommended amounts of total fat to consume or not to exceed each day.""" - per_100g: Optional[float] - """The amount of total fat per 100g of the product.""" - per_serving: Optional[float] - """The amount of total fat per serving of the product.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.daily_value = to_opt_float(raw_prediction, "daily_value") - self.per_100g = to_opt_float(raw_prediction, "per_100g") - self.per_serving = to_opt_float(raw_prediction, "per_serving") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Daily Value: {printable['daily_value']}\n" - out_str += f" :Per 100g: {printable['per_100g']}\n" - out_str += f" :Per Serving: {printable['per_serving']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Daily Value: {printable['daily_value']}, \n" - out_str += f"Per 100g: {printable['per_100g']}, \n" - out_str += f"Per Serving: {printable['per_serving']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_sugar.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_sugar.py deleted file mode 100644 index b44be085..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_sugar.py +++ /dev/null @@ -1,67 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1TotalSugar(FieldPositionMixin, FieldConfidenceMixin): - """The total amount of sugars in the product.""" - - daily_value: Optional[float] - """DVs are the recommended amounts of total sugars to consume or not to exceed each day.""" - per_100g: Optional[float] - """The amount of total sugars per 100g of the product.""" - per_serving: Optional[float] - """The amount of total sugars per serving of the product.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.daily_value = to_opt_float(raw_prediction, "daily_value") - self.per_100g = to_opt_float(raw_prediction, "per_100g") - self.per_serving = to_opt_float(raw_prediction, "per_serving") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Daily Value: {printable['daily_value']}\n" - out_str += f" :Per 100g: {printable['per_100g']}\n" - out_str += f" :Per Serving: {printable['per_serving']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Daily Value: {printable['daily_value']}, \n" - out_str += f"Per 100g: {printable['per_100g']}, \n" - out_str += f"Per Serving: {printable['per_serving']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_trans_fat.py b/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_trans_fat.py deleted file mode 100644 index 25ef328d..00000000 --- a/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_trans_fat.py +++ /dev/null @@ -1,67 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class NutritionFactsLabelV1TransFat(FieldPositionMixin, FieldConfidenceMixin): - """The amount of trans fat in the product.""" - - daily_value: Optional[float] - """DVs are the recommended amounts of trans fat to consume or not to exceed each day.""" - per_100g: Optional[float] - """The amount of trans fat per 100g of the product.""" - per_serving: Optional[float] - """The amount of trans fat per serving of the product.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.daily_value = to_opt_float(raw_prediction, "daily_value") - self.per_100g = to_opt_float(raw_prediction, "per_100g") - self.per_serving = to_opt_float(raw_prediction, "per_serving") - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["daily_value"] = float_to_string(self.daily_value) - out_dict["per_100g"] = float_to_string(self.per_100g) - out_dict["per_serving"] = float_to_string(self.per_serving) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :Daily Value: {printable['daily_value']}\n" - out_str += f" :Per 100g: {printable['per_100g']}\n" - out_str += f" :Per Serving: {printable['per_serving']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Daily Value: {printable['daily_value']}, \n" - out_str += f"Per 100g: {printable['per_100g']}, \n" - out_str += f"Per Serving: {printable['per_serving']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/resume/__init__.py b/mindee/product/resume/__init__.py deleted file mode 100644 index 161e28c7..00000000 --- a/mindee/product/resume/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -from mindee.product.resume.resume_v1 import ResumeV1 -from mindee.product.resume.resume_v1_certificate import ( - ResumeV1Certificate, -) -from mindee.product.resume.resume_v1_document import ( - ResumeV1Document, -) -from mindee.product.resume.resume_v1_education import ( - ResumeV1Education, -) -from mindee.product.resume.resume_v1_language import ( - ResumeV1Language, -) -from mindee.product.resume.resume_v1_professional_experience import ( - ResumeV1ProfessionalExperience, -) -from mindee.product.resume.resume_v1_social_networks_url import ( - ResumeV1SocialNetworksUrl, -) - -__all__ = [ - "ResumeV1", - "ResumeV1Document", - "ResumeV1Education", - "ResumeV1Language", - "ResumeV1ProfessionalExperience", - "ResumeV1SocialNetworksUrl", - "ResumeV1Certificate", -] diff --git a/mindee/product/resume/resume_v1.py b/mindee/product/resume/resume_v1.py deleted file mode 100644 index 0ad4eca8..00000000 --- a/mindee/product/resume/resume_v1.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.resume.resume_v1_document import ( - ResumeV1Document, -) - - -class ResumeV1(Inference): - """Resume API version 1 inference prediction.""" - - prediction: ResumeV1Document - """Document-level prediction.""" - pages: List[Page[ResumeV1Document]] - """Page-level prediction(s).""" - endpoint_name = "resume" - """Name of the endpoint.""" - endpoint_version = "1" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - Resume v1 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = ResumeV1Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(ResumeV1Document, page)) diff --git a/mindee/product/resume/resume_v1_certificate.py b/mindee/product/resume/resume_v1_certificate.py deleted file mode 100644 index bc5c3282..00000000 --- a/mindee/product/resume/resume_v1_certificate.py +++ /dev/null @@ -1,77 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class ResumeV1Certificate(FieldPositionMixin, FieldConfidenceMixin): - """The list of certificates obtained by the candidate.""" - - grade: Optional[str] - """The grade obtained for the certificate.""" - name: Optional[str] - """The name of certification.""" - provider: Optional[str] - """The organization or institution that issued the certificate.""" - year: Optional[str] - """The year when a certificate was issued or received.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.grade = raw_prediction["grade"] - self.name = raw_prediction["name"] - self.provider = raw_prediction["provider"] - self.year = raw_prediction["year"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["grade"] = format_for_display(self.grade) - out_dict["name"] = format_for_display(self.name) - out_dict["provider"] = format_for_display(self.provider) - out_dict["year"] = format_for_display(self.year) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["grade"] = format_for_display(self.grade, 10) - out_dict["name"] = format_for_display(self.name, 30) - out_dict["provider"] = format_for_display(self.provider, 25) - out_dict["year"] = format_for_display(self.year, None) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['grade']:<10} | " - out_str += f"{printable['name']:<30} | " - out_str += f"{printable['provider']:<25} | " - out_str += f"{printable['year']:<4} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Grade: {printable['grade']}, \n" - out_str += f"Name: {printable['name']}, \n" - out_str += f"Provider: {printable['provider']}, \n" - out_str += f"Year: {printable['year']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/resume/resume_v1_document.py b/mindee/product/resume/resume_v1_document.py deleted file mode 100644 index 46ac8314..00000000 --- a/mindee/product/resume/resume_v1_document.py +++ /dev/null @@ -1,313 +0,0 @@ -from typing import List, Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.classification import ClassificationField -from mindee.parsing.standard.text import StringField -from mindee.product.resume.resume_v1_certificate import ResumeV1Certificate -from mindee.product.resume.resume_v1_education import ResumeV1Education -from mindee.product.resume.resume_v1_language import ResumeV1Language -from mindee.product.resume.resume_v1_professional_experience import ( - ResumeV1ProfessionalExperience, -) -from mindee.product.resume.resume_v1_social_networks_url import ( - ResumeV1SocialNetworksUrl, -) - - -class ResumeV1Document(Prediction): - """Resume API version 1.2 document data.""" - - address: StringField - """The location information of the candidate, including city, state, and country.""" - certificates: List[ResumeV1Certificate] - """The list of certificates obtained by the candidate.""" - document_language: StringField - """The ISO 639 code of the language in which the document is written.""" - document_type: ClassificationField - """The type of the document sent.""" - education: List[ResumeV1Education] - """The list of the candidate's educational background.""" - email_address: StringField - """The email address of the candidate.""" - given_names: List[StringField] - """The candidate's first or given names.""" - hard_skills: List[StringField] - """The list of the candidate's technical abilities and knowledge.""" - job_applied: StringField - """The position that the candidate is applying for.""" - languages: List[ResumeV1Language] - """The list of languages that the candidate is proficient in.""" - nationality: StringField - """The ISO 3166 code for the country of citizenship of the candidate.""" - phone_number: StringField - """The phone number of the candidate.""" - profession: StringField - """The candidate's current profession.""" - professional_experiences: List[ResumeV1ProfessionalExperience] - """The list of the candidate's professional experiences.""" - social_networks_urls: List[ResumeV1SocialNetworksUrl] - """The list of social network profiles of the candidate.""" - soft_skills: List[StringField] - """The list of the candidate's interpersonal and communication abilities.""" - surnames: List[StringField] - """The candidate's last names.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - Resume document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.address = StringField( - raw_prediction["address"], - page_id=page_id, - ) - self.certificates = [ - ResumeV1Certificate(prediction, page_id=page_id) - for prediction in raw_prediction["certificates"] - ] - self.document_language = StringField( - raw_prediction["document_language"], - page_id=page_id, - ) - self.document_type = ClassificationField( - raw_prediction["document_type"], - page_id=page_id, - ) - self.education = [ - ResumeV1Education(prediction, page_id=page_id) - for prediction in raw_prediction["education"] - ] - self.email_address = StringField( - raw_prediction["email_address"], - page_id=page_id, - ) - self.given_names = [ - StringField(prediction, page_id=page_id) - for prediction in raw_prediction["given_names"] - ] - self.hard_skills = [ - StringField(prediction, page_id=page_id) - for prediction in raw_prediction["hard_skills"] - ] - self.job_applied = StringField( - raw_prediction["job_applied"], - page_id=page_id, - ) - self.languages = [ - ResumeV1Language(prediction, page_id=page_id) - for prediction in raw_prediction["languages"] - ] - self.nationality = StringField( - raw_prediction["nationality"], - page_id=page_id, - ) - self.phone_number = StringField( - raw_prediction["phone_number"], - page_id=page_id, - ) - self.profession = StringField( - raw_prediction["profession"], - page_id=page_id, - ) - self.professional_experiences = [ - ResumeV1ProfessionalExperience(prediction, page_id=page_id) - for prediction in raw_prediction["professional_experiences"] - ] - self.social_networks_urls = [ - ResumeV1SocialNetworksUrl(prediction, page_id=page_id) - for prediction in raw_prediction["social_networks_urls"] - ] - self.soft_skills = [ - StringField(prediction, page_id=page_id) - for prediction in raw_prediction["soft_skills"] - ] - self.surnames = [ - StringField(prediction, page_id=page_id) - for prediction in raw_prediction["surnames"] - ] - - @staticmethod - def _social_networks_urls_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 22}" - out_str += f"+{char * 52}" - return out_str + "+" - - def _social_networks_urls_to_str(self) -> str: - if not self.social_networks_urls: - return "" - - lines = f"\n{self._social_networks_urls_separator('-')}\n ".join( - [item.to_table_line() for item in self.social_networks_urls] - ) - out_str = "" - out_str += f"\n{self._social_networks_urls_separator('-')}\n " - out_str += " | Name " - out_str += " | URL " - out_str += f" |\n{self._social_networks_urls_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._social_networks_urls_separator('-')}" - return out_str - - @staticmethod - def _languages_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 10}" - out_str += f"+{char * 22}" - return out_str + "+" - - def _languages_to_str(self) -> str: - if not self.languages: - return "" - - lines = f"\n{self._languages_separator('-')}\n ".join( - [item.to_table_line() for item in self.languages] - ) - out_str = "" - out_str += f"\n{self._languages_separator('-')}\n " - out_str += " | Language" - out_str += " | Level " - out_str += f" |\n{self._languages_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._languages_separator('-')}" - return out_str - - @staticmethod - def _education_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 17}" - out_str += f"+{char * 27}" - out_str += f"+{char * 11}" - out_str += f"+{char * 10}" - out_str += f"+{char * 27}" - out_str += f"+{char * 13}" - out_str += f"+{char * 12}" - return out_str + "+" - - def _education_to_str(self) -> str: - if not self.education: - return "" - - lines = f"\n{self._education_separator('-')}\n ".join( - [item.to_table_line() for item in self.education] - ) - out_str = "" - out_str += f"\n{self._education_separator('-')}\n " - out_str += " | Domain " - out_str += " | Degree " - out_str += " | End Month" - out_str += " | End Year" - out_str += " | School " - out_str += " | Start Month" - out_str += " | Start Year" - out_str += f" |\n{self._education_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._education_separator('-')}" - return out_str - - @staticmethod - def _professional_experiences_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 17}" - out_str += f"+{char * 12}" - out_str += f"+{char * 38}" - out_str += f"+{char * 27}" - out_str += f"+{char * 11}" - out_str += f"+{char * 10}" - out_str += f"+{char * 22}" - out_str += f"+{char * 13}" - out_str += f"+{char * 12}" - return out_str + "+" - - def _professional_experiences_to_str(self) -> str: - if not self.professional_experiences: - return "" - - lines = f"\n{self._professional_experiences_separator('-')}\n ".join( - [item.to_table_line() for item in self.professional_experiences] - ) - out_str = "" - out_str += f"\n{self._professional_experiences_separator('-')}\n " - out_str += " | Contract Type " - out_str += " | Department" - out_str += " | Description " - out_str += " | Employer " - out_str += " | End Month" - out_str += " | End Year" - out_str += " | Role " - out_str += " | Start Month" - out_str += " | Start Year" - out_str += f" |\n{self._professional_experiences_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._professional_experiences_separator('-')}" - return out_str - - @staticmethod - def _certificates_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 12}" - out_str += f"+{char * 32}" - out_str += f"+{char * 27}" - out_str += f"+{char * 6}" - return out_str + "+" - - def _certificates_to_str(self) -> str: - if not self.certificates: - return "" - - lines = f"\n{self._certificates_separator('-')}\n ".join( - [item.to_table_line() for item in self.certificates] - ) - out_str = "" - out_str += f"\n{self._certificates_separator('-')}\n " - out_str += " | Grade " - out_str += " | Name " - out_str += " | Provider " - out_str += " | Year" - out_str += f" |\n{self._certificates_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._certificates_separator('-')}" - return out_str - - def __str__(self) -> str: - given_names = f"\n {' ' * 13}".join( - [str(item) for item in self.given_names], - ) - hard_skills = f"\n {' ' * 13}".join( - [str(item) for item in self.hard_skills], - ) - soft_skills = f"\n {' ' * 13}".join( - [str(item) for item in self.soft_skills], - ) - surnames = f"\n {' ' * 10}".join( - [str(item) for item in self.surnames], - ) - out_str: str = f":Document Language: {self.document_language}\n" - out_str += f":Document Type: {self.document_type}\n" - out_str += f":Given Names: {given_names}\n" - out_str += f":Surnames: {surnames}\n" - out_str += f":Nationality: {self.nationality}\n" - out_str += f":Email Address: {self.email_address}\n" - out_str += f":Phone Number: {self.phone_number}\n" - out_str += f":Address: {self.address}\n" - out_str += f":Social Networks: {self._social_networks_urls_to_str()}\n" - out_str += f":Profession: {self.profession}\n" - out_str += f":Job Applied: {self.job_applied}\n" - out_str += f":Languages: {self._languages_to_str()}\n" - out_str += f":Hard Skills: {hard_skills}\n" - out_str += f":Soft Skills: {soft_skills}\n" - out_str += f":Education: {self._education_to_str()}\n" - out_str += ( - f":Professional Experiences: {self._professional_experiences_to_str()}\n" - ) - out_str += f":Certificates: {self._certificates_to_str()}\n" - return clean_out_string(out_str) diff --git a/mindee/product/resume/resume_v1_education.py b/mindee/product/resume/resume_v1_education.py deleted file mode 100644 index 9f15ba85..00000000 --- a/mindee/product/resume/resume_v1_education.py +++ /dev/null @@ -1,98 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class ResumeV1Education(FieldPositionMixin, FieldConfidenceMixin): - """The list of the candidate's educational background.""" - - degree_domain: Optional[str] - """The area of study or specialization.""" - degree_type: Optional[str] - """The type of degree obtained, such as Bachelor's, Master's, or Doctorate.""" - end_month: Optional[str] - """The month when the education program or course was completed.""" - end_year: Optional[str] - """The year when the education program or course was completed.""" - school: Optional[str] - """The name of the school.""" - start_month: Optional[str] - """The month when the education program or course began.""" - start_year: Optional[str] - """The year when the education program or course began.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.degree_domain = raw_prediction["degree_domain"] - self.degree_type = raw_prediction["degree_type"] - self.end_month = raw_prediction["end_month"] - self.end_year = raw_prediction["end_year"] - self.school = raw_prediction["school"] - self.start_month = raw_prediction["start_month"] - self.start_year = raw_prediction["start_year"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["degree_domain"] = format_for_display(self.degree_domain) - out_dict["degree_type"] = format_for_display(self.degree_type) - out_dict["end_month"] = format_for_display(self.end_month) - out_dict["end_year"] = format_for_display(self.end_year) - out_dict["school"] = format_for_display(self.school) - out_dict["start_month"] = format_for_display(self.start_month) - out_dict["start_year"] = format_for_display(self.start_year) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["degree_domain"] = format_for_display(self.degree_domain, 15) - out_dict["degree_type"] = format_for_display(self.degree_type, 25) - out_dict["end_month"] = format_for_display(self.end_month, None) - out_dict["end_year"] = format_for_display(self.end_year, None) - out_dict["school"] = format_for_display(self.school, 25) - out_dict["start_month"] = format_for_display(self.start_month, None) - out_dict["start_year"] = format_for_display(self.start_year, None) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['degree_domain']:<15} | " - out_str += f"{printable['degree_type']:<25} | " - out_str += f"{printable['end_month']:<9} | " - out_str += f"{printable['end_year']:<8} | " - out_str += f"{printable['school']:<25} | " - out_str += f"{printable['start_month']:<11} | " - out_str += f"{printable['start_year']:<10} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Domain: {printable['degree_domain']}, \n" - out_str += f"Degree: {printable['degree_type']}, \n" - out_str += f"End Month: {printable['end_month']}, \n" - out_str += f"End Year: {printable['end_year']}, \n" - out_str += f"School: {printable['school']}, \n" - out_str += f"Start Month: {printable['start_month']}, \n" - out_str += f"Start Year: {printable['start_year']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/resume/resume_v1_language.py b/mindee/product/resume/resume_v1_language.py deleted file mode 100644 index d08a1485..00000000 --- a/mindee/product/resume/resume_v1_language.py +++ /dev/null @@ -1,63 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class ResumeV1Language(FieldPositionMixin, FieldConfidenceMixin): - """The list of languages that the candidate is proficient in.""" - - language: Optional[str] - """The language's ISO 639 code.""" - level: Optional[str] - """The candidate's level for the language.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.language = raw_prediction["language"] - self.level = raw_prediction["level"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["language"] = format_for_display(self.language) - out_dict["level"] = format_for_display(self.level) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["language"] = format_for_display(self.language, None) - out_dict["level"] = format_for_display(self.level, 20) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['language']:<8} | " - out_str += f"{printable['level']:<20} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Language: {printable['language']}, \n" - out_str += f"Level: {printable['level']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/resume/resume_v1_professional_experience.py b/mindee/product/resume/resume_v1_professional_experience.py deleted file mode 100644 index c19d042d..00000000 --- a/mindee/product/resume/resume_v1_professional_experience.py +++ /dev/null @@ -1,112 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class ResumeV1ProfessionalExperience(FieldPositionMixin, FieldConfidenceMixin): - """The list of the candidate's professional experiences.""" - - contract_type: Optional[str] - """The type of contract for the professional experience.""" - department: Optional[str] - """The specific department or division within the company.""" - description: Optional[str] - """The description of the professional experience as written in the document.""" - employer: Optional[str] - """The name of the company or organization.""" - end_month: Optional[str] - """The month when the professional experience ended.""" - end_year: Optional[str] - """The year when the professional experience ended.""" - role: Optional[str] - """The position or job title held by the candidate.""" - start_month: Optional[str] - """The month when the professional experience began.""" - start_year: Optional[str] - """The year when the professional experience began.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.contract_type = raw_prediction["contract_type"] - self.department = raw_prediction["department"] - self.description = raw_prediction["description"] - self.employer = raw_prediction["employer"] - self.end_month = raw_prediction["end_month"] - self.end_year = raw_prediction["end_year"] - self.role = raw_prediction["role"] - self.start_month = raw_prediction["start_month"] - self.start_year = raw_prediction["start_year"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["contract_type"] = format_for_display(self.contract_type) - out_dict["department"] = format_for_display(self.department) - out_dict["description"] = format_for_display(self.description) - out_dict["employer"] = format_for_display(self.employer) - out_dict["end_month"] = format_for_display(self.end_month) - out_dict["end_year"] = format_for_display(self.end_year) - out_dict["role"] = format_for_display(self.role) - out_dict["start_month"] = format_for_display(self.start_month) - out_dict["start_year"] = format_for_display(self.start_year) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["contract_type"] = format_for_display(self.contract_type, 15) - out_dict["department"] = format_for_display(self.department, 10) - out_dict["description"] = format_for_display(self.description, 36) - out_dict["employer"] = format_for_display(self.employer, 25) - out_dict["end_month"] = format_for_display(self.end_month, None) - out_dict["end_year"] = format_for_display(self.end_year, None) - out_dict["role"] = format_for_display(self.role, 20) - out_dict["start_month"] = format_for_display(self.start_month, None) - out_dict["start_year"] = format_for_display(self.start_year, None) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['contract_type']:<15} | " - out_str += f"{printable['department']:<10} | " - out_str += f"{printable['description']:<36} | " - out_str += f"{printable['employer']:<25} | " - out_str += f"{printable['end_month']:<9} | " - out_str += f"{printable['end_year']:<8} | " - out_str += f"{printable['role']:<20} | " - out_str += f"{printable['start_month']:<11} | " - out_str += f"{printable['start_year']:<10} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Contract Type: {printable['contract_type']}, \n" - out_str += f"Department: {printable['department']}, \n" - out_str += f"Description: {printable['description']}, \n" - out_str += f"Employer: {printable['employer']}, \n" - out_str += f"End Month: {printable['end_month']}, \n" - out_str += f"End Year: {printable['end_year']}, \n" - out_str += f"Role: {printable['role']}, \n" - out_str += f"Start Month: {printable['start_month']}, \n" - out_str += f"Start Year: {printable['start_year']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/resume/resume_v1_social_networks_url.py b/mindee/product/resume/resume_v1_social_networks_url.py deleted file mode 100644 index b5669765..00000000 --- a/mindee/product/resume/resume_v1_social_networks_url.py +++ /dev/null @@ -1,63 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class ResumeV1SocialNetworksUrl(FieldPositionMixin, FieldConfidenceMixin): - """The list of social network profiles of the candidate.""" - - name: Optional[str] - """The name of the social network.""" - url: Optional[str] - """The URL of the social network.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.name = raw_prediction["name"] - self.url = raw_prediction["url"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["name"] = format_for_display(self.name) - out_dict["url"] = format_for_display(self.url) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["name"] = format_for_display(self.name, 20) - out_dict["url"] = format_for_display(self.url, 50) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['name']:<20} | " - out_str += f"{printable['url']:<50} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Name: {printable['name']}, \n" - out_str += f"URL: {printable['url']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/us/__init__.py b/mindee/product/us/__init__.py index ca53a9ea..49201c4f 100644 --- a/mindee/product/us/__init__.py +++ b/mindee/product/us/__init__.py @@ -5,33 +5,9 @@ from mindee.product.us.bank_check.bank_check_v1_page import ( BankCheckV1Page, ) -from mindee.product.us.healthcare_card.healthcare_card_v1 import HealthcareCardV1 -from mindee.product.us.healthcare_card.healthcare_card_v1_copay import ( - HealthcareCardV1Copay, -) -from mindee.product.us.healthcare_card.healthcare_card_v1_document import ( - HealthcareCardV1Document, -) -from mindee.product.us.us_mail.us_mail_v3 import UsMailV3 -from mindee.product.us.us_mail.us_mail_v3_document import ( - UsMailV3Document, -) -from mindee.product.us.us_mail.us_mail_v3_recipient_address import ( - UsMailV3RecipientAddress, -) -from mindee.product.us.us_mail.us_mail_v3_sender_address import ( - UsMailV3SenderAddress, -) __all__ = [ "BankCheckV1", "BankCheckV1Document", "BankCheckV1Page", - "HealthcareCardV1", - "HealthcareCardV1Copay", - "HealthcareCardV1Document", - "UsMailV3", - "UsMailV3Document", - "UsMailV3RecipientAddress", - "UsMailV3SenderAddress", ] diff --git a/mindee/product/us/healthcare_card/__init__.py b/mindee/product/us/healthcare_card/__init__.py deleted file mode 100644 index cf396643..00000000 --- a/mindee/product/us/healthcare_card/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from mindee.product.us.healthcare_card.healthcare_card_v1 import HealthcareCardV1 -from mindee.product.us.healthcare_card.healthcare_card_v1_copay import ( - HealthcareCardV1Copay, -) -from mindee.product.us.healthcare_card.healthcare_card_v1_document import ( - HealthcareCardV1Document, -) - -__all__ = [ - "HealthcareCardV1", - "HealthcareCardV1Copay", - "HealthcareCardV1Document", -] diff --git a/mindee/product/us/healthcare_card/healthcare_card_v1.py b/mindee/product/us/healthcare_card/healthcare_card_v1.py deleted file mode 100644 index 71d48a16..00000000 --- a/mindee/product/us/healthcare_card/healthcare_card_v1.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.us.healthcare_card.healthcare_card_v1_document import ( - HealthcareCardV1Document, -) - - -class HealthcareCardV1(Inference): - """Healthcare Card API version 1 inference prediction.""" - - prediction: HealthcareCardV1Document - """Document-level prediction.""" - pages: List[Page[HealthcareCardV1Document]] - """Page-level prediction(s).""" - endpoint_name = "us_healthcare_cards" - """Name of the endpoint.""" - endpoint_version = "1" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - Healthcare Card v1 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = HealthcareCardV1Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(HealthcareCardV1Document, page)) diff --git a/mindee/product/us/healthcare_card/healthcare_card_v1_copay.py b/mindee/product/us/healthcare_card/healthcare_card_v1_copay.py deleted file mode 100644 index 4b3ee788..00000000 --- a/mindee/product/us/healthcare_card/healthcare_card_v1_copay.py +++ /dev/null @@ -1,68 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - float_to_string, - to_opt_float, -) - - -class HealthcareCardV1Copay(FieldPositionMixin, FieldConfidenceMixin): - """Copayments for covered services.""" - - service_fees: Optional[float] - """The price of the service.""" - service_name: Optional[str] - """The name of the service.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.service_fees = to_opt_float(raw_prediction, "service_fees") - self.service_name = raw_prediction["service_name"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["service_fees"] = float_to_string(self.service_fees) - out_dict["service_name"] = format_for_display(self.service_name) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["service_fees"] = float_to_string(self.service_fees) - out_dict["service_name"] = format_for_display(self.service_name, 20) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['service_fees']:<12} | " - out_str += f"{printable['service_name']:<20} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"Service Fees: {printable['service_fees']}, \n" - out_str += f"Service Name: {printable['service_name']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/us/healthcare_card/healthcare_card_v1_document.py b/mindee/product/us/healthcare_card/healthcare_card_v1_document.py deleted file mode 100644 index 303dc97f..00000000 --- a/mindee/product/us/healthcare_card/healthcare_card_v1_document.py +++ /dev/null @@ -1,155 +0,0 @@ -from typing import List, Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField -from mindee.product.us.healthcare_card.healthcare_card_v1_copay import ( - HealthcareCardV1Copay, -) - - -class HealthcareCardV1Document(Prediction): - """Healthcare Card API version 1.3 document data.""" - - company_name: StringField - """The name of the company that provides the healthcare plan.""" - copays: List[HealthcareCardV1Copay] - """Copayments for covered services.""" - dependents: List[StringField] - """The list of dependents covered by the healthcare plan.""" - enrollment_date: DateField - """The date when the member enrolled in the healthcare plan.""" - group_number: StringField - """The group number associated with the healthcare plan.""" - issuer_80840: StringField - """The organization that issued the healthcare plan.""" - member_id: StringField - """The unique identifier for the member in the healthcare system.""" - member_name: StringField - """The name of the member covered by the healthcare plan.""" - payer_id: StringField - """The unique identifier for the payer in the healthcare system.""" - plan_name: StringField - """The name of the healthcare plan.""" - rx_bin: StringField - """The BIN number for prescription drug coverage.""" - rx_grp: StringField - """The group number for prescription drug coverage.""" - rx_id: StringField - """The ID number for prescription drug coverage.""" - rx_pcn: StringField - """The PCN number for prescription drug coverage.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - Healthcare Card document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.company_name = StringField( - raw_prediction["company_name"], - page_id=page_id, - ) - self.copays = [ - HealthcareCardV1Copay(prediction, page_id=page_id) - for prediction in raw_prediction["copays"] - ] - self.dependents = [ - StringField(prediction, page_id=page_id) - for prediction in raw_prediction["dependents"] - ] - self.enrollment_date = DateField( - raw_prediction["enrollment_date"], - page_id=page_id, - ) - self.group_number = StringField( - raw_prediction["group_number"], - page_id=page_id, - ) - self.issuer_80840 = StringField( - raw_prediction["issuer_80840"], - page_id=page_id, - ) - self.member_id = StringField( - raw_prediction["member_id"], - page_id=page_id, - ) - self.member_name = StringField( - raw_prediction["member_name"], - page_id=page_id, - ) - self.payer_id = StringField( - raw_prediction["payer_id"], - page_id=page_id, - ) - self.plan_name = StringField( - raw_prediction["plan_name"], - page_id=page_id, - ) - self.rx_bin = StringField( - raw_prediction["rx_bin"], - page_id=page_id, - ) - self.rx_grp = StringField( - raw_prediction["rx_grp"], - page_id=page_id, - ) - self.rx_id = StringField( - raw_prediction["rx_id"], - page_id=page_id, - ) - self.rx_pcn = StringField( - raw_prediction["rx_pcn"], - page_id=page_id, - ) - - @staticmethod - def _copays_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 14}" - out_str += f"+{char * 22}" - return out_str + "+" - - def _copays_to_str(self) -> str: - if not self.copays: - return "" - - lines = f"\n{self._copays_separator('-')}\n ".join( - [item.to_table_line() for item in self.copays] - ) - out_str = "" - out_str += f"\n{self._copays_separator('-')}\n " - out_str += " | Service Fees" - out_str += " | Service Name " - out_str += f" |\n{self._copays_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._copays_separator('-')}" - return out_str - - def __str__(self) -> str: - dependents = f"\n {' ' * 12}".join( - [str(item) for item in self.dependents], - ) - out_str: str = f":Company Name: {self.company_name}\n" - out_str += f":Plan Name: {self.plan_name}\n" - out_str += f":Member Name: {self.member_name}\n" - out_str += f":Member ID: {self.member_id}\n" - out_str += f":Issuer 80840: {self.issuer_80840}\n" - out_str += f":Dependents: {dependents}\n" - out_str += f":Group Number: {self.group_number}\n" - out_str += f":Payer ID: {self.payer_id}\n" - out_str += f":RX BIN: {self.rx_bin}\n" - out_str += f":RX ID: {self.rx_id}\n" - out_str += f":RX GRP: {self.rx_grp}\n" - out_str += f":RX PCN: {self.rx_pcn}\n" - out_str += f":Copays: {self._copays_to_str()}\n" - out_str += f":Enrollment Date: {self.enrollment_date}\n" - return clean_out_string(out_str) diff --git a/mindee/product/us/us_mail/__init__.py b/mindee/product/us/us_mail/__init__.py deleted file mode 100644 index 1c1637fb..00000000 --- a/mindee/product/us/us_mail/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -from mindee.product.us.us_mail.us_mail_v3 import UsMailV3 -from mindee.product.us.us_mail.us_mail_v3_document import ( - UsMailV3Document, -) -from mindee.product.us.us_mail.us_mail_v3_recipient_address import ( - UsMailV3RecipientAddress, -) -from mindee.product.us.us_mail.us_mail_v3_sender_address import ( - UsMailV3SenderAddress, -) - -__all__ = [ - "UsMailV3", - "UsMailV3Document", - "UsMailV3RecipientAddress", - "UsMailV3SenderAddress", -] diff --git a/mindee/product/us/us_mail/us_mail_v3.py b/mindee/product/us/us_mail/us_mail_v3.py deleted file mode 100644 index ed6e7473..00000000 --- a/mindee/product/us/us_mail/us_mail_v3.py +++ /dev/null @@ -1,39 +0,0 @@ -from typing import List - -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict -from mindee.product.us.us_mail.us_mail_v3_document import ( - UsMailV3Document, -) - - -class UsMailV3(Inference): - """US Mail API version 3 inference prediction.""" - - prediction: UsMailV3Document - """Document-level prediction.""" - pages: List[Page[UsMailV3Document]] - """Page-level prediction(s).""" - endpoint_name = "us_mail" - """Name of the endpoint.""" - endpoint_version = "3" - """Version of the endpoint.""" - - def __init__(self, raw_prediction: StringDict): - """ - US Mail v3 inference. - - :param raw_prediction: Raw prediction from the HTTP response. - """ - super().__init__(raw_prediction) - - self.prediction = UsMailV3Document(raw_prediction["prediction"]) - self.pages = [] - for page in raw_prediction["pages"]: - try: - page_prediction = page["prediction"] - except KeyError: - continue - if page_prediction: - self.pages.append(Page(UsMailV3Document, page)) diff --git a/mindee/product/us/us_mail/us_mail_v3_document.py b/mindee/product/us/us_mail/us_mail_v3_document.py deleted file mode 100644 index ea17064a..00000000 --- a/mindee/product/us/us_mail/us_mail_v3_document.py +++ /dev/null @@ -1,105 +0,0 @@ -from typing import List, Optional - -from mindee.parsing.common.prediction import Prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.boolean import BooleanField -from mindee.parsing.standard.text import StringField -from mindee.product.us.us_mail.us_mail_v3_recipient_address import ( - UsMailV3RecipientAddress, -) -from mindee.product.us.us_mail.us_mail_v3_sender_address import UsMailV3SenderAddress - - -class UsMailV3Document(Prediction): - """US Mail API version 3.0 document data.""" - - is_return_to_sender: BooleanField - """Whether the mailing is marked as return to sender.""" - recipient_addresses: List[UsMailV3RecipientAddress] - """The addresses of the recipients.""" - recipient_names: List[StringField] - """The names of the recipients.""" - sender_address: UsMailV3SenderAddress - """The address of the sender.""" - sender_name: StringField - """The name of the sender.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - """ - US Mail document. - - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input - """ - super().__init__(raw_prediction, page_id) - self.is_return_to_sender = BooleanField( - raw_prediction["is_return_to_sender"], - page_id=page_id, - ) - self.recipient_addresses = [ - UsMailV3RecipientAddress(prediction, page_id=page_id) - for prediction in raw_prediction["recipient_addresses"] - ] - self.recipient_names = [ - StringField(prediction, page_id=page_id) - for prediction in raw_prediction["recipient_names"] - ] - self.sender_address = UsMailV3SenderAddress( - raw_prediction["sender_address"], - page_id=page_id, - ) - self.sender_name = StringField( - raw_prediction["sender_name"], - page_id=page_id, - ) - - @staticmethod - def _recipient_addresses_separator(char: str) -> str: - out_str = " " - out_str += f"+{char * 17}" - out_str += f"+{char * 37}" - out_str += f"+{char * 19}" - out_str += f"+{char * 13}" - out_str += f"+{char * 24}" - out_str += f"+{char * 7}" - out_str += f"+{char * 27}" - out_str += f"+{char * 17}" - return out_str + "+" - - def _recipient_addresses_to_str(self) -> str: - if not self.recipient_addresses: - return "" - - lines = f"\n{self._recipient_addresses_separator('-')}\n ".join( - [item.to_table_line() for item in self.recipient_addresses] - ) - out_str = "" - out_str += f"\n{self._recipient_addresses_separator('-')}\n " - out_str += " | City " - out_str += " | Complete Address " - out_str += " | Is Address Change" - out_str += " | Postal Code" - out_str += " | Private Mailbox Number" - out_str += " | State" - out_str += " | Street " - out_str += " | Unit " - out_str += f" |\n{self._recipient_addresses_separator('=')}" - out_str += f"\n {lines}" - out_str += f"\n{self._recipient_addresses_separator('-')}" - return out_str - - def __str__(self) -> str: - recipient_names = f"\n {' ' * 17}".join( - [str(item) for item in self.recipient_names], - ) - out_str: str = f":Sender Name: {self.sender_name}\n" - out_str += f":Sender Address:\n{self.sender_address.to_field_list()}\n" - out_str += f":Recipient Names: {recipient_names}\n" - out_str += f":Recipient Addresses: {self._recipient_addresses_to_str()}\n" - out_str += f":Return to Sender: {self.is_return_to_sender}\n" - return clean_out_string(out_str) diff --git a/mindee/product/us/us_mail/us_mail_v3_recipient_address.py b/mindee/product/us/us_mail/us_mail_v3_recipient_address.py deleted file mode 100644 index 91ce313c..00000000 --- a/mindee/product/us/us_mail/us_mail_v3_recipient_address.py +++ /dev/null @@ -1,114 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( - FieldConfidenceMixin, - FieldPositionMixin, - bool_to_string, - to_opt_bool, -) - - -class UsMailV3RecipientAddress(FieldPositionMixin, FieldConfidenceMixin): - """The addresses of the recipients.""" - - city: Optional[str] - """The city of the recipient's address.""" - complete: Optional[str] - """The complete address of the recipient.""" - is_address_change: Optional[bool] - """Indicates if the recipient's address is a change of address.""" - postal_code: Optional[str] - """The postal code of the recipient's address.""" - private_mailbox_number: Optional[str] - """The private mailbox number of the recipient's address.""" - state: Optional[str] - """Second part of the ISO 3166-2 code, consisting of two letters indicating the US State.""" - street: Optional[str] - """The street of the recipient's address.""" - unit: Optional[str] - """The unit number of the recipient's address.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.city = raw_prediction["city"] - self.complete = raw_prediction["complete"] - self.is_address_change = to_opt_bool(raw_prediction, "is_address_change") - self.postal_code = raw_prediction["postal_code"] - self.private_mailbox_number = raw_prediction["private_mailbox_number"] - self.state = raw_prediction["state"] - self.street = raw_prediction["street"] - self.unit = raw_prediction["unit"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["city"] = format_for_display(self.city) - out_dict["complete"] = format_for_display(self.complete) - out_dict["is_address_change"] = bool_to_string(self.is_address_change) - out_dict["postal_code"] = format_for_display(self.postal_code) - out_dict["private_mailbox_number"] = format_for_display( - self.private_mailbox_number - ) - out_dict["state"] = format_for_display(self.state) - out_dict["street"] = format_for_display(self.street) - out_dict["unit"] = format_for_display(self.unit) - return out_dict - - def _table_printable_values(self) -> Dict[str, str]: - """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} - out_dict["city"] = format_for_display(self.city, 15) - out_dict["complete"] = format_for_display(self.complete, 35) - out_dict["is_address_change"] = bool_to_string(self.is_address_change) - out_dict["postal_code"] = format_for_display(self.postal_code, None) - out_dict["private_mailbox_number"] = format_for_display( - self.private_mailbox_number, None - ) - out_dict["state"] = format_for_display(self.state, None) - out_dict["street"] = format_for_display(self.street, 25) - out_dict["unit"] = format_for_display(self.unit, 15) - return out_dict - - def to_table_line(self) -> str: - """Output in a format suitable for inclusion in an rST table.""" - printable = self._table_printable_values() - out_str: str = f"| {printable['city']:<15} | " - out_str += f"{printable['complete']:<35} | " - out_str += f"{printable['is_address_change']:<17} | " - out_str += f"{printable['postal_code']:<11} | " - out_str += f"{printable['private_mailbox_number']:<22} | " - out_str += f"{printable['state']:<5} | " - out_str += f"{printable['street']:<25} | " - out_str += f"{printable['unit']:<15} | " - return clean_out_string(out_str) - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"City: {printable['city']}, \n" - out_str += f"Complete Address: {printable['complete']}, \n" - out_str += f"Is Address Change: {printable['is_address_change']}, \n" - out_str += f"Postal Code: {printable['postal_code']}, \n" - out_str += f"Private Mailbox Number: {printable['private_mailbox_number']}, \n" - out_str += f"State: {printable['state']}, \n" - out_str += f"Street: {printable['street']}, \n" - out_str += f"Unit: {printable['unit']}, \n" - return clean_out_string(out_str) diff --git a/mindee/product/us/us_mail/us_mail_v3_sender_address.py b/mindee/product/us/us_mail/us_mail_v3_sender_address.py deleted file mode 100644 index 232d79fd..00000000 --- a/mindee/product/us/us_mail/us_mail_v3_sender_address.py +++ /dev/null @@ -1,74 +0,0 @@ -from typing import Dict, Optional - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin - - -class UsMailV3SenderAddress(FieldPositionMixin, FieldConfidenceMixin): - """The address of the sender.""" - - city: Optional[str] - """The city of the sender's address.""" - complete: Optional[str] - """The complete address of the sender.""" - postal_code: Optional[str] - """The postal code of the sender's address.""" - state: Optional[str] - """Second part of the ISO 3166-2 code, consisting of two letters indicating the US State.""" - street: Optional[str] - """The street of the sender's address.""" - page_n: int - """The document page on which the information was found.""" - - def __init__( - self, - raw_prediction: StringDict, - page_id: Optional[int] = None, - ): - self._set_confidence(raw_prediction) - self._set_position(raw_prediction) - - if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass - else: - self.page_n = page_id - - self.city = raw_prediction["city"] - self.complete = raw_prediction["complete"] - self.postal_code = raw_prediction["postal_code"] - self.state = raw_prediction["state"] - self.street = raw_prediction["street"] - - def _printable_values(self) -> Dict[str, str]: - """Return values for printing.""" - out_dict: Dict[str, str] = {} - out_dict["city"] = format_for_display(self.city) - out_dict["complete"] = format_for_display(self.complete) - out_dict["postal_code"] = format_for_display(self.postal_code) - out_dict["state"] = format_for_display(self.state) - out_dict["street"] = format_for_display(self.street) - return out_dict - - def to_field_list(self) -> str: - """Output the object in a format suitable for inclusion in an rST field list.""" - printable = self._printable_values() - out_str: str = f" :City: {printable['city']}\n" - out_str += f" :Complete Address: {printable['complete']}\n" - out_str += f" :Postal Code: {printable['postal_code']}\n" - out_str += f" :State: {printable['state']}\n" - out_str += f" :Street: {printable['street']}\n" - return out_str.rstrip() - - def __str__(self) -> str: - """Default string representation.""" - printable = self._printable_values() - out_str: str = f"City: {printable['city']}, \n" - out_str += f"Complete Address: {printable['complete']}, \n" - out_str += f"Postal Code: {printable['postal_code']}, \n" - out_str += f"State: {printable['state']}, \n" - out_str += f"Street: {printable['street']}, \n" - return clean_out_string(out_str) diff --git a/tests/v1/product/bill_of_lading/__init__.py b/tests/v1/product/bill_of_lading/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/bill_of_lading/test_bill_of_lading_v1.py b/tests/v1/product/bill_of_lading/test_bill_of_lading_v1.py deleted file mode 100644 index 204d5092..00000000 --- a/tests/v1/product/bill_of_lading/test_bill_of_lading_v1.py +++ /dev/null @@ -1,67 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.bill_of_lading.bill_of_lading_v1 import BillOfLadingV1 -from mindee.product.bill_of_lading.bill_of_lading_v1_document import ( - BillOfLadingV1Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "bill_of_lading" / "response_v1" - -BillOfLadingV1DocumentType = Document[ - BillOfLadingV1Document, - Page[BillOfLadingV1Document], -] - - -@pytest.fixture -def complete_doc() -> BillOfLadingV1DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(BillOfLadingV1, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> BillOfLadingV1DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(BillOfLadingV1, json_data["document"]) - - -def test_complete_doc(complete_doc: BillOfLadingV1DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: BillOfLadingV1DocumentType): - prediction = empty_doc.inference.prediction - assert prediction.bill_of_lading_number.value is None - assert prediction.shipper.address is None - assert prediction.shipper.email is None - assert prediction.shipper.name is None - assert prediction.shipper.phone is None - assert prediction.consignee.address is None - assert prediction.consignee.email is None - assert prediction.consignee.name is None - assert prediction.consignee.phone is None - assert prediction.notify_party.address is None - assert prediction.notify_party.email is None - assert prediction.notify_party.name is None - assert prediction.notify_party.phone is None - assert prediction.carrier.name is None - assert prediction.carrier.professional_number is None - assert prediction.carrier.scac is None - assert len(prediction.carrier_items) == 0 - assert prediction.port_of_loading.value is None - assert prediction.port_of_discharge.value is None - assert prediction.place_of_delivery.value is None - assert prediction.date_of_issue.value is None - assert prediction.departure_date.value is None diff --git a/tests/v1/product/business_card/__init__.py b/tests/v1/product/business_card/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/business_card/test_business_card_v1.py b/tests/v1/product/business_card/test_business_card_v1.py deleted file mode 100644 index 7111220a..00000000 --- a/tests/v1/product/business_card/test_business_card_v1.py +++ /dev/null @@ -1,56 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.business_card.business_card_v1 import BusinessCardV1 -from mindee.product.business_card.business_card_v1_document import ( - BusinessCardV1Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "business_card" / "response_v1" - -BusinessCardV1DocumentType = Document[ - BusinessCardV1Document, - Page[BusinessCardV1Document], -] - - -@pytest.fixture -def complete_doc() -> BusinessCardV1DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(BusinessCardV1, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> BusinessCardV1DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(BusinessCardV1, json_data["document"]) - - -def test_complete_doc(complete_doc: BusinessCardV1DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: BusinessCardV1DocumentType): - prediction = empty_doc.inference.prediction - assert prediction.firstname.value is None - assert prediction.lastname.value is None - assert prediction.job_title.value is None - assert prediction.company.value is None - assert prediction.email.value is None - assert prediction.phone_number.value is None - assert prediction.mobile_number.value is None - assert prediction.fax_number.value is None - assert prediction.address.value is None - assert prediction.website.value is None - assert len(prediction.social_media) == 0 diff --git a/tests/v1/product/delivery_note/__init__.py b/tests/v1/product/delivery_note/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/delivery_note/test_delivery_note_v1.py b/tests/v1/product/delivery_note/test_delivery_note_v1.py deleted file mode 100644 index 17145446..00000000 --- a/tests/v1/product/delivery_note/test_delivery_note_v1.py +++ /dev/null @@ -1,52 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.delivery_note.delivery_note_v1 import DeliveryNoteV1 -from mindee.product.delivery_note.delivery_note_v1_document import ( - DeliveryNoteV1Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "delivery_notes" / "response_v1" - -DeliveryNoteV1DocumentType = Document[ - DeliveryNoteV1Document, - Page[DeliveryNoteV1Document], -] - - -@pytest.fixture -def complete_doc() -> DeliveryNoteV1DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(DeliveryNoteV1, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> DeliveryNoteV1DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(DeliveryNoteV1, json_data["document"]) - - -def test_complete_doc(complete_doc: DeliveryNoteV1DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: DeliveryNoteV1DocumentType): - prediction = empty_doc.inference.prediction - assert prediction.delivery_date.value is None - assert prediction.delivery_number.value is None - assert prediction.supplier_name.value is None - assert prediction.supplier_address.value is None - assert prediction.customer_name.value is None - assert prediction.customer_address.value is None - assert prediction.total_amount.value is None diff --git a/tests/v1/product/driver_license/__init__.py b/tests/v1/product/driver_license/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/driver_license/test_driver_license_v1.py b/tests/v1/product/driver_license/test_driver_license_v1.py deleted file mode 100644 index 93df626b..00000000 --- a/tests/v1/product/driver_license/test_driver_license_v1.py +++ /dev/null @@ -1,58 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.driver_license.driver_license_v1 import DriverLicenseV1 -from mindee.product.driver_license.driver_license_v1_document import ( - DriverLicenseV1Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "driver_license" / "response_v1" - -DriverLicenseV1DocumentType = Document[ - DriverLicenseV1Document, - Page[DriverLicenseV1Document], -] - - -@pytest.fixture -def complete_doc() -> DriverLicenseV1DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(DriverLicenseV1, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> DriverLicenseV1DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(DriverLicenseV1, json_data["document"]) - - -def test_complete_doc(complete_doc: DriverLicenseV1DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: DriverLicenseV1DocumentType): - prediction = empty_doc.inference.prediction - assert prediction.country_code.value is None - assert prediction.state.value is None - assert prediction.id.value is None - assert prediction.category.value is None - assert prediction.last_name.value is None - assert prediction.first_name.value is None - assert prediction.date_of_birth.value is None - assert prediction.place_of_birth.value is None - assert prediction.expiry_date.value is None - assert prediction.issued_date.value is None - assert prediction.issuing_authority.value is None - assert prediction.mrz.value is None - assert prediction.dd_number.value is None diff --git a/tests/v1/product/fr/energy_bill/__init__.py b/tests/v1/product/fr/energy_bill/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/fr/energy_bill/test_energy_bill_v1.py b/tests/v1/product/fr/energy_bill/test_energy_bill_v1.py deleted file mode 100644 index 383d7dc5..00000000 --- a/tests/v1/product/fr/energy_bill/test_energy_bill_v1.py +++ /dev/null @@ -1,63 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.fr.energy_bill.energy_bill_v1 import EnergyBillV1 -from mindee.product.fr.energy_bill.energy_bill_v1_document import ( - EnergyBillV1Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "energy_bill_fra" / "response_v1" - -EnergyBillV1DocumentType = Document[ - EnergyBillV1Document, - Page[EnergyBillV1Document], -] - - -@pytest.fixture -def complete_doc() -> EnergyBillV1DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(EnergyBillV1, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> EnergyBillV1DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(EnergyBillV1, json_data["document"]) - - -def test_complete_doc(complete_doc: EnergyBillV1DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: EnergyBillV1DocumentType): - prediction = empty_doc.inference.prediction - assert prediction.invoice_number.value is None - assert prediction.contract_id.value is None - assert prediction.delivery_point.value is None - assert prediction.invoice_date.value is None - assert prediction.due_date.value is None - assert prediction.total_before_taxes.value is None - assert prediction.total_taxes.value is None - assert prediction.total_amount.value is None - assert prediction.energy_supplier.address is None - assert prediction.energy_supplier.name is None - assert prediction.energy_consumer.address is None - assert prediction.energy_consumer.name is None - assert len(prediction.subscription) == 0 - assert len(prediction.energy_usage) == 0 - assert len(prediction.taxes_and_contributions) == 0 - assert prediction.meter_details.meter_number is None - assert prediction.meter_details.meter_type is None - assert prediction.meter_details.unit is None diff --git a/tests/v1/product/fr/health_card/__init__.py b/tests/v1/product/fr/health_card/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/fr/health_card/test_health_card_v1.py b/tests/v1/product/fr/health_card/test_health_card_v1.py deleted file mode 100644 index 6c5f2b50..00000000 --- a/tests/v1/product/fr/health_card/test_health_card_v1.py +++ /dev/null @@ -1,49 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.fr.health_card.health_card_v1 import HealthCardV1 -from mindee.product.fr.health_card.health_card_v1_document import ( - HealthCardV1Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "french_healthcard" / "response_v1" - -HealthCardV1DocumentType = Document[ - HealthCardV1Document, - Page[HealthCardV1Document], -] - - -@pytest.fixture -def complete_doc() -> HealthCardV1DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(HealthCardV1, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> HealthCardV1DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(HealthCardV1, json_data["document"]) - - -def test_complete_doc(complete_doc: HealthCardV1DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: HealthCardV1DocumentType): - prediction = empty_doc.inference.prediction - assert len(prediction.given_names) == 0 - assert prediction.surname.value is None - assert prediction.social_security.value is None - assert prediction.issuance_date.value is None diff --git a/tests/v1/product/fr/payslip/__init__.py b/tests/v1/product/fr/payslip/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/fr/payslip/test_payslip_v3.py b/tests/v1/product/fr/payslip/test_payslip_v3.py deleted file mode 100644 index 44f356ef..00000000 --- a/tests/v1/product/fr/payslip/test_payslip_v3.py +++ /dev/null @@ -1,86 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.fr.payslip.payslip_v3 import PayslipV3 -from mindee.product.fr.payslip.payslip_v3_document import ( - PayslipV3Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "payslip_fra" / "response_v3" - -PayslipV3DocumentType = Document[ - PayslipV3Document, - Page[PayslipV3Document], -] - - -@pytest.fixture -def complete_doc() -> PayslipV3DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(PayslipV3, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> PayslipV3DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(PayslipV3, json_data["document"]) - - -def test_complete_doc(complete_doc: PayslipV3DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: PayslipV3DocumentType): - prediction = empty_doc.inference.prediction - assert prediction.pay_period.end_date is None - assert prediction.pay_period.month is None - assert prediction.pay_period.payment_date is None - assert prediction.pay_period.start_date is None - assert prediction.pay_period.year is None - assert prediction.employee.address is None - assert prediction.employee.date_of_birth is None - assert prediction.employee.first_name is None - assert prediction.employee.last_name is None - assert prediction.employee.phone_number is None - assert prediction.employee.registration_number is None - assert prediction.employee.social_security_number is None - assert prediction.employer.address is None - assert prediction.employer.company_id is None - assert prediction.employer.company_site is None - assert prediction.employer.naf_code is None - assert prediction.employer.name is None - assert prediction.employer.phone_number is None - assert prediction.employer.urssaf_number is None - assert prediction.bank_account_details.bank_name is None - assert prediction.bank_account_details.iban is None - assert prediction.bank_account_details.swift is None - assert prediction.employment.category is None - assert prediction.employment.coefficient is None - assert prediction.employment.collective_agreement is None - assert prediction.employment.job_title is None - assert prediction.employment.position_level is None - assert prediction.employment.seniority_date is None - assert prediction.employment.start_date is None - assert len(prediction.salary_details) == 0 - assert prediction.pay_detail.gross_salary is None - assert prediction.pay_detail.gross_salary_ytd is None - assert prediction.pay_detail.income_tax_rate is None - assert prediction.pay_detail.income_tax_withheld is None - assert prediction.pay_detail.net_paid is None - assert prediction.pay_detail.net_paid_before_tax is None - assert prediction.pay_detail.net_taxable is None - assert prediction.pay_detail.net_taxable_ytd is None - assert prediction.pay_detail.total_cost_employer is None - assert prediction.pay_detail.total_taxes_and_deductions is None - assert len(prediction.paid_time_off) == 0 diff --git a/tests/v1/product/ind/__init__.py b/tests/v1/product/ind/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/ind/indian_passport/__init__.py b/tests/v1/product/ind/indian_passport/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/ind/indian_passport/test_indian_passport_v1.py b/tests/v1/product/ind/indian_passport/test_indian_passport_v1.py deleted file mode 100644 index 3aca0562..00000000 --- a/tests/v1/product/ind/indian_passport/test_indian_passport_v1.py +++ /dev/null @@ -1,66 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.ind.indian_passport.indian_passport_v1 import IndianPassportV1 -from mindee.product.ind.indian_passport.indian_passport_v1_document import ( - IndianPassportV1Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "ind_passport" / "response_v1" - -IndianPassportV1DocumentType = Document[ - IndianPassportV1Document, - Page[IndianPassportV1Document], -] - - -@pytest.fixture -def complete_doc() -> IndianPassportV1DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(IndianPassportV1, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> IndianPassportV1DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(IndianPassportV1, json_data["document"]) - - -def test_complete_doc(complete_doc: IndianPassportV1DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: IndianPassportV1DocumentType): - prediction = empty_doc.inference.prediction - assert prediction.country.value is None - assert prediction.id_number.value is None - assert prediction.given_names.value is None - assert prediction.surname.value is None - assert prediction.birth_date.value is None - assert prediction.birth_place.value is None - assert prediction.issuance_place.value is None - assert prediction.issuance_date.value is None - assert prediction.expiry_date.value is None - assert prediction.mrz1.value is None - assert prediction.mrz2.value is None - assert prediction.legal_guardian.value is None - assert prediction.name_of_spouse.value is None - assert prediction.name_of_mother.value is None - assert prediction.old_passport_date_of_issue.value is None - assert prediction.old_passport_number.value is None - assert prediction.old_passport_place_of_issue.value is None - assert prediction.address1.value is None - assert prediction.address2.value is None - assert prediction.address3.value is None - assert prediction.file_number.value is None diff --git a/tests/v1/product/material_certificate/__init__.py b/tests/v1/product/material_certificate/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/material_certificate/test_material_certificate_v1.py b/tests/v1/product/material_certificate/test_material_certificate_v1.py deleted file mode 100644 index 0ef20dda..00000000 --- a/tests/v1/product/material_certificate/test_material_certificate_v1.py +++ /dev/null @@ -1,50 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.material_certificate.material_certificate_v1 import ( - MaterialCertificateV1, -) -from mindee.product.material_certificate.material_certificate_v1_document import ( - MaterialCertificateV1Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "material_certificate" / "response_v1" - -MaterialCertificateV1DocumentType = Document[ - MaterialCertificateV1Document, - Page[MaterialCertificateV1Document], -] - - -@pytest.fixture -def complete_doc() -> MaterialCertificateV1DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(MaterialCertificateV1, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> MaterialCertificateV1DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(MaterialCertificateV1, json_data["document"]) - - -def test_complete_doc(complete_doc: MaterialCertificateV1DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: MaterialCertificateV1DocumentType): - prediction = empty_doc.inference.prediction - assert prediction.certificate_type.value is None - assert prediction.norm.value is None - assert prediction.heat_number.value is None diff --git a/tests/v1/product/nutrition_facts_label/__init__.py b/tests/v1/product/nutrition_facts_label/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/nutrition_facts_label/test_nutrition_facts_label_v1.py b/tests/v1/product/nutrition_facts_label/test_nutrition_facts_label_v1.py deleted file mode 100644 index a9ed7519..00000000 --- a/tests/v1/product/nutrition_facts_label/test_nutrition_facts_label_v1.py +++ /dev/null @@ -1,85 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1 import ( - NutritionFactsLabelV1, -) -from mindee.product.nutrition_facts_label.nutrition_facts_label_v1_document import ( - NutritionFactsLabelV1Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "nutrition_facts" / "response_v1" - -NutritionFactsLabelV1DocumentType = Document[ - NutritionFactsLabelV1Document, - Page[NutritionFactsLabelV1Document], -] - - -@pytest.fixture -def complete_doc() -> NutritionFactsLabelV1DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(NutritionFactsLabelV1, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> NutritionFactsLabelV1DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(NutritionFactsLabelV1, json_data["document"]) - - -def test_complete_doc(complete_doc: NutritionFactsLabelV1DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: NutritionFactsLabelV1DocumentType): - prediction = empty_doc.inference.prediction - assert prediction.serving_per_box.value is None - assert prediction.serving_size.amount is None - assert prediction.serving_size.unit is None - assert prediction.calories.daily_value is None - assert prediction.calories.per_100g is None - assert prediction.calories.per_serving is None - assert prediction.total_fat.daily_value is None - assert prediction.total_fat.per_100g is None - assert prediction.total_fat.per_serving is None - assert prediction.saturated_fat.daily_value is None - assert prediction.saturated_fat.per_100g is None - assert prediction.saturated_fat.per_serving is None - assert prediction.trans_fat.daily_value is None - assert prediction.trans_fat.per_100g is None - assert prediction.trans_fat.per_serving is None - assert prediction.cholesterol.daily_value is None - assert prediction.cholesterol.per_100g is None - assert prediction.cholesterol.per_serving is None - assert prediction.total_carbohydrate.daily_value is None - assert prediction.total_carbohydrate.per_100g is None - assert prediction.total_carbohydrate.per_serving is None - assert prediction.dietary_fiber.daily_value is None - assert prediction.dietary_fiber.per_100g is None - assert prediction.dietary_fiber.per_serving is None - assert prediction.total_sugars.daily_value is None - assert prediction.total_sugars.per_100g is None - assert prediction.total_sugars.per_serving is None - assert prediction.added_sugars.daily_value is None - assert prediction.added_sugars.per_100g is None - assert prediction.added_sugars.per_serving is None - assert prediction.protein.daily_value is None - assert prediction.protein.per_100g is None - assert prediction.protein.per_serving is None - assert prediction.sodium.daily_value is None - assert prediction.sodium.per_100g is None - assert prediction.sodium.per_serving is None - assert prediction.sodium.unit is None - assert len(prediction.nutrients) == 0 diff --git a/tests/v1/product/resume/__init__.py b/tests/v1/product/resume/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/resume/test_resume_v1.py b/tests/v1/product/resume/test_resume_v1.py deleted file mode 100644 index 104df9ca..00000000 --- a/tests/v1/product/resume/test_resume_v1.py +++ /dev/null @@ -1,61 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.resume.resume_v1 import ResumeV1 -from mindee.product.resume.resume_v1_document import ( - ResumeV1Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "resume" / "response_v1" - -ResumeV1DocumentType = Document[ - ResumeV1Document, - Page[ResumeV1Document], -] - - -@pytest.fixture -def complete_doc() -> ResumeV1DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(ResumeV1, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> ResumeV1DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(ResumeV1, json_data["document"]) - - -def test_complete_doc(complete_doc: ResumeV1DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: ResumeV1DocumentType): - prediction = empty_doc.inference.prediction - assert prediction.document_language.value is None - assert len(prediction.given_names) == 0 - assert len(prediction.surnames) == 0 - assert prediction.nationality.value is None - assert prediction.email_address.value is None - assert prediction.phone_number.value is None - assert prediction.address.value is None - assert len(prediction.social_networks_urls) == 0 - assert prediction.profession.value is None - assert prediction.job_applied.value is None - assert len(prediction.languages) == 0 - assert len(prediction.hard_skills) == 0 - assert len(prediction.soft_skills) == 0 - assert len(prediction.education) == 0 - assert len(prediction.professional_experiences) == 0 - assert len(prediction.certificates) == 0 diff --git a/tests/v1/product/us/healthcare_card/__init__.py b/tests/v1/product/us/healthcare_card/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/us/healthcare_card/test_healthcare_card_v1.py b/tests/v1/product/us/healthcare_card/test_healthcare_card_v1.py deleted file mode 100644 index 26629bea..00000000 --- a/tests/v1/product/us/healthcare_card/test_healthcare_card_v1.py +++ /dev/null @@ -1,59 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.us.healthcare_card.healthcare_card_v1 import HealthcareCardV1 -from mindee.product.us.healthcare_card.healthcare_card_v1_document import ( - HealthcareCardV1Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "us_healthcare_cards" / "response_v1" - -HealthcareCardV1DocumentType = Document[ - HealthcareCardV1Document, - Page[HealthcareCardV1Document], -] - - -@pytest.fixture -def complete_doc() -> HealthcareCardV1DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(HealthcareCardV1, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> HealthcareCardV1DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(HealthcareCardV1, json_data["document"]) - - -def test_complete_doc(complete_doc: HealthcareCardV1DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: HealthcareCardV1DocumentType): - prediction = empty_doc.inference.prediction - assert prediction.company_name.value is None - assert prediction.plan_name.value is None - assert prediction.member_name.value is None - assert prediction.member_id.value is None - assert prediction.issuer_80840.value is None - assert len(prediction.dependents) == 0 - assert prediction.group_number.value is None - assert prediction.payer_id.value is None - assert prediction.rx_bin.value is None - assert prediction.rx_id.value is None - assert prediction.rx_grp.value is None - assert prediction.rx_pcn.value is None - assert len(prediction.copays) == 0 - assert prediction.enrollment_date.value is None diff --git a/tests/v1/product/us/us_mail/__init__.py b/tests/v1/product/us/us_mail/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/v1/product/us/us_mail/test_us_mail_v3.py b/tests/v1/product/us/us_mail/test_us_mail_v3.py deleted file mode 100644 index ea3b4862..00000000 --- a/tests/v1/product/us/us_mail/test_us_mail_v3.py +++ /dev/null @@ -1,54 +0,0 @@ -import json - -import pytest - -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.us.us_mail.us_mail_v3 import UsMailV3 -from mindee.product.us.us_mail.us_mail_v3_document import ( - UsMailV3Document, -) -from tests.utils import V1_PRODUCT_DATA_DIR - -RESPONSE_DIR = V1_PRODUCT_DATA_DIR / "us_mail" / "response_v3" - -UsMailV3DocumentType = Document[ - UsMailV3Document, - Page[UsMailV3Document], -] - - -@pytest.fixture -def complete_doc() -> UsMailV3DocumentType: - file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(UsMailV3, json_data["document"]) - - -@pytest.fixture -def empty_doc() -> UsMailV3DocumentType: - file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: - json_data = json.load(open_file) - return Document(UsMailV3, json_data["document"]) - - -def test_complete_doc(complete_doc: UsMailV3DocumentType): - file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: - reference_str = open_file.read() - assert str(complete_doc) == reference_str - - -def test_empty_doc(empty_doc: UsMailV3DocumentType): - prediction = empty_doc.inference.prediction - assert prediction.sender_name.value is None - assert prediction.sender_address.city is None - assert prediction.sender_address.complete is None - assert prediction.sender_address.postal_code is None - assert prediction.sender_address.state is None - assert prediction.sender_address.street is None - assert len(prediction.recipient_names) == 0 - assert len(prediction.recipient_addresses) == 0 - assert prediction.is_return_to_sender.value is None From af9e357d0b6ab1d8bcc63eae212bdeeb9b590123 Mon Sep 17 00:00:00 2001 From: sebastianMindee <130448732+sebastianMindee@users.noreply.github.com> Date: Mon, 1 Jun 2026 15:51:13 +0200 Subject: [PATCH 03/10] :boom: :recycle: move v1 and v2 internals to their respective namespaces --- ...uto_invoice_splitter_extraction_example.py | 6 +- .../auto_multi_receipts_extraction_example.py | 3 +- examples/custom_line_items_reconstruction.py | 5 +- examples/display_cropping.py | 5 +- mindee/__init__.py | 38 +---- mindee/commands/cli_parser.py | 10 +- mindee/commands/cli_products.py | 4 +- mindee/error/mindee_http_error.py | 2 +- mindee/error/v2/__init__.py | 0 mindee/error/{ => v2}/mindee_http_error_v2.py | 4 +- .../multi_receipts_extractor.py | 2 +- .../extraction/pdf_extractor/pdf_extractor.py | 2 +- mindee/input/__init__.py | 8 +- mindee/input/inference_parameters.py | 134 ------------------ mindee/input/local_response.py | 2 +- mindee/input/sources/__init__.py | 2 - mindee/input/sources/base_64_input.py | 3 +- mindee/input/sources/bytes_input.py | 3 +- mindee/input/sources/file_input.py | 3 +- mindee/input/sources/input_type.py | 11 -- mindee/input/sources/local_input_source.py | 12 +- mindee/input/sources/path_input.py | 3 +- mindee/input/sources/url_input_source.py | 3 - mindee/mindee_http/endpoint.py | 2 +- mindee/mindee_http/mindee_api_v2.py | 2 +- mindee/mindee_http/response_validation.py | 2 +- mindee/mindee_http/workflow_endpoint.py | 2 +- mindee/parsing/__init__.py | 8 +- mindee/parsing/common/__init__.py | 46 +----- .../parsing/{v2 => common}/common_response.py | 0 mindee/parsing/common/extras/__init__.py | 7 - mindee/parsing/common/ocr/__init__.py | 3 - mindee/parsing/custom/__init__.py | 11 -- mindee/parsing/standard/__init__.py | 46 ------ mindee/parsing/v2/__init__.py | 21 --- mindee/parsing/v2/base_inference.py | 29 ---- mindee/parsing/v2/base_response.py | 21 --- mindee/parsing/v2/field/__init__.py | 17 --- mindee/parsing/v2/inference_job.py | 14 -- mindee/product/__init__.py | 90 ------------ mindee/product/barcode_reader/__init__.py | 9 -- mindee/product/cropper/__init__.py | 13 -- mindee/product/financial_document/__init__.py | 13 -- mindee/product/fr/__init__.py | 49 ------- .../fr/bank_account_details/__init__.py | 23 --- mindee/product/fr/carte_grise/__init__.py | 9 -- mindee/product/fr/id_card/__init__.py | 23 --- mindee/product/international_id/__init__.py | 9 -- mindee/product/invoice/__init__.py | 13 -- mindee/product/invoice_splitter/__init__.py | 13 -- .../multi_receipts_detector/__init__.py | 11 -- mindee/product/passport/__init__.py | 9 -- mindee/product/receipt/__init__.py | 13 -- mindee/product/us/__init__.py | 13 -- mindee/product/us/bank_check/__init__.py | 13 -- mindee/v1/__init__.py | 17 +++ mindee/{ => v1}/client.py | 12 +- mindee/v1/input/__init__.py | 0 mindee/{ => v1}/input/workflow_options.py | 2 +- mindee/v1/parsing/__init__.py | 0 mindee/v1/parsing/common/__init__.py | 43 ++++++ mindee/{ => v1}/parsing/common/api_request.py | 0 .../{ => v1}/parsing/common/api_response.py | 2 +- .../parsing/common/async_predict_response.py | 8 +- mindee/{ => v1}/parsing/common/document.py | 10 +- mindee/{ => v1}/parsing/common/execution.py | 12 +- .../{ => v1}/parsing/common/execution_file.py | 0 .../parsing/common/execution_priority.py | 0 mindee/v1/parsing/common/extras/__init__.py | 7 + .../parsing/common/extras/cropper_extra.py | 2 +- .../{ => v1}/parsing/common/extras/extras.py | 6 +- .../common/extras/full_text_ocr_extra.py | 0 .../parsing/common/extras/rag_extra.py | 0 .../parsing/common/feedback_response.py | 2 +- mindee/{ => v1}/parsing/common/inference.py | 8 +- mindee/{ => v1}/parsing/common/job.py | 0 mindee/v1/parsing/common/ocr/__init__.py | 3 + .../{ => v1}/parsing/common/ocr/mvision_v1.py | 2 +- mindee/{ => v1}/parsing/common/ocr/ocr.py | 2 +- .../{ => v1}/parsing/common/ocr/ocr_line.py | 2 +- .../{ => v1}/parsing/common/ocr/ocr_page.py | 4 +- .../{ => v1}/parsing/common/ocr/ocr_word.py | 2 +- mindee/{ => v1}/parsing/common/orientation.py | 2 +- mindee/{ => v1}/parsing/common/page.py | 6 +- .../parsing/common/predict_response.py | 6 +- mindee/{ => v1}/parsing/common/prediction.py | 0 mindee/{ => v1}/parsing/common/product.py | 0 .../parsing/common/workflow_response.py | 8 +- mindee/v1/parsing/custom/__init__.py | 11 ++ .../{ => v1}/parsing/custom/classification.py | 2 +- mindee/{ => v1}/parsing/custom/line_items.py | 2 +- mindee/{ => v1}/parsing/custom/list.py | 4 +- mindee/{ => v1}/parsing/generated/__init__.py | 4 +- .../parsing/generated/generated_list.py | 6 +- .../parsing/generated/generated_object.py | 4 +- mindee/v1/parsing/standard/__init__.py | 52 +++++++ mindee/{ => v1}/parsing/standard/address.py | 4 +- mindee/{ => v1}/parsing/standard/amount.py | 8 +- mindee/{ => v1}/parsing/standard/base.py | 2 +- mindee/{ => v1}/parsing/standard/boolean.py | 4 +- .../parsing/standard/classification.py | 4 +- .../parsing/standard/company_registration.py | 6 +- mindee/{ => v1}/parsing/standard/date.py | 4 +- mindee/{ => v1}/parsing/standard/locale.py | 4 +- .../parsing/standard/payment_details.py | 4 +- mindee/{ => v1}/parsing/standard/position.py | 4 +- mindee/{ => v1}/parsing/standard/tax.py | 8 +- mindee/{ => v1}/parsing/standard/text.py | 4 +- mindee/v1/product/__init__.py | 97 +++++++++++++ mindee/v1/product/barcode_reader/__init__.py | 9 ++ .../barcode_reader/barcode_reader_v1.py | 6 +- .../barcode_reader_v1_document.py | 4 +- mindee/v1/product/cropper/__init__.py | 13 ++ mindee/{ => v1}/product/cropper/cropper_v1.py | 8 +- .../product/cropper/cropper_v1_document.py | 2 +- .../product/cropper/cropper_v1_page.py | 4 +- mindee/{ => v1}/product/custom/__init__.py | 2 +- mindee/{ => v1}/product/custom/custom_v1.py | 8 +- .../product/custom/custom_v1_document.py | 8 +- .../{ => v1}/product/custom/custom_v1_page.py | 6 +- .../v1/product/financial_document/__init__.py | 15 ++ .../financial_document_v1.py | 6 +- .../financial_document_v1_document.py | 22 +-- .../financial_document_v1_line_item.py | 2 +- mindee/v1/product/fr/__init__.py | 49 +++++++ .../fr/bank_account_details/__init__.py | 23 +++ .../bank_account_details_v1.py | 6 +- .../bank_account_details_v1_document.py | 4 +- .../bank_account_details_v2.py | 6 +- .../bank_account_details_v2_bban.py | 2 +- .../bank_account_details_v2_document.py | 6 +- mindee/v1/product/fr/carte_grise/__init__.py | 9 ++ .../product/fr/carte_grise/carte_grise_v1.py | 6 +- .../fr/carte_grise/carte_grise_v1_document.py | 6 +- mindee/v1/product/fr/id_card/__init__.py | 23 +++ .../{ => v1}/product/fr/id_card/id_card_v1.py | 8 +- .../product/fr/id_card/id_card_v1_document.py | 6 +- .../product/fr/id_card/id_card_v1_page.py | 4 +- .../{ => v1}/product/fr/id_card/id_card_v2.py | 8 +- .../product/fr/id_card/id_card_v2_document.py | 6 +- .../product/fr/id_card/id_card_v2_page.py | 4 +- mindee/{ => v1}/product/generated/__init__.py | 2 +- .../product/generated/generated_v1.py | 8 +- .../generated/generated_v1_document.py | 8 +- .../product/generated/generated_v1_page.py | 8 +- .../generated/generated_v1_prediction.py | 8 +- .../v1/product/international_id/__init__.py | 9 ++ .../international_id/international_id_v2.py | 6 +- .../international_id_v2_document.py | 8 +- mindee/v1/product/invoice/__init__.py | 13 ++ mindee/{ => v1}/product/invoice/invoice_v4.py | 6 +- .../product/invoice/invoice_v4_document.py | 22 +-- .../product/invoice/invoice_v4_line_item.py | 2 +- .../v1/product/invoice_splitter/__init__.py | 13 ++ .../invoice_splitter/invoice_splitter_v1.py | 6 +- .../invoice_splitter_v1_document.py | 4 +- .../invoice_splitter_v1_invoice_page_group.py | 2 +- .../multi_receipts_detector/__init__.py | 11 ++ .../multi_receipts_detector_v1.py | 6 +- .../multi_receipts_detector_v1_document.py | 4 +- mindee/v1/product/passport/__init__.py | 9 ++ .../{ => v1}/product/passport/passport_v1.py | 6 +- .../product/passport/passport_v1_document.py | 6 +- mindee/v1/product/receipt/__init__.py | 13 ++ mindee/{ => v1}/product/receipt/receipt_v5.py | 6 +- .../product/receipt/receipt_v5_document.py | 18 +-- .../product/receipt/receipt_v5_line_item.py | 2 +- mindee/v1/product/us/__init__.py | 13 ++ mindee/v1/product/us/bank_check/__init__.py | 13 ++ .../product/us/bank_check/bank_check_v1.py | 8 +- .../us/bank_check/bank_check_v1_document.py | 8 +- .../us/bank_check/bank_check_v1_page.py | 4 +- mindee/v2/__init__.py | 10 +- mindee/{client_v2.py => v2/client.py} | 17 +-- mindee/v2/commands/cli_parser.py | 12 +- mindee/v2/file_operations/crop.py | 2 +- mindee/v2/input/__init__.py | 0 mindee/{ => v2}/input/base_parameters.py | 0 mindee/v2/parsing/__init__.py | 22 ++- mindee/v2/parsing/inference/__init__.py | 7 - mindee/v2/parsing/inference/base_inference.py | 30 +++- mindee/v2/parsing/inference/base_response.py | 22 ++- .../v2 => v2/parsing/inference}/error_item.py | 2 +- .../parsing/inference}/error_response.py | 4 +- mindee/v2/parsing/inference/field/__init__.py | 17 +++ .../parsing/inference}/field/base_field.py | 8 +- .../parsing/inference}/field/dynamic_field.py | 14 +- .../inference}/field/field_confidence.py | 0 .../inference}/field/field_location.py | 2 +- .../inference}/field/inference_fields.py | 4 +- .../parsing/inference}/field/list_field.py | 10 +- .../parsing/inference}/field/object_field.py | 12 +- .../parsing/inference}/field/simple_field.py | 6 +- .../inference}/inference_active_options.py | 2 +- .../parsing/inference}/inference_file.py | 2 +- mindee/v2/parsing/inference/inference_job.py | 15 +- .../parsing/inference}/inference_model.py | 2 +- .../v2 => v2/parsing/inference}/job.py | 6 +- .../parsing/inference}/job_response.py | 6 +- .../parsing/inference}/job_webhook.py | 4 +- .../parsing/inference}/rag_metadata.py | 2 +- .../v2 => v2/parsing/inference}/raw_text.py | 4 +- .../parsing/inference}/raw_text_page.py | 2 +- mindee/v2/product/__init__.py | 8 +- mindee/v2/product/classification/__init__.py | 2 +- .../classification_classifier.py | 4 +- .../classification_inference.py | 4 +- .../classification/classification_response.py | 4 +- .../classification/classification_result.py | 2 +- .../product/classification/param/__init__.py | 5 + .../{ => param}/classification_parameters.py | 2 +- mindee/v2/product/crop/__init__.py | 2 +- mindee/v2/product/crop/crop_box.py | 8 +- mindee/v2/product/crop/crop_inference.py | 4 +- mindee/v2/product/crop/crop_response.py | 4 +- mindee/v2/product/crop/crop_result.py | 2 +- mindee/v2/product/crop/params/__init__.py | 3 + .../crop/{ => params}/crop_parameters.py | 2 +- mindee/v2/product/extraction/__init__.py | 19 +++ .../v2 => v2/product/extraction}/inference.py | 8 +- .../product/extraction}/inference_response.py | 6 +- .../product/extraction}/inference_result.py | 8 +- .../v2/product/extraction/params/__init__.py | 13 ++ .../product/extraction/params/data_schema.py | 20 +++ .../extraction/params/data_schema_field.py | 31 ++++ .../extraction/params/data_schema_replace.py | 21 +++ .../extraction/params/inference_parameters.py | 63 ++++++++ .../extraction/params/string_data_class.py | 17 +++ mindee/v2/product/ocr/__init__.py | 2 +- mindee/v2/product/ocr/ocr_inference.py | 4 +- mindee/v2/product/ocr/ocr_page.py | 2 +- mindee/v2/product/ocr/ocr_response.py | 4 +- mindee/v2/product/ocr/ocr_result.py | 2 +- mindee/v2/product/ocr/params/__init__.py | 3 + .../ocr/{ => params}/ocr_parameters.py | 2 +- mindee/v2/product/split/__init__.py | 2 +- mindee/v2/product/split/params/__init__.py | 3 + .../split/{ => params}/split_parameters.py | 2 +- mindee/v2/product/split/split_inference.py | 4 +- mindee/v2/product/split/split_range.py | 4 +- mindee/v2/product/split/split_response.py | 4 +- mindee/v2/product/split/split_result.py | 2 +- tests/v1/api/test_async_response.py | 8 +- tests/v1/api/test_feedback_response.py | 2 +- tests/v1/api/test_response.py | 26 ++-- tests/v1/extraction/test_image_extractor.py | 2 +- .../test_invoice_splitter_auto_extraction.py | 8 +- .../test_multi_receipts_extractor.py | 2 +- tests/v1/extraction/test_pdf_extractor.py | 6 +- tests/v1/extras/test_extras_integration.py | 6 +- tests/v1/extras/test_full_text_ocr.py | 4 +- .../test_url_input_source_integration.py | 4 +- tests/v1/mindee_http/test_error.py | 3 +- tests/v1/parsing/common/test_ocr.py | 2 +- tests/v1/parsing/common/test_orientation.py | 2 +- tests/v1/parsing/standard/test_amount.py | 2 +- tests/v1/parsing/standard/test_date.py | 2 +- tests/v1/parsing/standard/test_field.py | 6 +- tests/v1/parsing/standard/test_locale.py | 2 +- .../parsing/standard/test_payment_details.py | 2 +- tests/v1/parsing/standard/test_position.py | 2 +- tests/v1/parsing/standard/test_string.py | 2 +- tests/v1/parsing/standard/test_tax.py | 2 +- .../barcode_reader/test_barcode_reader_v1.py | 8 +- .../test_barcode_reader_v1_regression.py | 4 +- tests/v1/product/cropper/test_cropper_v1.py | 10 +- .../cropper/test_cropper_v1_regression.py | 4 +- tests/v1/product/custom/test_custom_v1.py | 14 +- .../custom/test_custom_v1_line_items.py | 8 +- tests/v1/product/custom/test_custom_v1_v2.py | 14 +- .../test_financial_document_v1.py | 10 +- .../test_financial_document_v1_regression.py | 6 +- .../test_bank_account_details_v1.py | 8 +- ...test_bank_account_details_v1_regression.py | 4 +- .../test_bank_account_details_v2.py | 8 +- ...test_bank_account_details_v2_regression.py | 4 +- .../fr/carte_grise/test_carte_grise_v1.py | 8 +- .../test_carte_grise_v1_regression.py | 4 +- .../v1/product/fr/id_card/test_id_card_v1.py | 10 +- .../fr/id_card/test_id_card_v1_regression.py | 4 +- .../v1/product/fr/id_card/test_id_card_v2.py | 10 +- .../fr/id_card/test_id_card_v2_regression.py | 4 +- .../v1/product/generated/test_generated_v1.py | 18 +-- .../test_international_id_v2.py | 8 +- tests/v1/product/invoice/test_invoice_v4.py | 8 +- .../invoice/test_invoice_v4_regression.py | 4 +- .../test_invoice_splitter_v1.py | 8 +- .../test_invoice_splitter_v1_regression.py | 4 +- .../test_multi_receipts_detector_v1.py | 8 +- ...t_multi_receipts_detector_v1_regression.py | 4 +- tests/v1/product/passport/test_passport_v1.py | 8 +- .../passport/test_passport_v1_regression.py | 4 +- tests/v1/product/receipt/test_receipt_v5.py | 8 +- .../receipt/test_receipt_v5_regression.py | 4 +- .../us/bank_check/test_bank_check_v1.py | 10 +- .../test_bank_check_v1_regression.py | 4 +- tests/v1/test_client.py | 18 ++- tests/v1/workflows/test_workflow.py | 4 +- .../v1/workflows/test_workflow_integration.py | 6 +- .../test_crop_operation_integration.py | 6 +- .../test_split_operation_integration.py | 4 +- tests/v2/input/test_inference_parameters.py | 8 +- tests/v2/parsing/test_job_response.py | 3 +- .../test_classification_integration.py | 11 +- .../v2/product/crop/test_crop_integration.py | 9 +- .../extraction/test_extraction_response.py | 20 +-- tests/v2/product/ocr/test_ocr_integration.py | 9 +- .../product/split/test_split_integration.py | 9 +- tests/v2/test_base_classes.py | 10 +- tests/v2/test_client.py | 21 +-- tests/v2/test_client_integration.py | 31 ++-- 311 files changed, 1444 insertions(+), 1378 deletions(-) create mode 100644 mindee/error/v2/__init__.py rename mindee/error/{ => v2}/mindee_http_error_v2.py (93%) delete mode 100644 mindee/input/inference_parameters.py delete mode 100644 mindee/input/sources/input_type.py rename mindee/parsing/{v2 => common}/common_response.py (100%) delete mode 100644 mindee/parsing/common/extras/__init__.py delete mode 100644 mindee/parsing/common/ocr/__init__.py delete mode 100644 mindee/parsing/custom/__init__.py delete mode 100644 mindee/parsing/standard/__init__.py delete mode 100644 mindee/parsing/v2/__init__.py delete mode 100644 mindee/parsing/v2/base_inference.py delete mode 100644 mindee/parsing/v2/base_response.py delete mode 100644 mindee/parsing/v2/field/__init__.py delete mode 100644 mindee/parsing/v2/inference_job.py delete mode 100644 mindee/product/__init__.py delete mode 100644 mindee/product/barcode_reader/__init__.py delete mode 100644 mindee/product/cropper/__init__.py delete mode 100644 mindee/product/financial_document/__init__.py delete mode 100644 mindee/product/fr/__init__.py delete mode 100644 mindee/product/fr/bank_account_details/__init__.py delete mode 100644 mindee/product/fr/carte_grise/__init__.py delete mode 100644 mindee/product/fr/id_card/__init__.py delete mode 100644 mindee/product/international_id/__init__.py delete mode 100644 mindee/product/invoice/__init__.py delete mode 100644 mindee/product/invoice_splitter/__init__.py delete mode 100644 mindee/product/multi_receipts_detector/__init__.py delete mode 100644 mindee/product/passport/__init__.py delete mode 100644 mindee/product/receipt/__init__.py delete mode 100644 mindee/product/us/__init__.py delete mode 100644 mindee/product/us/bank_check/__init__.py create mode 100644 mindee/v1/__init__.py rename mindee/{ => v1}/client.py (98%) create mode 100644 mindee/v1/input/__init__.py rename mindee/{ => v1}/input/workflow_options.py (94%) create mode 100644 mindee/v1/parsing/__init__.py create mode 100644 mindee/v1/parsing/common/__init__.py rename mindee/{ => v1}/parsing/common/api_request.py (100%) rename mindee/{ => v1}/parsing/common/api_response.py (93%) rename mindee/{ => v1}/parsing/common/async_predict_response.py (81%) rename mindee/{ => v1}/parsing/common/document.py (90%) rename mindee/{ => v1}/parsing/common/execution.py (88%) rename mindee/{ => v1}/parsing/common/execution_file.py (100%) rename mindee/{ => v1}/parsing/common/execution_priority.py (100%) create mode 100644 mindee/v1/parsing/common/extras/__init__.py rename mindee/{ => v1}/parsing/common/extras/cropper_extra.py (92%) rename mindee/{ => v1}/parsing/common/extras/extras.py (88%) rename mindee/{ => v1}/parsing/common/extras/full_text_ocr_extra.py (100%) rename mindee/{ => v1}/parsing/common/extras/rag_extra.py (100%) rename mindee/{ => v1}/parsing/common/feedback_response.py (85%) rename mindee/{ => v1}/parsing/common/inference.py (92%) rename mindee/{ => v1}/parsing/common/job.py (100%) create mode 100644 mindee/v1/parsing/common/ocr/__init__.py rename mindee/{ => v1}/parsing/common/ocr/mvision_v1.py (88%) rename mindee/{ => v1}/parsing/common/ocr/ocr.py (85%) rename mindee/{ => v1}/parsing/common/ocr/ocr_line.py (87%) rename mindee/{ => v1}/parsing/common/ocr/ocr_page.py (95%) rename mindee/{ => v1}/parsing/common/ocr/ocr_word.py (88%) rename mindee/{ => v1}/parsing/common/orientation.py (95%) rename mindee/{ => v1}/parsing/common/page.py (88%) rename mindee/{ => v1}/parsing/common/predict_response.py (80%) rename mindee/{ => v1}/parsing/common/prediction.py (100%) rename mindee/{ => v1}/parsing/common/product.py (100%) rename mindee/{ => v1}/parsing/common/workflow_response.py (70%) create mode 100644 mindee/v1/parsing/custom/__init__.py rename mindee/{ => v1}/parsing/custom/classification.py (87%) rename mindee/{ => v1}/parsing/custom/line_items.py (98%) rename mindee/{ => v1}/parsing/custom/list.py (94%) rename mindee/{ => v1}/parsing/generated/__init__.py (52%) rename mindee/{ => v1}/parsing/generated/generated_list.py (90%) rename mindee/{ => v1}/parsing/generated/generated_object.py (95%) create mode 100644 mindee/v1/parsing/standard/__init__.py rename mindee/{ => v1}/parsing/standard/address.py (94%) rename mindee/{ => v1}/parsing/standard/amount.py (88%) rename mindee/{ => v1}/parsing/standard/base.py (99%) rename mindee/{ => v1}/parsing/standard/boolean.py (88%) rename mindee/{ => v1}/parsing/standard/classification.py (88%) rename mindee/{ => v1}/parsing/standard/company_registration.py (87%) rename mindee/{ => v1}/parsing/standard/date.py (93%) rename mindee/{ => v1}/parsing/standard/locale.py (94%) rename mindee/{ => v1}/parsing/standard/payment_details.py (96%) rename mindee/{ => v1}/parsing/standard/position.py (96%) rename mindee/{ => v1}/parsing/standard/tax.py (96%) rename mindee/{ => v1}/parsing/standard/text.py (89%) create mode 100644 mindee/v1/product/__init__.py create mode 100644 mindee/v1/product/barcode_reader/__init__.py rename mindee/{ => v1}/product/barcode_reader/barcode_reader_v1.py (86%) rename mindee/{ => v1}/product/barcode_reader/barcode_reader_v1_document.py (92%) create mode 100644 mindee/v1/product/cropper/__init__.py rename mindee/{ => v1}/product/cropper/cropper_v1.py (82%) rename mindee/{ => v1}/product/cropper/cropper_v1_document.py (69%) rename mindee/{ => v1}/product/cropper/cropper_v1_page.py (90%) rename mindee/{ => v1}/product/custom/__init__.py (72%) rename mindee/{ => v1}/product/custom/custom_v1.py (78%) rename mindee/{ => v1}/product/custom/custom_v1_document.py (88%) rename mindee/{ => v1}/product/custom/custom_v1_page.py (89%) create mode 100644 mindee/v1/product/financial_document/__init__.py rename mindee/{ => v1}/product/financial_document/financial_document_v1.py (85%) rename mindee/{ => v1}/product/financial_document/financial_document_v1_document.py (94%) rename mindee/{ => v1}/product/financial_document/financial_document_v1_line_item.py (99%) create mode 100644 mindee/v1/product/fr/__init__.py create mode 100644 mindee/v1/product/fr/bank_account_details/__init__.py rename mindee/{ => v1}/product/fr/bank_account_details/bank_account_details_v1.py (85%) rename mindee/{ => v1}/product/fr/bank_account_details/bank_account_details_v1_document.py (92%) rename mindee/{ => v1}/product/fr/bank_account_details/bank_account_details_v2.py (85%) rename mindee/{ => v1}/product/fr/bank_account_details/bank_account_details_v2_bban.py (97%) rename mindee/{ => v1}/product/fr/bank_account_details/bank_account_details_v2_document.py (90%) create mode 100644 mindee/v1/product/fr/carte_grise/__init__.py rename mindee/{ => v1}/product/fr/carte_grise/carte_grise_v1.py (86%) rename mindee/{ => v1}/product/fr/carte_grise/carte_grise_v1_document.py (98%) create mode 100644 mindee/v1/product/fr/id_card/__init__.py rename mindee/{ => v1}/product/fr/id_card/id_card_v1.py (82%) rename mindee/{ => v1}/product/fr/id_card/id_card_v1_document.py (95%) rename mindee/{ => v1}/product/fr/id_card/id_card_v1_page.py (88%) rename mindee/{ => v1}/product/fr/id_card/id_card_v2.py (82%) rename mindee/{ => v1}/product/fr/id_card/id_card_v2_document.py (96%) rename mindee/{ => v1}/product/fr/id_card/id_card_v2_page.py (90%) rename mindee/{ => v1}/product/generated/__init__.py (73%) rename mindee/{ => v1}/product/generated/generated_v1.py (78%) rename mindee/{ => v1}/product/generated/generated_v1_document.py (84%) rename mindee/{ => v1}/product/generated/generated_v1_page.py (85%) rename mindee/{ => v1}/product/generated/generated_v1_prediction.py (92%) create mode 100644 mindee/v1/product/international_id/__init__.py rename mindee/{ => v1}/product/international_id/international_id_v2.py (86%) rename mindee/{ => v1}/product/international_id/international_id_v2_document.py (95%) create mode 100644 mindee/v1/product/invoice/__init__.py rename mindee/{ => v1}/product/invoice/invoice_v4.py (86%) rename mindee/{ => v1}/product/invoice/invoice_v4_document.py (93%) rename mindee/{ => v1}/product/invoice/invoice_v4_line_item.py (99%) create mode 100644 mindee/v1/product/invoice_splitter/__init__.py rename mindee/{ => v1}/product/invoice_splitter/invoice_splitter_v1.py (86%) rename mindee/{ => v1}/product/invoice_splitter/invoice_splitter_v1_document.py (93%) rename mindee/{ => v1}/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.py (95%) create mode 100644 mindee/v1/product/multi_receipts_detector/__init__.py rename mindee/{ => v1}/product/multi_receipts_detector/multi_receipts_detector_v1.py (85%) rename mindee/{ => v1}/product/multi_receipts_detector/multi_receipts_detector_v1_document.py (90%) create mode 100644 mindee/v1/product/passport/__init__.py rename mindee/{ => v1}/product/passport/passport_v1.py (86%) rename mindee/{ => v1}/product/passport/passport_v1_document.py (95%) create mode 100644 mindee/v1/product/receipt/__init__.py rename mindee/{ => v1}/product/receipt/receipt_v5.py (86%) rename mindee/{ => v1}/product/receipt/receipt_v5_document.py (91%) rename mindee/{ => v1}/product/receipt/receipt_v5_line_item.py (98%) create mode 100644 mindee/v1/product/us/__init__.py create mode 100644 mindee/v1/product/us/bank_check/__init__.py rename mindee/{ => v1}/product/us/bank_check/bank_check_v1.py (81%) rename mindee/{ => v1}/product/us/bank_check/bank_check_v1_document.py (90%) rename mindee/{ => v1}/product/us/bank_check/bank_check_v1_page.py (91%) rename mindee/{client_v2.py => v2/client.py} (92%) create mode 100644 mindee/v2/input/__init__.py rename mindee/{ => v2}/input/base_parameters.py (100%) rename mindee/{parsing/v2 => v2/parsing/inference}/error_item.py (87%) rename mindee/{parsing/v2 => v2/parsing/inference}/error_response.py (90%) create mode 100644 mindee/v2/parsing/inference/field/__init__.py rename mindee/{parsing/v2 => v2/parsing/inference}/field/base_field.py (76%) rename mindee/{parsing/v2 => v2/parsing/inference}/field/dynamic_field.py (74%) rename mindee/{parsing/v2 => v2/parsing/inference}/field/field_confidence.py (100%) rename mindee/{parsing/v2 => v2/parsing/inference}/field/field_location.py (93%) rename mindee/{parsing/v2 => v2/parsing/inference}/field/inference_fields.py (90%) rename mindee/{parsing/v2 => v2/parsing/inference}/field/list_field.py (83%) rename mindee/{parsing/v2 => v2/parsing/inference}/field/object_field.py (92%) rename mindee/{parsing/v2 => v2/parsing/inference}/field/simple_field.py (78%) rename mindee/{parsing/v2 => v2/parsing/inference}/inference_active_options.py (97%) rename mindee/{parsing/v2 => v2/parsing/inference}/inference_file.py (93%) rename mindee/{parsing/v2 => v2/parsing/inference}/inference_model.py (82%) rename mindee/{parsing/v2 => v2/parsing/inference}/job.py (91%) rename mindee/{parsing/v2 => v2/parsing/inference}/job_response.py (64%) rename mindee/{parsing/v2 => v2/parsing/inference}/job_webhook.py (89%) rename mindee/{parsing/v2 => v2/parsing/inference}/rag_metadata.py (82%) rename mindee/{parsing/v2 => v2/parsing/inference}/raw_text.py (82%) rename mindee/{parsing/v2 => v2/parsing/inference}/raw_text_page.py (79%) create mode 100644 mindee/v2/product/classification/param/__init__.py rename mindee/v2/product/classification/{ => param}/classification_parameters.py (75%) create mode 100644 mindee/v2/product/crop/params/__init__.py rename mindee/v2/product/crop/{ => params}/crop_parameters.py (71%) create mode 100644 mindee/v2/product/extraction/__init__.py rename mindee/{parsing/v2 => v2/product/extraction}/inference.py (72%) rename mindee/{parsing/v2 => v2/product/extraction}/inference_response.py (77%) rename mindee/{parsing/v2 => v2/product/extraction}/inference_result.py (76%) create mode 100644 mindee/v2/product/extraction/params/__init__.py create mode 100644 mindee/v2/product/extraction/params/data_schema.py create mode 100644 mindee/v2/product/extraction/params/data_schema_field.py create mode 100644 mindee/v2/product/extraction/params/data_schema_replace.py create mode 100644 mindee/v2/product/extraction/params/inference_parameters.py create mode 100644 mindee/v2/product/extraction/params/string_data_class.py create mode 100644 mindee/v2/product/ocr/params/__init__.py rename mindee/v2/product/ocr/{ => params}/ocr_parameters.py (70%) create mode 100644 mindee/v2/product/split/params/__init__.py rename mindee/v2/product/split/{ => params}/split_parameters.py (71%) diff --git a/examples/auto_invoice_splitter_extraction_example.py b/examples/auto_invoice_splitter_extraction_example.py index 902e648e..714f5032 100644 --- a/examples/auto_invoice_splitter_extraction_example.py +++ b/examples/auto_invoice_splitter_extraction_example.py @@ -1,8 +1,8 @@ -from mindee import Client +from mindee.v1.client import Client from mindee.extraction.pdf_extractor import PdfExtractor from mindee.input.sources.path_input import PathInput -from mindee.product.invoice.invoice_v4 import InvoiceV4 -from mindee.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 +from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 +from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 mindee_client = Client(api_key="my-api-key") # mindee_client = Client() # Optionally, set from env. diff --git a/examples/auto_multi_receipts_extraction_example.py b/examples/auto_multi_receipts_extraction_example.py index 2906a155..4b83b452 100644 --- a/examples/auto_multi_receipts_extraction_example.py +++ b/examples/auto_multi_receipts_extraction_example.py @@ -1,4 +1,5 @@ -from mindee import Client, product +from mindee.v1.client import Client +from mindee.v1 import product from mindee.extraction.multi_receipts_extractor.multi_receipts_extractor import ( extract_receipts, ) diff --git a/examples/custom_line_items_reconstruction.py b/examples/custom_line_items_reconstruction.py index c43d702d..b7490c0d 100644 --- a/examples/custom_line_items_reconstruction.py +++ b/examples/custom_line_items_reconstruction.py @@ -1,7 +1,8 @@ import os -from mindee import Client, product -from mindee.parsing.common.predict_response import PredictResponse +from mindee.v1.client import Client +from mindee.v1 import product +from mindee.v1.parsing.common import PredictResponse CUSTOM_ENDPOINT_NAME = os.getenv("CUSTOM_ENDPOINT_NAME", "my-endpoint-name") CUSTOM_ACCOUNT_NAME = os.getenv("CUSTOM_ACCOUNT_NAME", "my-account-name") diff --git a/examples/display_cropping.py b/examples/display_cropping.py index 1e931859..055e1103 100644 --- a/examples/display_cropping.py +++ b/examples/display_cropping.py @@ -15,8 +15,9 @@ import cv2 import numpy as np -from mindee import Client, product -from mindee.parsing.common.predict_response import PredictResponse +from mindee.v1.client import Client +from mindee.v1 import product +from mindee.v1.parsing.common import PredictResponse def relative_to_pixel_pos(polygon, image_h: int, image_w: int) -> List[Tuple[int, int]]: diff --git a/mindee/__init__.py b/mindee/__init__.py index 0f8bf1ae..330cdf0d 100644 --- a/mindee/__init__.py +++ b/mindee/__init__.py @@ -1,13 +1,6 @@ -from mindee import product -from mindee.client import Client -from mindee.client_v2 import ClientV2 +from mindee.v1 import product from mindee.input import LocalResponse, PageOptions, PollingOptions -from mindee.input.inference_parameters import ( - DataSchema, - DataSchemaField, - DataSchemaReplace, - InferenceParameters, -) +from mindee.v2.product.extraction.params.inference_parameters import InferenceParameters from mindee.input.sources import ( Base64Input, BytesInput, @@ -15,45 +8,30 @@ PathInput, UrlInputSource, ) -from mindee.parsing.common.api_response import ApiResponse -from mindee.parsing.common.async_predict_response import AsyncPredictResponse -from mindee.parsing.common.feedback_response import FeedbackResponse -from mindee.parsing.common.job import Job -from mindee.parsing.common.predict_response import PredictResponse -from mindee.parsing.common.workflow_response import WorkflowResponse -from mindee.parsing.v2 import InferenceResponse, JobResponse -from mindee.v2.product.classification.classification_parameters import ( +from mindee.v2.parsing import InferenceResponse, JobResponse +from mindee.v2.product.classification.param.classification_parameters import ( ClassificationParameters, ) from mindee.v2.product.classification.classification_response import ( ClassificationResponse, ) -from mindee.v2.product.crop.crop_parameters import CropParameters +from mindee.v2.product.crop.params.crop_parameters import CropParameters from mindee.v2.product.crop.crop_response import CropResponse -from mindee.v2.product.ocr.ocr_parameters import OCRParameters +from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters from mindee.v2.product.ocr.ocr_response import OCRResponse -from mindee.v2.product.split.split_parameters import SplitParameters +from mindee.v2.product.split.params.split_parameters import SplitParameters from mindee.v2.product.split.split_response import SplitResponse __all__ = [ - "ApiResponse", - "AsyncPredictResponse", "Base64Input", "BytesInput", "ClassificationResponse", "ClassificationParameters", - "Client", - "ClientV2", "CropParameters", "CropResponse", - "DataSchema", - "DataSchemaField", - "DataSchemaReplace", - "FeedbackResponse", "FileInput", "InferenceParameters", "InferenceResponse", - "Job", "JobResponse", "LocalResponse", "OCRParameters", @@ -61,10 +39,8 @@ "PageOptions", "PathInput", "PollingOptions", - "PredictResponse", "SplitParameters", "SplitResponse", "UrlInputSource", - "WorkflowResponse", "product", ] diff --git a/mindee/commands/cli_parser.py b/mindee/commands/cli_parser.py index 0c7f9859..0479e8a2 100644 --- a/mindee/commands/cli_parser.py +++ b/mindee/commands/cli_parser.py @@ -2,15 +2,15 @@ from argparse import ArgumentParser, Namespace from typing import Optional, Type, Union -from mindee.client import Client, Endpoint +from mindee.v1.client import Client, Endpoint from mindee.commands.cli_products import PRODUCTS, CommandConfig from mindee.error.mindee_error import MindeeClientError from mindee.input.page_options import PageOptions from mindee.input.sources import LocalInputSource, UrlInputSource -from mindee.parsing.common.async_predict_response import AsyncPredictResponse -from mindee.parsing.common.document import Document, serialize_for_json -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.predict_response import PredictResponse +from mindee.v1.parsing.common.async_predict_response import AsyncPredictResponse +from mindee.v1.parsing.common import Document, serialize_for_json +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common import PredictResponse class MindeeArgumentParser(ArgumentParser): diff --git a/mindee/commands/cli_products.py b/mindee/commands/cli_products.py index 7679899d..5216e3de 100644 --- a/mindee/commands/cli_products.py +++ b/mindee/commands/cli_products.py @@ -1,8 +1,8 @@ from dataclasses import dataclass from typing import Dict, Generic, Type -from mindee import product -from mindee.parsing.common import TypeInference +from mindee.v1 import product +from mindee.v1.parsing.common import TypeInference @dataclass diff --git a/mindee/error/mindee_http_error.py b/mindee/error/mindee_http_error.py index 131a6538..bff2c5d5 100644 --- a/mindee/error/mindee_http_error.py +++ b/mindee/error/mindee_http_error.py @@ -1,7 +1,7 @@ from typing import Optional, Union from mindee.error.mindee_error import MindeeError -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict class MindeeHTTPError(RuntimeError): diff --git a/mindee/error/v2/__init__.py b/mindee/error/v2/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mindee/error/mindee_http_error_v2.py b/mindee/error/v2/mindee_http_error_v2.py similarity index 93% rename from mindee/error/mindee_http_error_v2.py rename to mindee/error/v2/mindee_http_error_v2.py index a6be90f3..0d4b73ad 100644 --- a/mindee/error/mindee_http_error_v2.py +++ b/mindee/error/v2/mindee_http_error_v2.py @@ -1,8 +1,8 @@ import json from typing import List, Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2 import ErrorItem, ErrorResponse +from mindee.parsing.common import StringDict +from mindee.v2.parsing import ErrorItem, ErrorResponse class MindeeHTTPErrorV2(RuntimeError, ErrorResponse): diff --git a/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py b/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py index 5d42b7c7..a5256d9d 100644 --- a/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py +++ b/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py @@ -6,7 +6,7 @@ extract_multiple_images_from_source, ) from mindee.input.sources.local_input_source import LocalInputSource -from mindee.parsing.common.inference import Inference +from mindee.v1.parsing.common.inference import Inference def extract_receipts( diff --git a/mindee/extraction/pdf_extractor/pdf_extractor.py b/mindee/extraction/pdf_extractor/pdf_extractor.py index 7f9baf7f..40fe60a1 100644 --- a/mindee/extraction/pdf_extractor/pdf_extractor.py +++ b/mindee/extraction/pdf_extractor/pdf_extractor.py @@ -8,7 +8,7 @@ from mindee.error.mindee_error import MindeeError from mindee.extraction.pdf_extractor.extracted_pdf import ExtractedPdf from mindee.input.sources.local_input_source import LocalInputSource -from mindee.product.invoice_splitter import InvoiceSplitterV1InvoicePageGroup +from mindee.v1.product.invoice_splitter import InvoiceSplitterV1InvoicePageGroup class PdfExtractor: diff --git a/mindee/input/__init__.py b/mindee/input/__init__.py index 1afea578..5ba4687f 100644 --- a/mindee/input/__init__.py +++ b/mindee/input/__init__.py @@ -1,24 +1,18 @@ from mindee.input.local_response import LocalResponse -from mindee.input.base_parameters import BaseParameters -from mindee.input.inference_parameters import InferenceParameters from mindee.input.page_options import PageOptions from mindee.input.polling_options import PollingOptions from mindee.input.sources.base_64_input import Base64Input from mindee.input.sources.bytes_input import BytesInput from mindee.input.sources.file_input import FileInput -from mindee.input.sources.input_type import InputType from mindee.input.sources.local_input_source import LocalInputSource from mindee.input.sources.path_input import PathInput from mindee.input.sources.url_input_source import UrlInputSource -from mindee.input.workflow_options import WorkflowOptions +from mindee.v1.input.workflow_options import WorkflowOptions __all__ = [ "Base64Input", - "BaseParameters", "BytesInput", "FileInput", - "InputType", - "InferenceParameters", "LocalInputSource", "LocalResponse", "PageOptions", diff --git a/mindee/input/inference_parameters.py b/mindee/input/inference_parameters.py deleted file mode 100644 index 3c2f13b3..00000000 --- a/mindee/input/inference_parameters.py +++ /dev/null @@ -1,134 +0,0 @@ -import json -from dataclasses import dataclass, asdict -from typing import Dict, List, Optional, Union - -from mindee.input.base_parameters import BaseParameters - - -@dataclass -class StringDataClass: - """Base class for dataclasses that can be serialized to JSON.""" - - @staticmethod - def _no_none_values(x) -> dict: - """Don't include None values in the JSON output.""" - return {k: v for (k, v) in x if v is not None} - - def __str__(self) -> str: - return json.dumps( - asdict(self, dict_factory=self._no_none_values), indent=None, sort_keys=True - ) - - -@dataclass -class DataSchemaField(StringDataClass): - """A field in the data schema.""" - - title: str - """Display name for the field, also impacts inference results.""" - name: str - """Name of the field in the data schema.""" - is_array: bool - """Whether this field can contain multiple values.""" - type: str - """Data type of the field.""" - classification_values: Optional[List[str]] = None - """Allowed values when type is `classification`. Leave empty for other types.""" - unique_values: Optional[bool] = None - """ - Whether to remove duplicate values in the array. - Only applicable if `is_array` is True. - """ - description: Optional[str] = None - """Detailed description of what this field represents.""" - guidelines: Optional[str] = None - """Optional extraction guidelines.""" - nested_fields: Optional[dict] = None - """Subfields when type is `nested_object`. Leave empty for other types.""" - - -@dataclass -class DataSchemaReplace(StringDataClass): - """The structure to completely replace the data schema of the model.""" - - fields: List[Union[DataSchemaField, dict]] - - def __post_init__(self) -> None: - if not self.fields: - raise ValueError("Data schema replacement fields cannot be empty.") - if isinstance(self.fields[0], dict): - self.fields = [ - DataSchemaField(**field) # type: ignore[arg-type] - for field in self.fields - ] - - -@dataclass -class DataSchema(StringDataClass): - """Modify the Data Schema.""" - - replace: Optional[Union[DataSchemaReplace, dict, str]] = None - """If set, completely replaces the data schema of the model.""" - - def __post_init__(self) -> None: - if isinstance(self.replace, dict): - self.replace = DataSchemaReplace(**self.replace) - elif isinstance(self.replace, str): - self.replace = DataSchemaReplace(**json.loads(self.replace)) - - -@dataclass -class InferenceParameters(BaseParameters): - """Inference parameters to set when sending a file.""" - - rag: Optional[bool] = None - """Enhance extraction accuracy with Retrieval-Augmented Generation.""" - raw_text: Optional[bool] = None - """Extract the full text content from the document as strings, and fill the ``raw_text`` attribute.""" - polygon: Optional[bool] = None - """Calculate bounding box polygons for all fields, and fill their ``locations`` attribute.""" - confidence: Optional[bool] = None - """ - Boost the precision and accuracy of all extractions. - Calculate confidence scores for all fields, and fill their ``confidence`` attribute. - """ - text_context: Optional[str] = None - """ - Additional text context used by the model during inference. - Not recommended, for specific use only. - """ - data_schema: Optional[Union[DataSchema, str, dict]] = None - """ - Dynamic changes to the data schema of the model for this inference. - Not recommended, for specific use only. - """ - - _slug: str = "inferences" - """Slug of the endpoint.""" - - def __post_init__(self): - if isinstance(self.data_schema, str): - self.data_schema = DataSchema(**json.loads(self.data_schema)) - elif isinstance(self.data_schema, dict): - self.data_schema = DataSchema(**self.data_schema) - - def get_form_data(self) -> Dict[str, Union[str, List[str]]]: - """ - Return the parameters as a config dictionary. - - :return: A dict of parameters. - """ - data = super().get_form_data() - if self.data_schema is not None: - data["data_schema"] = str(self.data_schema) - if self.rag is not None: - data["rag"] = data["rag"] = str(self.rag).lower() - if self.raw_text is not None: - data["raw_text"] = data["raw_text"] = str(self.raw_text).lower() - if self.polygon is not None: - data["polygon"] = data["polygon"] = str(self.polygon).lower() - if self.confidence is not None: - data["confidence"] = data["confidence"] = str(self.confidence).lower() - if self.text_context is not None: - data["text_context"] = self.text_context - return data diff --git a/mindee/input/local_response.py b/mindee/input/local_response.py index c8a27fbb..4050ef43 100644 --- a/mindee/input/local_response.py +++ b/mindee/input/local_response.py @@ -7,7 +7,7 @@ from typing import Any, BinaryIO, Dict, Type, TypeVar, Union from mindee.error.mindee_error import MindeeError -from mindee.parsing.v2.common_response import CommonResponse +from mindee.parsing.common.common_response import CommonResponse class LocalResponse: diff --git a/mindee/input/sources/__init__.py b/mindee/input/sources/__init__.py index 9d3bab1d..9b4d5bbf 100644 --- a/mindee/input/sources/__init__.py +++ b/mindee/input/sources/__init__.py @@ -1,7 +1,6 @@ from mindee.input.sources.base_64_input import Base64Input from mindee.input.sources.bytes_input import BytesInput from mindee.input.sources.file_input import FileInput -from mindee.input.sources.input_type import InputType from mindee.input.sources.local_input_source import LocalInputSource from mindee.input.sources.path_input import PathInput from mindee.input.sources.url_input_source import UrlInputSource @@ -10,7 +9,6 @@ "Base64Input", "BytesInput", "FileInput", - "InputType", "LocalInputSource", "PathInput", "UrlInputSource", diff --git a/mindee/input/sources/base_64_input.py b/mindee/input/sources/base_64_input.py index b656255b..e1f0c892 100644 --- a/mindee/input/sources/base_64_input.py +++ b/mindee/input/sources/base_64_input.py @@ -1,7 +1,6 @@ import base64 import io -from mindee.input.sources.input_type import InputType from mindee.input.sources.local_input_source import LocalInputSource @@ -18,4 +17,4 @@ def __init__(self, base64_string: str, filename: str) -> None: self.file_object = io.BytesIO(base64.standard_b64decode(base64_string)) self.filename = filename self.filepath = None - super().__init__(input_type=InputType.BASE64) + super().__init__() diff --git a/mindee/input/sources/bytes_input.py b/mindee/input/sources/bytes_input.py index 1f2b63fd..afbd3149 100644 --- a/mindee/input/sources/bytes_input.py +++ b/mindee/input/sources/bytes_input.py @@ -1,6 +1,5 @@ import io -from mindee.input.sources.input_type import InputType from mindee.input.sources.local_input_source import LocalInputSource @@ -17,4 +16,4 @@ def __init__(self, raw_bytes: bytes, filename: str) -> None: self.file_object = io.BytesIO(raw_bytes) self.filename = filename self.filepath = None - super().__init__(input_type=InputType.BYTES) + super().__init__() diff --git a/mindee/input/sources/file_input.py b/mindee/input/sources/file_input.py index 2623a4f3..8a3cbaef 100644 --- a/mindee/input/sources/file_input.py +++ b/mindee/input/sources/file_input.py @@ -1,7 +1,6 @@ import os from typing import BinaryIO -from mindee.input.sources.input_type import InputType from mindee.input.sources.local_input_source import LocalInputSource @@ -21,4 +20,4 @@ def __init__(self, file: BinaryIO) -> None: self.file_object = file self.filename = os.path.basename(file.name) self.filepath = file.name - super().__init__(input_type=InputType.FILE) + super().__init__() diff --git a/mindee/input/sources/input_type.py b/mindee/input/sources/input_type.py deleted file mode 100644 index 6daf1131..00000000 --- a/mindee/input/sources/input_type.py +++ /dev/null @@ -1,11 +0,0 @@ -from enum import Enum - - -class InputType(Enum): - """The input type, for internal use.""" - - FILE = "file" - BASE64 = "base64" - BYTES = "bytes" - PATH = "path" - URL = "url" diff --git a/mindee/input/sources/local_input_source.py b/mindee/input/sources/local_input_source.py index c015239b..9dd3a4b2 100644 --- a/mindee/input/sources/local_input_source.py +++ b/mindee/input/sources/local_input_source.py @@ -9,7 +9,6 @@ from mindee.error.mindee_error import MindeeError, MindeeSourceError from mindee.image_operations.image_compressor import compress_image from mindee.input.page_options import KEEP_ONLY, REMOVE, PageOptions -from mindee.input.sources.input_type import InputType from mindee.logger import logger from mindee.pdf.pdf_compressor import compress_pdf from mindee.pdf.pdf_utils import has_source_text @@ -34,15 +33,18 @@ class LocalInputSource: file_object: BinaryIO filename: str file_mimetype: str - input_type: InputType filepath: Optional[str] _page_count: Optional[int] = None - def __init__(self, input_type: InputType): - self.input_type = input_type + def __init__(self) -> None: + """ + Initialize a LocalInputSource object. + """ self._check_mimetype() - logger.debug("Loaded new input '%s' from %s", self.filename, self.input_type) + logger.debug( + "Loaded new input '%s' from %s", self.filename, {type(self).__name__} + ) def _check_mimetype(self) -> None: file_mimetype = mimetypes.guess_type(self.filename)[0] diff --git a/mindee/input/sources/path_input.py b/mindee/input/sources/path_input.py index 2e7fc736..4da49e3f 100644 --- a/mindee/input/sources/path_input.py +++ b/mindee/input/sources/path_input.py @@ -2,7 +2,6 @@ from pathlib import Path from typing import Union -from mindee.input.sources.input_type import InputType from mindee.input.sources.local_input_source import LocalInputSource @@ -18,4 +17,4 @@ def __init__(self, filepath: Union[Path, str]) -> None: self.file_object = open(filepath, "rb") # pylint: disable=consider-using-with self.filename = os.path.basename(filepath) self.filepath = str(filepath) - super().__init__(input_type=InputType.PATH) + super().__init__() diff --git a/mindee/input/sources/url_input_source.py b/mindee/input/sources/url_input_source.py index 0e62573a..8c681bba 100644 --- a/mindee/input/sources/url_input_source.py +++ b/mindee/input/sources/url_input_source.py @@ -10,7 +10,6 @@ from mindee.error.mindee_error import MindeeSourceError from mindee.input.sources.bytes_input import BytesInput -from mindee.input.sources.input_type import InputType from mindee.logger import logger @@ -29,8 +28,6 @@ def __init__(self, url: str) -> None: if not url.lower().startswith("https"): raise MindeeSourceError("URL must be HTTPS") - self.input_type = InputType.URL - logger.debug("URL input: %s", url) self.url = url diff --git a/mindee/mindee_http/endpoint.py b/mindee/mindee_http/endpoint.py index 0275328d..947e3251 100644 --- a/mindee/mindee_http/endpoint.py +++ b/mindee/mindee_http/endpoint.py @@ -8,7 +8,7 @@ from mindee.input.sources.url_input_source import UrlInputSource from mindee.mindee_http.base_endpoint import BaseEndpoint from mindee.mindee_http.mindee_api import MindeeApi -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict class Endpoint(BaseEndpoint): diff --git a/mindee/mindee_http/mindee_api_v2.py b/mindee/mindee_http/mindee_api_v2.py index 968bb813..2ca34a10 100644 --- a/mindee/mindee_http/mindee_api_v2.py +++ b/mindee/mindee_http/mindee_api_v2.py @@ -4,7 +4,7 @@ import requests from mindee.error.mindee_error import MindeeApiV2Error -from mindee.input.base_parameters import BaseParameters +from mindee.v2.input.base_parameters import BaseParameters from mindee.input.sources.local_input_source import LocalInputSource from mindee.input.sources.url_input_source import UrlInputSource from mindee.logger import logger diff --git a/mindee/mindee_http/response_validation.py b/mindee/mindee_http/response_validation.py index e261df91..392c452c 100644 --- a/mindee/mindee_http/response_validation.py +++ b/mindee/mindee_http/response_validation.py @@ -2,7 +2,7 @@ import requests -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict def is_valid_sync_response(response: requests.Response) -> bool: diff --git a/mindee/mindee_http/workflow_endpoint.py b/mindee/mindee_http/workflow_endpoint.py index ed437d1e..7a2f05a6 100644 --- a/mindee/mindee_http/workflow_endpoint.py +++ b/mindee/mindee_http/workflow_endpoint.py @@ -4,7 +4,7 @@ from mindee.input.sources.local_input_source import LocalInputSource from mindee.input.sources.url_input_source import UrlInputSource -from mindee.input.workflow_options import WorkflowOptions +from mindee.v1.input.workflow_options import WorkflowOptions from mindee.mindee_http.base_endpoint import BaseEndpoint from mindee.mindee_http.workflow_settings import WorkflowSettings diff --git a/mindee/parsing/__init__.py b/mindee/parsing/__init__.py index 0ac446b4..d5ae915f 100644 --- a/mindee/parsing/__init__.py +++ b/mindee/parsing/__init__.py @@ -1,7 +1,3 @@ -from mindee.parsing import ( - common, - custom, - standard, -) +from mindee.parsing import common -__all__ = ["common", "custom", "standard"] +__all__ = ["common"] diff --git a/mindee/parsing/common/__init__.py b/mindee/parsing/common/__init__.py index dce90dad..b48f6d25 100644 --- a/mindee/parsing/common/__init__.py +++ b/mindee/parsing/common/__init__.py @@ -1,49 +1,15 @@ -from mindee.parsing.common.api_request import ApiRequest -from mindee.parsing.common.api_response import ApiResponse -from mindee.parsing.common.async_predict_response import AsyncPredictResponse -from mindee.parsing.common.document import Document -from mindee.parsing.common.execution import Execution -from mindee.parsing.common.execution_file import ExecutionFile -from mindee.parsing.common.execution_priority import ExecutionPriority -from mindee.parsing.common.extras import CropperExtra, Extras -from mindee.parsing.common.feedback_response import FeedbackResponse -from mindee.parsing.common.inference import Inference, TypeInference -from mindee.parsing.common.job import Job -from mindee.parsing.common.ocr.mvision_v1 import MVisionV1 -from mindee.parsing.common.ocr.ocr import Ocr -from mindee.parsing.common.orientation import OrientationField -from mindee.parsing.common.page import Page -from mindee.parsing.common.predict_response import PredictResponse -from mindee.parsing.common.prediction import Prediction +from mindee.parsing.common.common_response import CommonResponse +from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import ( clean_out_string, - format_for_display, line_separator, + format_for_display, ) -from mindee.parsing.common.workflow_response import WorkflowResponse __all__ = [ - "ApiRequest", - "ApiResponse", - "AsyncPredictResponse", - "Document", - "Execution", - "ExecutionFile", - "ExecutionPriority", - "CropperExtra", - "Extras", - "FeedbackResponse", - "Inference", - "TypeInference", - "WorkflowResponse", - "line_separator", + "CommonResponse", + "StringDict", "clean_out_string", + "line_separator", "format_for_display", - "Prediction", - "Job", - "OrientationField", - "Page", - "PredictResponse", - "MVisionV1", - "Ocr", ] diff --git a/mindee/parsing/v2/common_response.py b/mindee/parsing/common/common_response.py similarity index 100% rename from mindee/parsing/v2/common_response.py rename to mindee/parsing/common/common_response.py diff --git a/mindee/parsing/common/extras/__init__.py b/mindee/parsing/common/extras/__init__.py deleted file mode 100644 index e6349e99..00000000 --- a/mindee/parsing/common/extras/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from mindee.parsing.common.extras.cropper_extra import CropperExtra -from mindee.parsing.common.extras.extras import Extras - -__all__ = [ - "Extras", - "CropperExtra", -] diff --git a/mindee/parsing/common/ocr/__init__.py b/mindee/parsing/common/ocr/__init__.py deleted file mode 100644 index c8e760ea..00000000 --- a/mindee/parsing/common/ocr/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from mindee.parsing.common.ocr.ocr import Ocr - -__all__ = ["Ocr"] diff --git a/mindee/parsing/custom/__init__.py b/mindee/parsing/custom/__init__.py deleted file mode 100644 index 6b96ca6f..00000000 --- a/mindee/parsing/custom/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from mindee.parsing.custom.classification import ClassificationField -from mindee.parsing.custom.line_items import CustomLine, get_line_items -from mindee.parsing.custom.list import ListField, ListFieldValue - -__all__ = [ - "ClassificationField", - "CustomLine", - "get_line_items", - "ListField", - "ListFieldValue", -] diff --git a/mindee/parsing/standard/__init__.py b/mindee/parsing/standard/__init__.py deleted file mode 100644 index 74993467..00000000 --- a/mindee/parsing/standard/__init__.py +++ /dev/null @@ -1,46 +0,0 @@ -from mindee.parsing.standard.address import AddressField -from mindee.parsing.standard.amount import AmountField -from mindee.parsing.standard.base import ( - BaseField, - FieldConfidenceMixin, - FieldPositionMixin, - bool_to_string, - float_to_string, - int_to_string, - to_opt_bool, - to_opt_float, - to_opt_int, -) -from mindee.parsing.standard.boolean import BooleanField -from mindee.parsing.standard.classification import ClassificationField -from mindee.parsing.standard.company_registration import CompanyRegistrationField -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.locale import LocaleField -from mindee.parsing.standard.payment_details import PaymentDetailsField -from mindee.parsing.standard.position import PositionField -from mindee.parsing.standard.tax import Taxes, TaxField -from mindee.parsing.standard.text import StringField - -__all__ = [ - "AddressField", - "AmountField", - "BaseField", - "FieldConfidenceMixin", - "FieldPositionMixin", - "bool_to_string", - "float_to_string", - "int_to_string", - "to_opt_bool", - "to_opt_float", - "to_opt_int", - "BooleanField", - "ClassificationField", - "CompanyRegistrationField", - "DateField", - "LocaleField", - "PaymentDetailsField", - "PositionField", - "Taxes", - "TaxField", - "StringField", -] diff --git a/mindee/parsing/v2/__init__.py b/mindee/parsing/v2/__init__.py deleted file mode 100644 index fe275352..00000000 --- a/mindee/parsing/v2/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -from mindee.parsing.v2.error_item import ErrorItem -from mindee.parsing.v2.error_response import ErrorResponse -from mindee.parsing.v2.inference import Inference -from mindee.parsing.v2.inference_active_options import InferenceActiveOptions -from mindee.parsing.v2.inference_file import InferenceFile -from mindee.parsing.v2.inference_model import InferenceModel -from mindee.parsing.v2.inference_response import InferenceResponse -from mindee.parsing.v2.inference_result import InferenceResult -from mindee.parsing.v2.job_response import JobResponse - -__all__ = [ - "Inference", - "InferenceActiveOptions", - "InferenceFile", - "InferenceModel", - "InferenceResponse", - "InferenceResult", - "JobResponse", - "ErrorResponse", - "ErrorItem", -] diff --git a/mindee/parsing/v2/base_inference.py b/mindee/parsing/v2/base_inference.py deleted file mode 100644 index 9f9e90ec..00000000 --- a/mindee/parsing/v2/base_inference.py +++ /dev/null @@ -1,29 +0,0 @@ -from abc import ABC -from typing import TypeVar - -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.inference_file import InferenceFile -from mindee.parsing.v2.inference_job import InferenceJob -from mindee.parsing.v2.inference_model import InferenceModel - - -class BaseInference(ABC): - """Base class for V2 inference objects.""" - - job: InferenceJob - """Job the inference belongs to.""" - model: InferenceModel - """Model info for the inference.""" - file: InferenceFile - """File info for the inference.""" - id: str - """ID of the inference.""" - - def __init__(self, raw_response: StringDict): - self.id = raw_response["id"] - self.job = InferenceJob(raw_response["job"]) - self.model = InferenceModel(raw_response["model"]) - self.file = InferenceFile(raw_response["file"]) - - -TypeBaseInference = TypeVar("TypeBaseInference", bound=BaseInference) diff --git a/mindee/parsing/v2/base_response.py b/mindee/parsing/v2/base_response.py deleted file mode 100644 index d3aab4bf..00000000 --- a/mindee/parsing/v2/base_response.py +++ /dev/null @@ -1,21 +0,0 @@ -from abc import ABC - -from mindee.parsing.v2.base_inference import BaseInference -from mindee.parsing.v2.common_response import CommonResponse - - -class BaseResponse(ABC, CommonResponse): - """Base class for V2 inference responses.""" - - inference: BaseInference - """The inference result for a split utility request""" - _slug: str - """Slug of the inference.""" - - def __str__(self) -> str: - return str(self.inference) - - @classmethod - def get_result_slug(cls) -> str: - """Getter for the inference slug.""" - return cls._slug diff --git a/mindee/parsing/v2/field/__init__.py b/mindee/parsing/v2/field/__init__.py deleted file mode 100644 index 0d54869e..00000000 --- a/mindee/parsing/v2/field/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -from mindee.parsing.v2.field.base_field import BaseField -from mindee.parsing.v2.field.field_confidence import FieldConfidence -from mindee.parsing.v2.field.field_location import FieldLocation -from mindee.parsing.v2.field.inference_fields import InferenceFields -from mindee.parsing.v2.field.list_field import ListField -from mindee.parsing.v2.field.object_field import ObjectField -from mindee.parsing.v2.field.simple_field import SimpleField - -__all__ = [ - "BaseField", - "FieldConfidence", - "FieldLocation", - "ListField", - "ObjectField", - "SimpleField", - "InferenceFields", -] diff --git a/mindee/parsing/v2/inference_job.py b/mindee/parsing/v2/inference_job.py deleted file mode 100644 index ac877545..00000000 --- a/mindee/parsing/v2/inference_job.py +++ /dev/null @@ -1,14 +0,0 @@ -from mindee.parsing.common.string_dict import StringDict - - -class InferenceJob: - """Inference Job info.""" - - id: str - """UUID of the Job.""" - - def __init__(self, raw_response: StringDict) -> None: - self.id = raw_response["id"] - - def __str__(self) -> str: - return f"Job\n===\n:ID: {self.id}" diff --git a/mindee/product/__init__.py b/mindee/product/__init__.py deleted file mode 100644 index 168b3c7c..00000000 --- a/mindee/product/__init__.py +++ /dev/null @@ -1,90 +0,0 @@ -from mindee.product import fr, us -from mindee.product.barcode_reader.barcode_reader_v1 import BarcodeReaderV1 -from mindee.product.barcode_reader.barcode_reader_v1_document import ( - BarcodeReaderV1Document, -) -from mindee.product.cropper.cropper_v1 import CropperV1 -from mindee.product.cropper.cropper_v1_document import ( - CropperV1Document, -) -from mindee.product.cropper.cropper_v1_page import ( - CropperV1Page, -) -from mindee.product.custom import CustomV1, CustomV1Document, CustomV1Page -from mindee.product.financial_document.financial_document_v1 import FinancialDocumentV1 -from mindee.product.financial_document.financial_document_v1_document import ( - FinancialDocumentV1Document, -) -from mindee.product.financial_document.financial_document_v1_line_item import ( - FinancialDocumentV1LineItem, -) -from mindee.product.generated import GeneratedV1, GeneratedV1Document, GeneratedV1Page -from mindee.product.international_id.international_id_v2 import InternationalIdV2 -from mindee.product.international_id.international_id_v2_document import ( - InternationalIdV2Document, -) -from mindee.product.invoice.invoice_v4 import InvoiceV4 -from mindee.product.invoice.invoice_v4_document import ( - InvoiceV4Document, -) -from mindee.product.invoice.invoice_v4_line_item import ( - InvoiceV4LineItem, -) -from mindee.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 -from mindee.product.invoice_splitter.invoice_splitter_v1_document import ( - InvoiceSplitterV1Document, -) -from mindee.product.invoice_splitter.invoice_splitter_v1_invoice_page_group import ( - InvoiceSplitterV1InvoicePageGroup, -) -from mindee.product.multi_receipts_detector.multi_receipts_detector_v1 import ( - MultiReceiptsDetectorV1, -) -from mindee.product.multi_receipts_detector.multi_receipts_detector_v1_document import ( - MultiReceiptsDetectorV1Document, -) -from mindee.product.passport.passport_v1 import PassportV1 -from mindee.product.passport.passport_v1_document import ( - PassportV1Document, -) -from mindee.product.receipt.receipt_v5 import ReceiptV5 -from mindee.product.receipt.receipt_v5_document import ( - ReceiptV5Document, -) -from mindee.product.receipt.receipt_v5_line_item import ( - ReceiptV5LineItem, -) - -__all__ = [ - "fr", - "us", - "BarcodeReaderV1", - "BarcodeReaderV1Document", - "CropperV1", - "CropperV1Document", - "CropperV1Page", - "CustomV1", - "CustomV1Document", - "CustomV1Page", - "FinancialDocumentV1", - "FinancialDocumentV1Document", - "FinancialDocumentV1LineItem", - "GeneratedV1", - "GeneratedV1Document", - "GeneratedV1Page", - "InternationalIdV2", - "InternationalIdV2Document", - "InvoiceV4", - "InvoiceV4Document", - "InvoiceV4LineItem", - "InvoiceSplitterV1", - "InvoiceSplitterV1Document", - "InvoiceSplitterV1InvoicePageGroup", - "MultiReceiptsDetectorV1", - "MultiReceiptsDetectorV1Document", - "PassportV1", - "PassportV1Document", - "ReceiptV5", - "ReceiptV5Document", - "ReceiptV5LineItem", -] diff --git a/mindee/product/barcode_reader/__init__.py b/mindee/product/barcode_reader/__init__.py deleted file mode 100644 index 2fec6a10..00000000 --- a/mindee/product/barcode_reader/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from mindee.product.barcode_reader.barcode_reader_v1 import BarcodeReaderV1 -from mindee.product.barcode_reader.barcode_reader_v1_document import ( - BarcodeReaderV1Document, -) - -__all__ = [ - "BarcodeReaderV1", - "BarcodeReaderV1Document", -] diff --git a/mindee/product/cropper/__init__.py b/mindee/product/cropper/__init__.py deleted file mode 100644 index 219d5b42..00000000 --- a/mindee/product/cropper/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from mindee.product.cropper.cropper_v1 import CropperV1 -from mindee.product.cropper.cropper_v1_document import ( - CropperV1Document, -) -from mindee.product.cropper.cropper_v1_page import ( - CropperV1Page, -) - -__all__ = [ - "CropperV1", - "CropperV1Document", - "CropperV1Page", -] diff --git a/mindee/product/financial_document/__init__.py b/mindee/product/financial_document/__init__.py deleted file mode 100644 index 6cbb4b52..00000000 --- a/mindee/product/financial_document/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from mindee.product.financial_document.financial_document_v1 import FinancialDocumentV1 -from mindee.product.financial_document.financial_document_v1_document import ( - FinancialDocumentV1Document, -) -from mindee.product.financial_document.financial_document_v1_line_item import ( - FinancialDocumentV1LineItem, -) - -__all__ = [ - "FinancialDocumentV1", - "FinancialDocumentV1Document", - "FinancialDocumentV1LineItem", -] diff --git a/mindee/product/fr/__init__.py b/mindee/product/fr/__init__.py deleted file mode 100644 index e9fdfd06..00000000 --- a/mindee/product/fr/__init__.py +++ /dev/null @@ -1,49 +0,0 @@ -from mindee.product.fr.bank_account_details.bank_account_details_v1 import ( - BankAccountDetailsV1, -) -from mindee.product.fr.bank_account_details.bank_account_details_v1_document import ( - BankAccountDetailsV1Document, -) -from mindee.product.fr.bank_account_details.bank_account_details_v2 import ( - BankAccountDetailsV2, -) -from mindee.product.fr.bank_account_details.bank_account_details_v2_bban import ( - BankAccountDetailsV2Bban, -) -from mindee.product.fr.bank_account_details.bank_account_details_v2_document import ( - BankAccountDetailsV2Document, -) -from mindee.product.fr.carte_grise.carte_grise_v1 import CarteGriseV1 -from mindee.product.fr.carte_grise.carte_grise_v1_document import ( - CarteGriseV1Document, -) -from mindee.product.fr.id_card.id_card_v1 import IdCardV1 -from mindee.product.fr.id_card.id_card_v1_document import ( - IdCardV1Document, -) -from mindee.product.fr.id_card.id_card_v1_page import ( - IdCardV1Page, -) -from mindee.product.fr.id_card.id_card_v2 import IdCardV2 -from mindee.product.fr.id_card.id_card_v2_document import ( - IdCardV2Document, -) -from mindee.product.fr.id_card.id_card_v2_page import ( - IdCardV2Page, -) - -__all__ = [ - "BankAccountDetailsV1", - "BankAccountDetailsV1Document", - "BankAccountDetailsV2", - "BankAccountDetailsV2Bban", - "BankAccountDetailsV2Document", - "CarteGriseV1", - "CarteGriseV1Document", - "IdCardV1", - "IdCardV1Document", - "IdCardV1Page", - "IdCardV2", - "IdCardV2Document", - "IdCardV2Page", -] diff --git a/mindee/product/fr/bank_account_details/__init__.py b/mindee/product/fr/bank_account_details/__init__.py deleted file mode 100644 index 8ff37aee..00000000 --- a/mindee/product/fr/bank_account_details/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -from mindee.product.fr.bank_account_details.bank_account_details_v1 import ( - BankAccountDetailsV1, -) -from mindee.product.fr.bank_account_details.bank_account_details_v1_document import ( - BankAccountDetailsV1Document, -) -from mindee.product.fr.bank_account_details.bank_account_details_v2 import ( - BankAccountDetailsV2, -) -from mindee.product.fr.bank_account_details.bank_account_details_v2_bban import ( - BankAccountDetailsV2Bban, -) -from mindee.product.fr.bank_account_details.bank_account_details_v2_document import ( - BankAccountDetailsV2Document, -) - -__all__ = [ - "BankAccountDetailsV1", - "BankAccountDetailsV1Document", - "BankAccountDetailsV2", - "BankAccountDetailsV2Bban", - "BankAccountDetailsV2Document", -] diff --git a/mindee/product/fr/carte_grise/__init__.py b/mindee/product/fr/carte_grise/__init__.py deleted file mode 100644 index dc35100b..00000000 --- a/mindee/product/fr/carte_grise/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from mindee.product.fr.carte_grise.carte_grise_v1 import CarteGriseV1 -from mindee.product.fr.carte_grise.carte_grise_v1_document import ( - CarteGriseV1Document, -) - -__all__ = [ - "CarteGriseV1", - "CarteGriseV1Document", -] diff --git a/mindee/product/fr/id_card/__init__.py b/mindee/product/fr/id_card/__init__.py deleted file mode 100644 index d1e47e96..00000000 --- a/mindee/product/fr/id_card/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -from mindee.product.fr.id_card.id_card_v1 import IdCardV1 -from mindee.product.fr.id_card.id_card_v1_document import ( - IdCardV1Document, -) -from mindee.product.fr.id_card.id_card_v1_page import ( - IdCardV1Page, -) -from mindee.product.fr.id_card.id_card_v2 import IdCardV2 -from mindee.product.fr.id_card.id_card_v2_document import ( - IdCardV2Document, -) -from mindee.product.fr.id_card.id_card_v2_page import ( - IdCardV2Page, -) - -__all__ = [ - "IdCardV1", - "IdCardV1Document", - "IdCardV1Page", - "IdCardV2", - "IdCardV2Document", - "IdCardV2Page", -] diff --git a/mindee/product/international_id/__init__.py b/mindee/product/international_id/__init__.py deleted file mode 100644 index d93a0fd2..00000000 --- a/mindee/product/international_id/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from mindee.product.international_id.international_id_v2 import InternationalIdV2 -from mindee.product.international_id.international_id_v2_document import ( - InternationalIdV2Document, -) - -__all__ = [ - "InternationalIdV2", - "InternationalIdV2Document", -] diff --git a/mindee/product/invoice/__init__.py b/mindee/product/invoice/__init__.py deleted file mode 100644 index 76eda3a9..00000000 --- a/mindee/product/invoice/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from mindee.product.invoice.invoice_v4 import InvoiceV4 -from mindee.product.invoice.invoice_v4_document import ( - InvoiceV4Document, -) -from mindee.product.invoice.invoice_v4_line_item import ( - InvoiceV4LineItem, -) - -__all__ = [ - "InvoiceV4", - "InvoiceV4Document", - "InvoiceV4LineItem", -] diff --git a/mindee/product/invoice_splitter/__init__.py b/mindee/product/invoice_splitter/__init__.py deleted file mode 100644 index 2249036f..00000000 --- a/mindee/product/invoice_splitter/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from mindee.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 -from mindee.product.invoice_splitter.invoice_splitter_v1_document import ( - InvoiceSplitterV1Document, -) -from mindee.product.invoice_splitter.invoice_splitter_v1_invoice_page_group import ( - InvoiceSplitterV1InvoicePageGroup, -) - -__all__ = [ - "InvoiceSplitterV1", - "InvoiceSplitterV1Document", - "InvoiceSplitterV1InvoicePageGroup", -] diff --git a/mindee/product/multi_receipts_detector/__init__.py b/mindee/product/multi_receipts_detector/__init__.py deleted file mode 100644 index 8cd99e60..00000000 --- a/mindee/product/multi_receipts_detector/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from mindee.product.multi_receipts_detector.multi_receipts_detector_v1 import ( - MultiReceiptsDetectorV1, -) -from mindee.product.multi_receipts_detector.multi_receipts_detector_v1_document import ( - MultiReceiptsDetectorV1Document, -) - -__all__ = [ - "MultiReceiptsDetectorV1", - "MultiReceiptsDetectorV1Document", -] diff --git a/mindee/product/passport/__init__.py b/mindee/product/passport/__init__.py deleted file mode 100644 index 00bb91e9..00000000 --- a/mindee/product/passport/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from mindee.product.passport.passport_v1 import PassportV1 -from mindee.product.passport.passport_v1_document import ( - PassportV1Document, -) - -__all__ = [ - "PassportV1", - "PassportV1Document", -] diff --git a/mindee/product/receipt/__init__.py b/mindee/product/receipt/__init__.py deleted file mode 100644 index b993e38a..00000000 --- a/mindee/product/receipt/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from mindee.product.receipt.receipt_v5 import ReceiptV5 -from mindee.product.receipt.receipt_v5_document import ( - ReceiptV5Document, -) -from mindee.product.receipt.receipt_v5_line_item import ( - ReceiptV5LineItem, -) - -__all__ = [ - "ReceiptV5", - "ReceiptV5Document", - "ReceiptV5LineItem", -] diff --git a/mindee/product/us/__init__.py b/mindee/product/us/__init__.py deleted file mode 100644 index 49201c4f..00000000 --- a/mindee/product/us/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from mindee.product.us.bank_check.bank_check_v1 import BankCheckV1 -from mindee.product.us.bank_check.bank_check_v1_document import ( - BankCheckV1Document, -) -from mindee.product.us.bank_check.bank_check_v1_page import ( - BankCheckV1Page, -) - -__all__ = [ - "BankCheckV1", - "BankCheckV1Document", - "BankCheckV1Page", -] diff --git a/mindee/product/us/bank_check/__init__.py b/mindee/product/us/bank_check/__init__.py deleted file mode 100644 index 49201c4f..00000000 --- a/mindee/product/us/bank_check/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from mindee.product.us.bank_check.bank_check_v1 import BankCheckV1 -from mindee.product.us.bank_check.bank_check_v1_document import ( - BankCheckV1Document, -) -from mindee.product.us.bank_check.bank_check_v1_page import ( - BankCheckV1Page, -) - -__all__ = [ - "BankCheckV1", - "BankCheckV1Document", - "BankCheckV1Page", -] diff --git a/mindee/v1/__init__.py b/mindee/v1/__init__.py new file mode 100644 index 00000000..589a36a7 --- /dev/null +++ b/mindee/v1/__init__.py @@ -0,0 +1,17 @@ +from mindee.v1.client import ( + Client, + AsyncPredictOptions, + AsyncPredictResponse, + PageOptions, + PredictResponse, + PredictOptions, +) + +__all__ = [ + "Client", + "AsyncPredictOptions", + "AsyncPredictResponse", + "PageOptions", + "PredictResponse", + "PredictOptions", +] diff --git a/mindee/client.py b/mindee/v1/client.py similarity index 98% rename from mindee/client.py rename to mindee/v1/client.py index ec8ff828..47d41e81 100644 --- a/mindee/client.py +++ b/mindee/v1/client.py @@ -20,13 +20,13 @@ ) from mindee.mindee_http.workflow_endpoint import WorkflowEndpoint from mindee.mindee_http.workflow_settings import WorkflowSettings -from mindee.parsing.common.async_predict_response import AsyncPredictResponse -from mindee.parsing.common.feedback_response import FeedbackResponse -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.predict_response import PredictResponse +from mindee.v1.parsing.common.async_predict_response import AsyncPredictResponse +from mindee.v1.parsing.common.feedback_response import FeedbackResponse +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.predict_response import PredictResponse from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.workflow_response import WorkflowResponse -from mindee.product import GeneratedV1 +from mindee.v1.parsing.common.workflow_response import WorkflowResponse +from mindee.v1.product import GeneratedV1 OTS_OWNER = "mindee" diff --git a/mindee/v1/input/__init__.py b/mindee/v1/input/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mindee/input/workflow_options.py b/mindee/v1/input/workflow_options.py similarity index 94% rename from mindee/input/workflow_options.py rename to mindee/v1/input/workflow_options.py index 8e368921..fa032588 100644 --- a/mindee/input/workflow_options.py +++ b/mindee/v1/input/workflow_options.py @@ -1,6 +1,6 @@ from typing import Optional -from mindee.parsing.common import ExecutionPriority +from mindee.v1.parsing.common import ExecutionPriority class WorkflowOptions: diff --git a/mindee/v1/parsing/__init__.py b/mindee/v1/parsing/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mindee/v1/parsing/common/__init__.py b/mindee/v1/parsing/common/__init__.py new file mode 100644 index 00000000..e08df2a7 --- /dev/null +++ b/mindee/v1/parsing/common/__init__.py @@ -0,0 +1,43 @@ +from mindee.v1.parsing.common.api_request import ApiRequest, RequestStatus +from mindee.v1.parsing.common.api_response import ApiResponse +from mindee.v1.parsing.common.async_predict_response import AsyncPredictResponse +from mindee.v1.parsing.common.document import Document, serialize_for_json +from mindee.v1.parsing.common.execution import Execution +from mindee.v1.parsing.common.execution_file import ExecutionFile +from mindee.v1.parsing.common.execution_priority import ExecutionPriority +from mindee.v1.parsing.common.extras import CropperExtra, Extras +from mindee.v1.parsing.common.feedback_response import FeedbackResponse +from mindee.v1.parsing.common.inference import Inference, TypeInference +from mindee.v1.parsing.common.job import Job +from mindee.v1.parsing.common.ocr.mvision_v1 import MVisionV1 +from mindee.v1.parsing.common.ocr.ocr import Ocr +from mindee.v1.parsing.common.orientation import OrientationField +from mindee.v1.parsing.common.page import Page +from mindee.v1.parsing.common.predict_response import PredictResponse +from mindee.v1.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.workflow_response import WorkflowResponse + +__all__ = [ + "ApiRequest", + "ApiResponse", + "AsyncPredictResponse", + "Document", + "Execution", + "ExecutionFile", + "ExecutionPriority", + "CropperExtra", + "Extras", + "FeedbackResponse", + "Inference", + "TypeInference", + "WorkflowResponse", + "Prediction", + "Job", + "OrientationField", + "Page", + "PredictResponse", + "MVisionV1", + "Ocr", + "RequestStatus", + "serialize_for_json", +] diff --git a/mindee/parsing/common/api_request.py b/mindee/v1/parsing/common/api_request.py similarity index 100% rename from mindee/parsing/common/api_request.py rename to mindee/v1/parsing/common/api_request.py diff --git a/mindee/parsing/common/api_response.py b/mindee/v1/parsing/common/api_response.py similarity index 93% rename from mindee/parsing/common/api_response.py rename to mindee/v1/parsing/common/api_response.py index 112f8f93..08825eaa 100644 --- a/mindee/parsing/common/api_response.py +++ b/mindee/v1/parsing/common/api_response.py @@ -2,7 +2,7 @@ from abc import ABC from mindee.logger import logger -from mindee.parsing.common.api_request import ApiRequest +from mindee.v1.parsing.common.api_request import ApiRequest from mindee.parsing.common.string_dict import StringDict diff --git a/mindee/parsing/common/async_predict_response.py b/mindee/v1/parsing/common/async_predict_response.py similarity index 81% rename from mindee/parsing/common/async_predict_response.py rename to mindee/v1/parsing/common/async_predict_response.py index 5d657532..e4b5f9a6 100644 --- a/mindee/parsing/common/async_predict_response.py +++ b/mindee/v1/parsing/common/async_predict_response.py @@ -1,9 +1,9 @@ from typing import Generic, Optional, Type -from mindee.parsing.common.api_response import ApiResponse, StringDict -from mindee.parsing.common.document import Document -from mindee.parsing.common.inference import TypeInference -from mindee.parsing.common.job import Job +from mindee.v1.parsing.common.api_response import ApiResponse, StringDict +from mindee.v1.parsing.common.document import Document +from mindee.v1.parsing.common.inference import TypeInference +from mindee.v1.parsing.common.job import Job class AsyncPredictResponse(Generic[TypeInference], ApiResponse): diff --git a/mindee/parsing/common/document.py b/mindee/v1/parsing/common/document.py similarity index 90% rename from mindee/parsing/common/document.py rename to mindee/v1/parsing/common/document.py index cf5f5e9c..7d982375 100644 --- a/mindee/parsing/common/document.py +++ b/mindee/v1/parsing/common/document.py @@ -1,11 +1,11 @@ import datetime from typing import Any, Generic, Optional, Type -from mindee.parsing.common.extras.extras import Extras -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.ocr.ocr import Ocr -from mindee.parsing.common.page import TypePage -from mindee.parsing.common.prediction import TypePrediction +from mindee.v1.parsing.common.extras.extras import Extras +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.ocr.ocr import Ocr +from mindee.v1.parsing.common.page import TypePage +from mindee.v1.parsing.common.prediction import TypePrediction from mindee.parsing.common.string_dict import StringDict diff --git a/mindee/parsing/common/execution.py b/mindee/v1/parsing/common/execution.py similarity index 88% rename from mindee/parsing/common/execution.py rename to mindee/v1/parsing/common/execution.py index 3d0a725a..d7ebf889 100644 --- a/mindee/parsing/common/execution.py +++ b/mindee/v1/parsing/common/execution.py @@ -1,13 +1,13 @@ from datetime import datetime from typing import Generic, Optional, Type -from mindee.parsing.common.execution_file import ExecutionFile -from mindee.parsing.common.execution_priority import ExecutionPriority -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page -from mindee.parsing.common.prediction import TypePrediction +from mindee.v1.parsing.common.execution_file import ExecutionFile +from mindee.v1.parsing.common.execution_priority import ExecutionPriority +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page +from mindee.v1.parsing.common.prediction import TypePrediction from mindee.parsing.common.string_dict import StringDict -from mindee.product.generated.generated_v1 import GeneratedV1Document +from mindee.v1.product.generated import GeneratedV1Document class Execution(Generic[TypePrediction]): diff --git a/mindee/parsing/common/execution_file.py b/mindee/v1/parsing/common/execution_file.py similarity index 100% rename from mindee/parsing/common/execution_file.py rename to mindee/v1/parsing/common/execution_file.py diff --git a/mindee/parsing/common/execution_priority.py b/mindee/v1/parsing/common/execution_priority.py similarity index 100% rename from mindee/parsing/common/execution_priority.py rename to mindee/v1/parsing/common/execution_priority.py diff --git a/mindee/v1/parsing/common/extras/__init__.py b/mindee/v1/parsing/common/extras/__init__.py new file mode 100644 index 00000000..268a629e --- /dev/null +++ b/mindee/v1/parsing/common/extras/__init__.py @@ -0,0 +1,7 @@ +from mindee.v1.parsing.common.extras.cropper_extra import CropperExtra +from mindee.v1.parsing.common.extras.extras import Extras + +__all__ = [ + "Extras", + "CropperExtra", +] diff --git a/mindee/parsing/common/extras/cropper_extra.py b/mindee/v1/parsing/common/extras/cropper_extra.py similarity index 92% rename from mindee/parsing/common/extras/cropper_extra.py rename to mindee/v1/parsing/common/extras/cropper_extra.py index e1bb2743..68d80628 100644 --- a/mindee/parsing/common/extras/cropper_extra.py +++ b/mindee/v1/parsing/common/extras/cropper_extra.py @@ -1,7 +1,7 @@ from typing import List, Optional from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.position import PositionField +from mindee.v1.parsing.standard.position import PositionField class CropperExtra: diff --git a/mindee/parsing/common/extras/extras.py b/mindee/v1/parsing/common/extras/extras.py similarity index 88% rename from mindee/parsing/common/extras/extras.py rename to mindee/v1/parsing/common/extras/extras.py index 8d1f8f94..cc114e47 100644 --- a/mindee/parsing/common/extras/extras.py +++ b/mindee/v1/parsing/common/extras/extras.py @@ -1,8 +1,8 @@ from typing import Optional -from mindee.parsing.common.extras.cropper_extra import CropperExtra -from mindee.parsing.common.extras.full_text_ocr_extra import FullTextOcrExtra -from mindee.parsing.common.extras.rag_extra import RagExtra +from mindee.v1.parsing.common.extras.cropper_extra import CropperExtra +from mindee.v1.parsing.common.extras.full_text_ocr_extra import FullTextOcrExtra +from mindee.v1.parsing.common.extras.rag_extra import RagExtra from mindee.parsing.common.string_dict import StringDict diff --git a/mindee/parsing/common/extras/full_text_ocr_extra.py b/mindee/v1/parsing/common/extras/full_text_ocr_extra.py similarity index 100% rename from mindee/parsing/common/extras/full_text_ocr_extra.py rename to mindee/v1/parsing/common/extras/full_text_ocr_extra.py diff --git a/mindee/parsing/common/extras/rag_extra.py b/mindee/v1/parsing/common/extras/rag_extra.py similarity index 100% rename from mindee/parsing/common/extras/rag_extra.py rename to mindee/v1/parsing/common/extras/rag_extra.py diff --git a/mindee/parsing/common/feedback_response.py b/mindee/v1/parsing/common/feedback_response.py similarity index 85% rename from mindee/parsing/common/feedback_response.py rename to mindee/v1/parsing/common/feedback_response.py index 54ab67d2..a7b76640 100644 --- a/mindee/parsing/common/feedback_response.py +++ b/mindee/v1/parsing/common/feedback_response.py @@ -1,4 +1,4 @@ -from mindee.parsing.common.api_response import ApiResponse +from mindee.v1.parsing.common.api_response import ApiResponse from mindee.parsing.common.string_dict import StringDict diff --git a/mindee/parsing/common/inference.py b/mindee/v1/parsing/common/inference.py similarity index 92% rename from mindee/parsing/common/inference.py rename to mindee/v1/parsing/common/inference.py index 5a61d353..a7192118 100644 --- a/mindee/parsing/common/inference.py +++ b/mindee/v1/parsing/common/inference.py @@ -1,10 +1,10 @@ from typing import Dict, Generic, List, Optional, Type, TypeVar from mindee.error.mindee_error import MindeeError -from mindee.parsing.common.extras import Extras -from mindee.parsing.common.page import TypePage -from mindee.parsing.common.prediction import TypePrediction -from mindee.parsing.common.product import Product +from mindee.v1.parsing.common.extras import Extras +from mindee.v1.parsing.common.page import TypePage +from mindee.v1.parsing.common.prediction import TypePrediction +from mindee.v1.parsing.common.product import Product from mindee.parsing.common.string_dict import StringDict diff --git a/mindee/parsing/common/job.py b/mindee/v1/parsing/common/job.py similarity index 100% rename from mindee/parsing/common/job.py rename to mindee/v1/parsing/common/job.py diff --git a/mindee/v1/parsing/common/ocr/__init__.py b/mindee/v1/parsing/common/ocr/__init__.py new file mode 100644 index 00000000..ea56ce8c --- /dev/null +++ b/mindee/v1/parsing/common/ocr/__init__.py @@ -0,0 +1,3 @@ +from mindee.v1.parsing.common.ocr.ocr import Ocr + +__all__ = ["Ocr"] diff --git a/mindee/parsing/common/ocr/mvision_v1.py b/mindee/v1/parsing/common/ocr/mvision_v1.py similarity index 88% rename from mindee/parsing/common/ocr/mvision_v1.py rename to mindee/v1/parsing/common/ocr/mvision_v1.py index 4c7a374b..fb9afeb3 100644 --- a/mindee/parsing/common/ocr/mvision_v1.py +++ b/mindee/v1/parsing/common/ocr/mvision_v1.py @@ -1,6 +1,6 @@ from typing import List -from mindee.parsing.common.ocr.ocr_page import OcrPage +from mindee.v1.parsing.common.ocr.ocr_page import OcrPage from mindee.parsing.common.string_dict import StringDict diff --git a/mindee/parsing/common/ocr/ocr.py b/mindee/v1/parsing/common/ocr/ocr.py similarity index 85% rename from mindee/parsing/common/ocr/ocr.py rename to mindee/v1/parsing/common/ocr/ocr.py index 8116f5c5..b0b10986 100644 --- a/mindee/parsing/common/ocr/ocr.py +++ b/mindee/v1/parsing/common/ocr/ocr.py @@ -1,4 +1,4 @@ -from mindee.parsing.common.ocr.mvision_v1 import MVisionV1 +from mindee.v1.parsing.common.ocr.mvision_v1 import MVisionV1 from mindee.parsing.common.string_dict import StringDict diff --git a/mindee/parsing/common/ocr/ocr_line.py b/mindee/v1/parsing/common/ocr/ocr_line.py similarity index 87% rename from mindee/parsing/common/ocr/ocr_line.py rename to mindee/v1/parsing/common/ocr/ocr_line.py index e10cb911..a94ac815 100644 --- a/mindee/parsing/common/ocr/ocr_line.py +++ b/mindee/v1/parsing/common/ocr/ocr_line.py @@ -1,7 +1,7 @@ from typing import List from mindee.geometry.minmax import get_min_max_x -from mindee.parsing.common.ocr.ocr_word import OcrWord +from mindee.v1.parsing.common.ocr.ocr_word import OcrWord class OcrLine(List[OcrWord]): diff --git a/mindee/parsing/common/ocr/ocr_page.py b/mindee/v1/parsing/common/ocr/ocr_page.py similarity index 95% rename from mindee/parsing/common/ocr/ocr_page.py rename to mindee/v1/parsing/common/ocr/ocr_page.py index b2210ff2..f0795ff4 100644 --- a/mindee/parsing/common/ocr/ocr_page.py +++ b/mindee/v1/parsing/common/ocr/ocr_page.py @@ -3,8 +3,8 @@ from mindee.geometry.minmax import get_min_max_y from mindee.geometry.polygon import is_point_in_polygon_y from mindee.geometry.polygon_utils import get_centroid -from mindee.parsing.common.ocr.ocr_line import OcrLine -from mindee.parsing.common.ocr.ocr_word import OcrWord +from mindee.v1.parsing.common.ocr.ocr_line import OcrLine +from mindee.v1.parsing.common.ocr.ocr_word import OcrWord from mindee.parsing.common.string_dict import StringDict diff --git a/mindee/parsing/common/ocr/ocr_word.py b/mindee/v1/parsing/common/ocr/ocr_word.py similarity index 88% rename from mindee/parsing/common/ocr/ocr_word.py rename to mindee/v1/parsing/common/ocr/ocr_word.py index 891da862..3af9ee6b 100644 --- a/mindee/parsing/common/ocr/ocr_word.py +++ b/mindee/v1/parsing/common/ocr/ocr_word.py @@ -1,5 +1,5 @@ from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.base import FieldPositionMixin +from mindee.v1.parsing.standard.base import FieldPositionMixin class OcrWord(FieldPositionMixin): diff --git a/mindee/parsing/common/orientation.py b/mindee/v1/parsing/common/orientation.py similarity index 95% rename from mindee/parsing/common/orientation.py rename to mindee/v1/parsing/common/orientation.py index f0f1eef9..54f85cc9 100644 --- a/mindee/parsing/common/orientation.py +++ b/mindee/v1/parsing/common/orientation.py @@ -1,7 +1,7 @@ from typing import Optional from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.base import BaseField +from mindee.v1.parsing.standard.base import BaseField class OrientationField(BaseField): diff --git a/mindee/parsing/common/page.py b/mindee/v1/parsing/common/page.py similarity index 88% rename from mindee/parsing/common/page.py rename to mindee/v1/parsing/common/page.py index f8468b74..f49c52b4 100644 --- a/mindee/parsing/common/page.py +++ b/mindee/v1/parsing/common/page.py @@ -1,8 +1,8 @@ from typing import Generic, Optional, Type, TypeVar -from mindee.parsing.common.extras.extras import Extras -from mindee.parsing.common.orientation import OrientationField -from mindee.parsing.common.prediction import TypePrediction +from mindee.v1.parsing.common.extras.extras import Extras +from mindee.v1.parsing.common.orientation import OrientationField +from mindee.v1.parsing.common.prediction import TypePrediction from mindee.parsing.common.string_dict import StringDict diff --git a/mindee/parsing/common/predict_response.py b/mindee/v1/parsing/common/predict_response.py similarity index 80% rename from mindee/parsing/common/predict_response.py rename to mindee/v1/parsing/common/predict_response.py index bcc8ba81..83379e6b 100644 --- a/mindee/parsing/common/predict_response.py +++ b/mindee/v1/parsing/common/predict_response.py @@ -1,8 +1,8 @@ from typing import Generic, Type -from mindee.parsing.common.api_response import ApiResponse, StringDict -from mindee.parsing.common.document import Document -from mindee.parsing.common.inference import TypeInference +from mindee.v1.parsing.common.api_response import ApiResponse, StringDict +from mindee.v1.parsing.common.document import Document +from mindee.v1.parsing.common.inference import TypeInference class PredictResponse(Generic[TypeInference], ApiResponse): diff --git a/mindee/parsing/common/prediction.py b/mindee/v1/parsing/common/prediction.py similarity index 100% rename from mindee/parsing/common/prediction.py rename to mindee/v1/parsing/common/prediction.py diff --git a/mindee/parsing/common/product.py b/mindee/v1/parsing/common/product.py similarity index 100% rename from mindee/parsing/common/product.py rename to mindee/v1/parsing/common/product.py diff --git a/mindee/parsing/common/workflow_response.py b/mindee/v1/parsing/common/workflow_response.py similarity index 70% rename from mindee/parsing/common/workflow_response.py rename to mindee/v1/parsing/common/workflow_response.py index c0f01105..5e0ebbe5 100644 --- a/mindee/parsing/common/workflow_response.py +++ b/mindee/v1/parsing/common/workflow_response.py @@ -1,9 +1,9 @@ from typing import Generic, Type -from mindee.parsing.common.api_response import ApiResponse -from mindee.parsing.common.execution import Execution -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.prediction import TypePrediction +from mindee.v1.parsing.common.api_response import ApiResponse +from mindee.v1.parsing.common.execution import Execution +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.prediction import TypePrediction from mindee.parsing.common.string_dict import StringDict diff --git a/mindee/v1/parsing/custom/__init__.py b/mindee/v1/parsing/custom/__init__.py new file mode 100644 index 00000000..10e5584a --- /dev/null +++ b/mindee/v1/parsing/custom/__init__.py @@ -0,0 +1,11 @@ +from mindee.v1.parsing.custom.classification import ClassificationField +from mindee.v1.parsing.custom.line_items import CustomLine, get_line_items +from mindee.v1.parsing.custom.list import ListField, ListFieldValue + +__all__ = [ + "ClassificationField", + "CustomLine", + "get_line_items", + "ListField", + "ListFieldValue", +] diff --git a/mindee/parsing/custom/classification.py b/mindee/v1/parsing/custom/classification.py similarity index 87% rename from mindee/parsing/custom/classification.py rename to mindee/v1/parsing/custom/classification.py index bc5bd4a3..c11099ff 100644 --- a/mindee/parsing/custom/classification.py +++ b/mindee/v1/parsing/custom/classification.py @@ -1,4 +1,4 @@ -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict class ClassificationField: diff --git a/mindee/parsing/custom/line_items.py b/mindee/v1/parsing/custom/line_items.py similarity index 98% rename from mindee/parsing/custom/line_items.py rename to mindee/v1/parsing/custom/line_items.py index 08103014..c28643a5 100644 --- a/mindee/parsing/custom/line_items.py +++ b/mindee/v1/parsing/custom/line_items.py @@ -4,7 +4,7 @@ from mindee.geometry.bbox import BBox, extend_bbox, get_bbox from mindee.geometry.minmax import MinMax, get_min_max_y from mindee.geometry.quadrilateral import get_bounding_box -from mindee.parsing.custom.list import ListField, ListFieldValue +from mindee.v1.parsing.custom.list import ListField, ListFieldValue def _find_best_anchor(anchors: Sequence[str], fields: Dict[str, ListField]) -> str: diff --git a/mindee/parsing/custom/list.py b/mindee/v1/parsing/custom/list.py similarity index 94% rename from mindee/parsing/custom/list.py rename to mindee/v1/parsing/custom/list.py index e0fa1dd2..b24033a5 100644 --- a/mindee/parsing/custom/list.py +++ b/mindee/v1/parsing/custom/list.py @@ -1,7 +1,7 @@ from typing import List, Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.base import FieldPositionMixin +from mindee.parsing.common import StringDict +from mindee.v1.parsing.standard.base import FieldPositionMixin class ListFieldValue(FieldPositionMixin): diff --git a/mindee/parsing/generated/__init__.py b/mindee/v1/parsing/generated/__init__.py similarity index 52% rename from mindee/parsing/generated/__init__.py rename to mindee/v1/parsing/generated/__init__.py index ffec05ac..ca3e561b 100644 --- a/mindee/parsing/generated/__init__.py +++ b/mindee/v1/parsing/generated/__init__.py @@ -1,5 +1,5 @@ -from mindee.parsing.generated.generated_list import GeneratedListField -from mindee.parsing.generated.generated_object import ( +from mindee.v1.parsing.generated.generated_list import GeneratedListField +from mindee.v1.parsing.generated.generated_object import ( GeneratedObjectField, is_generated_object, ) diff --git a/mindee/parsing/generated/generated_list.py b/mindee/v1/parsing/generated/generated_list.py similarity index 90% rename from mindee/parsing/generated/generated_list.py rename to mindee/v1/parsing/generated/generated_list.py index 4deba5db..12071fac 100644 --- a/mindee/parsing/generated/generated_list.py +++ b/mindee/v1/parsing/generated/generated_list.py @@ -1,11 +1,11 @@ from typing import List, Optional, Union -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.generated.generated_object import ( +from mindee.parsing.common import StringDict +from mindee.v1.parsing.generated.generated_object import ( GeneratedObjectField, is_generated_object, ) -from mindee.parsing.standard.text import StringField +from mindee.v1.parsing.standard.text import StringField class GeneratedListField: diff --git a/mindee/parsing/generated/generated_object.py b/mindee/v1/parsing/generated/generated_object.py similarity index 95% rename from mindee/parsing/generated/generated_object.py rename to mindee/v1/parsing/generated/generated_object.py index f93f182a..78eab0a2 100644 --- a/mindee/parsing/generated/generated_object.py +++ b/mindee/v1/parsing/generated/generated_object.py @@ -1,7 +1,7 @@ from typing import List, Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.position import PositionField +from mindee.parsing.common import StringDict +from mindee.v1.parsing.standard.position import PositionField class GeneratedObjectField: diff --git a/mindee/v1/parsing/standard/__init__.py b/mindee/v1/parsing/standard/__init__.py new file mode 100644 index 00000000..dc52b092 --- /dev/null +++ b/mindee/v1/parsing/standard/__init__.py @@ -0,0 +1,52 @@ +from mindee.v1.parsing.standard.address import AddressField +from mindee.v1.parsing.standard.amount import AmountField +from mindee.v1.parsing.standard.base import ( + BaseField, + bool_to_string, + compare_field_arrays, + field_array_confidence, + field_array_sum, + FieldConfidenceMixin, + FieldPositionMixin, + float_to_string, + int_to_string, + to_opt_bool, + to_opt_float, + to_opt_int, +) +from mindee.v1.parsing.standard.boolean import BooleanField +from mindee.v1.parsing.standard.classification import ClassificationField +from mindee.v1.parsing.standard.company_registration import CompanyRegistrationField +from mindee.v1.parsing.standard.date import DateField +from mindee.v1.parsing.standard.locale import LocaleField +from mindee.v1.parsing.standard.payment_details import PaymentDetailsField +from mindee.v1.parsing.standard.position import PositionField +from mindee.v1.parsing.standard.tax import Taxes, TaxField +from mindee.v1.parsing.standard.text import StringField + +__all__ = [ + "AddressField", + "AmountField", + "BaseField", + "FieldConfidenceMixin", + "FieldPositionMixin", + "bool_to_string", + "float_to_string", + "compare_field_arrays", + "field_array_confidence", + "field_array_sum", + "int_to_string", + "to_opt_bool", + "to_opt_float", + "to_opt_int", + "BooleanField", + "ClassificationField", + "CompanyRegistrationField", + "DateField", + "LocaleField", + "PaymentDetailsField", + "PositionField", + "Taxes", + "TaxField", + "StringField", +] diff --git a/mindee/parsing/standard/address.py b/mindee/v1/parsing/standard/address.py similarity index 94% rename from mindee/parsing/standard/address.py rename to mindee/v1/parsing/standard/address.py index cdfbcfdb..b269f72e 100644 --- a/mindee/parsing/standard/address.py +++ b/mindee/v1/parsing/standard/address.py @@ -1,7 +1,7 @@ from typing import Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.text import StringField +from mindee.parsing.common import StringDict +from mindee.v1.parsing.standard.text import StringField class AddressField(StringField): diff --git a/mindee/parsing/standard/amount.py b/mindee/v1/parsing/standard/amount.py similarity index 88% rename from mindee/parsing/standard/amount.py rename to mindee/v1/parsing/standard/amount.py index 3692898f..3060deca 100644 --- a/mindee/parsing/standard/amount.py +++ b/mindee/v1/parsing/standard/amount.py @@ -1,7 +1,11 @@ from typing import Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.base import BaseField, FieldPositionMixin, float_to_string +from mindee.parsing.common import StringDict +from mindee.v1.parsing.standard.base import ( + BaseField, + FieldPositionMixin, + float_to_string, +) class AmountField(FieldPositionMixin, BaseField): diff --git a/mindee/parsing/standard/base.py b/mindee/v1/parsing/standard/base.py similarity index 99% rename from mindee/parsing/standard/base.py rename to mindee/v1/parsing/standard/base.py index 1960d72a..18b46794 100644 --- a/mindee/parsing/standard/base.py +++ b/mindee/v1/parsing/standard/base.py @@ -2,7 +2,7 @@ from mindee.geometry.polygon import Polygon from mindee.geometry.quadrilateral import Quadrilateral, get_bounding_box -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict class FieldPositionMixin: diff --git a/mindee/parsing/standard/boolean.py b/mindee/v1/parsing/standard/boolean.py similarity index 88% rename from mindee/parsing/standard/boolean.py rename to mindee/v1/parsing/standard/boolean.py index 354eefa2..65e3a275 100644 --- a/mindee/parsing/standard/boolean.py +++ b/mindee/v1/parsing/standard/boolean.py @@ -1,7 +1,7 @@ from typing import Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.base import BaseField, FieldPositionMixin +from mindee.parsing.common import StringDict +from mindee.v1.parsing.standard.base import BaseField, FieldPositionMixin class BooleanField(FieldPositionMixin, BaseField): diff --git a/mindee/parsing/standard/classification.py b/mindee/v1/parsing/standard/classification.py similarity index 88% rename from mindee/parsing/standard/classification.py rename to mindee/v1/parsing/standard/classification.py index 8c9a9429..1b5f6b12 100644 --- a/mindee/parsing/standard/classification.py +++ b/mindee/v1/parsing/standard/classification.py @@ -1,7 +1,7 @@ from typing import Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.base import BaseField +from mindee.parsing.common import StringDict +from mindee.v1.parsing.standard.base import BaseField class ClassificationField(BaseField): diff --git a/mindee/parsing/standard/company_registration.py b/mindee/v1/parsing/standard/company_registration.py similarity index 87% rename from mindee/parsing/standard/company_registration.py rename to mindee/v1/parsing/standard/company_registration.py index 77ad05ce..f242bd6b 100644 --- a/mindee/parsing/standard/company_registration.py +++ b/mindee/v1/parsing/standard/company_registration.py @@ -1,8 +1,8 @@ from typing import Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.common.summary_helper import format_for_display -from mindee.parsing.standard.base import BaseField, FieldPositionMixin +from mindee.parsing.common import StringDict +from mindee.parsing.common import format_for_display +from mindee.v1.parsing.standard.base import BaseField, FieldPositionMixin class CompanyRegistrationField(FieldPositionMixin, BaseField): diff --git a/mindee/parsing/standard/date.py b/mindee/v1/parsing/standard/date.py similarity index 93% rename from mindee/parsing/standard/date.py rename to mindee/v1/parsing/standard/date.py index 21857cf3..42ddce34 100644 --- a/mindee/parsing/standard/date.py +++ b/mindee/v1/parsing/standard/date.py @@ -3,8 +3,8 @@ import pytz -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.base import BaseField, FieldPositionMixin +from mindee.parsing.common import StringDict +from mindee.v1.parsing.standard.base import BaseField, FieldPositionMixin ISO8601_DATE_FORMAT = "%Y-%m-%d" ISO8601_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ" diff --git a/mindee/parsing/standard/locale.py b/mindee/v1/parsing/standard/locale.py similarity index 94% rename from mindee/parsing/standard/locale.py rename to mindee/v1/parsing/standard/locale.py index 2b692d91..c92769a3 100644 --- a/mindee/parsing/standard/locale.py +++ b/mindee/v1/parsing/standard/locale.py @@ -1,7 +1,7 @@ from typing import Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.base import BaseField +from mindee.parsing.common import StringDict +from mindee.v1.parsing.standard.base import BaseField class LocaleField(BaseField): diff --git a/mindee/parsing/standard/payment_details.py b/mindee/v1/parsing/standard/payment_details.py similarity index 96% rename from mindee/parsing/standard/payment_details.py rename to mindee/v1/parsing/standard/payment_details.py index bc30d161..fcd48c78 100644 --- a/mindee/parsing/standard/payment_details.py +++ b/mindee/v1/parsing/standard/payment_details.py @@ -1,7 +1,7 @@ from typing import Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.base import BaseField, FieldPositionMixin +from mindee.parsing.common import StringDict +from mindee.v1.parsing.standard.base import BaseField, FieldPositionMixin class PaymentDetailsField(FieldPositionMixin, BaseField): diff --git a/mindee/parsing/standard/position.py b/mindee/v1/parsing/standard/position.py similarity index 96% rename from mindee/parsing/standard/position.py rename to mindee/v1/parsing/standard/position.py index a7bfd530..16bb35f3 100644 --- a/mindee/parsing/standard/position.py +++ b/mindee/v1/parsing/standard/position.py @@ -3,8 +3,8 @@ from mindee.error.geometry_error import GeometryError from mindee.geometry.polygon import Polygon from mindee.geometry.quadrilateral import Quadrilateral, quadrilateral_from_prediction -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.base import BaseField +from mindee.parsing.common import StringDict +from mindee.v1.parsing.standard.base import BaseField class PositionField(BaseField): diff --git a/mindee/parsing/standard/tax.py b/mindee/v1/parsing/standard/tax.py similarity index 96% rename from mindee/parsing/standard/tax.py rename to mindee/v1/parsing/standard/tax.py index a7648ea6..de917335 100644 --- a/mindee/parsing/standard/tax.py +++ b/mindee/v1/parsing/standard/tax.py @@ -1,7 +1,11 @@ from typing import Dict, List, Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.base import BaseField, FieldPositionMixin, float_to_string +from mindee.parsing.common import StringDict +from mindee.v1.parsing.standard.base import ( + BaseField, + FieldPositionMixin, + float_to_string, +) class TaxField(FieldPositionMixin, BaseField): diff --git a/mindee/parsing/standard/text.py b/mindee/v1/parsing/standard/text.py similarity index 89% rename from mindee/parsing/standard/text.py rename to mindee/v1/parsing/standard/text.py index f3e3c191..b4bb36d9 100644 --- a/mindee/parsing/standard/text.py +++ b/mindee/v1/parsing/standard/text.py @@ -1,7 +1,7 @@ from typing import Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.standard.base import BaseField, FieldPositionMixin +from mindee.parsing.common import StringDict +from mindee.v1.parsing.standard.base import BaseField, FieldPositionMixin class StringField(FieldPositionMixin, BaseField): diff --git a/mindee/v1/product/__init__.py b/mindee/v1/product/__init__.py new file mode 100644 index 00000000..69ca5f37 --- /dev/null +++ b/mindee/v1/product/__init__.py @@ -0,0 +1,97 @@ +from mindee.v1.product import us +from mindee.v1.product import fr +from mindee.v1.product.barcode_reader.barcode_reader_v1 import BarcodeReaderV1 +from mindee.v1.product.barcode_reader.barcode_reader_v1_document import ( + BarcodeReaderV1Document, +) +from mindee.v1.product.cropper.cropper_v1 import CropperV1 +from mindee.v1.product.cropper.cropper_v1_document import ( + CropperV1Document, +) +from mindee.v1.product.cropper.cropper_v1_page import ( + CropperV1Page, +) +from mindee.v1.product.custom import CustomV1, CustomV1Document, CustomV1Page +from mindee.v1.product.financial_document.financial_document_v1 import ( + FinancialDocumentV1, +) +from mindee.v1.product.financial_document.financial_document_v1_document import ( + FinancialDocumentV1Document, +) +from mindee.v1.product.financial_document.financial_document_v1_line_item import ( + FinancialDocumentV1LineItem, +) +from mindee.v1.product.generated import ( + GeneratedV1, + GeneratedV1Document, + GeneratedV1Page, +) +from mindee.v1.product.international_id.international_id_v2 import InternationalIdV2 +from mindee.v1.product.international_id.international_id_v2_document import ( + InternationalIdV2Document, +) +from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 +from mindee.v1.product.invoice.invoice_v4_document import ( + InvoiceV4Document, +) +from mindee.v1.product.invoice.invoice_v4_line_item import ( + InvoiceV4LineItem, +) +from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 +from mindee.v1.product.invoice_splitter.invoice_splitter_v1_document import ( + InvoiceSplitterV1Document, +) +from mindee.v1.product.invoice_splitter.invoice_splitter_v1_invoice_page_group import ( + InvoiceSplitterV1InvoicePageGroup, +) +from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1 import ( + MultiReceiptsDetectorV1, +) +from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1_document import ( + MultiReceiptsDetectorV1Document, +) +from mindee.v1.product.passport.passport_v1 import PassportV1 +from mindee.v1.product.passport.passport_v1_document import ( + PassportV1Document, +) +from mindee.v1.product.receipt.receipt_v5 import ReceiptV5 +from mindee.v1.product.receipt.receipt_v5_document import ( + ReceiptV5Document, +) +from mindee.v1.product.receipt.receipt_v5_line_item import ( + ReceiptV5LineItem, +) + +__all__ = [ + "fr", + "us", + "BarcodeReaderV1", + "BarcodeReaderV1Document", + "CropperV1", + "CropperV1Document", + "CropperV1Page", + "CustomV1", + "CustomV1Document", + "CustomV1Page", + "FinancialDocumentV1", + "FinancialDocumentV1Document", + "FinancialDocumentV1LineItem", + "GeneratedV1", + "GeneratedV1Document", + "GeneratedV1Page", + "InternationalIdV2", + "InternationalIdV2Document", + "InvoiceV4", + "InvoiceV4Document", + "InvoiceV4LineItem", + "InvoiceSplitterV1", + "InvoiceSplitterV1Document", + "InvoiceSplitterV1InvoicePageGroup", + "MultiReceiptsDetectorV1", + "MultiReceiptsDetectorV1Document", + "PassportV1", + "PassportV1Document", + "ReceiptV5", + "ReceiptV5Document", + "ReceiptV5LineItem", +] diff --git a/mindee/v1/product/barcode_reader/__init__.py b/mindee/v1/product/barcode_reader/__init__.py new file mode 100644 index 00000000..3d7d1d5f --- /dev/null +++ b/mindee/v1/product/barcode_reader/__init__.py @@ -0,0 +1,9 @@ +from mindee.v1.product.barcode_reader.barcode_reader_v1 import BarcodeReaderV1 +from mindee.v1.product.barcode_reader.barcode_reader_v1_document import ( + BarcodeReaderV1Document, +) + +__all__ = [ + "BarcodeReaderV1", + "BarcodeReaderV1Document", +] diff --git a/mindee/product/barcode_reader/barcode_reader_v1.py b/mindee/v1/product/barcode_reader/barcode_reader_v1.py similarity index 86% rename from mindee/product/barcode_reader/barcode_reader_v1.py rename to mindee/v1/product/barcode_reader/barcode_reader_v1.py index c6290b70..91d3185e 100644 --- a/mindee/product/barcode_reader/barcode_reader_v1.py +++ b/mindee/v1/product/barcode_reader/barcode_reader_v1.py @@ -1,9 +1,9 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.barcode_reader.barcode_reader_v1_document import ( +from mindee.v1.product.barcode_reader.barcode_reader_v1_document import ( BarcodeReaderV1Document, ) diff --git a/mindee/product/barcode_reader/barcode_reader_v1_document.py b/mindee/v1/product/barcode_reader/barcode_reader_v1_document.py similarity index 92% rename from mindee/product/barcode_reader/barcode_reader_v1_document.py rename to mindee/v1/product/barcode_reader/barcode_reader_v1_document.py index be0a621e..daa2756e 100644 --- a/mindee/product/barcode_reader/barcode_reader_v1_document.py +++ b/mindee/v1/product/barcode_reader/barcode_reader_v1_document.py @@ -1,9 +1,9 @@ from typing import List, Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.text import StringField +from mindee.v1.parsing.standard.text import StringField class BarcodeReaderV1Document(Prediction): diff --git a/mindee/v1/product/cropper/__init__.py b/mindee/v1/product/cropper/__init__.py new file mode 100644 index 00000000..585ae8e9 --- /dev/null +++ b/mindee/v1/product/cropper/__init__.py @@ -0,0 +1,13 @@ +from mindee.v1.product.cropper.cropper_v1 import CropperV1 +from mindee.v1.product.cropper.cropper_v1_document import ( + CropperV1Document, +) +from mindee.v1.product.cropper.cropper_v1_page import ( + CropperV1Page, +) + +__all__ = [ + "CropperV1", + "CropperV1Document", + "CropperV1Page", +] diff --git a/mindee/product/cropper/cropper_v1.py b/mindee/v1/product/cropper/cropper_v1.py similarity index 82% rename from mindee/product/cropper/cropper_v1.py rename to mindee/v1/product/cropper/cropper_v1.py index 76e128e6..5d9c5691 100644 --- a/mindee/product/cropper/cropper_v1.py +++ b/mindee/v1/product/cropper/cropper_v1.py @@ -1,12 +1,12 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.cropper.cropper_v1_document import ( +from mindee.v1.product.cropper.cropper_v1_document import ( CropperV1Document, ) -from mindee.product.cropper.cropper_v1_page import ( +from mindee.v1.product.cropper.cropper_v1_page import ( CropperV1Page, ) diff --git a/mindee/product/cropper/cropper_v1_document.py b/mindee/v1/product/cropper/cropper_v1_document.py similarity index 69% rename from mindee/product/cropper/cropper_v1_document.py rename to mindee/v1/product/cropper/cropper_v1_document.py index 1e575620..8b1529f4 100644 --- a/mindee/product/cropper/cropper_v1_document.py +++ b/mindee/v1/product/cropper/cropper_v1_document.py @@ -1,4 +1,4 @@ -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction class CropperV1Document(Prediction): diff --git a/mindee/product/cropper/cropper_v1_page.py b/mindee/v1/product/cropper/cropper_v1_page.py similarity index 90% rename from mindee/product/cropper/cropper_v1_page.py rename to mindee/v1/product/cropper/cropper_v1_page.py index 7ad263f5..0cfba4c3 100644 --- a/mindee/product/cropper/cropper_v1_page.py +++ b/mindee/v1/product/cropper/cropper_v1_page.py @@ -2,8 +2,8 @@ from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.position import PositionField -from mindee.product.cropper.cropper_v1_document import ( +from mindee.v1.parsing.standard.position import PositionField +from mindee.v1.product.cropper.cropper_v1_document import ( CropperV1Document, ) diff --git a/mindee/product/custom/__init__.py b/mindee/v1/product/custom/__init__.py similarity index 72% rename from mindee/product/custom/__init__.py rename to mindee/v1/product/custom/__init__.py index 8e801206..641b9d4d 100644 --- a/mindee/product/custom/__init__.py +++ b/mindee/v1/product/custom/__init__.py @@ -1,4 +1,4 @@ -from mindee.product.custom.custom_v1 import ( +from mindee.v1.product.custom.custom_v1 import ( CustomV1, CustomV1Document, CustomV1Page, diff --git a/mindee/product/custom/custom_v1.py b/mindee/v1/product/custom/custom_v1.py similarity index 78% rename from mindee/product/custom/custom_v1.py rename to mindee/v1/product/custom/custom_v1.py index 570af288..ac530967 100644 --- a/mindee/product/custom/custom_v1.py +++ b/mindee/v1/product/custom/custom_v1.py @@ -1,10 +1,10 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.custom.custom_v1_document import CustomV1Document -from mindee.product.custom.custom_v1_page import CustomV1Page +from mindee.v1.product.custom.custom_v1_document import CustomV1Document +from mindee.v1.product.custom.custom_v1_page import CustomV1Page class CustomV1(Inference): diff --git a/mindee/product/custom/custom_v1_document.py b/mindee/v1/product/custom/custom_v1_document.py similarity index 88% rename from mindee/product/custom/custom_v1_document.py rename to mindee/v1/product/custom/custom_v1_document.py index 3458cfbd..62b93575 100644 --- a/mindee/product/custom/custom_v1_document.py +++ b/mindee/v1/product/custom/custom_v1_document.py @@ -1,11 +1,11 @@ from typing import Dict, List -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.custom.classification import ClassificationField -from mindee.parsing.custom.line_items import CustomLine, get_line_items -from mindee.parsing.custom.list import ListField +from mindee.v1.parsing.custom.classification import ClassificationField +from mindee.v1.parsing.custom.line_items import CustomLine, get_line_items +from mindee.v1.parsing.custom.list import ListField class CustomV1Document(Prediction): diff --git a/mindee/product/custom/custom_v1_page.py b/mindee/v1/product/custom/custom_v1_page.py similarity index 89% rename from mindee/product/custom/custom_v1_page.py rename to mindee/v1/product/custom/custom_v1_page.py index 027d2f67..4fb8bb03 100644 --- a/mindee/product/custom/custom_v1_page.py +++ b/mindee/v1/product/custom/custom_v1_page.py @@ -1,10 +1,10 @@ from typing import Dict, List, Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.custom.line_items import CustomLine, get_line_items -from mindee.parsing.custom.list import ListField +from mindee.v1.parsing.custom.line_items import CustomLine, get_line_items +from mindee.v1.parsing.custom.list import ListField class CustomV1Page(Prediction): diff --git a/mindee/v1/product/financial_document/__init__.py b/mindee/v1/product/financial_document/__init__.py new file mode 100644 index 00000000..6c7d5523 --- /dev/null +++ b/mindee/v1/product/financial_document/__init__.py @@ -0,0 +1,15 @@ +from mindee.v1.product.financial_document.financial_document_v1 import ( + FinancialDocumentV1, +) +from mindee.v1.product.financial_document.financial_document_v1_document import ( + FinancialDocumentV1Document, +) +from mindee.v1.product.financial_document.financial_document_v1_line_item import ( + FinancialDocumentV1LineItem, +) + +__all__ = [ + "FinancialDocumentV1", + "FinancialDocumentV1Document", + "FinancialDocumentV1LineItem", +] diff --git a/mindee/product/financial_document/financial_document_v1.py b/mindee/v1/product/financial_document/financial_document_v1.py similarity index 85% rename from mindee/product/financial_document/financial_document_v1.py rename to mindee/v1/product/financial_document/financial_document_v1.py index 9880d71d..dca3d2d6 100644 --- a/mindee/product/financial_document/financial_document_v1.py +++ b/mindee/v1/product/financial_document/financial_document_v1.py @@ -1,9 +1,9 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.financial_document.financial_document_v1_document import ( +from mindee.v1.product.financial_document.financial_document_v1_document import ( FinancialDocumentV1Document, ) diff --git a/mindee/product/financial_document/financial_document_v1_document.py b/mindee/v1/product/financial_document/financial_document_v1_document.py similarity index 94% rename from mindee/product/financial_document/financial_document_v1_document.py rename to mindee/v1/product/financial_document/financial_document_v1_document.py index 57352bdd..c041fc38 100644 --- a/mindee/product/financial_document/financial_document_v1_document.py +++ b/mindee/v1/product/financial_document/financial_document_v1_document.py @@ -1,18 +1,18 @@ from typing import List, Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.address import AddressField -from mindee.parsing.standard.amount import AmountField -from mindee.parsing.standard.classification import ClassificationField -from mindee.parsing.standard.company_registration import CompanyRegistrationField -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.locale import LocaleField -from mindee.parsing.standard.payment_details import PaymentDetailsField -from mindee.parsing.standard.tax import Taxes -from mindee.parsing.standard.text import StringField -from mindee.product.financial_document.financial_document_v1_line_item import ( +from mindee.v1.parsing.standard.address import AddressField +from mindee.v1.parsing.standard.amount import AmountField +from mindee.v1.parsing.standard.classification import ClassificationField +from mindee.v1.parsing.standard.company_registration import CompanyRegistrationField +from mindee.v1.parsing.standard.date import DateField +from mindee.v1.parsing.standard.locale import LocaleField +from mindee.v1.parsing.standard.payment_details import PaymentDetailsField +from mindee.v1.parsing.standard.tax import Taxes +from mindee.v1.parsing.standard.text import StringField +from mindee.v1.product.financial_document.financial_document_v1_line_item import ( FinancialDocumentV1LineItem, ) diff --git a/mindee/product/financial_document/financial_document_v1_line_item.py b/mindee/v1/product/financial_document/financial_document_v1_line_item.py similarity index 99% rename from mindee/product/financial_document/financial_document_v1_line_item.py rename to mindee/v1/product/financial_document/financial_document_v1_line_item.py index 7ab4206d..1c5d8b44 100644 --- a/mindee/product/financial_document/financial_document_v1_line_item.py +++ b/mindee/v1/product/financial_document/financial_document_v1_line_item.py @@ -2,7 +2,7 @@ from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( +from mindee.v1.parsing.standard.base import ( FieldConfidenceMixin, FieldPositionMixin, float_to_string, diff --git a/mindee/v1/product/fr/__init__.py b/mindee/v1/product/fr/__init__.py new file mode 100644 index 00000000..815368ad --- /dev/null +++ b/mindee/v1/product/fr/__init__.py @@ -0,0 +1,49 @@ +from mindee.v1.product.fr.bank_account_details.bank_account_details_v1 import ( + BankAccountDetailsV1, +) +from mindee.v1.product.fr.bank_account_details.bank_account_details_v1_document import ( + BankAccountDetailsV1Document, +) +from mindee.v1.product.fr.bank_account_details.bank_account_details_v2 import ( + BankAccountDetailsV2, +) +from mindee.v1.product.fr.bank_account_details.bank_account_details_v2_bban import ( + BankAccountDetailsV2Bban, +) +from mindee.v1.product.fr.bank_account_details.bank_account_details_v2_document import ( + BankAccountDetailsV2Document, +) +from mindee.v1.product.fr.carte_grise.carte_grise_v1 import CarteGriseV1 +from mindee.v1.product.fr.carte_grise.carte_grise_v1_document import ( + CarteGriseV1Document, +) +from mindee.v1.product.fr.id_card.id_card_v1 import IdCardV1 +from mindee.v1.product.fr.id_card.id_card_v1_document import ( + IdCardV1Document, +) +from mindee.v1.product.fr.id_card.id_card_v1_page import ( + IdCardV1Page, +) +from mindee.v1.product.fr.id_card.id_card_v2 import IdCardV2 +from mindee.v1.product.fr.id_card.id_card_v2_document import ( + IdCardV2Document, +) +from mindee.v1.product.fr.id_card.id_card_v2_page import ( + IdCardV2Page, +) + +__all__ = [ + "BankAccountDetailsV1", + "BankAccountDetailsV1Document", + "BankAccountDetailsV2", + "BankAccountDetailsV2Bban", + "BankAccountDetailsV2Document", + "CarteGriseV1", + "CarteGriseV1Document", + "IdCardV1", + "IdCardV1Document", + "IdCardV1Page", + "IdCardV2", + "IdCardV2Document", + "IdCardV2Page", +] diff --git a/mindee/v1/product/fr/bank_account_details/__init__.py b/mindee/v1/product/fr/bank_account_details/__init__.py new file mode 100644 index 00000000..f95f5883 --- /dev/null +++ b/mindee/v1/product/fr/bank_account_details/__init__.py @@ -0,0 +1,23 @@ +from mindee.v1.product.fr.bank_account_details.bank_account_details_v1 import ( + BankAccountDetailsV1, +) +from mindee.v1.product.fr.bank_account_details.bank_account_details_v1_document import ( + BankAccountDetailsV1Document, +) +from mindee.v1.product.fr.bank_account_details.bank_account_details_v2 import ( + BankAccountDetailsV2, +) +from mindee.v1.product.fr.bank_account_details.bank_account_details_v2_bban import ( + BankAccountDetailsV2Bban, +) +from mindee.v1.product.fr.bank_account_details.bank_account_details_v2_document import ( + BankAccountDetailsV2Document, +) + +__all__ = [ + "BankAccountDetailsV1", + "BankAccountDetailsV1Document", + "BankAccountDetailsV2", + "BankAccountDetailsV2Bban", + "BankAccountDetailsV2Document", +] diff --git a/mindee/product/fr/bank_account_details/bank_account_details_v1.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v1.py similarity index 85% rename from mindee/product/fr/bank_account_details/bank_account_details_v1.py rename to mindee/v1/product/fr/bank_account_details/bank_account_details_v1.py index 008d68c2..639b9b26 100644 --- a/mindee/product/fr/bank_account_details/bank_account_details_v1.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v1.py @@ -1,9 +1,9 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.fr.bank_account_details.bank_account_details_v1_document import ( +from mindee.v1.product.fr.bank_account_details.bank_account_details_v1_document import ( BankAccountDetailsV1Document, ) diff --git a/mindee/product/fr/bank_account_details/bank_account_details_v1_document.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.py similarity index 92% rename from mindee/product/fr/bank_account_details/bank_account_details_v1_document.py rename to mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.py index 4a43b3e1..9d4c6d2e 100644 --- a/mindee/product/fr/bank_account_details/bank_account_details_v1_document.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.py @@ -1,9 +1,9 @@ from typing import Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.text import StringField +from mindee.v1.parsing.standard.text import StringField class BankAccountDetailsV1Document(Prediction): diff --git a/mindee/product/fr/bank_account_details/bank_account_details_v2.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2.py similarity index 85% rename from mindee/product/fr/bank_account_details/bank_account_details_v2.py rename to mindee/v1/product/fr/bank_account_details/bank_account_details_v2.py index e1468274..eaae960c 100644 --- a/mindee/product/fr/bank_account_details/bank_account_details_v2.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2.py @@ -1,9 +1,9 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.fr.bank_account_details.bank_account_details_v2_document import ( +from mindee.v1.product.fr.bank_account_details.bank_account_details_v2_document import ( BankAccountDetailsV2Document, ) diff --git a/mindee/product/fr/bank_account_details/bank_account_details_v2_bban.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_bban.py similarity index 97% rename from mindee/product/fr/bank_account_details/bank_account_details_v2_bban.py rename to mindee/v1/product/fr/bank_account_details/bank_account_details_v2_bban.py index 9ad1b404..ace363a6 100644 --- a/mindee/product/fr/bank_account_details/bank_account_details_v2_bban.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_bban.py @@ -2,7 +2,7 @@ from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin +from mindee.v1.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin class BankAccountDetailsV2Bban(FieldPositionMixin, FieldConfidenceMixin): diff --git a/mindee/product/fr/bank_account_details/bank_account_details_v2_document.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.py similarity index 90% rename from mindee/product/fr/bank_account_details/bank_account_details_v2_document.py rename to mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.py index 53d996f9..24004f09 100644 --- a/mindee/product/fr/bank_account_details/bank_account_details_v2_document.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.py @@ -1,10 +1,10 @@ from typing import Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.text import StringField -from mindee.product.fr.bank_account_details.bank_account_details_v2_bban import ( +from mindee.v1.parsing.standard.text import StringField +from mindee.v1.product.fr.bank_account_details.bank_account_details_v2_bban import ( BankAccountDetailsV2Bban, ) diff --git a/mindee/v1/product/fr/carte_grise/__init__.py b/mindee/v1/product/fr/carte_grise/__init__.py new file mode 100644 index 00000000..963db07f --- /dev/null +++ b/mindee/v1/product/fr/carte_grise/__init__.py @@ -0,0 +1,9 @@ +from mindee.v1.product.fr.carte_grise.carte_grise_v1 import CarteGriseV1 +from mindee.v1.product.fr.carte_grise.carte_grise_v1_document import ( + CarteGriseV1Document, +) + +__all__ = [ + "CarteGriseV1", + "CarteGriseV1Document", +] diff --git a/mindee/product/fr/carte_grise/carte_grise_v1.py b/mindee/v1/product/fr/carte_grise/carte_grise_v1.py similarity index 86% rename from mindee/product/fr/carte_grise/carte_grise_v1.py rename to mindee/v1/product/fr/carte_grise/carte_grise_v1.py index ad8a920d..7de08ee2 100644 --- a/mindee/product/fr/carte_grise/carte_grise_v1.py +++ b/mindee/v1/product/fr/carte_grise/carte_grise_v1.py @@ -1,9 +1,9 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.fr.carte_grise.carte_grise_v1_document import ( +from mindee.v1.product.fr.carte_grise.carte_grise_v1_document import ( CarteGriseV1Document, ) diff --git a/mindee/product/fr/carte_grise/carte_grise_v1_document.py b/mindee/v1/product/fr/carte_grise/carte_grise_v1_document.py similarity index 98% rename from mindee/product/fr/carte_grise/carte_grise_v1_document.py rename to mindee/v1/product/fr/carte_grise/carte_grise_v1_document.py index bd8a573c..cd37a33e 100644 --- a/mindee/product/fr/carte_grise/carte_grise_v1_document.py +++ b/mindee/v1/product/fr/carte_grise/carte_grise_v1_document.py @@ -1,10 +1,10 @@ from typing import Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField +from mindee.v1.parsing.standard.date import DateField +from mindee.v1.parsing.standard.text import StringField class CarteGriseV1Document(Prediction): diff --git a/mindee/v1/product/fr/id_card/__init__.py b/mindee/v1/product/fr/id_card/__init__.py new file mode 100644 index 00000000..a7ff9d17 --- /dev/null +++ b/mindee/v1/product/fr/id_card/__init__.py @@ -0,0 +1,23 @@ +from mindee.v1.product.fr.id_card.id_card_v1 import IdCardV1 +from mindee.v1.product.fr.id_card.id_card_v1_document import ( + IdCardV1Document, +) +from mindee.v1.product.fr.id_card.id_card_v1_page import ( + IdCardV1Page, +) +from mindee.v1.product.fr.id_card.id_card_v2 import IdCardV2 +from mindee.v1.product.fr.id_card.id_card_v2_document import ( + IdCardV2Document, +) +from mindee.v1.product.fr.id_card.id_card_v2_page import ( + IdCardV2Page, +) + +__all__ = [ + "IdCardV1", + "IdCardV1Document", + "IdCardV1Page", + "IdCardV2", + "IdCardV2Document", + "IdCardV2Page", +] diff --git a/mindee/product/fr/id_card/id_card_v1.py b/mindee/v1/product/fr/id_card/id_card_v1.py similarity index 82% rename from mindee/product/fr/id_card/id_card_v1.py rename to mindee/v1/product/fr/id_card/id_card_v1.py index f46ad87c..5aa91667 100644 --- a/mindee/product/fr/id_card/id_card_v1.py +++ b/mindee/v1/product/fr/id_card/id_card_v1.py @@ -1,12 +1,12 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.fr.id_card.id_card_v1_document import ( +from mindee.v1.product.fr.id_card.id_card_v1_document import ( IdCardV1Document, ) -from mindee.product.fr.id_card.id_card_v1_page import ( +from mindee.v1.product.fr.id_card.id_card_v1_page import ( IdCardV1Page, ) diff --git a/mindee/product/fr/id_card/id_card_v1_document.py b/mindee/v1/product/fr/id_card/id_card_v1_document.py similarity index 95% rename from mindee/product/fr/id_card/id_card_v1_document.py rename to mindee/v1/product/fr/id_card/id_card_v1_document.py index 7f1f9187..948bee2e 100644 --- a/mindee/product/fr/id_card/id_card_v1_document.py +++ b/mindee/v1/product/fr/id_card/id_card_v1_document.py @@ -1,10 +1,10 @@ from typing import List, Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField +from mindee.v1.parsing.standard.date import DateField +from mindee.v1.parsing.standard.text import StringField class IdCardV1Document(Prediction): diff --git a/mindee/product/fr/id_card/id_card_v1_page.py b/mindee/v1/product/fr/id_card/id_card_v1_page.py similarity index 88% rename from mindee/product/fr/id_card/id_card_v1_page.py rename to mindee/v1/product/fr/id_card/id_card_v1_page.py index f82e7672..5b0a5330 100644 --- a/mindee/product/fr/id_card/id_card_v1_page.py +++ b/mindee/v1/product/fr/id_card/id_card_v1_page.py @@ -2,8 +2,8 @@ from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.classification import ClassificationField -from mindee.product.fr.id_card.id_card_v1_document import ( +from mindee.v1.parsing.standard.classification import ClassificationField +from mindee.v1.product.fr.id_card.id_card_v1_document import ( IdCardV1Document, ) diff --git a/mindee/product/fr/id_card/id_card_v2.py b/mindee/v1/product/fr/id_card/id_card_v2.py similarity index 82% rename from mindee/product/fr/id_card/id_card_v2.py rename to mindee/v1/product/fr/id_card/id_card_v2.py index dff7f9f9..2b8a3df0 100644 --- a/mindee/product/fr/id_card/id_card_v2.py +++ b/mindee/v1/product/fr/id_card/id_card_v2.py @@ -1,12 +1,12 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.fr.id_card.id_card_v2_document import ( +from mindee.v1.product.fr.id_card.id_card_v2_document import ( IdCardV2Document, ) -from mindee.product.fr.id_card.id_card_v2_page import ( +from mindee.v1.product.fr.id_card.id_card_v2_page import ( IdCardV2Page, ) diff --git a/mindee/product/fr/id_card/id_card_v2_document.py b/mindee/v1/product/fr/id_card/id_card_v2_document.py similarity index 96% rename from mindee/product/fr/id_card/id_card_v2_document.py rename to mindee/v1/product/fr/id_card/id_card_v2_document.py index 9466a4b0..96432f1a 100644 --- a/mindee/product/fr/id_card/id_card_v2_document.py +++ b/mindee/v1/product/fr/id_card/id_card_v2_document.py @@ -1,10 +1,10 @@ from typing import List, Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField +from mindee.v1.parsing.standard.date import DateField +from mindee.v1.parsing.standard.text import StringField class IdCardV2Document(Prediction): diff --git a/mindee/product/fr/id_card/id_card_v2_page.py b/mindee/v1/product/fr/id_card/id_card_v2_page.py similarity index 90% rename from mindee/product/fr/id_card/id_card_v2_page.py rename to mindee/v1/product/fr/id_card/id_card_v2_page.py index 5c5758e0..76a5bc0d 100644 --- a/mindee/product/fr/id_card/id_card_v2_page.py +++ b/mindee/v1/product/fr/id_card/id_card_v2_page.py @@ -2,8 +2,8 @@ from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.classification import ClassificationField -from mindee.product.fr.id_card.id_card_v2_document import ( +from mindee.v1.parsing.standard.classification import ClassificationField +from mindee.v1.product.fr.id_card.id_card_v2_document import ( IdCardV2Document, ) diff --git a/mindee/product/generated/__init__.py b/mindee/v1/product/generated/__init__.py similarity index 73% rename from mindee/product/generated/__init__.py rename to mindee/v1/product/generated/__init__.py index 36399d60..10b7278d 100644 --- a/mindee/product/generated/__init__.py +++ b/mindee/v1/product/generated/__init__.py @@ -1,4 +1,4 @@ -from mindee.product.generated.generated_v1 import ( +from mindee.v1.product.generated.generated_v1 import ( GeneratedV1, GeneratedV1Document, GeneratedV1Page, diff --git a/mindee/product/generated/generated_v1.py b/mindee/v1/product/generated/generated_v1.py similarity index 78% rename from mindee/product/generated/generated_v1.py rename to mindee/v1/product/generated/generated_v1.py index 83a55bbc..8c984428 100644 --- a/mindee/product/generated/generated_v1.py +++ b/mindee/v1/product/generated/generated_v1.py @@ -1,10 +1,10 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.generated.generated_v1_document import GeneratedV1Document -from mindee.product.generated.generated_v1_page import GeneratedV1Page +from mindee.v1.product.generated.generated_v1_document import GeneratedV1Document +from mindee.v1.product.generated.generated_v1_page import GeneratedV1Page class GeneratedV1(Inference): diff --git a/mindee/product/generated/generated_v1_document.py b/mindee/v1/product/generated/generated_v1_document.py similarity index 84% rename from mindee/product/generated/generated_v1_document.py rename to mindee/v1/product/generated/generated_v1_document.py index b2b80b07..3b24ec9a 100644 --- a/mindee/product/generated/generated_v1_document.py +++ b/mindee/v1/product/generated/generated_v1_document.py @@ -1,13 +1,13 @@ from typing import Dict, Union from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.generated.generated_list import GeneratedListField -from mindee.parsing.generated.generated_object import ( +from mindee.v1.parsing.generated.generated_list import GeneratedListField +from mindee.v1.parsing.generated.generated_object import ( GeneratedObjectField, is_generated_object, ) -from mindee.parsing.standard.text import StringField -from mindee.product.generated.generated_v1_prediction import GeneratedV1Prediction +from mindee.v1.parsing.standard.text import StringField +from mindee.v1.product.generated.generated_v1_prediction import GeneratedV1Prediction class GeneratedV1Document(GeneratedV1Prediction): diff --git a/mindee/product/generated/generated_v1_page.py b/mindee/v1/product/generated/generated_v1_page.py similarity index 85% rename from mindee/product/generated/generated_v1_page.py rename to mindee/v1/product/generated/generated_v1_page.py index 619f9691..f7b58d05 100644 --- a/mindee/product/generated/generated_v1_page.py +++ b/mindee/v1/product/generated/generated_v1_page.py @@ -1,13 +1,13 @@ from typing import Dict, Optional, Union from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.generated.generated_list import GeneratedListField -from mindee.parsing.generated.generated_object import ( +from mindee.v1.parsing.generated.generated_list import GeneratedListField +from mindee.v1.parsing.generated.generated_object import ( GeneratedObjectField, is_generated_object, ) -from mindee.parsing.standard.text import StringField -from mindee.product.generated.generated_v1_prediction import GeneratedV1Prediction +from mindee.v1.parsing.standard.text import StringField +from mindee.v1.product.generated.generated_v1_prediction import GeneratedV1Prediction class GeneratedV1Page(GeneratedV1Prediction): diff --git a/mindee/product/generated/generated_v1_prediction.py b/mindee/v1/product/generated/generated_v1_prediction.py similarity index 92% rename from mindee/product/generated/generated_v1_prediction.py rename to mindee/v1/product/generated/generated_v1_prediction.py index 5c466405..c2c934da 100644 --- a/mindee/product/generated/generated_v1_prediction.py +++ b/mindee/v1/product/generated/generated_v1_prediction.py @@ -1,12 +1,12 @@ import re from typing import Dict, List, Union -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.generated.generated_list import GeneratedListField -from mindee.parsing.generated.generated_object import GeneratedObjectField -from mindee.parsing.standard.text import StringField +from mindee.v1.parsing.generated.generated_list import GeneratedListField +from mindee.v1.parsing.generated.generated_object import GeneratedObjectField +from mindee.v1.parsing.standard.text import StringField class GeneratedV1Prediction(Prediction): diff --git a/mindee/v1/product/international_id/__init__.py b/mindee/v1/product/international_id/__init__.py new file mode 100644 index 00000000..df84b3bd --- /dev/null +++ b/mindee/v1/product/international_id/__init__.py @@ -0,0 +1,9 @@ +from mindee.v1.product.international_id.international_id_v2 import InternationalIdV2 +from mindee.v1.product.international_id.international_id_v2_document import ( + InternationalIdV2Document, +) + +__all__ = [ + "InternationalIdV2", + "InternationalIdV2Document", +] diff --git a/mindee/product/international_id/international_id_v2.py b/mindee/v1/product/international_id/international_id_v2.py similarity index 86% rename from mindee/product/international_id/international_id_v2.py rename to mindee/v1/product/international_id/international_id_v2.py index c6b1d8a1..55539722 100644 --- a/mindee/product/international_id/international_id_v2.py +++ b/mindee/v1/product/international_id/international_id_v2.py @@ -1,9 +1,9 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.international_id.international_id_v2_document import ( +from mindee.v1.product.international_id.international_id_v2_document import ( InternationalIdV2Document, ) diff --git a/mindee/product/international_id/international_id_v2_document.py b/mindee/v1/product/international_id/international_id_v2_document.py similarity index 95% rename from mindee/product/international_id/international_id_v2_document.py rename to mindee/v1/product/international_id/international_id_v2_document.py index 0b1278c7..e81188cc 100644 --- a/mindee/product/international_id/international_id_v2_document.py +++ b/mindee/v1/product/international_id/international_id_v2_document.py @@ -1,11 +1,11 @@ from typing import List, Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.classification import ClassificationField -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField +from mindee.v1.parsing.standard.classification import ClassificationField +from mindee.v1.parsing.standard.date import DateField +from mindee.v1.parsing.standard.text import StringField class InternationalIdV2Document(Prediction): diff --git a/mindee/v1/product/invoice/__init__.py b/mindee/v1/product/invoice/__init__.py new file mode 100644 index 00000000..05caa5e3 --- /dev/null +++ b/mindee/v1/product/invoice/__init__.py @@ -0,0 +1,13 @@ +from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 +from mindee.v1.product.invoice.invoice_v4_document import ( + InvoiceV4Document, +) +from mindee.v1.product.invoice.invoice_v4_line_item import ( + InvoiceV4LineItem, +) + +__all__ = [ + "InvoiceV4", + "InvoiceV4Document", + "InvoiceV4LineItem", +] diff --git a/mindee/product/invoice/invoice_v4.py b/mindee/v1/product/invoice/invoice_v4.py similarity index 86% rename from mindee/product/invoice/invoice_v4.py rename to mindee/v1/product/invoice/invoice_v4.py index 159ea964..2b609840 100644 --- a/mindee/product/invoice/invoice_v4.py +++ b/mindee/v1/product/invoice/invoice_v4.py @@ -1,9 +1,9 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.invoice.invoice_v4_document import ( +from mindee.v1.product.invoice.invoice_v4_document import ( InvoiceV4Document, ) diff --git a/mindee/product/invoice/invoice_v4_document.py b/mindee/v1/product/invoice/invoice_v4_document.py similarity index 93% rename from mindee/product/invoice/invoice_v4_document.py rename to mindee/v1/product/invoice/invoice_v4_document.py index fc4408ed..4498ad96 100644 --- a/mindee/product/invoice/invoice_v4_document.py +++ b/mindee/v1/product/invoice/invoice_v4_document.py @@ -1,18 +1,18 @@ from typing import List, Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.address import AddressField -from mindee.parsing.standard.amount import AmountField -from mindee.parsing.standard.classification import ClassificationField -from mindee.parsing.standard.company_registration import CompanyRegistrationField -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.locale import LocaleField -from mindee.parsing.standard.payment_details import PaymentDetailsField -from mindee.parsing.standard.tax import Taxes -from mindee.parsing.standard.text import StringField -from mindee.product.invoice.invoice_v4_line_item import InvoiceV4LineItem +from mindee.v1.parsing.standard.address import AddressField +from mindee.v1.parsing.standard.amount import AmountField +from mindee.v1.parsing.standard.classification import ClassificationField +from mindee.v1.parsing.standard.company_registration import CompanyRegistrationField +from mindee.v1.parsing.standard.date import DateField +from mindee.v1.parsing.standard.locale import LocaleField +from mindee.v1.parsing.standard.payment_details import PaymentDetailsField +from mindee.v1.parsing.standard.tax import Taxes +from mindee.v1.parsing.standard.text import StringField +from mindee.v1.product.invoice.invoice_v4_line_item import InvoiceV4LineItem class InvoiceV4Document(Prediction): diff --git a/mindee/product/invoice/invoice_v4_line_item.py b/mindee/v1/product/invoice/invoice_v4_line_item.py similarity index 99% rename from mindee/product/invoice/invoice_v4_line_item.py rename to mindee/v1/product/invoice/invoice_v4_line_item.py index 84c3b843..f4a87686 100644 --- a/mindee/product/invoice/invoice_v4_line_item.py +++ b/mindee/v1/product/invoice/invoice_v4_line_item.py @@ -2,7 +2,7 @@ from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( +from mindee.v1.parsing.standard.base import ( FieldConfidenceMixin, FieldPositionMixin, float_to_string, diff --git a/mindee/v1/product/invoice_splitter/__init__.py b/mindee/v1/product/invoice_splitter/__init__.py new file mode 100644 index 00000000..7b58ae67 --- /dev/null +++ b/mindee/v1/product/invoice_splitter/__init__.py @@ -0,0 +1,13 @@ +from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 +from mindee.v1.product.invoice_splitter.invoice_splitter_v1_document import ( + InvoiceSplitterV1Document, +) +from mindee.v1.product.invoice_splitter.invoice_splitter_v1_invoice_page_group import ( + InvoiceSplitterV1InvoicePageGroup, +) + +__all__ = [ + "InvoiceSplitterV1", + "InvoiceSplitterV1Document", + "InvoiceSplitterV1InvoicePageGroup", +] diff --git a/mindee/product/invoice_splitter/invoice_splitter_v1.py b/mindee/v1/product/invoice_splitter/invoice_splitter_v1.py similarity index 86% rename from mindee/product/invoice_splitter/invoice_splitter_v1.py rename to mindee/v1/product/invoice_splitter/invoice_splitter_v1.py index 8140bc51..5f69a606 100644 --- a/mindee/product/invoice_splitter/invoice_splitter_v1.py +++ b/mindee/v1/product/invoice_splitter/invoice_splitter_v1.py @@ -1,9 +1,9 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.invoice_splitter.invoice_splitter_v1_document import ( +from mindee.v1.product.invoice_splitter.invoice_splitter_v1_document import ( InvoiceSplitterV1Document, ) diff --git a/mindee/product/invoice_splitter/invoice_splitter_v1_document.py b/mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.py similarity index 93% rename from mindee/product/invoice_splitter/invoice_splitter_v1_document.py rename to mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.py index a0e6c071..1615b67c 100644 --- a/mindee/product/invoice_splitter/invoice_splitter_v1_document.py +++ b/mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.py @@ -1,9 +1,9 @@ from typing import List, Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.product.invoice_splitter.invoice_splitter_v1_invoice_page_group import ( +from mindee.v1.product.invoice_splitter.invoice_splitter_v1_invoice_page_group import ( InvoiceSplitterV1InvoicePageGroup, ) diff --git a/mindee/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.py b/mindee/v1/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.py similarity index 95% rename from mindee/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.py rename to mindee/v1/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.py index 8bb8c2c7..3575efaf 100644 --- a/mindee/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.py +++ b/mindee/v1/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.py @@ -2,7 +2,7 @@ from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin +from mindee.v1.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin class InvoiceSplitterV1InvoicePageGroup(FieldPositionMixin, FieldConfidenceMixin): diff --git a/mindee/v1/product/multi_receipts_detector/__init__.py b/mindee/v1/product/multi_receipts_detector/__init__.py new file mode 100644 index 00000000..0ac4a64d --- /dev/null +++ b/mindee/v1/product/multi_receipts_detector/__init__.py @@ -0,0 +1,11 @@ +from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1 import ( + MultiReceiptsDetectorV1, +) +from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1_document import ( + MultiReceiptsDetectorV1Document, +) + +__all__ = [ + "MultiReceiptsDetectorV1", + "MultiReceiptsDetectorV1Document", +] diff --git a/mindee/product/multi_receipts_detector/multi_receipts_detector_v1.py b/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.py similarity index 85% rename from mindee/product/multi_receipts_detector/multi_receipts_detector_v1.py rename to mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.py index 062cc70a..f728b1cb 100644 --- a/mindee/product/multi_receipts_detector/multi_receipts_detector_v1.py +++ b/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.py @@ -1,9 +1,9 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.multi_receipts_detector.multi_receipts_detector_v1_document import ( +from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1_document import ( MultiReceiptsDetectorV1Document, ) diff --git a/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_document.py b/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.py similarity index 90% rename from mindee/product/multi_receipts_detector/multi_receipts_detector_v1_document.py rename to mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.py index 72be01a3..6e62b3ed 100644 --- a/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_document.py +++ b/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.py @@ -1,9 +1,9 @@ from typing import List, Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.position import PositionField +from mindee.v1.parsing.standard.position import PositionField class MultiReceiptsDetectorV1Document(Prediction): diff --git a/mindee/v1/product/passport/__init__.py b/mindee/v1/product/passport/__init__.py new file mode 100644 index 00000000..beb0e39e --- /dev/null +++ b/mindee/v1/product/passport/__init__.py @@ -0,0 +1,9 @@ +from mindee.v1.product.passport.passport_v1 import PassportV1 +from mindee.v1.product.passport.passport_v1_document import ( + PassportV1Document, +) + +__all__ = [ + "PassportV1", + "PassportV1Document", +] diff --git a/mindee/product/passport/passport_v1.py b/mindee/v1/product/passport/passport_v1.py similarity index 86% rename from mindee/product/passport/passport_v1.py rename to mindee/v1/product/passport/passport_v1.py index e6333c37..acd3dcb5 100644 --- a/mindee/product/passport/passport_v1.py +++ b/mindee/v1/product/passport/passport_v1.py @@ -1,9 +1,9 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.passport.passport_v1_document import ( +from mindee.v1.product.passport.passport_v1_document import ( PassportV1Document, ) diff --git a/mindee/product/passport/passport_v1_document.py b/mindee/v1/product/passport/passport_v1_document.py similarity index 95% rename from mindee/product/passport/passport_v1_document.py rename to mindee/v1/product/passport/passport_v1_document.py index 1f757604..73876de5 100644 --- a/mindee/product/passport/passport_v1_document.py +++ b/mindee/v1/product/passport/passport_v1_document.py @@ -1,10 +1,10 @@ from typing import List, Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField +from mindee.v1.parsing.standard.date import DateField +from mindee.v1.parsing.standard.text import StringField class PassportV1Document(Prediction): diff --git a/mindee/v1/product/receipt/__init__.py b/mindee/v1/product/receipt/__init__.py new file mode 100644 index 00000000..a7b091fb --- /dev/null +++ b/mindee/v1/product/receipt/__init__.py @@ -0,0 +1,13 @@ +from mindee.v1.product.receipt.receipt_v5 import ReceiptV5 +from mindee.v1.product.receipt.receipt_v5_document import ( + ReceiptV5Document, +) +from mindee.v1.product.receipt.receipt_v5_line_item import ( + ReceiptV5LineItem, +) + +__all__ = [ + "ReceiptV5", + "ReceiptV5Document", + "ReceiptV5LineItem", +] diff --git a/mindee/product/receipt/receipt_v5.py b/mindee/v1/product/receipt/receipt_v5.py similarity index 86% rename from mindee/product/receipt/receipt_v5.py rename to mindee/v1/product/receipt/receipt_v5.py index a11e8754..7c42fca6 100644 --- a/mindee/product/receipt/receipt_v5.py +++ b/mindee/v1/product/receipt/receipt_v5.py @@ -1,9 +1,9 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.receipt.receipt_v5_document import ( +from mindee.v1.product.receipt.receipt_v5_document import ( ReceiptV5Document, ) diff --git a/mindee/product/receipt/receipt_v5_document.py b/mindee/v1/product/receipt/receipt_v5_document.py similarity index 91% rename from mindee/product/receipt/receipt_v5_document.py rename to mindee/v1/product/receipt/receipt_v5_document.py index 7a5961db..fc9a2c12 100644 --- a/mindee/product/receipt/receipt_v5_document.py +++ b/mindee/v1/product/receipt/receipt_v5_document.py @@ -1,16 +1,16 @@ from typing import List, Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.amount import AmountField -from mindee.parsing.standard.classification import ClassificationField -from mindee.parsing.standard.company_registration import CompanyRegistrationField -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.locale import LocaleField -from mindee.parsing.standard.tax import Taxes -from mindee.parsing.standard.text import StringField -from mindee.product.receipt.receipt_v5_line_item import ReceiptV5LineItem +from mindee.v1.parsing.standard.amount import AmountField +from mindee.v1.parsing.standard.classification import ClassificationField +from mindee.v1.parsing.standard.company_registration import CompanyRegistrationField +from mindee.v1.parsing.standard.date import DateField +from mindee.v1.parsing.standard.locale import LocaleField +from mindee.v1.parsing.standard.tax import Taxes +from mindee.v1.parsing.standard.text import StringField +from mindee.v1.product.receipt.receipt_v5_line_item import ReceiptV5LineItem class ReceiptV5Document(Prediction): diff --git a/mindee/product/receipt/receipt_v5_line_item.py b/mindee/v1/product/receipt/receipt_v5_line_item.py similarity index 98% rename from mindee/product/receipt/receipt_v5_line_item.py rename to mindee/v1/product/receipt/receipt_v5_line_item.py index c5f87f5f..0b041937 100644 --- a/mindee/product/receipt/receipt_v5_line_item.py +++ b/mindee/v1/product/receipt/receipt_v5_line_item.py @@ -2,7 +2,7 @@ from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string, format_for_display -from mindee.parsing.standard.base import ( +from mindee.v1.parsing.standard.base import ( FieldConfidenceMixin, FieldPositionMixin, float_to_string, diff --git a/mindee/v1/product/us/__init__.py b/mindee/v1/product/us/__init__.py new file mode 100644 index 00000000..b7293ccc --- /dev/null +++ b/mindee/v1/product/us/__init__.py @@ -0,0 +1,13 @@ +from mindee.v1.product.us.bank_check.bank_check_v1 import BankCheckV1 +from mindee.v1.product.us.bank_check.bank_check_v1_document import ( + BankCheckV1Document, +) +from mindee.v1.product.us.bank_check.bank_check_v1_page import ( + BankCheckV1Page, +) + +__all__ = [ + "BankCheckV1", + "BankCheckV1Document", + "BankCheckV1Page", +] diff --git a/mindee/v1/product/us/bank_check/__init__.py b/mindee/v1/product/us/bank_check/__init__.py new file mode 100644 index 00000000..b7293ccc --- /dev/null +++ b/mindee/v1/product/us/bank_check/__init__.py @@ -0,0 +1,13 @@ +from mindee.v1.product.us.bank_check.bank_check_v1 import BankCheckV1 +from mindee.v1.product.us.bank_check.bank_check_v1_document import ( + BankCheckV1Document, +) +from mindee.v1.product.us.bank_check.bank_check_v1_page import ( + BankCheckV1Page, +) + +__all__ = [ + "BankCheckV1", + "BankCheckV1Document", + "BankCheckV1Page", +] diff --git a/mindee/product/us/bank_check/bank_check_v1.py b/mindee/v1/product/us/bank_check/bank_check_v1.py similarity index 81% rename from mindee/product/us/bank_check/bank_check_v1.py rename to mindee/v1/product/us/bank_check/bank_check_v1.py index a48d3315..aea6d486 100644 --- a/mindee/product/us/bank_check/bank_check_v1.py +++ b/mindee/v1/product/us/bank_check/bank_check_v1.py @@ -1,12 +1,12 @@ from typing import List -from mindee.parsing.common.inference import Inference -from mindee.parsing.common.page import Page +from mindee.v1.parsing.common.inference import Inference +from mindee.v1.parsing.common.page import Page from mindee.parsing.common.string_dict import StringDict -from mindee.product.us.bank_check.bank_check_v1_document import ( +from mindee.v1.product.us.bank_check.bank_check_v1_document import ( BankCheckV1Document, ) -from mindee.product.us.bank_check.bank_check_v1_page import ( +from mindee.v1.product.us.bank_check.bank_check_v1_page import ( BankCheckV1Page, ) diff --git a/mindee/product/us/bank_check/bank_check_v1_document.py b/mindee/v1/product/us/bank_check/bank_check_v1_document.py similarity index 90% rename from mindee/product/us/bank_check/bank_check_v1_document.py rename to mindee/v1/product/us/bank_check/bank_check_v1_document.py index 5b320763..b23c1072 100644 --- a/mindee/product/us/bank_check/bank_check_v1_document.py +++ b/mindee/v1/product/us/bank_check/bank_check_v1_document.py @@ -1,11 +1,11 @@ from typing import List, Optional -from mindee.parsing.common.prediction import Prediction +from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.amount import AmountField -from mindee.parsing.standard.date import DateField -from mindee.parsing.standard.text import StringField +from mindee.v1.parsing.standard.amount import AmountField +from mindee.v1.parsing.standard.date import DateField +from mindee.v1.parsing.standard.text import StringField class BankCheckV1Document(Prediction): diff --git a/mindee/product/us/bank_check/bank_check_v1_page.py b/mindee/v1/product/us/bank_check/bank_check_v1_page.py similarity index 91% rename from mindee/product/us/bank_check/bank_check_v1_page.py rename to mindee/v1/product/us/bank_check/bank_check_v1_page.py index aac6bf47..334cc55a 100644 --- a/mindee/product/us/bank_check/bank_check_v1_page.py +++ b/mindee/v1/product/us/bank_check/bank_check_v1_page.py @@ -2,8 +2,8 @@ from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string -from mindee.parsing.standard.position import PositionField -from mindee.product.us.bank_check.bank_check_v1_document import ( +from mindee.v1.parsing.standard.position import PositionField +from mindee.v1.product.us.bank_check.bank_check_v1_document import ( BankCheckV1Document, ) diff --git a/mindee/v2/__init__.py b/mindee/v2/__init__.py index 5a8d973e..719789b0 100644 --- a/mindee/v2/__init__.py +++ b/mindee/v2/__init__.py @@ -1,22 +1,24 @@ +from mindee.v2.client import Client from mindee.v2.file_operations.crop import ( extract_crops, extract_single_crop, ) from mindee.v2.file_operations.split import extract_splits -from mindee.v2.product.classification.classification_parameters import ( +from mindee.v2.product.classification.param.classification_parameters import ( ClassificationParameters, ) from mindee.v2.product.classification.classification_response import ( ClassificationResponse, ) -from mindee.v2.product.crop.crop_parameters import CropParameters +from mindee.v2.product.crop.params.crop_parameters import CropParameters from mindee.v2.product.crop.crop_response import CropResponse -from mindee.v2.product.ocr.ocr_parameters import OCRParameters +from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters from mindee.v2.product.ocr.ocr_response import OCRResponse -from mindee.v2.product.split.split_parameters import SplitParameters +from mindee.v2.product.split.params.split_parameters import SplitParameters from mindee.v2.product.split.split_response import SplitResponse __all__ = [ + "Client", "extract_crops", "extract_splits", "extract_crops", diff --git a/mindee/client_v2.py b/mindee/v2/client.py similarity index 92% rename from mindee/client_v2.py rename to mindee/v2/client.py index 68c466e0..3ea75d1b 100644 --- a/mindee/client_v2.py +++ b/mindee/v2/client.py @@ -4,9 +4,10 @@ from mindee.client_mixin import ClientMixin from mindee.error.mindee_error import MindeeError -from mindee.error.mindee_http_error_v2 import handle_error_v2 -from mindee.input import UrlInputSource, BaseParameters -from mindee.input.inference_parameters import InferenceParameters +from mindee.error.v2.mindee_http_error_v2 import handle_error_v2 +from mindee.input import UrlInputSource +from mindee.v2.input.base_parameters import BaseParameters +from mindee.v2.product.extraction.params.inference_parameters import InferenceParameters from mindee.input.polling_options import PollingOptions from mindee.input.sources.local_input_source import LocalInputSource from mindee.logger import logger @@ -15,15 +16,15 @@ is_valid_get_response, is_valid_post_response, ) -from mindee.parsing.v2.common_response import CommonStatus -from mindee.parsing.v2.base_response import BaseResponse -from mindee.parsing.v2.inference_response import InferenceResponse -from mindee.parsing.v2.job_response import JobResponse +from mindee.parsing.common.common_response import CommonStatus +from mindee.v2.parsing.inference.base_response import BaseResponse +from mindee.v2.product.extraction.inference_response import InferenceResponse +from mindee.v2.parsing.inference.job_response import JobResponse TypeBaseResponse = TypeVar("TypeBaseResponse", bound=BaseResponse) -class ClientV2(ClientMixin): +class Client(ClientMixin): """ Mindee API Client. diff --git a/mindee/v2/commands/cli_parser.py b/mindee/v2/commands/cli_parser.py index 305126f7..fc4a895f 100644 --- a/mindee/v2/commands/cli_parser.py +++ b/mindee/v2/commands/cli_parser.py @@ -3,7 +3,6 @@ from typing import Optional, Type, Union from mindee import ( - ClientV2, InferenceResponse, CropResponse, SplitResponse, @@ -13,10 +12,11 @@ CropParameters, SplitParameters, ) -from mindee.input import BaseParameters +from mindee.v2.client import Client from mindee.input.sources import PathInput, UrlInputSource -from mindee.parsing.v2.base_response import BaseResponse +from mindee.v2.input.base_parameters import BaseParameters +from mindee.v2.parsing.inference.base_response import BaseResponse @dataclass @@ -81,7 +81,7 @@ class MindeeParser: """Parser options.""" parsed_args: Namespace """Stores attributes relating to parsing.""" - client: ClientV2 + client: Client """Mindee client""" input_source: Union[PathInput, UrlInputSource] """Document to be parsed.""" @@ -90,7 +90,7 @@ def __init__( self, parser: Optional[MindeeArgumentParser] = None, parsed_args: Optional[Namespace] = None, - client: Optional[ClientV2] = None, + client: Optional[Client] = None, ) -> None: self.parser = ( parser if parser else MindeeArgumentParser(description="Mindee_API") @@ -100,7 +100,7 @@ def __init__( self.client = client else: api_key = self.parsed_args.api_key if "api_key" in self.parsed_args else "" - self.client = ClientV2(api_key=api_key) + self.client = Client(api_key=api_key) self.input_source = self._get_input_source() def call_parse(self) -> None: diff --git a/mindee/v2/file_operations/crop.py b/mindee/v2/file_operations/crop.py index b2d416df..b98ea19a 100644 --- a/mindee/v2/file_operations/crop.py +++ b/mindee/v2/file_operations/crop.py @@ -4,7 +4,7 @@ from mindee.extraction import ExtractedImage, extract_multiple_images_from_source from mindee.geometry import Point, Polygon from mindee.input.sources.local_input_source import LocalInputSource -from mindee.parsing.v2.field import FieldLocation +from mindee.v2.parsing.inference.field import FieldLocation from mindee.v2.file_operations.crop_files import CropFiles from mindee.v2.product.crop.crop_box import CropBox diff --git a/mindee/v2/input/__init__.py b/mindee/v2/input/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/mindee/input/base_parameters.py b/mindee/v2/input/base_parameters.py similarity index 100% rename from mindee/input/base_parameters.py rename to mindee/v2/input/base_parameters.py diff --git a/mindee/v2/parsing/__init__.py b/mindee/v2/parsing/__init__.py index 3d83d32f..85bf748e 100644 --- a/mindee/v2/parsing/__init__.py +++ b/mindee/v2/parsing/__init__.py @@ -1,7 +1,25 @@ -from mindee.parsing.v2.base_inference import BaseInference -from mindee.parsing.v2.base_response import BaseResponse +from mindee.v2.parsing.inference.base_inference import BaseInference +from mindee.v2.parsing.inference.base_response import BaseResponse +from mindee.v2.parsing.inference.error_item import ErrorItem +from mindee.v2.parsing.inference.error_response import ErrorResponse +from mindee.v2.product.extraction.inference import Inference +from mindee.v2.parsing.inference.inference_active_options import InferenceActiveOptions +from mindee.v2.parsing.inference.inference_file import InferenceFile +from mindee.v2.parsing.inference.inference_model import InferenceModel +from mindee.v2.product.extraction.inference_response import InferenceResponse +from mindee.v2.product.extraction.inference_result import InferenceResult +from mindee.v2.parsing.inference.job_response import JobResponse __all__ = [ "BaseInference", "BaseResponse", + "Inference", + "InferenceActiveOptions", + "InferenceFile", + "InferenceModel", + "InferenceResponse", + "InferenceResult", + "JobResponse", + "ErrorResponse", + "ErrorItem", ] diff --git a/mindee/v2/parsing/inference/__init__.py b/mindee/v2/parsing/inference/__init__.py index 3d83d32f..e69de29b 100644 --- a/mindee/v2/parsing/inference/__init__.py +++ b/mindee/v2/parsing/inference/__init__.py @@ -1,7 +0,0 @@ -from mindee.parsing.v2.base_inference import BaseInference -from mindee.parsing.v2.base_response import BaseResponse - -__all__ = [ - "BaseInference", - "BaseResponse", -] diff --git a/mindee/v2/parsing/inference/base_inference.py b/mindee/v2/parsing/inference/base_inference.py index 215b3a1a..80f129da 100644 --- a/mindee/v2/parsing/inference/base_inference.py +++ b/mindee/v2/parsing/inference/base_inference.py @@ -1,3 +1,29 @@ -from mindee.parsing.v2.base_inference import BaseInference, TypeBaseInference +from abc import ABC +from typing import TypeVar -__all__ = ["BaseInference", "TypeBaseInference"] +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.inference_file import InferenceFile +from mindee.v2.parsing.inference.inference_job import InferenceJob +from mindee.v2.parsing.inference.inference_model import InferenceModel + + +class BaseInference(ABC): + """Base class for V2 inference objects.""" + + job: InferenceJob + """Job the inference belongs to.""" + model: InferenceModel + """Model info for the inference.""" + file: InferenceFile + """File info for the inference.""" + id: str + """ID of the inference.""" + + def __init__(self, raw_response: StringDict): + self.id = raw_response["id"] + self.job = InferenceJob(raw_response["job"]) + self.model = InferenceModel(raw_response["model"]) + self.file = InferenceFile(raw_response["file"]) + + +TypeBaseInference = TypeVar("TypeBaseInference", bound=BaseInference) diff --git a/mindee/v2/parsing/inference/base_response.py b/mindee/v2/parsing/inference/base_response.py index f2917467..5baf73d8 100644 --- a/mindee/v2/parsing/inference/base_response.py +++ b/mindee/v2/parsing/inference/base_response.py @@ -1,3 +1,21 @@ -from mindee.parsing.v2.base_response import BaseResponse +from abc import ABC -__all__ = ["BaseResponse"] +from mindee.v2.parsing.inference.base_inference import BaseInference +from mindee.parsing.common.common_response import CommonResponse + + +class BaseResponse(ABC, CommonResponse): + """Base class for V2 inference responses.""" + + inference: BaseInference + """The inference result for a split utility request""" + _slug: str + """Slug of the inference.""" + + def __str__(self) -> str: + return str(self.inference) + + @classmethod + def get_result_slug(cls) -> str: + """Getter for the inference slug.""" + return cls._slug diff --git a/mindee/parsing/v2/error_item.py b/mindee/v2/parsing/inference/error_item.py similarity index 87% rename from mindee/parsing/v2/error_item.py rename to mindee/v2/parsing/inference/error_item.py index 8d9aad96..78d9e7cf 100644 --- a/mindee/parsing/v2/error_item.py +++ b/mindee/v2/parsing/inference/error_item.py @@ -1,6 +1,6 @@ from typing import Optional -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict class ErrorItem: diff --git a/mindee/parsing/v2/error_response.py b/mindee/v2/parsing/inference/error_response.py similarity index 90% rename from mindee/parsing/v2/error_response.py rename to mindee/v2/parsing/inference/error_response.py index 0a0191b3..e9673175 100644 --- a/mindee/parsing/v2/error_response.py +++ b/mindee/v2/parsing/inference/error_response.py @@ -1,7 +1,7 @@ from typing import List -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.error_item import ErrorItem +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.error_item import ErrorItem class ErrorResponse: diff --git a/mindee/v2/parsing/inference/field/__init__.py b/mindee/v2/parsing/inference/field/__init__.py new file mode 100644 index 00000000..0975d6d4 --- /dev/null +++ b/mindee/v2/parsing/inference/field/__init__.py @@ -0,0 +1,17 @@ +from mindee.v2.parsing.inference.field.base_field import BaseField +from mindee.v2.parsing.inference.field.field_confidence import FieldConfidence +from mindee.v2.parsing.inference.field.field_location import FieldLocation +from mindee.v2.parsing.inference.field.inference_fields import InferenceFields +from mindee.v2.parsing.inference.field.list_field import ListField +from mindee.v2.parsing.inference.field.object_field import ObjectField +from mindee.v2.parsing.inference.field.simple_field import SimpleField + +__all__ = [ + "BaseField", + "FieldConfidence", + "FieldLocation", + "ListField", + "ObjectField", + "SimpleField", + "InferenceFields", +] diff --git a/mindee/parsing/v2/field/base_field.py b/mindee/v2/parsing/inference/field/base_field.py similarity index 76% rename from mindee/parsing/v2/field/base_field.py rename to mindee/v2/parsing/inference/field/base_field.py index 8217f40c..d7cea841 100644 --- a/mindee/parsing/v2/field/base_field.py +++ b/mindee/v2/parsing/inference/field/base_field.py @@ -1,9 +1,9 @@ from typing import List, Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.field.dynamic_field import DynamicField, FieldType -from mindee.parsing.v2.field.field_confidence import FieldConfidence -from mindee.parsing.v2.field.field_location import FieldLocation +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.field.dynamic_field import DynamicField, FieldType +from mindee.v2.parsing.inference.field.field_confidence import FieldConfidence +from mindee.v2.parsing.inference.field.field_location import FieldLocation class BaseField(DynamicField): diff --git a/mindee/parsing/v2/field/dynamic_field.py b/mindee/v2/parsing/inference/field/dynamic_field.py similarity index 74% rename from mindee/parsing/v2/field/dynamic_field.py rename to mindee/v2/parsing/inference/field/dynamic_field.py index d32a9128..24e27f01 100644 --- a/mindee/parsing/v2/field/dynamic_field.py +++ b/mindee/v2/parsing/inference/field/dynamic_field.py @@ -3,12 +3,12 @@ from typing import TYPE_CHECKING, Union from mindee.error import MindeeApiV2Error -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict if TYPE_CHECKING: - from mindee.parsing.v2.field.list_field import ListField - from mindee.parsing.v2.field.object_field import ObjectField - from mindee.parsing.v2.field.simple_field import SimpleField + from mindee.v2.parsing.inference.field.object_field import ObjectField + from mindee.v2.parsing.inference.field.list_field import ListField + from mindee.v2.parsing.inference.field.simple_field import SimpleField class FieldType(str, Enum): @@ -46,13 +46,13 @@ def get_field_type( """Get appropriate field types.""" if isinstance(raw_response, dict): if "value" in raw_response: - field_file = import_module("mindee.parsing.v2.field.simple_field") + field_file = import_module("mindee.v2.parsing.inference.field.simple_field") field_class = getattr(field_file, FieldType.SIMPLE.value) elif "items" in raw_response: - field_file = import_module("mindee.parsing.v2.field.list_field") + field_file = import_module("mindee.v2.parsing.inference.field.list_field") field_class = getattr(field_file, FieldType.LIST.value) elif "fields" in raw_response: - field_file = import_module("mindee.parsing.v2.field.object_field") + field_file = import_module("mindee.v2.parsing.inference.field.object_field") field_class = getattr(field_file, FieldType.OBJECT.value) else: raise MindeeApiV2Error(f"Unrecognized field type in {raw_response}.") diff --git a/mindee/parsing/v2/field/field_confidence.py b/mindee/v2/parsing/inference/field/field_confidence.py similarity index 100% rename from mindee/parsing/v2/field/field_confidence.py rename to mindee/v2/parsing/inference/field/field_confidence.py diff --git a/mindee/parsing/v2/field/field_location.py b/mindee/v2/parsing/inference/field/field_location.py similarity index 93% rename from mindee/parsing/v2/field/field_location.py rename to mindee/v2/parsing/inference/field/field_location.py index 31ca7056..8dae3c5f 100644 --- a/mindee/parsing/v2/field/field_location.py +++ b/mindee/v2/parsing/inference/field/field_location.py @@ -1,5 +1,5 @@ from mindee.geometry.polygon import Polygon -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict class FieldLocation: diff --git a/mindee/parsing/v2/field/inference_fields.py b/mindee/v2/parsing/inference/field/inference_fields.py similarity index 90% rename from mindee/parsing/v2/field/inference_fields.py rename to mindee/v2/parsing/inference/field/inference_fields.py index 7e6368b0..652c26f6 100644 --- a/mindee/parsing/v2/field/inference_fields.py +++ b/mindee/v2/parsing/inference/field/inference_fields.py @@ -1,7 +1,7 @@ from typing import Dict -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.field.dynamic_field import ( +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.field.dynamic_field import ( FieldType, FieldTypeAlias, get_field_type, diff --git a/mindee/parsing/v2/field/list_field.py b/mindee/v2/parsing/inference/field/list_field.py similarity index 83% rename from mindee/parsing/v2/field/list_field.py rename to mindee/v2/parsing/inference/field/list_field.py index b37f1e2f..6840d5a9 100644 --- a/mindee/parsing/v2/field/list_field.py +++ b/mindee/v2/parsing/inference/field/list_field.py @@ -1,14 +1,14 @@ from typing import List -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.field.base_field import BaseField -from mindee.parsing.v2.field.dynamic_field import ( +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.field.base_field import BaseField +from mindee.v2.parsing.inference.field.dynamic_field import ( DynamicField, FieldType, get_field_type, ) -from mindee.parsing.v2.field.object_field import ObjectField -from mindee.parsing.v2.field.simple_field import SimpleField +from mindee.v2.parsing.inference.field.object_field import ObjectField +from mindee.v2.parsing.inference.field.simple_field import SimpleField class ListField(BaseField): diff --git a/mindee/parsing/v2/field/object_field.py b/mindee/v2/parsing/inference/field/object_field.py similarity index 92% rename from mindee/parsing/v2/field/object_field.py rename to mindee/v2/parsing/inference/field/object_field.py index 564dc8b3..6b2355c9 100644 --- a/mindee/parsing/v2/field/object_field.py +++ b/mindee/v2/parsing/inference/field/object_field.py @@ -1,12 +1,12 @@ from typing import TYPE_CHECKING, Dict, cast -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.field.base_field import BaseField -from mindee.parsing.v2.field.dynamic_field import FieldType -from mindee.parsing.v2.field.inference_fields import InferenceFields +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.field.base_field import BaseField +from mindee.v2.parsing.inference.field.dynamic_field import FieldType +from mindee.v2.parsing.inference.field.inference_fields import InferenceFields if TYPE_CHECKING: - from mindee.parsing.v2.field.list_field import ListField - from mindee.parsing.v2.field.simple_field import SimpleField + from mindee.v2.parsing.inference.field.list_field import ListField + from mindee.v2.parsing.inference.field.simple_field import SimpleField class ObjectField(BaseField): diff --git a/mindee/parsing/v2/field/simple_field.py b/mindee/v2/parsing/inference/field/simple_field.py similarity index 78% rename from mindee/parsing/v2/field/simple_field.py rename to mindee/v2/parsing/inference/field/simple_field.py index 0574093d..0ad97e2a 100644 --- a/mindee/parsing/v2/field/simple_field.py +++ b/mindee/v2/parsing/inference/field/simple_field.py @@ -1,8 +1,8 @@ from typing import Union -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.field.base_field import BaseField -from mindee.parsing.v2.field.dynamic_field import FieldType +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.field.base_field import BaseField +from mindee.v2.parsing.inference.field.dynamic_field import FieldType class SimpleField(BaseField): diff --git a/mindee/parsing/v2/inference_active_options.py b/mindee/v2/parsing/inference/inference_active_options.py similarity index 97% rename from mindee/parsing/v2/inference_active_options.py rename to mindee/v2/parsing/inference/inference_active_options.py index 4c894aef..730eb8b7 100644 --- a/mindee/parsing/v2/inference_active_options.py +++ b/mindee/v2/parsing/inference/inference_active_options.py @@ -1,4 +1,4 @@ -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict class DataSchemaActiveOptions: diff --git a/mindee/parsing/v2/inference_file.py b/mindee/v2/parsing/inference/inference_file.py similarity index 93% rename from mindee/parsing/v2/inference_file.py rename to mindee/v2/parsing/inference/inference_file.py index 5cd950f5..98151ec9 100644 --- a/mindee/parsing/v2/inference_file.py +++ b/mindee/v2/parsing/inference/inference_file.py @@ -1,4 +1,4 @@ -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict class InferenceFile: diff --git a/mindee/v2/parsing/inference/inference_job.py b/mindee/v2/parsing/inference/inference_job.py index 3315d39c..19519260 100644 --- a/mindee/v2/parsing/inference/inference_job.py +++ b/mindee/v2/parsing/inference/inference_job.py @@ -1,3 +1,14 @@ -from mindee.parsing.v2.inference_job import InferenceJob +from mindee.parsing.common import StringDict -__all__ = ["InferenceJob"] + +class InferenceJob: + """Inference Job info.""" + + id: str + """UUID of the Job.""" + + def __init__(self, raw_response: StringDict) -> None: + self.id = raw_response["id"] + + def __str__(self) -> str: + return f"Job\n===\n:ID: {self.id}" diff --git a/mindee/parsing/v2/inference_model.py b/mindee/v2/parsing/inference/inference_model.py similarity index 82% rename from mindee/parsing/v2/inference_model.py rename to mindee/v2/parsing/inference/inference_model.py index c44c4d0a..a93f65da 100644 --- a/mindee/parsing/v2/inference_model.py +++ b/mindee/v2/parsing/inference/inference_model.py @@ -1,4 +1,4 @@ -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict class InferenceModel: diff --git a/mindee/parsing/v2/job.py b/mindee/v2/parsing/inference/job.py similarity index 91% rename from mindee/parsing/v2/job.py rename to mindee/v2/parsing/inference/job.py index 662efbbc..606e96f9 100644 --- a/mindee/parsing/v2/job.py +++ b/mindee/v2/parsing/inference/job.py @@ -1,9 +1,9 @@ from datetime import datetime from typing import List, Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.error_response import ErrorResponse -from mindee.parsing.v2.job_webhook import JobWebhook +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.error_response import ErrorResponse +from mindee.v2.parsing.inference.job_webhook import JobWebhook class Job: diff --git a/mindee/parsing/v2/job_response.py b/mindee/v2/parsing/inference/job_response.py similarity index 64% rename from mindee/parsing/v2/job_response.py rename to mindee/v2/parsing/inference/job_response.py index ae1e3656..cc42c023 100644 --- a/mindee/parsing/v2/job_response.py +++ b/mindee/v2/parsing/inference/job_response.py @@ -1,6 +1,6 @@ -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.common_response import CommonResponse -from mindee.parsing.v2.job import Job +from mindee.parsing.common import StringDict +from mindee.parsing.common.common_response import CommonResponse +from mindee.v2.parsing.inference.job import Job class JobResponse(CommonResponse): diff --git a/mindee/parsing/v2/job_webhook.py b/mindee/v2/parsing/inference/job_webhook.py similarity index 89% rename from mindee/parsing/v2/job_webhook.py rename to mindee/v2/parsing/inference/job_webhook.py index daf421e1..f539e60d 100644 --- a/mindee/parsing/v2/job_webhook.py +++ b/mindee/v2/parsing/inference/job_webhook.py @@ -1,8 +1,8 @@ from datetime import datetime from typing import Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.error_response import ErrorResponse +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.error_response import ErrorResponse class JobWebhook: diff --git a/mindee/parsing/v2/rag_metadata.py b/mindee/v2/parsing/inference/rag_metadata.py similarity index 82% rename from mindee/parsing/v2/rag_metadata.py rename to mindee/v2/parsing/inference/rag_metadata.py index 04f875af..40eb00a9 100644 --- a/mindee/parsing/v2/rag_metadata.py +++ b/mindee/v2/parsing/inference/rag_metadata.py @@ -1,6 +1,6 @@ from typing import Optional -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict class RagMetadata: diff --git a/mindee/parsing/v2/raw_text.py b/mindee/v2/parsing/inference/raw_text.py similarity index 82% rename from mindee/parsing/v2/raw_text.py rename to mindee/v2/parsing/inference/raw_text.py index 7f6c0d54..61dd6b26 100644 --- a/mindee/parsing/v2/raw_text.py +++ b/mindee/v2/parsing/inference/raw_text.py @@ -1,7 +1,7 @@ from typing import List -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.raw_text_page import RawTextPage +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.raw_text_page import RawTextPage class RawText: diff --git a/mindee/parsing/v2/raw_text_page.py b/mindee/v2/parsing/inference/raw_text_page.py similarity index 79% rename from mindee/parsing/v2/raw_text_page.py rename to mindee/v2/parsing/inference/raw_text_page.py index b10c68c7..e3eaf041 100644 --- a/mindee/parsing/v2/raw_text_page.py +++ b/mindee/v2/parsing/inference/raw_text_page.py @@ -1,4 +1,4 @@ -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict class RawTextPage: diff --git a/mindee/v2/product/__init__.py b/mindee/v2/product/__init__.py index 6d5b3bc3..63daf638 100644 --- a/mindee/v2/product/__init__.py +++ b/mindee/v2/product/__init__.py @@ -1,14 +1,14 @@ -from mindee.v2.product.classification.classification_parameters import ( +from mindee.v2.product.classification.param.classification_parameters import ( ClassificationParameters, ) from mindee.v2.product.classification.classification_response import ( ClassificationResponse, ) -from mindee.v2.product.crop.crop_parameters import CropParameters +from mindee.v2.product.crop.params.crop_parameters import CropParameters from mindee.v2.product.crop.crop_response import CropResponse -from mindee.v2.product.ocr.ocr_parameters import OCRParameters +from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters from mindee.v2.product.ocr.ocr_response import OCRResponse -from mindee.v2.product.split.split_parameters import SplitParameters +from mindee.v2.product.split.params.split_parameters import SplitParameters from mindee.v2.product.split.split_response import SplitResponse __all__ = [ diff --git a/mindee/v2/product/classification/__init__.py b/mindee/v2/product/classification/__init__.py index 61fddbf5..ee60dadf 100644 --- a/mindee/v2/product/classification/__init__.py +++ b/mindee/v2/product/classification/__init__.py @@ -4,7 +4,7 @@ from mindee.v2.product.classification.classification_inference import ( ClassificationInference, ) -from mindee.v2.product.classification.classification_parameters import ( +from mindee.v2.product.classification.param.classification_parameters import ( ClassificationParameters, ) from mindee.v2.product.classification.classification_response import ( diff --git a/mindee/v2/product/classification/classification_classifier.py b/mindee/v2/product/classification/classification_classifier.py index fb3c3e8e..c196290e 100644 --- a/mindee/v2/product/classification/classification_classifier.py +++ b/mindee/v2/product/classification/classification_classifier.py @@ -1,7 +1,7 @@ from typing import Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.inference_response import InferenceResponse +from mindee.parsing.common import StringDict +from mindee.v2.product.extraction.inference_response import InferenceResponse class ClassificationClassifier: diff --git a/mindee/v2/product/classification/classification_inference.py b/mindee/v2/product/classification/classification_inference.py index 274be69e..7953059e 100644 --- a/mindee/v2/product/classification/classification_inference.py +++ b/mindee/v2/product/classification/classification_inference.py @@ -1,5 +1,5 @@ -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.base_inference import BaseInference +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.base_inference import BaseInference from mindee.v2.product.classification.classification_result import ClassificationResult diff --git a/mindee/v2/product/classification/classification_response.py b/mindee/v2/product/classification/classification_response.py index 78d7e520..2e5380ed 100644 --- a/mindee/v2/product/classification/classification_response.py +++ b/mindee/v2/product/classification/classification_response.py @@ -1,5 +1,5 @@ -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.base_response import BaseResponse +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.base_response import BaseResponse from mindee.v2.product.classification.classification_inference import ( ClassificationInference, ) diff --git a/mindee/v2/product/classification/classification_result.py b/mindee/v2/product/classification/classification_result.py index 2d314ffb..9bad332c 100644 --- a/mindee/v2/product/classification/classification_result.py +++ b/mindee/v2/product/classification/classification_result.py @@ -1,4 +1,4 @@ -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict from mindee.v2.product.classification.classification_classifier import ( ClassificationClassifier, ) diff --git a/mindee/v2/product/classification/param/__init__.py b/mindee/v2/product/classification/param/__init__.py new file mode 100644 index 00000000..3d594b77 --- /dev/null +++ b/mindee/v2/product/classification/param/__init__.py @@ -0,0 +1,5 @@ +from mindee.v2.product.classification.param.classification_parameters import ( + ClassificationParameters, +) + +__all__ = ["ClassificationParameters"] diff --git a/mindee/v2/product/classification/classification_parameters.py b/mindee/v2/product/classification/param/classification_parameters.py similarity index 75% rename from mindee/v2/product/classification/classification_parameters.py rename to mindee/v2/product/classification/param/classification_parameters.py index e09cf319..86194d80 100644 --- a/mindee/v2/product/classification/classification_parameters.py +++ b/mindee/v2/product/classification/param/classification_parameters.py @@ -1,4 +1,4 @@ -from mindee.input.base_parameters import BaseParameters +from mindee.v2.input.base_parameters import BaseParameters class ClassificationParameters(BaseParameters): diff --git a/mindee/v2/product/crop/__init__.py b/mindee/v2/product/crop/__init__.py index 9a8d525c..70cabc23 100644 --- a/mindee/v2/product/crop/__init__.py +++ b/mindee/v2/product/crop/__init__.py @@ -1,7 +1,7 @@ from mindee.v2.product.crop.crop_box import CropBox from mindee.v2.product.crop.crop_inference import CropInference from mindee.v2.product.crop.crop_item import CropItem -from mindee.v2.product.crop.crop_parameters import CropParameters +from mindee.v2.product.crop.params.crop_parameters import CropParameters from mindee.v2.product.crop.crop_response import CropResponse from mindee.v2.product.crop.crop_result import CropResult diff --git a/mindee/v2/product/crop/crop_box.py b/mindee/v2/product/crop/crop_box.py index 68c461dd..4508575f 100644 --- a/mindee/v2/product/crop/crop_box.py +++ b/mindee/v2/product/crop/crop_box.py @@ -1,10 +1,10 @@ from typing import Optional from mindee.extraction import ExtractedImage, extract_multiple_images_from_source -from mindee.input import LocalInputSource -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.field import FieldLocation -from mindee.parsing.v2.inference_response import InferenceResponse +from mindee.input.sources.local_input_source import LocalInputSource +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.field import FieldLocation +from mindee.v2.product.extraction.inference_response import InferenceResponse class CropBox: diff --git a/mindee/v2/product/crop/crop_inference.py b/mindee/v2/product/crop/crop_inference.py index 25298d9f..9ac140e0 100644 --- a/mindee/v2/product/crop/crop_inference.py +++ b/mindee/v2/product/crop/crop_inference.py @@ -1,5 +1,5 @@ -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.base_inference import BaseInference +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.base_inference import BaseInference from mindee.v2.product.crop.crop_result import CropResult diff --git a/mindee/v2/product/crop/crop_response.py b/mindee/v2/product/crop/crop_response.py index f63a1fcc..253fe36d 100644 --- a/mindee/v2/product/crop/crop_response.py +++ b/mindee/v2/product/crop/crop_response.py @@ -1,7 +1,7 @@ from mindee.input.sources.local_input_source import LocalInputSource -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict from mindee.v2.file_operations.crop_files import CropFiles -from mindee.parsing.v2.base_response import BaseResponse +from mindee.v2.parsing.inference.base_response import BaseResponse from mindee.v2.product.crop.crop_inference import CropInference diff --git a/mindee/v2/product/crop/crop_result.py b/mindee/v2/product/crop/crop_result.py index f74521dc..5701e2da 100644 --- a/mindee/v2/product/crop/crop_result.py +++ b/mindee/v2/product/crop/crop_result.py @@ -1,6 +1,6 @@ from typing import List -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict from mindee.v2.product.crop.crop_item import CropItem diff --git a/mindee/v2/product/crop/params/__init__.py b/mindee/v2/product/crop/params/__init__.py new file mode 100644 index 00000000..17148f2f --- /dev/null +++ b/mindee/v2/product/crop/params/__init__.py @@ -0,0 +1,3 @@ +from mindee.v2.product.crop.params.crop_parameters import CropParameters + +__all__ = ["CropParameters"] diff --git a/mindee/v2/product/crop/crop_parameters.py b/mindee/v2/product/crop/params/crop_parameters.py similarity index 71% rename from mindee/v2/product/crop/crop_parameters.py rename to mindee/v2/product/crop/params/crop_parameters.py index 070b2ded..a48b86c5 100644 --- a/mindee/v2/product/crop/crop_parameters.py +++ b/mindee/v2/product/crop/params/crop_parameters.py @@ -1,4 +1,4 @@ -from mindee.input.base_parameters import BaseParameters +from mindee.v2.input.base_parameters import BaseParameters class CropParameters(BaseParameters): diff --git a/mindee/v2/product/extraction/__init__.py b/mindee/v2/product/extraction/__init__.py new file mode 100644 index 00000000..9362a5d8 --- /dev/null +++ b/mindee/v2/product/extraction/__init__.py @@ -0,0 +1,19 @@ +from mindee.v2.product.extraction.inference import Inference +from mindee.v2.product.extraction.inference_response import InferenceResponse +from mindee.v2.product.extraction.inference_result import InferenceResult +from mindee.v2.product.extraction.params.inference_parameters import InferenceParameters +from mindee.v2.product.extraction.params.data_schema import DataSchema +from mindee.v2.product.extraction.params.data_schema_replace import DataSchemaReplace +from mindee.v2.product.extraction.params.data_schema_field import DataSchemaField +from mindee.v2.product.extraction.params.string_data_class import StringDataClass + +__all__ = [ + "Inference", + "InferenceParameters", + "InferenceResponse", + "InferenceResult", + "DataSchemaField", + "DataSchema", + "DataSchemaReplace", + "StringDataClass", +] diff --git a/mindee/parsing/v2/inference.py b/mindee/v2/product/extraction/inference.py similarity index 72% rename from mindee/parsing/v2/inference.py rename to mindee/v2/product/extraction/inference.py index 1009c101..7da58d41 100644 --- a/mindee/parsing/v2/inference.py +++ b/mindee/v2/product/extraction/inference.py @@ -1,7 +1,7 @@ -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.base_inference import BaseInference -from mindee.parsing.v2.inference_active_options import InferenceActiveOptions -from mindee.parsing.v2.inference_result import InferenceResult +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.base_inference import BaseInference +from mindee.v2.parsing.inference.inference_active_options import InferenceActiveOptions +from mindee.v2.product.extraction.inference_result import InferenceResult class Inference(BaseInference): diff --git a/mindee/parsing/v2/inference_response.py b/mindee/v2/product/extraction/inference_response.py similarity index 77% rename from mindee/parsing/v2/inference_response.py rename to mindee/v2/product/extraction/inference_response.py index 20a20975..4f84be15 100644 --- a/mindee/parsing/v2/inference_response.py +++ b/mindee/v2/product/extraction/inference_response.py @@ -1,6 +1,6 @@ -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.base_response import BaseResponse -from mindee.parsing.v2.inference import Inference +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.base_response import BaseResponse +from mindee.v2.product.extraction.inference import Inference class InferenceResponse(BaseResponse): diff --git a/mindee/parsing/v2/inference_result.py b/mindee/v2/product/extraction/inference_result.py similarity index 76% rename from mindee/parsing/v2/inference_result.py rename to mindee/v2/product/extraction/inference_result.py index 8359fb71..c0ba3dda 100644 --- a/mindee/parsing/v2/inference_result.py +++ b/mindee/v2/product/extraction/inference_result.py @@ -1,9 +1,9 @@ from typing import Optional -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.field.inference_fields import InferenceFields -from mindee.parsing.v2.rag_metadata import RagMetadata -from mindee.parsing.v2.raw_text import RawText +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.field import InferenceFields +from mindee.v2.parsing.inference.rag_metadata import RagMetadata +from mindee.v2.parsing.inference.raw_text import RawText class InferenceResult: diff --git a/mindee/v2/product/extraction/params/__init__.py b/mindee/v2/product/extraction/params/__init__.py new file mode 100644 index 00000000..5553ba80 --- /dev/null +++ b/mindee/v2/product/extraction/params/__init__.py @@ -0,0 +1,13 @@ +from mindee.v2.product.extraction.params.data_schema_field import DataSchemaField +from mindee.v2.product.extraction.params.string_data_class import StringDataClass +from mindee.v2.product.extraction.params.data_schema import DataSchema +from mindee.v2.product.extraction.params.data_schema_replace import DataSchemaReplace +from mindee.v2.product.extraction.params.inference_parameters import InferenceParameters + +__all__ = [ + "InferenceParameters", + "DataSchemaField", + "StringDataClass", + "DataSchema", + "DataSchemaReplace", +] diff --git a/mindee/v2/product/extraction/params/data_schema.py b/mindee/v2/product/extraction/params/data_schema.py new file mode 100644 index 00000000..44633891 --- /dev/null +++ b/mindee/v2/product/extraction/params/data_schema.py @@ -0,0 +1,20 @@ +import json +from dataclasses import dataclass +from typing import Optional, Union + +from mindee.v2.product.extraction.params.data_schema_replace import DataSchemaReplace +from mindee.v2.product.extraction.params.string_data_class import StringDataClass + + +@dataclass +class DataSchema(StringDataClass): + """Modify the Data Schema.""" + + replace: Optional[Union[DataSchemaReplace, dict, str]] = None + """If set, completely replaces the data schema of the model.""" + + def __post_init__(self) -> None: + if isinstance(self.replace, dict): + self.replace = DataSchemaReplace(**self.replace) + elif isinstance(self.replace, str): + self.replace = DataSchemaReplace(**json.loads(self.replace)) diff --git a/mindee/v2/product/extraction/params/data_schema_field.py b/mindee/v2/product/extraction/params/data_schema_field.py new file mode 100644 index 00000000..85907d4d --- /dev/null +++ b/mindee/v2/product/extraction/params/data_schema_field.py @@ -0,0 +1,31 @@ +from dataclasses import dataclass +from typing import List, Optional + +from mindee.v2.product.extraction.params.string_data_class import StringDataClass + + +@dataclass +class DataSchemaField(StringDataClass): + """A field in the data schema.""" + + title: str + """Display name for the field, also impacts inference results.""" + name: str + """Name of the field in the data schema.""" + is_array: bool + """Whether this field can contain multiple values.""" + type: str + """Data type of the field.""" + classification_values: Optional[List[str]] = None + """Allowed values when type is `classification`. Leave empty for other types.""" + unique_values: Optional[bool] = None + """ + Whether to remove duplicate values in the array. + Only applicable if `is_array` is True. + """ + description: Optional[str] = None + """Detailed description of what this field represents.""" + guidelines: Optional[str] = None + """Optional extraction guidelines.""" + nested_fields: Optional[dict] = None + """Subfields when type is `nested_object`. Leave empty for other types.""" diff --git a/mindee/v2/product/extraction/params/data_schema_replace.py b/mindee/v2/product/extraction/params/data_schema_replace.py new file mode 100644 index 00000000..4e3a7ccc --- /dev/null +++ b/mindee/v2/product/extraction/params/data_schema_replace.py @@ -0,0 +1,21 @@ +from dataclasses import dataclass +from typing import List, Union + +from mindee.v2.product.extraction.params.data_schema_field import DataSchemaField +from mindee.v2.product.extraction.params.string_data_class import StringDataClass + + +@dataclass +class DataSchemaReplace(StringDataClass): + """The structure to completely replace the data schema of the model.""" + + fields: List[Union[DataSchemaField, dict]] + + def __post_init__(self) -> None: + if not self.fields: + raise ValueError("Data schema replacement fields cannot be empty.") + if isinstance(self.fields[0], dict): + self.fields = [ + DataSchemaField(**field) # type: ignore[arg-type] + for field in self.fields + ] diff --git a/mindee/v2/product/extraction/params/inference_parameters.py b/mindee/v2/product/extraction/params/inference_parameters.py new file mode 100644 index 00000000..600fcc5c --- /dev/null +++ b/mindee/v2/product/extraction/params/inference_parameters.py @@ -0,0 +1,63 @@ +import json +from dataclasses import dataclass +from typing import Dict, List, Optional, Union + +from mindee.v2.input.base_parameters import BaseParameters +from mindee.v2.product.extraction.params.data_schema import DataSchema + + +@dataclass +class InferenceParameters(BaseParameters): + """Inference parameters to set when sending a file.""" + + rag: Optional[bool] = None + """Enhance extraction accuracy with Retrieval-Augmented Generation.""" + raw_text: Optional[bool] = None + """Extract the full text content from the document as strings, and fill the ``raw_text`` attribute.""" + polygon: Optional[bool] = None + """Calculate bounding box polygons for all fields, and fill their ``locations`` attribute.""" + confidence: Optional[bool] = None + """ + Boost the precision and accuracy of all extractions. + Calculate confidence scores for all fields, and fill their ``confidence`` attribute. + """ + text_context: Optional[str] = None + """ + Additional text context used by the model during inference. + Not recommended, for specific use only. + """ + data_schema: Optional[Union[DataSchema, str, dict]] = None + """ + Dynamic changes to the data schema of the model for this inference. + Not recommended, for specific use only. + """ + + _slug: str = "inferences" + """Slug of the endpoint.""" + + def __post_init__(self): + if isinstance(self.data_schema, str): + self.data_schema = DataSchema(**json.loads(self.data_schema)) + elif isinstance(self.data_schema, dict): + self.data_schema = DataSchema(**self.data_schema) + + def get_form_data(self) -> Dict[str, Union[str, List[str]]]: + """ + Return the parameters as a config dictionary. + + :return: A dict of parameters. + """ + data = super().get_form_data() + if self.data_schema is not None: + data["data_schema"] = str(self.data_schema) + if self.rag is not None: + data["rag"] = data["rag"] = str(self.rag).lower() + if self.raw_text is not None: + data["raw_text"] = data["raw_text"] = str(self.raw_text).lower() + if self.polygon is not None: + data["polygon"] = data["polygon"] = str(self.polygon).lower() + if self.confidence is not None: + data["confidence"] = data["confidence"] = str(self.confidence).lower() + if self.text_context is not None: + data["text_context"] = self.text_context + return data diff --git a/mindee/v2/product/extraction/params/string_data_class.py b/mindee/v2/product/extraction/params/string_data_class.py new file mode 100644 index 00000000..05f98d78 --- /dev/null +++ b/mindee/v2/product/extraction/params/string_data_class.py @@ -0,0 +1,17 @@ +import json +from dataclasses import asdict, dataclass + + +@dataclass +class StringDataClass: + """Base class for dataclasses that can be serialized to JSON.""" + + @staticmethod + def _no_none_values(x) -> dict: + """Don't include None values in the JSON output.""" + return {k: v for (k, v) in x if v is not None} + + def __str__(self) -> str: + return json.dumps( + asdict(self, dict_factory=self._no_none_values), indent=None, sort_keys=True + ) diff --git a/mindee/v2/product/ocr/__init__.py b/mindee/v2/product/ocr/__init__.py index b67e467a..821c6954 100644 --- a/mindee/v2/product/ocr/__init__.py +++ b/mindee/v2/product/ocr/__init__.py @@ -1,6 +1,6 @@ from mindee.v2.product.ocr.ocr_inference import OCRInference from mindee.v2.product.ocr.ocr_page import OCRPage -from mindee.v2.product.ocr.ocr_parameters import OCRParameters +from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters from mindee.v2.product.ocr.ocr_response import OCRResponse from mindee.v2.product.ocr.ocr_result import OCRResult from mindee.v2.product.ocr.ocr_word import OCRWord diff --git a/mindee/v2/product/ocr/ocr_inference.py b/mindee/v2/product/ocr/ocr_inference.py index 8699a2e5..acb7d330 100644 --- a/mindee/v2/product/ocr/ocr_inference.py +++ b/mindee/v2/product/ocr/ocr_inference.py @@ -1,5 +1,5 @@ -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.base_inference import BaseInference +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.base_inference import BaseInference from mindee.v2.product.ocr.ocr_result import OCRResult diff --git a/mindee/v2/product/ocr/ocr_page.py b/mindee/v2/product/ocr/ocr_page.py index 6c93bbd4..fa0ca010 100644 --- a/mindee/v2/product/ocr/ocr_page.py +++ b/mindee/v2/product/ocr/ocr_page.py @@ -1,6 +1,6 @@ from typing import List -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict from mindee.v2.product.ocr.ocr_word import OCRWord diff --git a/mindee/v2/product/ocr/ocr_response.py b/mindee/v2/product/ocr/ocr_response.py index 071ae0f2..32b7d052 100644 --- a/mindee/v2/product/ocr/ocr_response.py +++ b/mindee/v2/product/ocr/ocr_response.py @@ -1,5 +1,5 @@ -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.base_response import BaseResponse +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.base_response import BaseResponse from mindee.v2.product.ocr.ocr_inference import OCRInference diff --git a/mindee/v2/product/ocr/ocr_result.py b/mindee/v2/product/ocr/ocr_result.py index 28c837c7..d95a1c24 100644 --- a/mindee/v2/product/ocr/ocr_result.py +++ b/mindee/v2/product/ocr/ocr_result.py @@ -1,6 +1,6 @@ from typing import List -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict from mindee.v2.product.ocr.ocr_page import OCRPage diff --git a/mindee/v2/product/ocr/params/__init__.py b/mindee/v2/product/ocr/params/__init__.py new file mode 100644 index 00000000..3090f2e1 --- /dev/null +++ b/mindee/v2/product/ocr/params/__init__.py @@ -0,0 +1,3 @@ +from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters + +__all__ = ["OCRParameters"] diff --git a/mindee/v2/product/ocr/ocr_parameters.py b/mindee/v2/product/ocr/params/ocr_parameters.py similarity index 70% rename from mindee/v2/product/ocr/ocr_parameters.py rename to mindee/v2/product/ocr/params/ocr_parameters.py index 2e8ecb06..b976760d 100644 --- a/mindee/v2/product/ocr/ocr_parameters.py +++ b/mindee/v2/product/ocr/params/ocr_parameters.py @@ -1,4 +1,4 @@ -from mindee.input.base_parameters import BaseParameters +from mindee.v2.input.base_parameters import BaseParameters class OCRParameters(BaseParameters): diff --git a/mindee/v2/product/split/__init__.py b/mindee/v2/product/split/__init__.py index 9284c63e..5ab84925 100644 --- a/mindee/v2/product/split/__init__.py +++ b/mindee/v2/product/split/__init__.py @@ -1,5 +1,5 @@ from mindee.v2.product.split.split_inference import SplitInference -from mindee.v2.product.split.split_parameters import SplitParameters +from mindee.v2.product.split.params.split_parameters import SplitParameters from mindee.v2.product.split.split_response import SplitResponse from mindee.v2.product.split.split_result import SplitResult from mindee.v2.product.split.split_range import SplitRange diff --git a/mindee/v2/product/split/params/__init__.py b/mindee/v2/product/split/params/__init__.py new file mode 100644 index 00000000..b95e8f16 --- /dev/null +++ b/mindee/v2/product/split/params/__init__.py @@ -0,0 +1,3 @@ +from mindee.v2.product.split.params.split_parameters import SplitParameters + +__all__ = ["SplitParameters"] diff --git a/mindee/v2/product/split/split_parameters.py b/mindee/v2/product/split/params/split_parameters.py similarity index 71% rename from mindee/v2/product/split/split_parameters.py rename to mindee/v2/product/split/params/split_parameters.py index ec377dfe..ec57afea 100644 --- a/mindee/v2/product/split/split_parameters.py +++ b/mindee/v2/product/split/params/split_parameters.py @@ -1,4 +1,4 @@ -from mindee.input.base_parameters import BaseParameters +from mindee.v2.input.base_parameters import BaseParameters class SplitParameters(BaseParameters): diff --git a/mindee/v2/product/split/split_inference.py b/mindee/v2/product/split/split_inference.py index 28a0d434..7540f1fc 100644 --- a/mindee/v2/product/split/split_inference.py +++ b/mindee/v2/product/split/split_inference.py @@ -1,5 +1,5 @@ -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.base_inference import BaseInference +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.base_inference import BaseInference from mindee.v2.product.split.split_result import SplitResult diff --git a/mindee/v2/product/split/split_range.py b/mindee/v2/product/split/split_range.py index 59e61462..d63d4547 100644 --- a/mindee/v2/product/split/split_range.py +++ b/mindee/v2/product/split/split_range.py @@ -1,9 +1,9 @@ from typing import List, Optional -from mindee.parsing.v2.inference_response import InferenceResponse +from mindee.v2.product.extraction.inference_response import InferenceResponse from mindee.extraction.pdf_extractor.extracted_pdf import ExtractedPdf from mindee.input.sources.local_input_source import LocalInputSource -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict from mindee.v2.file_operations.split import extract_single_split diff --git a/mindee/v2/product/split/split_response.py b/mindee/v2/product/split/split_response.py index a00b868e..b46a58ac 100644 --- a/mindee/v2/product/split/split_response.py +++ b/mindee/v2/product/split/split_response.py @@ -1,6 +1,6 @@ from mindee.input.sources.local_input_source import LocalInputSource -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.base_response import BaseResponse +from mindee.parsing.common import StringDict +from mindee.v2.parsing.inference.base_response import BaseResponse from mindee.v2.file_operations.split_files import SplitFiles from mindee.v2.product.split.split_inference import SplitInference diff --git a/mindee/v2/product/split/split_result.py b/mindee/v2/product/split/split_result.py index efb63060..04c8a0f6 100644 --- a/mindee/v2/product/split/split_result.py +++ b/mindee/v2/product/split/split_result.py @@ -1,6 +1,6 @@ from typing import List -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.common import StringDict from mindee.v2.product.split.split_range import SplitRange diff --git a/tests/v1/api/test_async_response.py b/tests/v1/api/test_async_response.py index 5ca97391..139034b9 100644 --- a/tests/v1/api/test_async_response.py +++ b/tests/v1/api/test_async_response.py @@ -3,12 +3,12 @@ import pytest import requests -from mindee.client import Client +from mindee.v1.client import Client from mindee.input.sources.path_input import PathInput from mindee.mindee_http.response_validation import is_valid_async_response -from mindee.parsing.common.api_request import RequestStatus -from mindee.parsing.common.async_predict_response import AsyncPredictResponse -from mindee.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 +from mindee.v1.parsing.common import RequestStatus +from mindee.v1.parsing.common.async_predict_response import AsyncPredictResponse +from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 from tests.utils import V1_DATA_DIR, V1_PRODUCT_DATA_DIR ASYNC_DIR = V1_DATA_DIR / "async" diff --git a/tests/v1/api/test_feedback_response.py b/tests/v1/api/test_feedback_response.py index a6c3def2..f638d88b 100644 --- a/tests/v1/api/test_feedback_response.py +++ b/tests/v1/api/test_feedback_response.py @@ -1,6 +1,6 @@ import json -from mindee.parsing.common.feedback_response import FeedbackResponse +from mindee.v1.parsing.common.feedback_response import FeedbackResponse from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/api/test_response.py b/tests/v1/api/test_response.py index 2782d955..2b666fb2 100644 --- a/tests/v1/api/test_response.py +++ b/tests/v1/api/test_response.py @@ -1,19 +1,21 @@ import json -from mindee.parsing.common.predict_response import PredictResponse -from mindee.product.financial_document.financial_document_v1 import FinancialDocumentV1 -from mindee.product.financial_document.financial_document_v1_document import ( +from mindee.v1.parsing.common import PredictResponse +from mindee.v1.product.financial_document.financial_document_v1 import ( + FinancialDocumentV1, +) +from mindee.v1.product.financial_document.financial_document_v1_document import ( FinancialDocumentV1Document, ) -from mindee.product.fr.id_card.id_card_v2 import IdCardV2 -from mindee.product.fr.id_card.id_card_v2_document import IdCardV2Document -from mindee.product.fr.id_card.id_card_v2_page import IdCardV2Page -from mindee.product.invoice.invoice_v4 import InvoiceV4 -from mindee.product.invoice.invoice_v4_document import InvoiceV4Document -from mindee.product.passport.passport_v1 import PassportV1 -from mindee.product.passport.passport_v1_document import PassportV1Document -from mindee.product.receipt.receipt_v5 import ReceiptV5 -from mindee.product.receipt.receipt_v5_document import ReceiptV5Document +from mindee.v1.product.fr.id_card.id_card_v2 import IdCardV2 +from mindee.v1.product.fr.id_card.id_card_v2_document import IdCardV2Document +from mindee.v1.product.fr.id_card.id_card_v2_page import IdCardV2Page +from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 +from mindee.v1.product.invoice.invoice_v4_document import InvoiceV4Document +from mindee.v1.product.passport import PassportV1 +from mindee.v1.product.passport.passport_v1_document import PassportV1Document +from mindee.v1.product.receipt.receipt_v5 import ReceiptV5 +from mindee.v1.product.receipt.receipt_v5_document import ReceiptV5Document from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/extraction/test_image_extractor.py b/tests/v1/extraction/test_image_extractor.py index 87147ca3..77223152 100644 --- a/tests/v1/extraction/test_image_extractor.py +++ b/tests/v1/extraction/test_image_extractor.py @@ -5,7 +5,7 @@ from mindee.extraction.common.image_extractor import extract_multiple_images_from_source from mindee.input.sources.path_input import PathInput -from mindee.product.barcode_reader.barcode_reader_v1 import BarcodeReaderV1 +from mindee.v1.product.barcode_reader import BarcodeReaderV1 from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/extraction/test_invoice_splitter_auto_extraction.py b/tests/v1/extraction/test_invoice_splitter_auto_extraction.py index 6ecf7693..640ccc12 100644 --- a/tests/v1/extraction/test_invoice_splitter_auto_extraction.py +++ b/tests/v1/extraction/test_invoice_splitter_auto_extraction.py @@ -2,12 +2,12 @@ import pytest -from mindee import Client +from mindee.v1.client import Client from mindee.extraction.pdf_extractor.pdf_extractor import PdfExtractor from mindee.input.sources.path_input import PathInput -from mindee.parsing.common.document import Document -from mindee.product.invoice.invoice_v4 import InvoiceV4 -from mindee.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 +from mindee.v1.parsing.common import Document +from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 +from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 from tests.utils import V1_PRODUCT_DATA_DIR, levenshtein_ratio from tests.v1.product import get_id, get_version diff --git a/tests/v1/extraction/test_multi_receipts_extractor.py b/tests/v1/extraction/test_multi_receipts_extractor.py index f1c36451..bdc2ba5e 100644 --- a/tests/v1/extraction/test_multi_receipts_extractor.py +++ b/tests/v1/extraction/test_multi_receipts_extractor.py @@ -7,7 +7,7 @@ extract_receipts, ) from mindee.input.sources.path_input import PathInput -from mindee.product.multi_receipts_detector.multi_receipts_detector_v1 import ( +from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1 import ( MultiReceiptsDetectorV1, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/extraction/test_pdf_extractor.py b/tests/v1/extraction/test_pdf_extractor.py index 1359e1eb..96e0987a 100644 --- a/tests/v1/extraction/test_pdf_extractor.py +++ b/tests/v1/extraction/test_pdf_extractor.py @@ -1,11 +1,11 @@ import pytest -from mindee import Client +from mindee.v1.client import Client from mindee.extraction.pdf_extractor.pdf_extractor import PdfExtractor from mindee.input.local_response import LocalResponse from mindee.input.sources.path_input import PathInput -from mindee.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 -from mindee.product.invoice_splitter.invoice_splitter_v1_document import ( +from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 +from mindee.v1.product.invoice_splitter.invoice_splitter_v1_document import ( InvoiceSplitterV1Document, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/extras/test_extras_integration.py b/tests/v1/extras/test_extras_integration.py index 9c669cc3..4e7b83b9 100644 --- a/tests/v1/extras/test_extras_integration.py +++ b/tests/v1/extras/test_extras_integration.py @@ -1,8 +1,8 @@ import pytest -from mindee import Client -from mindee.product.international_id.international_id_v2 import InternationalIdV2 -from mindee.product.invoice.invoice_v4 import InvoiceV4 +from mindee.v1.client import Client +from mindee.v1.product.international_id import InternationalIdV2 +from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/extras/test_full_text_ocr.py b/tests/v1/extras/test_full_text_ocr.py index f1013efb..e2afcb72 100644 --- a/tests/v1/extras/test_full_text_ocr.py +++ b/tests/v1/extras/test_full_text_ocr.py @@ -2,8 +2,8 @@ import pytest -from mindee.parsing.common.async_predict_response import AsyncPredictResponse -from mindee.product.international_id.international_id_v2 import InternationalIdV2 +from mindee.v1.parsing.common.async_predict_response import AsyncPredictResponse +from mindee.v1.product.international_id import InternationalIdV2 from tests.utils import V1_EXTRAS_DIR # NOTE: Implementing extras per pages without content (like the Java library) diff --git a/tests/v1/input/test_url_input_source_integration.py b/tests/v1/input/test_url_input_source_integration.py index 82c81b11..9d688c41 100644 --- a/tests/v1/input/test_url_input_source_integration.py +++ b/tests/v1/input/test_url_input_source_integration.py @@ -3,8 +3,8 @@ import pytest -from mindee import Client -from mindee.product.invoice import InvoiceV4 +from mindee.v1.client import Client +from mindee.v1.product.invoice import InvoiceV4 from tests.utils import cleanup_output_files diff --git a/tests/v1/mindee_http/test_error.py b/tests/v1/mindee_http/test_error.py index 108cd332..b929122f 100644 --- a/tests/v1/mindee_http/test_error.py +++ b/tests/v1/mindee_http/test_error.py @@ -2,7 +2,8 @@ import pytest -from mindee import Client, product +from mindee.v1.client import Client +from mindee.v1 import product from mindee.error.mindee_http_error import ( MindeeHTTPClientError, MindeeHTTPServerError, diff --git a/tests/v1/parsing/common/test_ocr.py b/tests/v1/parsing/common/test_ocr.py index 56c9a75c..daa8706a 100644 --- a/tests/v1/parsing/common/test_ocr.py +++ b/tests/v1/parsing/common/test_ocr.py @@ -1,6 +1,6 @@ import json -from mindee.parsing.common.ocr.ocr import Ocr +from mindee.v1.parsing.common import Ocr from tests.utils import V1_DATA_DIR diff --git a/tests/v1/parsing/common/test_orientation.py b/tests/v1/parsing/common/test_orientation.py index d6740774..4fd488d8 100644 --- a/tests/v1/parsing/common/test_orientation.py +++ b/tests/v1/parsing/common/test_orientation.py @@ -1,4 +1,4 @@ -from mindee.parsing.common.orientation import OrientationField +from mindee.v1.parsing.common import OrientationField def test_constructor(): diff --git a/tests/v1/parsing/standard/test_amount.py b/tests/v1/parsing/standard/test_amount.py index 0940175f..bee6c84c 100644 --- a/tests/v1/parsing/standard/test_amount.py +++ b/tests/v1/parsing/standard/test_amount.py @@ -1,4 +1,4 @@ -from mindee.parsing.standard.amount import AmountField +from mindee.v1.parsing.standard import AmountField def test_constructor(): diff --git a/tests/v1/parsing/standard/test_date.py b/tests/v1/parsing/standard/test_date.py index ba790fef..33f7ae88 100644 --- a/tests/v1/parsing/standard/test_date.py +++ b/tests/v1/parsing/standard/test_date.py @@ -1,6 +1,6 @@ import datetime -from mindee.parsing.standard.date import DateField +from mindee.v1.parsing.standard import DateField def test_constructor(): diff --git a/tests/v1/parsing/standard/test_field.py b/tests/v1/parsing/standard/test_field.py index 23c750c4..b05fc64d 100644 --- a/tests/v1/parsing/standard/test_field.py +++ b/tests/v1/parsing/standard/test_field.py @@ -1,13 +1,13 @@ import pytest -from mindee.parsing.standard.base import ( +from mindee.v1.parsing.standard import ( BaseField, field_array_confidence, field_array_sum, float_to_string, ) -from mindee.parsing.standard.company_registration import CompanyRegistrationField -from mindee.parsing.standard.text import StringField +from mindee.v1.parsing.standard.company_registration import CompanyRegistrationField +from mindee.v1.parsing.standard.text import StringField def test_constructor(): diff --git a/tests/v1/parsing/standard/test_locale.py b/tests/v1/parsing/standard/test_locale.py index f5cd30fb..819179b9 100644 --- a/tests/v1/parsing/standard/test_locale.py +++ b/tests/v1/parsing/standard/test_locale.py @@ -1,4 +1,4 @@ -from mindee.parsing.standard.locale import LocaleField +from mindee.v1.parsing.standard import LocaleField def test_constructor(): diff --git a/tests/v1/parsing/standard/test_payment_details.py b/tests/v1/parsing/standard/test_payment_details.py index 8bb61ced..92538394 100644 --- a/tests/v1/parsing/standard/test_payment_details.py +++ b/tests/v1/parsing/standard/test_payment_details.py @@ -1,4 +1,4 @@ -from mindee.parsing.standard.payment_details import PaymentDetailsField +from mindee.v1.parsing.standard import PaymentDetailsField def test_constructor(): diff --git a/tests/v1/parsing/standard/test_position.py b/tests/v1/parsing/standard/test_position.py index 78bf912d..cb406740 100644 --- a/tests/v1/parsing/standard/test_position.py +++ b/tests/v1/parsing/standard/test_position.py @@ -1,4 +1,4 @@ -from mindee.parsing.standard.position import PositionField +from mindee.v1.parsing.standard import PositionField def test_constructor(): diff --git a/tests/v1/parsing/standard/test_string.py b/tests/v1/parsing/standard/test_string.py index c6f44b60..4d10b509 100644 --- a/tests/v1/parsing/standard/test_string.py +++ b/tests/v1/parsing/standard/test_string.py @@ -1,4 +1,4 @@ -from mindee.parsing.standard.text import StringField +from mindee.v1.parsing.standard.text import StringField def test_constructor_no_raw_value(): diff --git a/tests/v1/parsing/standard/test_tax.py b/tests/v1/parsing/standard/test_tax.py index a9c7b984..015d0154 100644 --- a/tests/v1/parsing/standard/test_tax.py +++ b/tests/v1/parsing/standard/test_tax.py @@ -1,4 +1,4 @@ -from mindee.parsing.standard.tax import TaxField +from mindee.v1.parsing.standard import TaxField def test_constructor(): diff --git a/tests/v1/product/barcode_reader/test_barcode_reader_v1.py b/tests/v1/product/barcode_reader/test_barcode_reader_v1.py index c79a97de..97f2c535 100644 --- a/tests/v1/product/barcode_reader/test_barcode_reader_v1.py +++ b/tests/v1/product/barcode_reader/test_barcode_reader_v1.py @@ -2,10 +2,10 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.barcode_reader.barcode_reader_v1 import BarcodeReaderV1 -from mindee.product.barcode_reader.barcode_reader_v1_document import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.barcode_reader import BarcodeReaderV1 +from mindee.v1.product.barcode_reader.barcode_reader_v1_document import ( BarcodeReaderV1Document, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/barcode_reader/test_barcode_reader_v1_regression.py b/tests/v1/product/barcode_reader/test_barcode_reader_v1_regression.py index 18683dfc..834aa11c 100644 --- a/tests/v1/product/barcode_reader/test_barcode_reader_v1_regression.py +++ b/tests/v1/product/barcode_reader/test_barcode_reader_v1_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.barcode_reader.barcode_reader_v1 import BarcodeReaderV1 +from mindee.v1.client import Client +from mindee.v1.product.barcode_reader import BarcodeReaderV1 from tests.utils import V1_PRODUCT_DATA_DIR from tests.v1.product import get_id, get_version diff --git a/tests/v1/product/cropper/test_cropper_v1.py b/tests/v1/product/cropper/test_cropper_v1.py index 84fc9986..02f57062 100644 --- a/tests/v1/product/cropper/test_cropper_v1.py +++ b/tests/v1/product/cropper/test_cropper_v1.py @@ -2,13 +2,13 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.cropper.cropper_v1 import CropperV1 -from mindee.product.cropper.cropper_v1_document import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.cropper.cropper_v1 import CropperV1 +from mindee.v1.product.cropper import ( CropperV1Document, ) -from mindee.product.cropper.cropper_v1_page import ( +from mindee.v1.product.cropper.cropper_v1_page import ( CropperV1Page, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/cropper/test_cropper_v1_regression.py b/tests/v1/product/cropper/test_cropper_v1_regression.py index 5b1f0c2f..dc5096bb 100644 --- a/tests/v1/product/cropper/test_cropper_v1_regression.py +++ b/tests/v1/product/cropper/test_cropper_v1_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.cropper.cropper_v1 import CropperV1 +from mindee.v1.client import Client +from mindee.v1.product.cropper.cropper_v1 import CropperV1 from tests.utils import V1_PRODUCT_DATA_DIR from tests.v1.product import get_id, get_version diff --git a/tests/v1/product/custom/test_custom_v1.py b/tests/v1/product/custom/test_custom_v1.py index 5f9d6bac..48f236e5 100644 --- a/tests/v1/product/custom/test_custom_v1.py +++ b/tests/v1/product/custom/test_custom_v1.py @@ -3,13 +3,13 @@ import pytest from mindee.geometry.quadrilateral import Quadrilateral -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.parsing.custom.classification import ClassificationField -from mindee.parsing.custom.list import ListField, ListFieldValue -from mindee.product.custom.custom_v1 import CustomV1 -from mindee.product.custom.custom_v1_document import CustomV1Document -from mindee.product.custom.custom_v1_page import CustomV1Page +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.parsing.custom import ClassificationField +from mindee.v1.parsing.custom import ListField, ListFieldValue +from mindee.v1.product.custom.custom_v1 import CustomV1 +from mindee.v1.product.custom.custom_v1_document import CustomV1Document +from mindee.v1.product.custom.custom_v1_page import CustomV1Page from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/custom/test_custom_v1_line_items.py b/tests/v1/product/custom/test_custom_v1_line_items.py index 435546b6..6de91978 100644 --- a/tests/v1/product/custom/test_custom_v1_line_items.py +++ b/tests/v1/product/custom/test_custom_v1_line_items.py @@ -2,10 +2,10 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.custom.custom_v1 import CustomV1 -from mindee.product.custom.custom_v1_page import CustomV1Page +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.custom.custom_v1 import CustomV1 +from mindee.v1.product.custom.custom_v1_page import CustomV1Page from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/custom/test_custom_v1_v2.py b/tests/v1/product/custom/test_custom_v1_v2.py index 3b7fa0f5..297cf9cd 100644 --- a/tests/v1/product/custom/test_custom_v1_v2.py +++ b/tests/v1/product/custom/test_custom_v1_v2.py @@ -3,13 +3,13 @@ import pytest from mindee.geometry.quadrilateral import Quadrilateral -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.parsing.custom.classification import ClassificationField -from mindee.parsing.custom.list import ListField, ListFieldValue -from mindee.product.custom.custom_v1 import CustomV1 -from mindee.product.custom.custom_v1_document import CustomV1Document -from mindee.product.custom.custom_v1_page import CustomV1Page +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.parsing.custom import ClassificationField +from mindee.v1.parsing.custom import ListField, ListFieldValue +from mindee.v1.product.custom.custom_v1 import CustomV1 +from mindee.v1.product.custom.custom_v1_document import CustomV1Document +from mindee.v1.product.custom.custom_v1_page import CustomV1Page from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/financial_document/test_financial_document_v1.py b/tests/v1/product/financial_document/test_financial_document_v1.py index 5fa5b4b1..a60b6558 100644 --- a/tests/v1/product/financial_document/test_financial_document_v1.py +++ b/tests/v1/product/financial_document/test_financial_document_v1.py @@ -2,10 +2,12 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.financial_document.financial_document_v1 import FinancialDocumentV1 -from mindee.product.financial_document.financial_document_v1_document import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.financial_document.financial_document_v1 import ( + FinancialDocumentV1, +) +from mindee.v1.product.financial_document.financial_document_v1_document import ( FinancialDocumentV1Document, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/financial_document/test_financial_document_v1_regression.py b/tests/v1/product/financial_document/test_financial_document_v1_regression.py index 59396583..a08f9cc1 100644 --- a/tests/v1/product/financial_document/test_financial_document_v1_regression.py +++ b/tests/v1/product/financial_document/test_financial_document_v1_regression.py @@ -1,7 +1,9 @@ import pytest -from mindee.client import Client -from mindee.product.financial_document.financial_document_v1 import FinancialDocumentV1 +from mindee.v1.client import Client +from mindee.v1.product.financial_document.financial_document_v1 import ( + FinancialDocumentV1, +) from tests.utils import V1_PRODUCT_DATA_DIR from tests.v1.product import get_id, get_version diff --git a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1.py b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1.py index d6649163..c9fcecb6 100644 --- a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1.py +++ b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1.py @@ -2,12 +2,12 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.fr.bank_account_details.bank_account_details_v1 import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.fr.bank_account_details.bank_account_details_v1 import ( BankAccountDetailsV1, ) -from mindee.product.fr.bank_account_details.bank_account_details_v1_document import ( +from mindee.v1.product.fr.bank_account_details.bank_account_details_v1_document import ( BankAccountDetailsV1Document, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1_regression.py b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1_regression.py index 8a452d7f..11fa0940 100644 --- a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1_regression.py +++ b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.fr.bank_account_details.bank_account_details_v1 import ( +from mindee.v1.client import Client +from mindee.v1.product.fr.bank_account_details.bank_account_details_v1 import ( BankAccountDetailsV1, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2.py b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2.py index 56e29397..2bb9678e 100644 --- a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2.py +++ b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2.py @@ -2,12 +2,12 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.fr.bank_account_details.bank_account_details_v2 import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.fr.bank_account_details.bank_account_details_v2 import ( BankAccountDetailsV2, ) -from mindee.product.fr.bank_account_details.bank_account_details_v2_document import ( +from mindee.v1.product.fr.bank_account_details.bank_account_details_v2_document import ( BankAccountDetailsV2Document, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2_regression.py b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2_regression.py index 66ded383..e65d1d4c 100644 --- a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2_regression.py +++ b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.fr.bank_account_details.bank_account_details_v2 import ( +from mindee.v1.client import Client +from mindee.v1.product.fr.bank_account_details.bank_account_details_v2 import ( BankAccountDetailsV2, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/fr/carte_grise/test_carte_grise_v1.py b/tests/v1/product/fr/carte_grise/test_carte_grise_v1.py index f643a8f9..4aa556e3 100644 --- a/tests/v1/product/fr/carte_grise/test_carte_grise_v1.py +++ b/tests/v1/product/fr/carte_grise/test_carte_grise_v1.py @@ -2,10 +2,10 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.fr.carte_grise.carte_grise_v1 import CarteGriseV1 -from mindee.product.fr.carte_grise.carte_grise_v1_document import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.fr.carte_grise.carte_grise_v1 import CarteGriseV1 +from mindee.v1.product.fr.carte_grise.carte_grise_v1_document import ( CarteGriseV1Document, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/fr/carte_grise/test_carte_grise_v1_regression.py b/tests/v1/product/fr/carte_grise/test_carte_grise_v1_regression.py index b4b3380f..56fbbb45 100644 --- a/tests/v1/product/fr/carte_grise/test_carte_grise_v1_regression.py +++ b/tests/v1/product/fr/carte_grise/test_carte_grise_v1_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.fr.carte_grise.carte_grise_v1 import CarteGriseV1 +from mindee.v1.client import Client +from mindee.v1.product.fr.carte_grise.carte_grise_v1 import CarteGriseV1 from tests.utils import V1_PRODUCT_DATA_DIR from tests.v1.product import get_id, get_version diff --git a/tests/v1/product/fr/id_card/test_id_card_v1.py b/tests/v1/product/fr/id_card/test_id_card_v1.py index 84507a3d..7cdb57d7 100644 --- a/tests/v1/product/fr/id_card/test_id_card_v1.py +++ b/tests/v1/product/fr/id_card/test_id_card_v1.py @@ -2,13 +2,13 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.fr.id_card.id_card_v1 import IdCardV1 -from mindee.product.fr.id_card.id_card_v1_document import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.fr.id_card.id_card_v1 import IdCardV1 +from mindee.v1.product.fr.id_card.id_card_v1_document import ( IdCardV1Document, ) -from mindee.product.fr.id_card.id_card_v1_page import ( +from mindee.v1.product.fr.id_card.id_card_v1_page import ( IdCardV1Page, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/fr/id_card/test_id_card_v1_regression.py b/tests/v1/product/fr/id_card/test_id_card_v1_regression.py index 00bb5588..ab1986bb 100644 --- a/tests/v1/product/fr/id_card/test_id_card_v1_regression.py +++ b/tests/v1/product/fr/id_card/test_id_card_v1_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.fr.id_card.id_card_v1 import IdCardV1 +from mindee.v1.client import Client +from mindee.v1.product.fr.id_card.id_card_v1 import IdCardV1 from tests.utils import V1_PRODUCT_DATA_DIR from tests.v1.product import get_id, get_version diff --git a/tests/v1/product/fr/id_card/test_id_card_v2.py b/tests/v1/product/fr/id_card/test_id_card_v2.py index a603e275..116ebb4d 100644 --- a/tests/v1/product/fr/id_card/test_id_card_v2.py +++ b/tests/v1/product/fr/id_card/test_id_card_v2.py @@ -2,13 +2,13 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.fr.id_card.id_card_v2 import IdCardV2 -from mindee.product.fr.id_card.id_card_v2_document import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.fr.id_card.id_card_v2 import IdCardV2 +from mindee.v1.product.fr.id_card.id_card_v2_document import ( IdCardV2Document, ) -from mindee.product.fr.id_card.id_card_v2_page import ( +from mindee.v1.product.fr.id_card.id_card_v2_page import ( IdCardV2Page, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/fr/id_card/test_id_card_v2_regression.py b/tests/v1/product/fr/id_card/test_id_card_v2_regression.py index b44b14b8..6f29a5d1 100644 --- a/tests/v1/product/fr/id_card/test_id_card_v2_regression.py +++ b/tests/v1/product/fr/id_card/test_id_card_v2_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.fr.id_card.id_card_v2 import IdCardV2 +from mindee.v1.client import Client +from mindee.v1.product.fr.id_card.id_card_v2 import IdCardV2 from tests.utils import V1_PRODUCT_DATA_DIR from tests.v1.product import get_id, get_version diff --git a/tests/v1/product/generated/test_generated_v1.py b/tests/v1/product/generated/test_generated_v1.py index f5a1f465..8aa6d332 100644 --- a/tests/v1/product/generated/test_generated_v1.py +++ b/tests/v1/product/generated/test_generated_v1.py @@ -2,15 +2,15 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.parsing.generated.generated_list import GeneratedListField -from mindee.parsing.generated.generated_object import GeneratedObjectField -from mindee.parsing.standard.position import PositionField -from mindee.parsing.standard.text import StringField -from mindee.product.generated.generated_v1 import GeneratedV1 -from mindee.product.generated.generated_v1_document import GeneratedV1Document -from mindee.product.generated.generated_v1_page import GeneratedV1Page +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.parsing.generated import GeneratedListField +from mindee.v1.parsing.generated import GeneratedObjectField +from mindee.v1.parsing.standard import PositionField +from mindee.v1.parsing.standard.text import StringField +from mindee.v1.product.generated import GeneratedV1 +from mindee.v1.product.generated import GeneratedV1Document +from mindee.v1.product.generated.generated_v1_page import GeneratedV1Page from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/international_id/test_international_id_v2.py b/tests/v1/product/international_id/test_international_id_v2.py index cd09a400..e334da9b 100644 --- a/tests/v1/product/international_id/test_international_id_v2.py +++ b/tests/v1/product/international_id/test_international_id_v2.py @@ -2,10 +2,10 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.international_id.international_id_v2 import InternationalIdV2 -from mindee.product.international_id.international_id_v2_document import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.international_id import InternationalIdV2 +from mindee.v1.product.international_id.international_id_v2_document import ( InternationalIdV2Document, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/invoice/test_invoice_v4.py b/tests/v1/product/invoice/test_invoice_v4.py index d63614e3..706cc73b 100644 --- a/tests/v1/product/invoice/test_invoice_v4.py +++ b/tests/v1/product/invoice/test_invoice_v4.py @@ -2,10 +2,10 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.invoice.invoice_v4 import InvoiceV4 -from mindee.product.invoice.invoice_v4_document import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 +from mindee.v1.product.invoice.invoice_v4_document import ( InvoiceV4Document, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/invoice/test_invoice_v4_regression.py b/tests/v1/product/invoice/test_invoice_v4_regression.py index 7dd012ca..c29d2887 100644 --- a/tests/v1/product/invoice/test_invoice_v4_regression.py +++ b/tests/v1/product/invoice/test_invoice_v4_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.invoice.invoice_v4 import InvoiceV4 +from mindee.v1.client import Client +from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 from tests.utils import V1_PRODUCT_DATA_DIR from tests.v1.product import get_id, get_version diff --git a/tests/v1/product/invoice_splitter/test_invoice_splitter_v1.py b/tests/v1/product/invoice_splitter/test_invoice_splitter_v1.py index aeb62c65..ef34e745 100644 --- a/tests/v1/product/invoice_splitter/test_invoice_splitter_v1.py +++ b/tests/v1/product/invoice_splitter/test_invoice_splitter_v1.py @@ -2,10 +2,10 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 -from mindee.product.invoice_splitter.invoice_splitter_v1_document import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 +from mindee.v1.product.invoice_splitter.invoice_splitter_v1_document import ( InvoiceSplitterV1Document, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/invoice_splitter/test_invoice_splitter_v1_regression.py b/tests/v1/product/invoice_splitter/test_invoice_splitter_v1_regression.py index 7908fa7f..277f5214 100644 --- a/tests/v1/product/invoice_splitter/test_invoice_splitter_v1_regression.py +++ b/tests/v1/product/invoice_splitter/test_invoice_splitter_v1_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 +from mindee.v1.client import Client +from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 from tests.utils import V1_PRODUCT_DATA_DIR from tests.v1.product import get_id, get_version diff --git a/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1.py b/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1.py index 0a6ed38e..27d41d69 100644 --- a/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1.py +++ b/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1.py @@ -2,12 +2,12 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.multi_receipts_detector.multi_receipts_detector_v1 import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1 import ( MultiReceiptsDetectorV1, ) -from mindee.product.multi_receipts_detector.multi_receipts_detector_v1_document import ( +from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1_document import ( MultiReceiptsDetectorV1Document, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1_regression.py b/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1_regression.py index 5c94f1bc..0c221973 100644 --- a/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1_regression.py +++ b/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.multi_receipts_detector.multi_receipts_detector_v1 import ( +from mindee.v1.client import Client +from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1 import ( MultiReceiptsDetectorV1, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/passport/test_passport_v1.py b/tests/v1/product/passport/test_passport_v1.py index 690fefed..a34286f4 100644 --- a/tests/v1/product/passport/test_passport_v1.py +++ b/tests/v1/product/passport/test_passport_v1.py @@ -2,10 +2,10 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.passport.passport_v1 import PassportV1 -from mindee.product.passport.passport_v1_document import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.passport import PassportV1 +from mindee.v1.product.passport.passport_v1_document import ( PassportV1Document, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/passport/test_passport_v1_regression.py b/tests/v1/product/passport/test_passport_v1_regression.py index 836a639b..0c95e07a 100644 --- a/tests/v1/product/passport/test_passport_v1_regression.py +++ b/tests/v1/product/passport/test_passport_v1_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.passport.passport_v1 import PassportV1 +from mindee.v1.client import Client +from mindee.v1.product.passport import PassportV1 from tests.utils import V1_PRODUCT_DATA_DIR from tests.v1.product import get_id, get_version diff --git a/tests/v1/product/receipt/test_receipt_v5.py b/tests/v1/product/receipt/test_receipt_v5.py index 807d32e3..b24a738e 100644 --- a/tests/v1/product/receipt/test_receipt_v5.py +++ b/tests/v1/product/receipt/test_receipt_v5.py @@ -2,10 +2,10 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.receipt.receipt_v5 import ReceiptV5 -from mindee.product.receipt.receipt_v5_document import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.receipt.receipt_v5 import ReceiptV5 +from mindee.v1.product.receipt.receipt_v5_document import ( ReceiptV5Document, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/receipt/test_receipt_v5_regression.py b/tests/v1/product/receipt/test_receipt_v5_regression.py index 7279c997..7792d8e1 100644 --- a/tests/v1/product/receipt/test_receipt_v5_regression.py +++ b/tests/v1/product/receipt/test_receipt_v5_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.receipt.receipt_v5 import ReceiptV5 +from mindee.v1.client import Client +from mindee.v1.product.receipt.receipt_v5 import ReceiptV5 from tests.utils import V1_PRODUCT_DATA_DIR from tests.v1.product import get_id, get_version diff --git a/tests/v1/product/us/bank_check/test_bank_check_v1.py b/tests/v1/product/us/bank_check/test_bank_check_v1.py index 087f2d82..422a78eb 100644 --- a/tests/v1/product/us/bank_check/test_bank_check_v1.py +++ b/tests/v1/product/us/bank_check/test_bank_check_v1.py @@ -2,13 +2,13 @@ import pytest -from mindee.parsing.common.document import Document -from mindee.parsing.common.page import Page -from mindee.product.us.bank_check.bank_check_v1 import BankCheckV1 -from mindee.product.us.bank_check.bank_check_v1_document import ( +from mindee.v1.parsing.common import Document +from mindee.v1.parsing.common.page import Page +from mindee.v1.product.us.bank_check.bank_check_v1 import BankCheckV1 +from mindee.v1.product.us.bank_check import ( BankCheckV1Document, ) -from mindee.product.us.bank_check.bank_check_v1_page import ( +from mindee.v1.product.us.bank_check.bank_check_v1_page import ( BankCheckV1Page, ) from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/product/us/bank_check/test_bank_check_v1_regression.py b/tests/v1/product/us/bank_check/test_bank_check_v1_regression.py index 58deddb0..9063e712 100644 --- a/tests/v1/product/us/bank_check/test_bank_check_v1_regression.py +++ b/tests/v1/product/us/bank_check/test_bank_check_v1_regression.py @@ -1,7 +1,7 @@ import pytest -from mindee.client import Client -from mindee.product.us.bank_check.bank_check_v1 import BankCheckV1 +from mindee.v1.client import Client +from mindee.v1.product.us.bank_check.bank_check_v1 import BankCheckV1 from tests.utils import V1_PRODUCT_DATA_DIR from tests.v1.product import get_id, get_version diff --git a/tests/v1/test_client.py b/tests/v1/test_client.py index 923f6416..62f2ffb6 100644 --- a/tests/v1/test_client.py +++ b/tests/v1/test_client.py @@ -2,16 +2,22 @@ import pytest -from mindee import AsyncPredictResponse, Client, PageOptions, PredictResponse, product +from mindee.v1 import ( + AsyncPredictResponse, + Client, + PageOptions, + PredictResponse, + product, +) from mindee.error.mindee_error import MindeeClientError, MindeeError from mindee.error.mindee_http_error import MindeeHTTPError from mindee.input.local_response import LocalResponse from mindee.input.sources.local_input_source import LocalInputSource -from mindee.product import MultiReceiptsDetectorV1 -from mindee.product.international_id.international_id_v2 import InternationalIdV2 -from mindee.product.invoice.invoice_v4 import InvoiceV4 -from mindee.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 -from mindee.product.receipt.receipt_v5 import ReceiptV5 +from mindee.v1.product import MultiReceiptsDetectorV1 +from mindee.v1.product.international_id import InternationalIdV2 +from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 +from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 +from mindee.v1.product.receipt.receipt_v5 import ReceiptV5 from tests.utils import ( FILE_TYPES_DIR, V1_PRODUCT_DATA_DIR, diff --git a/tests/v1/workflows/test_workflow.py b/tests/v1/workflows/test_workflow.py index 74c74034..ee810541 100644 --- a/tests/v1/workflows/test_workflow.py +++ b/tests/v1/workflows/test_workflow.py @@ -2,8 +2,8 @@ import pytest -from mindee.parsing.common.workflow_response import WorkflowResponse -from mindee.product.generated.generated_v1 import GeneratedV1 +from mindee.v1.parsing.common import WorkflowResponse +from mindee.v1.product.generated import GeneratedV1 from tests.utils import V1_DATA_DIR WORKFLOW_DIR = V1_DATA_DIR / "workflows" diff --git a/tests/v1/workflows/test_workflow_integration.py b/tests/v1/workflows/test_workflow_integration.py index 0fdac38b..954ad7c6 100644 --- a/tests/v1/workflows/test_workflow_integration.py +++ b/tests/v1/workflows/test_workflow_integration.py @@ -3,10 +3,10 @@ import pytest -from mindee import Client +from mindee.v1.client import Client from mindee.input import WorkflowOptions -from mindee.parsing.common.execution_priority import ExecutionPriority -from mindee.product import FinancialDocumentV1, GeneratedV1 +from mindee.v1.parsing.common import ExecutionPriority +from mindee.v1.product import FinancialDocumentV1, GeneratedV1 from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v2/file_operations/test_crop_operation_integration.py b/tests/v2/file_operations/test_crop_operation_integration.py index 2c2e1dca..a95bc67f 100644 --- a/tests/v2/file_operations/test_crop_operation_integration.py +++ b/tests/v2/file_operations/test_crop_operation_integration.py @@ -4,12 +4,12 @@ import pytest from mindee import ( - ClientV2, InferenceParameters, InferenceResponse, CropParameters, CropResponse, ) +from mindee.v1.client import Client from mindee.input.sources.path_input import PathInput from mindee.v2.file_operations.crop import extract_crops from tests.utils import OUTPUT_DIR, V2_PRODUCT_DATA_DIR, cleanup_output_files @@ -27,7 +27,7 @@ def check_findoc_return(findoc_response: InferenceResponse): @pytest.mark.integration def test_image_should_extract_crops(): - client = ClientV2() + client = Client() crop_input = PathInput(V2_PRODUCT_DATA_DIR / "crop" / "default_sample.jpg") response = client.enqueue_and_get_result( CropResponse, @@ -51,7 +51,7 @@ def test_image_should_extract_crops(): ) check_findoc_return(invoice_0) extracted_images.save_all_to_disk(OUTPUT_DIR) - assert os.path.getsize(OUTPUT_DIR / "crop_001.jpg") == 187601 + assert os.path.getsize(OUTPUT_DIR / "crop_001.jpg") in (187601, 199685) assert os.path.getsize(OUTPUT_DIR / "crop_002.jpg") == 197978 diff --git a/tests/v2/file_operations/test_split_operation_integration.py b/tests/v2/file_operations/test_split_operation_integration.py index edc319fa..8b78b24b 100644 --- a/tests/v2/file_operations/test_split_operation_integration.py +++ b/tests/v2/file_operations/test_split_operation_integration.py @@ -3,12 +3,12 @@ import pytest from mindee import ( - ClientV2, InferenceParameters, InferenceResponse, SplitParameters, SplitResponse, ) +from mindee.v1.client import Client from mindee.input.sources.path_input import PathInput from tests.utils import OUTPUT_DIR, V2_PRODUCT_DATA_DIR, cleanup_output_files @@ -25,7 +25,7 @@ def check_findoc_return(findoc_response: InferenceResponse): @pytest.mark.integration def test_pdf_should_extract_splits(): - client = ClientV2() + client = Client() split_input = PathInput(V2_PRODUCT_DATA_DIR / "split" / "default_sample.pdf") response = client.enqueue_and_get_result( SplitResponse, diff --git a/tests/v2/input/test_inference_parameters.py b/tests/v2/input/test_inference_parameters.py index 3f527afa..094888ff 100644 --- a/tests/v2/input/test_inference_parameters.py +++ b/tests/v2/input/test_inference_parameters.py @@ -3,11 +3,9 @@ import pytest from mindee import InferenceParameters -from mindee.input.inference_parameters import ( - DataSchema, - DataSchemaReplace, - DataSchemaField, -) +from mindee.v2.product.extraction.params.data_schema import DataSchema +from mindee.v2.product.extraction.params.data_schema_field import DataSchemaField +from mindee.v2.product.extraction.params.data_schema_replace import DataSchemaReplace from tests.utils import V2_PRODUCT_DATA_DIR expected_data_schema_dict = json.loads( diff --git a/tests/v2/parsing/test_job_response.py b/tests/v2/parsing/test_job_response.py index 022a44c5..9c9afcd5 100644 --- a/tests/v2/parsing/test_job_response.py +++ b/tests/v2/parsing/test_job_response.py @@ -4,7 +4,8 @@ import pytest from mindee import JobResponse -from mindee.parsing.v2 import ErrorItem, ErrorResponse +from mindee.v2.parsing.inference.error_item import ErrorItem +from mindee.v2.parsing.inference.error_response import ErrorResponse from tests.utils import V2_DATA_DIR diff --git a/tests/v2/product/classification/test_classification_integration.py b/tests/v2/product/classification/test_classification_integration.py index a16f1269..1c749bb8 100644 --- a/tests/v2/product/classification/test_classification_integration.py +++ b/tests/v2/product/classification/test_classification_integration.py @@ -2,7 +2,8 @@ import pytest -from mindee import ClientV2, PathInput +from mindee.v1.client import Client +from mindee.input.sources.path_input import PathInput from mindee.v2 import ClassificationParameters, ClassificationResponse from tests.utils import V2_PRODUCT_DATA_DIR @@ -14,15 +15,13 @@ def classification_model_id() -> str: @pytest.fixture(scope="session") -def v2_client() -> ClientV2: - return ClientV2() +def v2_client() -> Client: + return Client() @pytest.mark.integration @pytest.mark.v2 -def test_classification_default_sample( - v2_client: ClientV2, classification_model_id: str -): +def test_classification_default_sample(v2_client: Client, classification_model_id: str): input_source = PathInput( V2_PRODUCT_DATA_DIR / "classification" / "default_sample.jpg" ) diff --git a/tests/v2/product/crop/test_crop_integration.py b/tests/v2/product/crop/test_crop_integration.py index 1b0032c5..db707cc9 100644 --- a/tests/v2/product/crop/test_crop_integration.py +++ b/tests/v2/product/crop/test_crop_integration.py @@ -2,7 +2,8 @@ import pytest -from mindee import ClientV2, PathInput +from mindee.v1.client import Client +from mindee.input.sources.path_input import PathInput from mindee.v2 import CropParameters, CropResponse from tests.utils import V2_PRODUCT_DATA_DIR @@ -14,13 +15,13 @@ def crop_model_id() -> str: @pytest.fixture(scope="session") -def v2_client() -> ClientV2: - return ClientV2() +def v2_client() -> Client: + return Client() @pytest.mark.integration @pytest.mark.v2 -def test_crop_default_sample(v2_client: ClientV2, crop_model_id: str): +def test_crop_default_sample(v2_client: Client, crop_model_id: str): input_source = PathInput(V2_PRODUCT_DATA_DIR / "crop" / "default_sample.jpg") response = v2_client.enqueue_and_get_result( CropResponse, input_source, CropParameters(crop_model_id) diff --git a/tests/v2/product/extraction/test_extraction_response.py b/tests/v2/product/extraction/test_extraction_response.py index 3d0a06a3..b35124ea 100644 --- a/tests/v2/product/extraction/test_extraction_response.py +++ b/tests/v2/product/extraction/test_extraction_response.py @@ -3,16 +3,16 @@ import pytest from mindee import InferenceResponse -from mindee.parsing.v2 import InferenceActiveOptions -from mindee.parsing.v2.field.field_confidence import FieldConfidence -from mindee.parsing.v2.field.list_field import ListField -from mindee.parsing.v2.field.object_field import ObjectField -from mindee.parsing.v2.field.simple_field import SimpleField -from mindee.parsing.v2.field.inference_fields import InferenceFields -from mindee.parsing.v2.inference import Inference -from mindee.parsing.v2.inference_file import InferenceFile -from mindee.parsing.v2.inference_model import InferenceModel -from mindee.parsing.v2.rag_metadata import RagMetadata +from mindee.v2.parsing.inference.inference_active_options import InferenceActiveOptions +from mindee.v2.parsing.inference.field import FieldConfidence +from mindee.v2.parsing.inference.field import ListField +from mindee.v2.parsing.inference.field.object_field import ObjectField +from mindee.v2.parsing.inference.field.simple_field import SimpleField +from mindee.v2.parsing.inference.field import InferenceFields +from mindee.v2.product.extraction.inference import Inference +from mindee.v2.parsing.inference.inference_file import InferenceFile +from mindee.v2.parsing.inference.inference_model import InferenceModel +from mindee.v2.parsing.inference.rag_metadata import RagMetadata from tests.utils import V2_PRODUCT_DATA_DIR from tests.v2.product.utils import get_product_samples diff --git a/tests/v2/product/ocr/test_ocr_integration.py b/tests/v2/product/ocr/test_ocr_integration.py index abd3362c..b9f94666 100644 --- a/tests/v2/product/ocr/test_ocr_integration.py +++ b/tests/v2/product/ocr/test_ocr_integration.py @@ -2,7 +2,8 @@ import pytest -from mindee import ClientV2, PathInput +from mindee.v1.client import Client +from mindee.input.sources.path_input import PathInput from mindee.v2 import OCRParameters, OCRResponse from mindee.v2.product.ocr import OCRInference, OCRResult from tests.utils import V2_PRODUCT_DATA_DIR @@ -15,13 +16,13 @@ def ocr_model_id() -> str: @pytest.fixture(scope="session") -def v2_client() -> ClientV2: - return ClientV2() +def v2_client() -> Client: + return Client() @pytest.mark.integration @pytest.mark.v2 -def test_ocr_default_sample(v2_client: ClientV2, ocr_model_id: str): +def test_ocr_default_sample(v2_client: Client, ocr_model_id: str): input_source = PathInput(V2_PRODUCT_DATA_DIR / "ocr" / "default_sample.jpg") response = v2_client.enqueue_and_get_result( OCRResponse, input_source, OCRParameters(ocr_model_id) diff --git a/tests/v2/product/split/test_split_integration.py b/tests/v2/product/split/test_split_integration.py index b0e1c83f..daf2f2ef 100644 --- a/tests/v2/product/split/test_split_integration.py +++ b/tests/v2/product/split/test_split_integration.py @@ -2,7 +2,8 @@ import pytest -from mindee import ClientV2, PathInput +from mindee.v1.client import Client +from mindee.input.sources.path_input import PathInput from mindee.v2 import SplitParameters, SplitResponse from tests.utils import V2_PRODUCT_DATA_DIR @@ -14,13 +15,13 @@ def split_model_id() -> str: @pytest.fixture(scope="session") -def v2_client() -> ClientV2: - return ClientV2() +def v2_client() -> Client: + return Client() @pytest.mark.integration @pytest.mark.v2 -def test_split_default_sample(v2_client: ClientV2, split_model_id: str): +def test_split_default_sample(v2_client: Client, split_model_id: str): input_source = PathInput(V2_PRODUCT_DATA_DIR / "split" / "default_sample.pdf") response = v2_client.enqueue_and_get_result( SplitResponse, input_source, SplitParameters(split_model_id) diff --git a/tests/v2/test_base_classes.py b/tests/v2/test_base_classes.py index 77f28911..3a95966e 100644 --- a/tests/v2/test_base_classes.py +++ b/tests/v2/test_base_classes.py @@ -1,8 +1,8 @@ -from mindee.parsing.v2.base_inference import BaseInference -from mindee.parsing.v2.base_response import BaseResponse -from mindee.parsing.v2.inference_file import InferenceFile -from mindee.parsing.v2.inference_job import InferenceJob -from mindee.parsing.v2.inference_model import InferenceModel +from mindee.v2.parsing.inference.base_inference import BaseInference +from mindee.v2.parsing.inference.base_response import BaseResponse +from mindee.v2.parsing.inference.inference_file import InferenceFile +from mindee.v2.parsing.inference.inference_job import InferenceJob +from mindee.v2.parsing.inference.inference_model import InferenceModel def test_inference_job(): diff --git a/tests/v2/test_client.py b/tests/v2/test_client.py index 5eb0d3fa..f30c1915 100644 --- a/tests/v2/test_client.py +++ b/tests/v2/test_client.py @@ -3,26 +3,27 @@ import pytest -from mindee import ClientV2, InferenceParameters, InferenceResponse, LocalResponse +from mindee import InferenceParameters, InferenceResponse, LocalResponse +from mindee.v2.client import Client from mindee.error.mindee_error import MindeeApiV2Error, MindeeError -from mindee.error.mindee_http_error_v2 import MindeeHTTPErrorV2 +from mindee.error.v2.mindee_http_error_v2 import MindeeHTTPErrorV2 from mindee.input.sources.local_input_source import LocalInputSource from mindee.input.sources.path_input import PathInput from mindee.mindee_http.base_settings import USER_AGENT -from mindee.parsing.v2.inference import Inference -from mindee.parsing.v2.job import Job -from mindee.parsing.v2.job_response import JobResponse +from mindee.v2.product.extraction.inference import Inference +from mindee.v2.parsing.inference.job import Job +from mindee.v2.parsing.inference.job_response import JobResponse from tests.utils import FILE_TYPES_DIR, V2_PRODUCT_DATA_DIR, V2_DATA_DIR, dummy_envvars @pytest.fixture -def env_client(monkeypatch) -> ClientV2: +def env_client(monkeypatch) -> Client: dummy_envvars(monkeypatch) - return ClientV2("dummy") + return Client("dummy") @pytest.fixture -def custom_base_url_client(monkeypatch) -> ClientV2: +def custom_base_url_client(monkeypatch) -> Client: class _FakePostRespError: status_code = 400 # any non-2xx will do ok = False @@ -102,7 +103,7 @@ def _fake_ok_get_inference(*args, **kwargs): raising=True, ) - return ClientV2("dummy") + return Client("dummy") @pytest.fixture @@ -114,7 +115,7 @@ def env_no_key(monkeypatch): @pytest.mark.v2 def test_parse_path_without_token(env_no_key): with pytest.raises(MindeeApiV2Error): - ClientV2() + Client() @pytest.mark.v2 diff --git a/tests/v2/test_client_integration.py b/tests/v2/test_client_integration.py index 42c7605f..9b130193 100644 --- a/tests/v2/test_client_integration.py +++ b/tests/v2/test_client_integration.py @@ -3,10 +3,13 @@ import pytest -from mindee import ClientV2, InferenceParameters, PathInput, UrlInputSource -from mindee.error.mindee_http_error_v2 import MindeeHTTPErrorV2 -from mindee.parsing.v2 import InferenceActiveOptions -from mindee.parsing.v2.inference_response import InferenceResponse +from mindee import InferenceParameters +from mindee.v1.client import Client +from mindee.input.sources.path_input import PathInput +from mindee.input.sources.url_input_source import UrlInputSource +from mindee.error.v2.mindee_http_error_v2 import MindeeHTTPErrorV2 +from mindee.v2.parsing import InferenceActiveOptions +from mindee.v2.product.extraction.inference_response import InferenceResponse from tests.utils import FILE_TYPES_DIR, V2_PRODUCT_DATA_DIR @@ -17,8 +20,8 @@ def findoc_model_id() -> str: @pytest.fixture(scope="session") -def v2_client() -> ClientV2: - return ClientV2() +def v2_client() -> Client: + return Client() def _basic_assert_success( @@ -40,7 +43,7 @@ def _basic_assert_success( @pytest.mark.integration @pytest.mark.v2 def test_parse_file_empty_multiple_pages_must_succeed( - v2_client: ClientV2, findoc_model_id: str + v2_client: Client, findoc_model_id: str ) -> None: """ Upload a 2-page almost blank PDF and make sure the returned inference contains the @@ -83,7 +86,7 @@ def test_parse_file_empty_multiple_pages_must_succeed( @pytest.mark.integration @pytest.mark.v2 def test_parse_file_empty_single_page_options_must_succeed( - v2_client: ClientV2, findoc_model_id: str + v2_client: Client, findoc_model_id: str ) -> None: """ Upload a blank PDF and make sure the options are set correctly. @@ -118,7 +121,7 @@ def test_parse_file_empty_single_page_options_must_succeed( @pytest.mark.integration @pytest.mark.v2 def test_parse_file_filled_single_page_must_succeed( - v2_client: ClientV2, findoc_model_id: str + v2_client: Client, findoc_model_id: str ) -> None: """ Upload a filled single-page JPEG and verify that common fields are present. @@ -168,7 +171,7 @@ def test_parse_file_filled_single_page_must_succeed( @pytest.mark.integration @pytest.mark.v2 -def test_invalid_uuid_must_throw_error(v2_client: ClientV2) -> None: +def test_invalid_uuid_must_throw_error(v2_client: Client) -> None: """ Using an invalid model identifier must trigger a 422 HTTP error. """ @@ -191,7 +194,7 @@ def test_invalid_uuid_must_throw_error(v2_client: ClientV2) -> None: @pytest.mark.integration @pytest.mark.v2 -def test_unknown_model_must_throw_error(v2_client: ClientV2) -> None: +def test_unknown_model_must_throw_error(v2_client: Client) -> None: """ Using an unknown model identifier must trigger a 404 HTTP error. """ @@ -213,7 +216,7 @@ def test_unknown_model_must_throw_error(v2_client: ClientV2) -> None: @pytest.mark.integration @pytest.mark.v2 def test_unknown_webhook_ids_must_throw_error( - v2_client: ClientV2, findoc_model_id: str + v2_client: Client, findoc_model_id: str ) -> None: """ Using an unknown webhook identifier must trigger an error. @@ -247,7 +250,7 @@ def test_unknown_webhook_ids_must_throw_error( @pytest.mark.integration @pytest.mark.v2 def test_blank_url_input_source_must_succeed( - v2_client: ClientV2, + v2_client: Client, findoc_model_id: str, ) -> None: """ @@ -274,7 +277,7 @@ def test_blank_url_input_source_must_succeed( @pytest.mark.integration @pytest.mark.v2 def test_data_schema_must_succeed( - v2_client: ClientV2, + v2_client: Client, findoc_model_id: str, ) -> None: """ From 31e54c14f82ed45e76d7f6edff7e896514bbfc0a Mon Sep 17 00:00:00 2001 From: sebastianMindee <130448732+sebastianMindee@users.noreply.github.com> Date: Mon, 1 Jun 2026 16:06:00 +0200 Subject: [PATCH 04/10] :boom: :recycle: rename inference product to extraction and move internals --- .gitignore | 1 + .../extras/code_samples/v2_classification.txt | 12 +- docs/extras/code_samples/v2_crop.txt | 12 +- docs/extras/code_samples/v2_extraction.txt | 18 +-- docs/extras/code_samples/v2_ocr.txt | 12 +- docs/extras/code_samples/v2_split.txt | 12 +- mindee/__init__.py | 15 ++- mindee/client_mixin.py | 22 ++-- mindee/error/mindee_http_error.py | 12 +- mindee/error/v2/mindee_http_error_v2.py | 2 +- mindee/extraction/common/extracted_image.py | 10 +- mindee/extraction/common/image_extractor.py | 28 ++--- .../multi_receipts_extractor.py | 4 +- .../extraction/pdf_extractor/extracted_pdf.py | 3 +- .../extraction/pdf_extractor/pdf_extractor.py | 8 +- mindee/geometry/bbox.py | 6 +- mindee/geometry/minmax.py | 4 +- mindee/geometry/polygon.py | 16 +-- mindee/geometry/polygon_utils.py | 14 +-- mindee/geometry/quadrilateral.py | 4 +- mindee/image_operations/image_compressor.py | 8 +- mindee/input/local_response.py | 8 +- mindee/input/sources/base_64_input.py | 4 +- mindee/input/sources/bytes_input.py | 4 +- mindee/input/sources/file_input.py | 2 +- mindee/input/sources/local_input_source.py | 16 +-- mindee/input/sources/path_input.py | 2 +- mindee/input/sources/url_input_source.py | 56 ++++----- mindee/mindee_http/base_endpoint.py | 2 +- mindee/mindee_http/endpoint.py | 60 +++++----- mindee/mindee_http/mindee_api_v2.py | 12 +- mindee/mindee_http/response_validation.py | 6 +- mindee/mindee_http/response_validation_v2.py | 4 +- mindee/mindee_http/workflow_endpoint.py | 6 +- mindee/pdf/pdf_compressor.py | 34 +++--- mindee/pdf/pdf_utils.py | 62 +++++----- mindee/v1/client.py | 108 +++++++++--------- .../parsing/common/async_predict_response.py | 4 +- mindee/v1/parsing/common/extras/extras.py | 2 +- mindee/v1/parsing/common/inference.py | 2 +- mindee/v1/parsing/common/job.py | 2 +- mindee/v1/parsing/common/orientation.py | 8 +- mindee/v1/parsing/common/predict_response.py | 4 +- mindee/v1/parsing/common/prediction.py | 4 +- mindee/v1/parsing/custom/line_items.py | 16 +-- mindee/v1/parsing/custom/list.py | 2 +- mindee/v1/parsing/generated/generated_list.py | 2 +- .../v1/parsing/generated/generated_object.py | 4 +- mindee/v1/parsing/standard/address.py | 6 +- mindee/v1/parsing/standard/amount.py | 6 +- mindee/v1/parsing/standard/base.py | 18 +-- mindee/v1/parsing/standard/boolean.py | 8 +- mindee/v1/parsing/standard/classification.py | 8 +- mindee/v1/parsing/standard/date.py | 6 +- mindee/v1/parsing/standard/locale.py | 6 +- mindee/v1/parsing/standard/payment_details.py | 16 +-- mindee/v1/parsing/standard/position.py | 8 +- mindee/v1/parsing/standard/tax.py | 8 +- mindee/v1/parsing/standard/text.py | 8 +- .../barcode_reader/barcode_reader_v1.py | 2 +- .../barcode_reader_v1_document.py | 4 +- mindee/v1/product/cropper/cropper_v1.py | 2 +- mindee/v1/product/cropper/cropper_v1_page.py | 4 +- mindee/v1/product/custom/custom_v1.py | 2 +- .../v1/product/custom/custom_v1_document.py | 8 +- mindee/v1/product/custom/custom_v1_page.py | 8 +- .../financial_document_v1.py | 2 +- .../financial_document_v1_document.py | 4 +- .../bank_account_details_v1.py | 2 +- .../bank_account_details_v1_document.py | 4 +- .../bank_account_details_v2.py | 2 +- .../bank_account_details_v2_document.py | 4 +- .../product/fr/carte_grise/carte_grise_v1.py | 2 +- .../fr/carte_grise/carte_grise_v1_document.py | 4 +- mindee/v1/product/fr/id_card/id_card_v1.py | 2 +- .../product/fr/id_card/id_card_v1_document.py | 4 +- .../v1/product/fr/id_card/id_card_v1_page.py | 4 +- mindee/v1/product/fr/id_card/id_card_v2.py | 2 +- .../product/fr/id_card/id_card_v2_document.py | 4 +- .../v1/product/fr/id_card/id_card_v2_page.py | 4 +- mindee/v1/product/generated/generated_v1.py | 2 +- .../generated/generated_v1_document.py | 2 +- .../v1/product/generated/generated_v1_page.py | 2 +- .../generated/generated_v1_prediction.py | 2 +- .../international_id/international_id_v2.py | 2 +- .../international_id_v2_document.py | 4 +- mindee/v1/product/invoice/invoice_v4.py | 2 +- .../v1/product/invoice/invoice_v4_document.py | 4 +- .../invoice_splitter/invoice_splitter_v1.py | 2 +- .../invoice_splitter_v1_document.py | 4 +- .../multi_receipts_detector_v1.py | 2 +- .../multi_receipts_detector_v1_document.py | 4 +- mindee/v1/product/passport/passport_v1.py | 2 +- .../product/passport/passport_v1_document.py | 4 +- mindee/v1/product/receipt/receipt_v5.py | 2 +- .../v1/product/receipt/receipt_v5_document.py | 4 +- .../v1/product/us/bank_check/bank_check_v1.py | 2 +- .../us/bank_check/bank_check_v1_document.py | 4 +- .../us/bank_check/bank_check_v1_page.py | 4 +- mindee/v2/__init__.py | 8 +- mindee/v2/client.py | 42 ++----- mindee/v2/commands/cli_parser.py | 8 +- mindee/v2/file_operations/crop.py | 8 +- mindee/v2/file_operations/crop_files.py | 4 +- mindee/v2/file_operations/split.py | 8 +- mindee/v2/file_operations/split_files.py | 4 +- mindee/v2/parsing/__init__.py | 12 +- .../parsing/inference/field/field_location.py | 2 +- .../parsing/inference/field/object_field.py | 6 +- mindee/v2/product/__init__.py | 2 +- mindee/v2/product/classification/__init__.py | 2 +- .../classification_classifier.py | 6 +- .../product/classification/param/__init__.py | 5 - .../product/classification/params/__init__.py | 5 + .../classification_parameters.py | 0 mindee/v2/product/crop/crop_box.py | 8 +- mindee/v2/product/crop/crop_response.py | 2 +- mindee/v2/product/extraction/__init__.py | 18 +-- .../{inference.py => extraction_inference.py} | 8 +- ...nce_response.py => extraction_response.py} | 8 +- ...ference_result.py => extraction_result.py} | 2 +- .../v2/product/extraction/params/__init__.py | 6 +- ...parameters.py => extraction_parameters.py} | 2 +- mindee/v2/product/split/split_range.py | 8 +- mindee/v2/product/split/split_response.py | 2 +- tests/utils.py | 4 +- .../test_crop_operation_integration.py | 10 +- .../test_split_operation_integration.py | 10 +- tests/v2/input/test_inference_parameters.py | 18 +-- tests/v2/input/test_local_response.py | 8 +- .../test_classification_response.py | 4 +- tests/v2/product/crop/test_crop_response.py | 6 +- .../extraction/test_extraction_response.py | 40 +++---- tests/v2/product/split/test_split_response.py | 6 +- tests/v2/test_client.py | 22 ++-- tests/v2/test_client_integration.py | 42 +++---- 136 files changed, 622 insertions(+), 619 deletions(-) delete mode 100644 mindee/v2/product/classification/param/__init__.py create mode 100644 mindee/v2/product/classification/params/__init__.py rename mindee/v2/product/classification/{param => params}/classification_parameters.py (100%) rename mindee/v2/product/extraction/{inference.py => extraction_inference.py} (79%) rename mindee/v2/product/extraction/{inference_response.py => extraction_response.py} (71%) rename mindee/v2/product/extraction/{inference_result.py => extraction_result.py} (97%) rename mindee/v2/product/extraction/params/{inference_parameters.py => extraction_parameters.py} (98%) diff --git a/.gitignore b/.gitignore index 7c39c10e..53ef3307 100644 --- a/.gitignore +++ b/.gitignore @@ -137,5 +137,6 @@ dmypy.json *.swp *-swp _test.py +_test*.py _test.json local_test diff --git a/docs/extras/code_samples/v2_classification.txt b/docs/extras/code_samples/v2_classification.txt index f064cc33..58874405 100644 --- a/docs/extras/code_samples/v2_classification.txt +++ b/docs/extras/code_samples/v2_classification.txt @@ -1,8 +1,8 @@ -from mindee import ( - ClientV2, - PathInput, - ClassificationParameters, - ClassificationResponse, +from mindee import PathInput +from mindee.v2 import ( + Client, + ClassificationParameters, + ClassificationResponse, ) input_path = "/path/to/the/file.ext" @@ -10,7 +10,7 @@ api_key = "MY_API_KEY" model_id = "MY_MODEL_ID" # Init a new client -mindee_client = ClientV2(api_key) +mindee_client = Client(api_key) # Set parameters params = ClassificationParameters( diff --git a/docs/extras/code_samples/v2_crop.txt b/docs/extras/code_samples/v2_crop.txt index e13a4142..69841d89 100644 --- a/docs/extras/code_samples/v2_crop.txt +++ b/docs/extras/code_samples/v2_crop.txt @@ -1,8 +1,8 @@ -from mindee import ( - ClientV2, - PathInput, - CropParameters, - CropResponse, +from mindee import PathInput +from mindee.v2 import ( + Client, + CropParameters, + CropResponse, ) input_path = "/path/to/the/file.ext" @@ -10,7 +10,7 @@ api_key = "MY_API_KEY" model_id = "MY_MODEL_ID" # Init a new client -mindee_client = ClientV2(api_key) +mindee_client = Client(api_key) # Set parameters params = CropParameters( diff --git a/docs/extras/code_samples/v2_extraction.txt b/docs/extras/code_samples/v2_extraction.txt index 30ecd7a8..5dda5e32 100644 --- a/docs/extras/code_samples/v2_extraction.txt +++ b/docs/extras/code_samples/v2_extraction.txt @@ -1,8 +1,8 @@ -from mindee import ( - ClientV2, - InferenceParameters, - InferenceResponse, - PathInput, +from mindee import PathInput +from mindee.v2 import ( + Client, + ExtractionParameters, + ExtractionResponse, ) input_path = "/path/to/the/file.ext" @@ -10,10 +10,10 @@ api_key = "MY_API_KEY" model_id = "MY_MODEL_ID" # Init a new client -mindee_client = ClientV2(api_key) +mindee_client = Client(api_key) -# Set inference parameters -params = InferenceParameters( +# Set extraction parameters +params = ExtractionParameters( # ID of the model, required. model_id=model_id, @@ -35,7 +35,7 @@ input_source = PathInput(input_path) # Send for processing response = mindee_client.enqueue_and_get_result( - InferenceResponse, + ExtractionResponse, input_source, params, ) diff --git a/docs/extras/code_samples/v2_ocr.txt b/docs/extras/code_samples/v2_ocr.txt index 0c022ea5..061ed7c9 100644 --- a/docs/extras/code_samples/v2_ocr.txt +++ b/docs/extras/code_samples/v2_ocr.txt @@ -1,8 +1,8 @@ -from mindee import ( - ClientV2, - PathInput, - OCRParameters, - OCRResponse, +from mindee import PathInput +from mindee.v2 import ( + Client, + OCRParameters, + OCRResponse, ) input_path = "/path/to/the/file.ext" @@ -10,7 +10,7 @@ api_key = "MY_API_KEY" model_id = "MY_MODEL_ID" # Init a new client -mindee_client = ClientV2(api_key) +mindee_client = Client(api_key) # Set parameters params = OCRParameters( diff --git a/docs/extras/code_samples/v2_split.txt b/docs/extras/code_samples/v2_split.txt index 08511d63..917c1b9e 100644 --- a/docs/extras/code_samples/v2_split.txt +++ b/docs/extras/code_samples/v2_split.txt @@ -1,8 +1,8 @@ -from mindee import ( - ClientV2, - PathInput, - SplitParameters, - SplitResponse, +from mindee import PathInput +from mindee.v2 import ( + Client, + SplitParameters, + SplitResponse, ) input_path = "/path/to/the/file.ext" @@ -10,7 +10,7 @@ api_key = "MY_API_KEY" model_id = "MY_MODEL_ID" # Init a new client -mindee_client = ClientV2(api_key) +mindee_client = Client(api_key) # Set parameters params = SplitParameters( diff --git a/mindee/__init__.py b/mindee/__init__.py index 330cdf0d..09020cd4 100644 --- a/mindee/__init__.py +++ b/mindee/__init__.py @@ -1,6 +1,9 @@ from mindee.v1 import product from mindee.input import LocalResponse, PageOptions, PollingOptions -from mindee.v2.product.extraction.params.inference_parameters import InferenceParameters +from mindee.v2.parsing.inference.job_response import JobResponse +from mindee.v2.product.extraction.params.extraction_parameters import ( + ExtractionParameters, +) from mindee.input.sources import ( Base64Input, BytesInput, @@ -8,8 +11,7 @@ PathInput, UrlInputSource, ) -from mindee.v2.parsing import InferenceResponse, JobResponse -from mindee.v2.product.classification.param.classification_parameters import ( +from mindee.v2.product.classification.params.classification_parameters import ( ClassificationParameters, ) from mindee.v2.product.classification.classification_response import ( @@ -17,6 +19,8 @@ ) from mindee.v2.product.crop.params.crop_parameters import CropParameters from mindee.v2.product.crop.crop_response import CropResponse +from mindee.v2.product.extraction.extraction_response import ExtractionResponse +from mindee.v2.product.extraction.extraction_result import ExtractionResult from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters from mindee.v2.product.ocr.ocr_response import OCRResponse from mindee.v2.product.split.params.split_parameters import SplitParameters @@ -30,8 +34,9 @@ "CropParameters", "CropResponse", "FileInput", - "InferenceParameters", - "InferenceResponse", + "ExtractionParameters", + "ExtractionResponse", + "ExtractionResult", "JobResponse", "LocalResponse", "OCRParameters", diff --git a/mindee/client_mixin.py b/mindee/client_mixin.py index 514a91ac..849e3a35 100644 --- a/mindee/client_mixin.py +++ b/mindee/client_mixin.py @@ -19,8 +19,8 @@ def source_from_path( """ Load a document from a path, as a string or a `Path` object. - :param input_path: Path of file to open - :param fix_pdf: Whether to attempt fixing PDF files before sending. + :params input_path: Path of file to open + :params fix_pdf: Whether to attempt fixing PDF files before sending. Setting this to `True` can modify the data sent to Mindee. """ input_doc = PathInput(input_path) @@ -33,8 +33,8 @@ def source_from_file(input_file: BinaryIO, fix_pdf: bool = False) -> FileInput: """ Load a document from a normal Python file object/handle. - :param input_file: Input file handle - :param fix_pdf: Whether to attempt fixing PDF files before sending. + :params input_file: Input file handle + :params fix_pdf: Whether to attempt fixing PDF files before sending. Setting this to `True` can modify the data sent to Mindee. """ input_doc = FileInput(input_file) @@ -49,9 +49,9 @@ def source_from_b64string( """ Load a document from a base64 encoded string. - :param input_string: Input to parse as base64 string - :param filename: The name of the file (without the path) - :param fix_pdf: Whether to attempt fixing PDF files before sending. + :params input_string: Input to parse as base64 string + :params filename: The name of the file (without the path) + :params fix_pdf: Whether to attempt fixing PDF files before sending. Setting this to `True` can modify the data sent to Mindee. """ input_doc = Base64Input(input_string, filename) @@ -66,9 +66,9 @@ def source_from_bytes( """ Load a document from raw bytes. - :param input_bytes: Raw byte input - :param filename: The name of the file (without the path) - :param fix_pdf: Whether to attempt fixing PDF files before sending. + :params input_bytes: Raw byte input + :params filename: The name of the file (without the path) + :params fix_pdf: Whether to attempt fixing PDF files before sending. Setting this to `True` can modify the data sent to Mindee. """ input_doc = BytesInput(input_bytes, filename) @@ -101,7 +101,7 @@ def source_from_url( """ Load a document from a URL. - :param url: Raw byte input + :params url: Raw byte input """ return UrlInputSource( url, diff --git a/mindee/error/mindee_http_error.py b/mindee/error/mindee_http_error.py index bff2c5d5..c7f75099 100644 --- a/mindee/error/mindee_http_error.py +++ b/mindee/error/mindee_http_error.py @@ -16,9 +16,9 @@ def __init__(self, http_error: StringDict, url: str, code: int) -> None: """ Base exception for HTTP calls. - :param http_error: formatted & parsed error - :param url: url/endpoint the exception was raised on - :param code: HTTP code for the error + :params http_error: formatted & parsed error + :params url: url/endpoint the exception was raised on + :params code: HTTP code for the error """ self.status_code = code self.api_code = http_error["code"] if "code" in http_error else None @@ -33,7 +33,7 @@ def create_error_obj(response: Union[StringDict, str]) -> StringDict: """ Creates an error object based on a requests' payload. - :param response: response as sent by the server, as a dict. + :params response: response as sent by the server, as a dict. In _very_ rare instances, this can be an html string. """ if not isinstance(response, str): @@ -92,8 +92,8 @@ def handle_error(url: str, response: StringDict) -> MindeeHTTPError: """ Creates an appropriate HTTP error exception, based on retrieved HTTP error code. - :param url: url of the product - :param response: StringDict + :params url: url of the product + :params response: StringDict """ error_obj = create_error_obj(response) if not isinstance(response, str) and ( # type: ignore diff --git a/mindee/error/v2/mindee_http_error_v2.py b/mindee/error/v2/mindee_http_error_v2.py index 0d4b73ad..a1b5c9e8 100644 --- a/mindee/error/v2/mindee_http_error_v2.py +++ b/mindee/error/v2/mindee_http_error_v2.py @@ -12,7 +12,7 @@ def __init__(self, response: ErrorResponse) -> None: """ Base exception for HTTP calls. - :param response: + :params response: """ self.status = response.status self.title = response.title diff --git a/mindee/extraction/common/extracted_image.py b/mindee/extraction/common/extracted_image.py index 65acb81c..6fd88743 100644 --- a/mindee/extraction/common/extracted_image.py +++ b/mindee/extraction/common/extracted_image.py @@ -26,9 +26,9 @@ def __init__( """ Initialize the ExtractedImage with a buffer and an internal file name. - :param input_source: Local source for input. - :param page_id: ID of the page the element was found on. - :param element_id: ID of the element in a page. + :params input_source: Local source for input. + :params page_id: ID of the page the element was found on. + :params element_id: ID of the element in a page. """ self.buffer = io.BytesIO(input_source.file_object.read()) self.buffer.name = input_source.filename @@ -52,8 +52,8 @@ def save_to_file( """ Saves the document to a file. - :param output_path: Path to save the file to. - :param file_format: Optional PIL-compatible format for the file. Inferred from file extension if not provided. + :params output_path: Path to save the file to. + :params file_format: Optional PIL-compatible format for the file. Inferred from file extension if not provided. :raises MindeeError: If an invalid path or filename is provided. """ try: diff --git a/mindee/extraction/common/image_extractor.py b/mindee/extraction/common/image_extractor.py index 52c57d0d..08ea11e3 100644 --- a/mindee/extraction/common/image_extractor.py +++ b/mindee/extraction/common/image_extractor.py @@ -18,7 +18,7 @@ def attach_image_as_new_file( # type: ignore """ Attaches an image as a new page in a PdfDocument object. - :param input_buffer: Input buffer. + :params input_buffer: Input buffer. :return: A PdfDocument handle. """ # Create a new page in the PdfDocument @@ -54,11 +54,11 @@ def extract_image_from_polygon( """ Crops the image from the given polygon. - :param page_content: Contents of the page as a Pillow object. - :param polygon: Polygon coordinates for the image. - :param width: Width of the generated image. - :param height: Height of the generated image. - :param file_format: Format for the generated file. + :params page_content: Contents of the page as a Pillow object. + :params polygon: Polygon coordinates for the image. + :params width: Width of the generated image. + :params height: Height of the generated image. + :params file_format: Format for the generated file. :return: A generated image as a buffer. """ min_max_x = get_min_max_x(polygon) @@ -78,8 +78,8 @@ def save_image_to_buffer(image: Image.Image, file_format: str) -> bytes: """ Saves an image as a buffer. - :param image: Pillow wrapper for the image. - :param file_format: Format to save the file as. + :params image: Pillow wrapper for the image. + :params file_format: Format to save the file as. :return: A valid buffer. """ buffer = io.BytesIO() @@ -92,7 +92,7 @@ def determine_file_format(input_source: LocalInputSource) -> str: """ Retrieves the file format from an input source. - :param input_source: Local input source to retrieve the format from. + :params input_source: Local input source to retrieve the format from. :return: A valid pillow file format. """ if input_source.is_pdf(): @@ -107,7 +107,7 @@ def get_file_extension(file_format: str): """ Extract the correct file extension. - :param file_format: Format of the file. + :params file_format: Format of the file. :return: A valid file extension. """ return file_format.lower() if file_format != "JPEG" else "jpg" @@ -121,9 +121,9 @@ def extract_multiple_images_from_source( """ Extracts elements from a page based on a list of bounding boxes. - :param input_source: Local Input source to extract elements from. - :param page_id: id of the page to extract from. - :param polygons: List of coordinates to pull the elements from. + :params input_source: Local Input source to extract elements from. + :params page_id: id of the page to extract from. + :params polygons: List of coordinates to pull the elements from. :return: List of byte arrays representing the extracted elements. """ page = load_pdf_doc(input_source).get_page(page_id) @@ -156,7 +156,7 @@ def load_pdf_doc(input_file: LocalInputSource) -> pdfium.PdfDocument: # type: i """ Loads a PDF document from a local input source. - :param input_file: Local input. + :params input_file: Local input. :return: A valid PdfDocument handle. """ if input_file.is_pdf(): diff --git a/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py b/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py index a5256d9d..e208238a 100644 --- a/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py +++ b/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py @@ -15,8 +15,8 @@ def extract_receipts( """ Extracts individual receipts from multi-receipts documents. - :param input_source: Local Input Source to extract sub-receipts from. - :param inference: Results of the inference. + :params input_source: Local Input Source to extract sub-receipts from. + :params inference: Results of the inference. :return: Individual extracted receipts as an array of ExtractedMultiReceiptsImage. """ images: List[ExtractedImage] = [] diff --git a/mindee/extraction/pdf_extractor/extracted_pdf.py b/mindee/extraction/pdf_extractor/extracted_pdf.py index f58e75e9..521b9f2b 100644 --- a/mindee/extraction/pdf_extractor/extracted_pdf.py +++ b/mindee/extraction/pdf_extractor/extracted_pdf.py @@ -35,7 +35,8 @@ def save_to_file(self, output_path: Union[Path, str]): """ Writes the contents of the current PDF object to a file. - :param output_path: Path of the destination file. If not extension is provided, pdf will be appended by default. + :params output_path: Path of the destination file. If + not extension is provided, pdf will be appended by default. """ out_path = Path(output_path) if out_path.resolve().is_dir(): diff --git a/mindee/extraction/pdf_extractor/pdf_extractor.py b/mindee/extraction/pdf_extractor/pdf_extractor.py index 40fe60a1..7bc93629 100644 --- a/mindee/extraction/pdf_extractor/pdf_extractor.py +++ b/mindee/extraction/pdf_extractor/pdf_extractor.py @@ -35,7 +35,7 @@ def cut_pages(self, page_indexes: List) -> BinaryIO: """ Create a new PDF from pages and save it into a buffer. - :param page_indexes: List of pages number to use for merging in the original PDF. + :params page_indexes: List of pages number to use for merging in the original PDF. :return: The buffer containing the new PDF. """ self._source_pdf.seek(0) @@ -52,7 +52,7 @@ def extract_sub_documents( """ Extract the sub-documents from the main pdf, based on the given list of page indexes. - :param page_indexes: List of list of numbers, representing page indexes. + :params page_indexes: List of list of numbers, representing page indexes. :return: A list of created PDFS. """ extracted_pdfs: List[ExtractedPdf] = [] @@ -80,8 +80,8 @@ def extract_invoices( """ Extracts invoices as complete PDFs from the document. - :param page_indexes: List of sub-lists of pages to keep. - :param strict: Whether to trust confidence scores above 0.5 (included) or not. + :params page_indexes: List of sub-lists of pages to keep. + :params strict: Whether to trust confidence scores above 0.5 (included) or not. :return: A list of extracted invoices. """ if len(page_indexes) < 1: diff --git a/mindee/geometry/bbox.py b/mindee/geometry/bbox.py index 7f3d4153..b7677280 100644 --- a/mindee/geometry/bbox.py +++ b/mindee/geometry/bbox.py @@ -35,7 +35,7 @@ def get_bbox(points: Points) -> BBox: """ Given a sequence of points, calculate a bbox that encompasses all points. - :param points: Polygon to process. + :params points: Polygon to process. :return: A bbox that encompasses all points """ y_min = min(v[1] for v in points) @@ -59,8 +59,8 @@ def extend_bbox(bbox: BBox, points: Points) -> BBox: """ Given a BBox and a sequence of points, calculate the surrounding bbox that encompasses all. - :param bbox: initial BBox to extend. - :param points: Sequence of points to process. Accepts polygons and similar + :params bbox: initial BBox to extend. + :params points: Sequence of points to process. Accepts polygons and similar """ all_points = [] for point in points: diff --git a/mindee/geometry/minmax.py b/mindee/geometry/minmax.py index 0d82b0eb..22ed8060 100644 --- a/mindee/geometry/minmax.py +++ b/mindee/geometry/minmax.py @@ -16,7 +16,7 @@ def get_min_max_y(points: Points) -> MinMax: """ Get the maximum and minimum Y value given a sequence of points. - :param points: List of points + :params points: List of points """ y_coords = [y for _, y in points] return MinMax(min=min(y_coords), max=max(y_coords)) @@ -26,7 +26,7 @@ def get_min_max_x(points: Points) -> MinMax: """ Get the maximum and minimum Y value given a sequence of points. - :param points: List of points + :params points: List of points """ x_coords = [x for x, _ in points] return MinMax(min=min(x_coords), max=max(x_coords)) diff --git a/mindee/geometry/polygon.py b/mindee/geometry/polygon.py index bd733cfd..da6e9f68 100644 --- a/mindee/geometry/polygon.py +++ b/mindee/geometry/polygon.py @@ -34,7 +34,7 @@ def is_point_in_x(self, point: Point) -> bool: """ Determine if the Point is in the Polygon's X-axis. - :param point: Point to compare + :params point: Point to compare """ self._raise_if_invalid() min_x, max_x = get_min_max_x(self) @@ -44,7 +44,7 @@ def is_point_in_y(self, point: Point) -> bool: """ Determine if the Point is in the Polygon's Y-axis. - :param point: Point to compare + :params point: Point to compare """ self._raise_if_invalid() min_y, max_y = get_min_max_y(self) @@ -60,8 +60,8 @@ def is_point_in_polygon_x(point: Point, polygon: Polygon) -> bool: Determine if the Point is in the Polygon's X-axis. - :param point: Point to compare - :param polygon: Polygon to look into + :params point: Point to compare + :params polygon: Polygon to look into """ min_x, max_x = get_min_max_x(polygon) return is_point_in_x(point, min_x, max_x) @@ -73,8 +73,8 @@ def is_point_in_polygon_y(point: Point, polygon: Polygon) -> bool: Determine if the Point is in the Polygon's Y-axis. - :param point: Point to compare - :param polygon: Polygon to look into + :params point: Point to compare + :params polygon: Polygon to look into """ min_y, max_y = get_min_max_y(polygon) return is_point_in_y(point, min_y, max_y) @@ -86,7 +86,7 @@ def polygon_from_prediction(prediction: Sequence[List[float]]) -> Polygon: Transform a prediction into a Polygon. - :param prediction: API prediction. + :params prediction: API prediction. """ return Polygon([Point(point[0], point[1]) for point in prediction]) @@ -95,7 +95,7 @@ def merge_polygons(vertices: Sequence[Polygon]) -> Polygon: """ Given a sequence of polygons, calculate a polygon box that encompasses all polygons. - :param vertices: List of polygons + :params vertices: List of polygons :return: A bounding box that encompasses all polygons """ y_min = min(y for v in vertices for _, y in v) diff --git a/mindee/geometry/polygon_utils.py b/mindee/geometry/polygon_utils.py index 3d234a0d..8fe6dab6 100644 --- a/mindee/geometry/polygon_utils.py +++ b/mindee/geometry/polygon_utils.py @@ -5,7 +5,7 @@ def get_centroid(points: Points) -> Point: """ Get the central point (centroid) given a sequence of points. - :param points: Polygon to process. + :params points: Polygon to process. :return: The centroid """ vertices_count = len(points) @@ -18,9 +18,9 @@ def is_point_in_y(point: Point, min_y: float, max_y: float) -> bool: """ Determine if the Point is in the Polygon's Y-axis. - :param point: Point to compare - :param min_y: Minimum Y-axis value - :param max_y: Maximum Y-axis value + :params point: Point to compare + :params min_y: Minimum Y-axis value + :params max_y: Maximum Y-axis value """ return min_y <= point.y <= max_y @@ -29,8 +29,8 @@ def is_point_in_x(point: Point, min_x: float, max_x: float) -> bool: """ Determine if the Point is within the X-axis interval. - :param point: Point to compare - :param min_x: Minimum X-axis value - :param max_x: Maximum X-axis value + :params point: Point to compare + :params min_x: Minimum X-axis value + :params max_x: Maximum X-axis value """ return min_x <= point.x <= max_x diff --git a/mindee/geometry/quadrilateral.py b/mindee/geometry/quadrilateral.py index 7034dc4f..dc182fe2 100644 --- a/mindee/geometry/quadrilateral.py +++ b/mindee/geometry/quadrilateral.py @@ -28,7 +28,7 @@ def quadrilateral_from_prediction(prediction: Sequence[list]) -> Quadrilateral: """ Transform a prediction into a Quadrilateral. - :param prediction: API prediction. + :params prediction: API prediction. """ if len(prediction) != 4: raise GeometryError("Prediction must have exactly 4 points") @@ -44,7 +44,7 @@ def get_bounding_box(points: Points) -> Quadrilateral: """ Given a sequence of points, calculate a bounding box that encompasses all points. - :param points: Polygon to process. + :params points: Polygon to process. :return: A bounding box that encompasses all points. """ x_min, y_min, x_max, y_max = get_bbox(points) diff --git a/mindee/image_operations/image_compressor.py b/mindee/image_operations/image_compressor.py index 82b0bf87..9848000d 100644 --- a/mindee/image_operations/image_compressor.py +++ b/mindee/image_operations/image_compressor.py @@ -13,10 +13,10 @@ def compress_image( """ Compresses an image with the given parameters. - :param image_buffer: Buffer representation of an image, also accepts BinaryIO. - :param quality: Quality to apply to the image (JPEG compression). - :param max_width: Maximum bound for the width. - :param max_height: Maximum bound for the height. + :params image_buffer: Buffer representation of an image, also accepts BinaryIO. + :params quality: Quality to apply to the image (JPEG compression). + :params max_width: Maximum bound for the width. + :params max_height: Maximum bound for the height. :return: """ if isinstance(image_buffer, bytes): diff --git a/mindee/input/local_response.py b/mindee/input/local_response.py index 4050ef43..580adec2 100644 --- a/mindee/input/local_response.py +++ b/mindee/input/local_response.py @@ -64,7 +64,7 @@ def _process_secret_key( """ Processes the secret key as a byte array. - :param secret_key: Secret key, either a string or a byte/byte array. + :params secret_key: Secret key, either a string or a byte/byte array. :return: a byte/byte array secret key. """ if isinstance(secret_key, (bytes, bytearray)): @@ -75,7 +75,7 @@ def get_hmac_signature(self, secret_key: Union[str, bytes, bytearray]): """ Returns the hmac signature of the local response, from the secret key provided. - :param secret_key: Secret key, either a string or a byte/byte array. + :params secret_key: Secret key, either a string or a byte/byte array. :return: The hmac signature of the local response. """ algorithm = hashlib.sha256 @@ -98,8 +98,8 @@ def is_valid_hmac_signature( """ Checks if the hmac signature of the local response is valid. - :param secret_key: Secret key, given as a string. - :param signature: HMAC signature, given as a string. + :params secret_key: Secret key, given as a string. + :params signature: HMAC signature, given as a string. :return: True if the HMAC signature is valid. """ return signature == self.get_hmac_signature(secret_key) diff --git a/mindee/input/sources/base_64_input.py b/mindee/input/sources/base_64_input.py index e1f0c892..0438b106 100644 --- a/mindee/input/sources/base_64_input.py +++ b/mindee/input/sources/base_64_input.py @@ -11,8 +11,8 @@ def __init__(self, base64_string: str, filename: str) -> None: """ Input document from a base64 encoded string. - :param base64_string: Raw data as a base64 encoded string - :param filename: File name of the input + :params base64_string: Raw data as a base64 encoded string + :params filename: File name of the input """ self.file_object = io.BytesIO(base64.standard_b64decode(base64_string)) self.filename = filename diff --git a/mindee/input/sources/bytes_input.py b/mindee/input/sources/bytes_input.py index afbd3149..eda582b6 100644 --- a/mindee/input/sources/bytes_input.py +++ b/mindee/input/sources/bytes_input.py @@ -10,8 +10,8 @@ def __init__(self, raw_bytes: bytes, filename: str) -> None: """ Input document from raw bytes (no buffer). - :param raw_bytes: Raw data as bytes - :param filename: File name of the input + :params raw_bytes: Raw data as bytes + :params filename: File name of the input """ self.file_object = io.BytesIO(raw_bytes) self.filename = filename diff --git a/mindee/input/sources/file_input.py b/mindee/input/sources/file_input.py index 8a3cbaef..d8ba7ead 100644 --- a/mindee/input/sources/file_input.py +++ b/mindee/input/sources/file_input.py @@ -13,7 +13,7 @@ def __init__(self, file: BinaryIO) -> None: Note: the calling function is responsible for closing the file. - :param file: FileIO object + :params file: FileIO object """ assert file.name, "File name must be set" diff --git a/mindee/input/sources/local_input_source.py b/mindee/input/sources/local_input_source.py index 9dd3a4b2..af3a44cd 100644 --- a/mindee/input/sources/local_input_source.py +++ b/mindee/input/sources/local_input_source.py @@ -67,7 +67,7 @@ def fix_pdf(self, maximum_offset: int = 500) -> None: or until the maximum offset has been reached. If a tag denoting a PDF file is found, deletes all bytes before it. - :param maximum_offset: maximum byte offset where superfluous headers will be removed. + :params maximum_offset: maximum byte offset where superfluous headers will be removed. Cannot be less than 0. """ if maximum_offset < 0: @@ -172,7 +172,7 @@ def merge_pdf_pages(self, page_numbers: set) -> None: """ Create a new PDF from pages and set it to ``file_object``. - :param page_numbers: List of page numbers to use for merging in the original PDF. + :params page_numbers: List of page numbers to use for merging in the original PDF. :return: None """ self.file_object.seek(0) @@ -202,7 +202,7 @@ def read_contents(self, close_file: bool) -> Tuple[str, bytes]: """ Read the contents of the input file. - :param close_file: whether to close the file after reading + :params close_file: whether to close the file after reading :return: a Tuple with the file name and binary data """ logger.debug("Reading data from: %s", self.filename) @@ -239,12 +239,12 @@ def compress( """ Compresses the file object, either as a PDF or an image. - :param quality: Quality of the compression. For images, this is the JPEG quality. + :params quality: Quality of the compression. For images, this is the JPEG quality. For PDFs, this affects image quality within the PDF. - :param max_width: Maximum width for image resizing. Ignored for PDFs. - :param max_height: Maximum height for image resizing. Ignored for PDFs. - :param force_source_text: For PDFs, whether to force compression even if source text is present. - :param disable_source_text: For PDFs, whether to disable source text during compression. + :params max_width: Maximum width for image resizing. Ignored for PDFs. + :params max_height: Maximum height for image resizing. Ignored for PDFs. + :params force_source_text: For PDFs, whether to force compression even if source text is present. + :params disable_source_text: For PDFs, whether to disable source text during compression. """ new_file_bytes: bytes if self.is_pdf(): diff --git a/mindee/input/sources/path_input.py b/mindee/input/sources/path_input.py index 4da49e3f..255d5fa6 100644 --- a/mindee/input/sources/path_input.py +++ b/mindee/input/sources/path_input.py @@ -12,7 +12,7 @@ def __init__(self, filepath: Union[Path, str]) -> None: """ Input document from a path. - :param filepath: Path to open + :params filepath: Path to open """ self.file_object = open(filepath, "rb") # pylint: disable=consider-using-with self.filename = os.path.basename(filepath) diff --git a/mindee/input/sources/url_input_source.py b/mindee/input/sources/url_input_source.py index 8c681bba..222e1eba 100644 --- a/mindee/input/sources/url_input_source.py +++ b/mindee/input/sources/url_input_source.py @@ -23,7 +23,7 @@ def __init__(self, url: str) -> None: """ Input document from a base64 encoded string. - :param url: URL to send, must be HTTPS. + :params url: URL to send, must be HTTPS. """ if not url.lower().startswith("https"): raise MindeeSourceError("URL must be HTTPS") @@ -43,11 +43,11 @@ def __fetch_file_content( """ Fetch the content of the file from the URL. - :param username: Optional username for authentication. - :param password: Optional password for authentication. - :param token: Optional token for authentication. - :param headers: Optional additional headers for the request. - :param max_redirects: Maximum number of redirects to follow. + :params username: Optional username for authentication. + :params password: Optional password for authentication. + :params token: Optional token for authentication. + :params headers: Optional additional headers for the request. + :params max_redirects: Maximum number of redirects to follow. :return: The content of the file as bytes. """ if not headers: @@ -75,13 +75,13 @@ def save_to_file( """ Save the content of the URL to a file. - :param filepath: Path to save the content to. - :param filename: Optional filename to give to the file. - :param username: Optional username for authentication. - :param password: Optional password for authentication. - :param token: Optional token for authentication. - :param headers: Optional additional headers for the request. - :param max_redirects: Maximum number of redirects to follow. + :params filepath: Path to save the content to. + :params filename: Optional filename to give to the file. + :params username: Optional username for authentication. + :params password: Optional password for authentication. + :params token: Optional token for authentication. + :params headers: Optional additional headers for the request. + :params max_redirects: Maximum number of redirects to follow. :return: The path to the saved file. """ response = self.__fetch_file_content( @@ -105,12 +105,12 @@ def as_local_input_source( """ Convert the URL content to a BytesInput object. - :param filename: Optional filename for the BytesInput. - :param username: Optional username for authentication. - :param password: Optional password for authentication. - :param token: Optional token for authentication. - :param headers: Optional additional headers for the request. - :param max_redirects: Maximum number of redirects to follow. + :params filename: Optional filename for the BytesInput. + :params username: Optional username for authentication. + :params password: Optional password for authentication. + :params token: Optional token for authentication. + :params headers: Optional additional headers for the request. + :params max_redirects: Maximum number of redirects to follow. :return: A BytesInput object containing the file content. """ response = self.__fetch_file_content( @@ -125,7 +125,7 @@ def __extract_filename_from_url(uri) -> str: """ Extract the filename from a given URL. - :param uri: The URL to extract the filename from. + :params uri: The URL to extract the filename from. :return: The extracted filename or an empty string if not found. """ filename = os.path.basename(urlparse(uri).path) @@ -136,7 +136,7 @@ def __generate_file_name(extension=".tmp") -> str: """ Generate a unique filename with a timestamp and random string. - :param extension: The file extension to use (default is '.tmp'). + :params extension: The file extension to use (default is '.tmp'). :return: A generated filename. """ random_string = "".join( @@ -150,7 +150,7 @@ def __get_file_extension(filename) -> Optional[str]: """ Get the extension from a filename. - :param filename: The filename to extract the extension from. + :params filename: The filename to extract the extension from. :return: The lowercase file extension or None if not found. """ ext = os.path.splitext(filename)[1] @@ -160,7 +160,7 @@ def __fill_filename(self, filename=None) -> str: """ Fill in a filename if not provided or incomplete. - :param filename: Optional filename to use. + :params filename: Optional filename to use. :return: A complete filename. """ if filename is None: @@ -178,11 +178,11 @@ def __make_request(url, auth, headers, redirects, max_redirects) -> bytes: """ Makes an HTTP request to the given URL, while following redirections. - :param url: The URL to request. - :param auth: Authentication tuple (username, password). - :param headers: Headers for the request. - :param redirects: Current number of redirects. - :param max_redirects: Maximum number of redirects to follow. + :params url: The URL to request. + :params auth: Authentication tuple (username, password). + :params headers: Headers for the request. + :params redirects: Current number of redirects. + :params max_redirects: Maximum number of redirects to follow. :return: The content of the response. :raises MindeeSourceError: If max redirects are exceeded or the request fails. """ diff --git a/mindee/mindee_http/base_endpoint.py b/mindee/mindee_http/base_endpoint.py index 51c75f71..ad137407 100644 --- a/mindee/mindee_http/base_endpoint.py +++ b/mindee/mindee_http/base_endpoint.py @@ -10,6 +10,6 @@ def __init__(self, settings: BaseSettings) -> None: """ Base API endpoint class for all endpoints. - :param settings: Settings relating to all endpoints. + :params settings: Settings relating to all endpoints. """ self.settings = settings diff --git a/mindee/mindee_http/endpoint.py b/mindee/mindee_http/endpoint.py index 947e3251..1860bd98 100644 --- a/mindee/mindee_http/endpoint.py +++ b/mindee/mindee_http/endpoint.py @@ -22,9 +22,9 @@ def __init__( """ Generic API endpoint for a product. - :param owner: owner of the product - :param url_name: name of the product as it appears in the URL - :param version: interface version + :params owner: owner of the product + :params url_name: name of the product as it appears in the URL + :params version: interface version """ super().__init__(settings) self.owner = owner @@ -42,11 +42,11 @@ def predict_req_post( """ Make a request to POST a document for prediction. - :param input_source: Input object - :param include_words: Include raw OCR words in the response - :param close_file: Whether to `close()` the file after parsing it. - :param cropper: Including Mindee cropping results. - :param full_text: Whether to include the full OCR text response in compatible APIs. + :params input_source: Input object + :params include_words: Include raw OCR words in the response + :params close_file: Whether to `close()` the file after parsing it. + :params cropper: Including Mindee cropping results. + :params full_text: Whether to include the full OCR text response in compatible APIs. :return: requests response """ return self._custom_request( @@ -66,13 +66,13 @@ def predict_async_req_post( """ Make an asynchronous request to POST a document for prediction. - :param input_source: Input object - :param include_words: Include raw OCR words in the response - :param close_file: Whether to `close()` the file after parsing it. - :param cropper: Including Mindee cropping results. - :param full_text: Whether to include the full OCR text response in compatible APIs. - :param workflow_id: Workflow ID. - :param rag: If set, will enable Retrieval-Augmented Generation. + :params input_source: Input object + :params include_words: Include raw OCR words in the response + :params close_file: Whether to `close()` the file after parsing it. + :params cropper: Including Mindee cropping results. + :params full_text: Whether to include the full OCR text response in compatible APIs. + :params workflow_id: Workflow ID. + :params rag: If set, will enable Retrieval-Augmented Generation. :return: requests response """ return self._custom_request( @@ -140,7 +140,7 @@ def document_queue_req_get(self, queue_id: str) -> requests.Response: """ Sends a request matching a given queue_id. Returns either a Job or a Document. - :param queue_id: queue_id received from the API + :params queue_id: queue_id received from the API """ return requests.get( f"{self.settings.url_root}/documents/queue/{queue_id}", @@ -162,8 +162,8 @@ def document_feedback_req_put( """ Send a feedback. - :param document_id: ID of the document to send feedback to. - :param feedback: Feedback object to send. + :params document_id: ID of the document to send feedback to. + :params feedback: Feedback object to send. """ return requests.put( f"{self.settings.base_url}/documents/{document_id}/feedback", @@ -182,9 +182,9 @@ def training_req_post( """ Make a request to POST a document for training. - :param input_source: Input object + :params input_source: Input object :return: requests response - :param close_file: Whether to `close()` the file after parsing it. + :params close_file: Whether to `close()` the file after parsing it. """ files = {"document": input_source.read_contents(close_file)} params = {"training": True, "with_candidates": True} @@ -204,9 +204,9 @@ def training_async_req_post( """ Make a request to POST a document for training without processing. - :param input_source: Input object + :params input_source: Input object :return: requests response - :param close_file: Whether to `close()` the file after parsing it. + :params close_file: Whether to `close()` the file after parsing it. """ files = {"document": input_source.read_contents(close_file)} params = {"training": True, "async": True} @@ -224,7 +224,7 @@ def document_req_del(self, document_id: str) -> requests.Response: """ Make a request to DELETE a document. - :param document_id: ID of the document + :params document_id: ID of the document """ response = requests.delete( f"{self.settings.url_root}/documents/{document_id}", @@ -237,7 +237,7 @@ def documents_req_get(self, page_id: int = 1) -> requests.Response: """ Make a request to GET info on all documents. - :param page_id: Page number + :params page_id: Page number """ params = { "page": page_id, @@ -254,7 +254,7 @@ def document_req_get(self, document_id: str) -> requests.Response: """ Make a request to GET annotations for a document. - :param document_id: ID of the document + :params document_id: ID of the document """ params = { "include_annotations": True, @@ -275,8 +275,8 @@ def annotations_req_post( """ Make a request to POST annotations for a document. - :param document_id: ID of the document to annotate - :param annotations: Annotations object + :params document_id: ID of the document to annotate + :params annotations: Annotations object :return: requests response """ response = requests.post( @@ -293,8 +293,8 @@ def annotations_req_put( """ Make a request to PUT annotations for a document. - :param document_id: ID of the document to annotate - :param annotations: Annotations object + :params document_id: ID of the document to annotate + :params annotations: Annotations object :return: requests response """ response = requests.put( @@ -309,7 +309,7 @@ def annotations_req_del(self, document_id: str) -> requests.Response: """ Make a request to DELETE annotations for a document. - :param document_id: ID of the document to annotate + :params document_id: ID of the document to annotate :return: requests response """ response = requests.delete( diff --git a/mindee/mindee_http/mindee_api_v2.py b/mindee/mindee_http/mindee_api_v2.py index 2ca34a10..cc79ba3b 100644 --- a/mindee/mindee_http/mindee_api_v2.py +++ b/mindee/mindee_http/mindee_api_v2.py @@ -81,9 +81,9 @@ def req_post_inference_enqueue( """ Make an asynchronous request to POST a document for prediction on the V2 API. - :param input_source: Input object. - :param params: Options for the enqueueing of the document. - :param slug: Slug to use for the enqueueing, defaults to 'inferences'. + :params input_source: Input object. + :params params: Options for the enqueueing of the document. + :params slug: Slug to use for the enqueueing, defaults to 'inferences'. :return: requests response. """ data = params.get_form_data() @@ -114,7 +114,7 @@ def req_get_job(self, job_id: str) -> requests.Response: """ Sends a request matching a given queue_id. Returns either a Job or a Document. - :param job_id: Job ID, returned by the enqueue request. + :params job_id: Job ID, returned by the enqueue request. """ return requests.get( f"{self.url_root}/jobs/{job_id}", @@ -127,8 +127,8 @@ def req_get_inference(self, inference_id: str, slug: str) -> requests.Response: """ Sends a request matching a given queue_id. Returns either a Job or a Document. - :param inference_id: Inference ID, returned by the job request. - :param slug: Slug of the inference, defaults to nothing. + :params inference_id: Inference ID, returned by the job request. + :params slug: Slug of the inference, defaults to nothing. """ url = f"{self.url_root}/{slug}/{inference_id}" diff --git a/mindee/mindee_http/response_validation.py b/mindee/mindee_http/response_validation.py index 392c452c..03160fcd 100644 --- a/mindee/mindee_http/response_validation.py +++ b/mindee/mindee_http/response_validation.py @@ -9,7 +9,7 @@ def is_valid_sync_response(response: requests.Response) -> bool: """ Checks if the synchronous response is valid. Returns True if the response is valid. - :param response: a requests response object. + :params response: a requests response object. :return: bool """ if not response or not response.ok: @@ -27,7 +27,7 @@ def is_valid_async_response(response: requests.Response) -> bool: Returns True if the response is valid. - :param response: a requests response object. + :params response: a requests response object. :return: bool """ if not is_valid_sync_response(response): @@ -55,7 +55,7 @@ def clean_request_json(response: requests.Response) -> StringDict: """ Checks and correct the response error format depending on the two possible kind of returns. - :param response: Raw request response. + :params response: Raw request response. :return: Returns the job error if the error is due to parsing, returns the http error otherwise. """ response_json = response.json() diff --git a/mindee/mindee_http/response_validation_v2.py b/mindee/mindee_http/response_validation_v2.py index fdf75d63..b89ce566 100644 --- a/mindee/mindee_http/response_validation_v2.py +++ b/mindee/mindee_http/response_validation_v2.py @@ -9,7 +9,7 @@ def is_valid_post_response(response: requests.Response) -> bool: """ Checks if the POST response is valid and of the expected format. - :param response: HTTP response object. + :params response: HTTP response object. :return: True if the response is valid. """ if not is_valid_sync_response(response): @@ -30,7 +30,7 @@ def is_valid_get_response(response: requests.Response) -> bool: """ Checks if the GET response is valid and of the expected format. - :param response: HTTP response object. + :params response: HTTP response object. :return: True if the response is valid. """ if not is_valid_sync_response(response): diff --git a/mindee/mindee_http/workflow_endpoint.py b/mindee/mindee_http/workflow_endpoint.py index 7a2f05a6..7473192d 100644 --- a/mindee/mindee_http/workflow_endpoint.py +++ b/mindee/mindee_http/workflow_endpoint.py @@ -18,7 +18,7 @@ def __init__(self, settings: WorkflowSettings) -> None: """ Workflow Endpoint. - :param settings: Settings object. + :params settings: Settings object. """ super().__init__(settings) @@ -30,9 +30,9 @@ def workflow_execution_post( """ Sends the document to the workflow. - :param input_source: The document/source file to use. + :params input_source: The document/source file to use. Has to be created beforehand. - :param options: Options for the workflow. + :params options: Options for the workflow. :return: """ data = {} diff --git a/mindee/pdf/pdf_compressor.py b/mindee/pdf/pdf_compressor.py index c5686838..7a3d5c23 100644 --- a/mindee/pdf/pdf_compressor.py +++ b/mindee/pdf/pdf_compressor.py @@ -29,10 +29,10 @@ def compress_pdf( """ Compresses each page of a provided PDF buffer. - :param pdf_data: The input PDF as bytes. - :param image_quality: Compression quality (70-100 for most JPG images). - :param force_source_text_compression: If true, attempts to re-write detected text. - :param disable_source_text: If true, doesn't re-apply source text to the output PDF. + :params pdf_data: The input PDF as bytes. + :params image_quality: Compression quality (70-100 for most JPG images). + :params force_source_text_compression: If true, attempts to re-write detected text. + :params disable_source_text: If true, doesn't re-apply source text to the output PDF. :return: Compressed PDF as bytes. """ if not isinstance(pdf_data, bytes): @@ -90,8 +90,8 @@ def _compress_pdf_pages( """ Compresses PDF pages and returns an array of compressed page buffers. - :param pdf_data: The input PDF as bytes. - :param image_quality: Initial compression quality. + :params pdf_data: The input PDF as bytes. + :params image_quality: Initial compression quality. :return: List of compressed page buffers, or None if compression fails. """ original_size = len(pdf_data) @@ -119,9 +119,9 @@ def add_text_to_pdf_page( # type: ignore """ Adds text to a PDF page based on the extracted text data. - :param page: The PDFDocument object. - :param page_id: The ID of the page. - :param extracted_text: List of PDFCharData objects containing text and positioning information. + :params page: The PDFDocument object. + :params page_id: The ID of the page. + :params extracted_text: List of PDFCharData objects containing text and positioning information. """ if not extracted_text or not extracted_text[page_id]: return @@ -153,8 +153,8 @@ def _compress_pages_with_quality( """ Compresses pages with a specific quality. - :param pdf_data: The input PDF as bytes. - :param image_quality: Compression quality. + :params pdf_data: The input PDF as bytes. + :params image_quality: Compression quality. :return: List of compressed page buffers. """ pdf_document = pdfium.PdfDocument(pdf_data) @@ -174,9 +174,9 @@ def _is_compression_successful( """ Checks if the compression was successful based on the compressed size and original size. - :param total_compressed_size: Total size of compressed pages. - :param original_size: Original PDF size. - :param image_quality: Compression quality. + :params total_compressed_size: Total size of compressed pages. + :params original_size: Original PDF size. + :params image_quality: Compression quality. :return: True if compression was successful, false otherwise. """ overhead = lerp(0.54, 0.18, image_quality / 100) @@ -190,8 +190,8 @@ def _rasterize_page( # type: ignore """ Rasterizes a PDF page. - :param page: PdfPage object to rasterize. - :param quality: Quality to apply during rasterization. + :params page: PdfPage object to rasterize. + :params quality: Quality to apply during rasterization. :return: Rasterized page as bytes. """ image = page.render().to_pil() @@ -204,7 +204,7 @@ def _collect_images_as_pdf(image_list: List[bytes]) -> pdfium.PdfDocument: # ty """ Converts a list of JPEG images into pages in a PdfDocument. - :param image_list: A list of bytes representing JPEG images. + :params image_list: A list of bytes representing JPEG images. :return: A PdfDocument handle containing the images as pages. """ out_pdf = pdfium.PdfDocument.new() diff --git a/mindee/pdf/pdf_utils.py b/mindee/pdf/pdf_utils.py index 70b7d984..83541280 100644 --- a/mindee/pdf/pdf_utils.py +++ b/mindee/pdf/pdf_utils.py @@ -15,7 +15,7 @@ def has_source_text(pdf_bytes: bytes) -> bool: """ Checks if the provided PDF bytes contain source text. - :param pdf_bytes: Raw bytes representation of a PDF file + :params pdf_bytes: Raw bytes representation of a PDF file :return: """ pdf = pdfium.PdfDocument(pdf_bytes) @@ -29,7 +29,7 @@ def extract_text_from_pdf(pdf_bytes: bytes) -> List[List[PDFCharData]]: """ Extracts the raw text from a given PDF's bytes along with font data. - :param pdf_bytes: Raw bytes representation of a PDF file. + :params pdf_bytes: Raw bytes representation of a PDF file. :return: A list of info regarding each read character. """ pdfium_lock = RLock() @@ -46,9 +46,9 @@ def _process_page(page, page_id: int, pdfium_lock: RLock) -> List[PDFCharData]: """ Processes a single page of the PDF. - :param page: The PDF page to process. - :param page_id: ID of the page. - :param pdfium_lock: Lock for thread-safe operations. + :params page: The PDF page to process. + :params page_id: ID of the page. + :params pdfium_lock: Lock for thread-safe operations. """ char_data_list: List[PDFCharData] = [] internal_height = page.get_height() @@ -82,13 +82,13 @@ def _process_char( """ Processes a single character from the PDF. - :param i: The index of the character. - :param text_handler: The text handler for the current page. - :param page: The current page being processed. - :param pdfium_lock: Lock for thread-safe operations. - :param internal_height: The height of the page. - :param internal_width: The width of the page. - :param page_id: ID of the page the character was found on. + :params i: The index of the character. + :params text_handler: The text handler for the current page. + :params page: The current page being processed. + :params pdfium_lock: Lock for thread-safe operations. + :params internal_height: The height of the page. + :params internal_width: The width of the page. + :params page_id: ID of the page the character was found on. :return: List of character data for a page. """ char_info = _get_char_info(i, text_handler, pdfium_lock) @@ -132,9 +132,9 @@ def _get_char_info(i: int, text_handler, pdfium_lock: RLock) -> dict: """ Retrieves information about a specific character. - :param i: The index of the character. - :param text_handler: The text handler for the current page. - :param pdfium_lock: Lock for thread-safe operations. + :params i: The index of the character. + :params text_handler: The text handler for the current page. + :params pdfium_lock: Lock for thread-safe operations. :return: A dictionary containing character information. """ stroke = (ctypes.c_uint(), ctypes.c_uint(), ctypes.c_uint(), ctypes.c_uint()) @@ -171,8 +171,8 @@ def _get_font_name(text_handler, i: int) -> str: """ Retrieves the font name for a specific character. - :param text_handler: The text handler for the current page. - :param i: The index of the character. + :params text_handler: The text handler for the current page. + :params i: The index of the character. :return: The font name as a string. """ buffer_length = 128 @@ -190,8 +190,8 @@ def _get_font_flags(text_handler, i: int) -> int: """ Retrieves the font flags for a specific character. - :param text_handler: The text handler for the current page. - :param i: The index of the character. + :params text_handler: The text handler for the current page. + :params i: The index of the character. :return: The font flags as an integer. """ flags = c_int(0) @@ -205,9 +205,9 @@ def _get_char_box( """ Retrieves the bounding box for a specific character. - :param i: The index of the character. - :param text_handler: The text handler for the current page. - :param pdfium_lock: Lock for thread-safe operations. + :params i: The index of the character. + :params text_handler: The text handler for the current page. + :params pdfium_lock: Lock for thread-safe operations. :return: A tuple containing left, right, bottom, and top coordinates. """ left, right, bottom, top = (c_double(0), c_double(0), c_double(0), c_double(0)) @@ -222,8 +222,8 @@ def _get_page_rotation(page, pdfium_lock: RLock) -> int: """ Retrieves the rotation value for a specific page. - :param page: The page to get the rotation for. - :param pdfium_lock: Lock for thread-safe operations. + :params page: The page to get the rotation for. + :params pdfium_lock: Lock for thread-safe operations. :return: The rotation value in degrees. """ with pdfium_lock: @@ -241,10 +241,10 @@ def _adjust_char_box( """ Adjusts the character bounding box based on page rotation. - :param char_box: The original character bounding box. - :param rotation: The page rotation in degrees. - :param internal_height: The height of the page. - :param internal_width: The width of the page. + :params char_box: The original character bounding box. + :params rotation: The page rotation in degrees. + :params internal_height: The height of the page. + :params internal_width: The width of the page. :return: The adjusted character bounding box. """ left, right, bottom, top = char_box @@ -269,9 +269,9 @@ def lerp(start: float, end: float, t: float) -> float: """ Performs linear interpolation between two numbers. - :param start: The starting value. - :param end: The ending value. - :param t: The interpolation factor (0 to 1). + :params start: The starting value. + :params end: The ending value. + :params t: The interpolation factor (0 to 1). :return: The interpolated value. """ return start * (1 - t) + end * t diff --git a/mindee/v1/client.py b/mindee/v1/client.py index 47d41e81..403c4350 100644 --- a/mindee/v1/client.py +++ b/mindee/v1/client.py @@ -40,7 +40,7 @@ def _clean_account_name(account_name: str) -> str: """ Checks that an account name is provided for custom products, and sets the default one otherwise. - :param account_name: name of the account's holder. Only needed for custom products. + :params account_name: name of the account's holder. Only needed for custom products. """ if not account_name or len(account_name) < 1: logger.warning( @@ -64,7 +64,7 @@ def __init__(self, api_key: str = "") -> None: """ Mindee API Client. - :param api_key: Your API key for all endpoints + :params api_key: Your API key for all endpoints """ self.api_key = api_key @@ -82,28 +82,28 @@ def parse( """ Call prediction API on the document and parse the results. - :param product_class: The document class to use. + :params product_class: The document class to use. The response object will be instantiated based on this parameter. - :param input_source: The document/source file to use. + :params input_source: The document/source file to use. Has to be created beforehand. - :param include_words: Whether to include the full text for each page. + :params include_words: Whether to include the full text for each page. This performs a full OCR operation on the server and will increase response time. Only available on financial document APIs. - :param close_file: Whether to ``close()`` the file after parsing it. + :params close_file: Whether to ``close()`` the file after parsing it. Set to ``False`` if you need to access the file after this operation. - :param page_options: If set, remove pages from the document as specified. + :params page_options: If set, remove pages from the document as specified. This is done before sending the file to the server. It is useful to avoid page limitations. - :param cropper: Whether to include cropper results for each page. + :params cropper: Whether to include cropper results for each page. This performs a cropping operation on the server and will increase response time. - :param endpoint: For custom endpoints, an endpoint has to be given. - :param full_text: Whether to include the full OCR text response in compatible APIs. + :params endpoint: For custom endpoints, an endpoint has to be given. + :params full_text: Whether to include the full OCR text response in compatible APIs. """ if input_source is None: raise MindeeClientError("No input document provided.") @@ -145,32 +145,32 @@ def enqueue( """ Enqueues a document to an asynchronous endpoint. - :param product_class: The document class to use. + :params product_class: The document class to use. The response object will be instantiated based on this parameter. - :param input_source: The document/source file to use. + :params input_source: The document/source file to use. Has to be created beforehand. - :param include_words: Whether to include the full text for each page. + :params include_words: Whether to include the full text for each page. This performs a full OCR operation on the server and will increase response time. - :param close_file: Whether to ``close()`` the file after parsing it. + :params close_file: Whether to ``close()`` the file after parsing it. Set to ``False`` if you need to access the file after this operation. - :param page_options: If set, remove pages from the document as specified. + :params page_options: If set, remove pages from the document as specified. This is done before sending the file to the server. It is useful to avoid page limitations. - :param cropper: Whether to include cropper results for each page. + :params cropper: Whether to include cropper results for each page. This performs a cropping operation on the server and will increase response time. - :param endpoint: For custom endpoints, an endpoint has to be given. + :params endpoint: For custom endpoints, an endpoint has to be given. - :param full_text: Whether to include the full OCR text response in compatible APIs. + :params full_text: Whether to include the full OCR text response in compatible APIs. - :param workflow_id: Workflow ID. + :params workflow_id: Workflow ID. - :param rag: If set, will enable Retrieval-Augmented Generation. + :params rag: If set, will enable Retrieval-Augmented Generation. Only works if a valid ``workflow_id`` is set. """ if input_source is None: @@ -205,8 +205,8 @@ def load_prediction( """ Load a prediction. - :param product_class: Class of the product to use. - :param local_response: Local response to load. + :params product_class: Class of the product to use. + :params local_response: Local response to load. :return: A valid prediction. """ try: @@ -225,10 +225,10 @@ def parse_queued( """ Parses a queued document. - :param product_class: The document class to use. + :params product_class: The document class to use. The response object will be instantiated based on this parameter. - :param queue_id: queue_id received from the API. - :param endpoint: For custom endpoints, an endpoint has to be given. + :params queue_id: queue_id received from the API. + :params endpoint: For custom endpoints, an endpoint has to be given. """ if not endpoint: endpoint = self._initialize_ots_endpoint(product_class) @@ -247,13 +247,13 @@ def execute_workflow( """ Send the document to a workflow execution. - :param input_source: The document/source file to use. + :params input_source: The document/source file to use. Has to be created beforehand. - :param workflow_id: ID of the workflow. - :param page_options: If set, remove pages from the document as specified. + :params workflow_id: ID of the workflow. + :params page_options: If set, remove pages from the document as specified. This is done before sending the file to the server. It is useful to avoid page limitations. - :param options: Options for the workflow. + :params options: Options for the workflow. :return: """ if isinstance(input_source, LocalInputSource): @@ -290,40 +290,40 @@ def enqueue_and_parse( # pylint: disable=too-many-locals """ Enqueues to an asynchronous endpoint and automatically polls for a response. - :param product_class: The document class to use. + :params product_class: The document class to use. The response object will be instantiated based on this parameter. - :param input_source: The document/source file to use. + :params input_source: The document/source file to use. Has to be created beforehand. - :param include_words: Whether to include the full text for each page. + :params include_words: Whether to include the full text for each page. This performs a full OCR operation on the server and will increase response time. - :param close_file: Whether to ``close()`` the file after parsing it. + :params close_file: Whether to ``close()`` the file after parsing it. Set to ``False`` if you need to access the file after this operation. - :param page_options: If set, remove pages from the document as specified. + :params page_options: If set, remove pages from the document as specified. This is done before sending the file to the server. It is useful to avoid page limitations. - :param cropper: Whether to include cropper results for each page. + :params cropper: Whether to include cropper results for each page. This performs a cropping operation on the server and will increase response time. - :param endpoint: For custom endpoints, an endpoint has to be given. + :params endpoint: For custom endpoints, an endpoint has to be given. - :param initial_delay_sec: Delay between each polling attempts. + :params initial_delay_sec: Delay between each polling attempts. This should not be shorter than 1 second. - :param delay_sec: Delay between each polling attempts. + :params delay_sec: Delay between each polling attempts. This should not be shorter than 1 second. - :param max_retries: Total amount of polling attempts. + :params max_retries: Total amount of polling attempts. - :param full_text: Whether to include the full OCR text response in compatible APIs. + :params full_text: Whether to include the full OCR text response in compatible APIs. - :param workflow_id: Workflow ID. + :params workflow_id: Workflow ID. - :param rag: If set, will enable Retrieval-Augmented Generation. + :params rag: If set, will enable Retrieval-Augmented Generation. Only works if a valid ``workflow_id`` is set. """ self._validate_async_params(initial_delay_sec, delay_sec, max_retries) @@ -378,12 +378,12 @@ def send_feedback( """ Send a feedback for a document. - :param product_class: The document class to use. + :params product_class: The document class to use. The response object will be instantiated based on this parameter. - :param document_id: The id of the document to send feedback to. - :param feedback: Feedback to send. - :param endpoint: For custom endpoints, an endpoint has to be given. + :params document_id: The id of the document to send feedback to. + :params feedback: Feedback to send. + :params endpoint: For custom endpoints, an endpoint has to be given. """ if not document_id or len(document_id) == 0: raise MindeeClientError("Invalid document_id.") @@ -467,7 +467,7 @@ def _get_queued_document( """ Fetches a document or a Job from a given queue. - :param queue_id: Queue_id received from the API + :params queue_id: Queue_id received from the API """ queue_response = endpoint.document_queue_req_get(queue_id=queue_id) @@ -490,13 +490,13 @@ def _send_to_workflow( """ Sends a document to a workflow. - :param product_class: The document class to use. + :params product_class: The document class to use. The response object will be instantiated based on this parameter. - :param input_source: The document/source file to use. + :params input_source: The document/source file to use. Has to be created beforehand. - :param workflow_id: ID of the workflow. - :param options: Optional options for the workflow. + :params workflow_id: ID of the workflow. + :params options: Optional options for the workflow. :return: """ if input_source is None: @@ -548,9 +548,9 @@ def create_endpoint( """ Add a custom endpoint, created using the Mindee API Builder. - :param endpoint_name: The "API name" field in the "Settings" page of the API Builder - :param account_name: Your organization's username on the API Builder - :param version: If set, locks the version of the model to use. + :params endpoint_name: The "API name" field in the "Settings" page of the API Builder + :params account_name: Your organization's username on the API Builder + :params version: If set, locks the version of the model to use. If not set, use the latest version of the model. """ if len(endpoint_name) == 0: diff --git a/mindee/v1/parsing/common/async_predict_response.py b/mindee/v1/parsing/common/async_predict_response.py index e4b5f9a6..268ad939 100644 --- a/mindee/v1/parsing/common/async_predict_response.py +++ b/mindee/v1/parsing/common/async_predict_response.py @@ -26,8 +26,8 @@ def __init__( Inherits and instantiates a normal PredictResponse if the product of the current queue is both requested and done. - :param inference_type: Type of the inference. - :param raw_response: json response from HTTP call. + :params inference_type: Type of the inference. + :params raw_response: json response from HTTP call. """ super().__init__(raw_response) self.job = Job(raw_response["job"]) diff --git a/mindee/v1/parsing/common/extras/extras.py b/mindee/v1/parsing/common/extras/extras.py index cc114e47..8dcb589a 100644 --- a/mindee/v1/parsing/common/extras/extras.py +++ b/mindee/v1/parsing/common/extras/extras.py @@ -39,7 +39,7 @@ def add_artificial_extra(self, raw_prediction: StringDict): """ Adds artificial extra data for reconstructed extras. Currently only used for full_text_ocr. - :param raw_prediction: Raw prediction used by the document. + :params raw_prediction: Raw prediction used by the document. """ if "full_text_ocr" in raw_prediction and raw_prediction["full_text_ocr"]: self.full_text_ocr = FullTextOcrExtra(raw_prediction["full_text_ocr"]) diff --git a/mindee/v1/parsing/common/inference.py b/mindee/v1/parsing/common/inference.py index a7192118..0bc32d67 100644 --- a/mindee/v1/parsing/common/inference.py +++ b/mindee/v1/parsing/common/inference.py @@ -67,7 +67,7 @@ def get_endpoint_info(klass: Type["Inference"]) -> Dict[str, str]: Should never retrieve info for CustomV1, as a custom endpoint should be created to use CustomV1. - :param klass: product subclass to access endpoint information. + :params klass: product subclass to access endpoint information. """ if klass.endpoint_name and klass.endpoint_version: return {"name": klass.endpoint_name, "version": klass.endpoint_version} diff --git a/mindee/v1/parsing/common/job.py b/mindee/v1/parsing/common/job.py index 486015ee..67287c42 100644 --- a/mindee/v1/parsing/common/job.py +++ b/mindee/v1/parsing/common/job.py @@ -29,7 +29,7 @@ def __init__(self, json_response: dict) -> None: """ Wrapper for the HTTP response sent from the API when a document is enqueued. - :param json_response: JSON response sent by the server + :params json_response: JSON response sent by the server """ self.issued_at = datetime.fromisoformat(json_response["issued_at"]) if json_response.get("available_at"): diff --git a/mindee/v1/parsing/common/orientation.py b/mindee/v1/parsing/common/orientation.py index 54f85cc9..8fa0c0c3 100644 --- a/mindee/v1/parsing/common/orientation.py +++ b/mindee/v1/parsing/common/orientation.py @@ -20,10 +20,10 @@ def __init__( """ Page orientation. - :param raw_prediction: Orientation prediction object from HTTP response - :param value_key: Key to use in the orientation_prediction dict - :param reconstructed: Bool for reconstructed object (not extracted in the API) - :param page_id: Page number for multi-page document + :params raw_prediction: Orientation prediction object from HTTP response + :params value_key: Key to use in the orientation_prediction dict + :params reconstructed: Bool for reconstructed object (not extracted in the API) + :params page_id: Page number for multi-page document """ super().__init__( raw_prediction, diff --git a/mindee/v1/parsing/common/predict_response.py b/mindee/v1/parsing/common/predict_response.py index 83379e6b..f976bed1 100644 --- a/mindee/v1/parsing/common/predict_response.py +++ b/mindee/v1/parsing/common/predict_response.py @@ -21,8 +21,8 @@ def __init__( """ Container for the raw API response and the parsed document. - :param inference_type: Type of the inference. - :param raw_response: json response from HTTP call. + :params inference_type: Type of the inference. + :params raw_response: json response from HTTP call. """ super().__init__(raw_response) self.document = Document(inference_type, raw_response["document"]) diff --git a/mindee/v1/parsing/common/prediction.py b/mindee/v1/parsing/common/prediction.py index ca0784e8..8bab63cc 100644 --- a/mindee/v1/parsing/common/prediction.py +++ b/mindee/v1/parsing/common/prediction.py @@ -10,8 +10,8 @@ def __init__(self, raw_prediction: StringDict, page_id: Optional[int] = None): """ Base prediction. - :param raw_prediction: a json-equivalent dictionary containing prediction results. - :param page_id: an optional page number for page-level predictions. + :params raw_prediction: a json-equivalent dictionary containing prediction results. + :params page_id: an optional page number for page-level predictions. """ diff --git a/mindee/v1/parsing/custom/line_items.py b/mindee/v1/parsing/custom/line_items.py index c28643a5..fbc55d46 100644 --- a/mindee/v1/parsing/custom/line_items.py +++ b/mindee/v1/parsing/custom/line_items.py @@ -42,8 +42,8 @@ def update_field(self, field_name: str, field_value: ListFieldValue) -> None: """ Updates a field value if it exists. - :param field_name: name of the field to update. - :param field_value: value of the field to set. + :params field_name: name of the field to update. + :params field_value: value of the field to set. """ if field_name in self.fields: existing_field = self.fields[field_name] @@ -74,9 +74,9 @@ def is_box_in_line(line: CustomLine, bbox: BBox, height_line_tolerance: float) - """ Checks if the bbox fits inside the given line. - :param line: Line to check. - :param bbox: Bbox to check. - :param height_line_tolerance: line height tolerance for custom line reconstruction. + :params line: Line to check. + :params bbox: Bbox to check. + :params height_line_tolerance: line height tolerance for custom line reconstruction. """ if abs(bbox.y_min - line.bbox.y_min) <= height_line_tolerance: return True @@ -89,9 +89,9 @@ def prepare( """ Prepares lines before filling them. - :param anchor_name: name of the anchor. - :param fields: fields to build lines from. - :param height_line_tolerance: line height tolerance for custom line reconstruction. + :params anchor_name: name of the anchor. + :params fields: fields to build lines from. + :params height_line_tolerance: line height tolerance for custom line reconstruction. """ lines_prepared: List[CustomLine] = [] try: diff --git a/mindee/v1/parsing/custom/list.py b/mindee/v1/parsing/custom/list.py index b24033a5..01b61018 100644 --- a/mindee/v1/parsing/custom/list.py +++ b/mindee/v1/parsing/custom/list.py @@ -60,7 +60,7 @@ def contents_string(self, separator: str = " ") -> str: """ Return a string representation of all values. - :param separator: Character(s) to use when concatenating fields. + :params separator: Character(s) to use when concatenating fields. """ return separator.join(self.contents_list) diff --git a/mindee/v1/parsing/generated/generated_list.py b/mindee/v1/parsing/generated/generated_list.py index 12071fac..ab19dd3b 100644 --- a/mindee/v1/parsing/generated/generated_list.py +++ b/mindee/v1/parsing/generated/generated_list.py @@ -48,7 +48,7 @@ def contents_string(self, separator: str = " ") -> str: """ Return a string representation of all values. - :param separator: Character(s) to use when concatenating fields. + :params separator: Character(s) to use when concatenating fields. """ return separator.join(self.contents_list) diff --git a/mindee/v1/parsing/generated/generated_object.py b/mindee/v1/parsing/generated/generated_object.py index 78eab0a2..57106756 100644 --- a/mindee/v1/parsing/generated/generated_object.py +++ b/mindee/v1/parsing/generated/generated_object.py @@ -50,7 +50,7 @@ def _str_level(self, level=0) -> str: Takes into account level of indentation & displays elements as list elements. - :param level: level of indent (times 2 spaces). + :params level: level of indent (times 2 spaces). """ indent = " " + " " * level out_str = "" @@ -68,7 +68,7 @@ def is_generated_object(str_dict: StringDict) -> bool: """ Checks whether an field is a custom object or not. - :param str_dict: input dictionary to check. + :params str_dict: input dictionary to check. """ common_keys = [ "value", diff --git a/mindee/v1/parsing/standard/address.py b/mindee/v1/parsing/standard/address.py index b269f72e..0f3a2dbf 100644 --- a/mindee/v1/parsing/standard/address.py +++ b/mindee/v1/parsing/standard/address.py @@ -33,9 +33,9 @@ def __init__( """ Text field object. - :param raw_prediction: Amount prediction object from HTTP response. - :param reconstructed: Bool for reconstructed object (not extracted in the API). - :param page_id: Page number for multi-page document. + :params raw_prediction: Amount prediction object from HTTP response. + :params reconstructed: Bool for reconstructed object (not extracted in the API). + :params page_id: Page number for multi-page document. """ self.value = None super().__init__( diff --git a/mindee/v1/parsing/standard/amount.py b/mindee/v1/parsing/standard/amount.py index 3060deca..b24094da 100644 --- a/mindee/v1/parsing/standard/amount.py +++ b/mindee/v1/parsing/standard/amount.py @@ -23,9 +23,9 @@ def __init__( """ Amount field object. - :param raw_prediction: Amount prediction object from HTTP response - :param reconstructed: Bool for reconstructed object (not extracted in the API) - :param page_id: Page number for multi-page document + :params raw_prediction: Amount prediction object from HTTP response + :params reconstructed: Bool for reconstructed object (not extracted in the API) + :params page_id: Page number for multi-page document """ self.value = None super().__init__( diff --git a/mindee/v1/parsing/standard/base.py b/mindee/v1/parsing/standard/base.py index 18b46794..6b009877 100644 --- a/mindee/v1/parsing/standard/base.py +++ b/mindee/v1/parsing/standard/base.py @@ -60,10 +60,10 @@ def __init__( """ Base field object. - :param raw_prediction: Prediction object from HTTP response - :param value_key: Key to use in the abstract_prediction dict - :param reconstructed: Bool for reconstructed object (not extracted in the API) - :param page_id: Page number for multi-page PDF + :params raw_prediction: Prediction object from HTTP response + :params value_key: Key to use in the abstract_prediction dict + :params reconstructed: Bool for reconstructed object (not extracted in the API) + :params page_id: Page number for multi-page PDF """ if page_id is None: try: @@ -104,9 +104,9 @@ def compare_field_arrays( """ Check that all elements are present in both arrays. - :param array1: Array of Fields - :param array2: Array of Fields - :param attr: Attribute to compare + :params array1: Array of Fields + :params array2: Array of Fields + :params attr: Attribute to compare :return: True if all elements in array1 exist in array2, False otherwise """ set1 = {getattr(f1, attr) for f1 in array1} @@ -118,7 +118,7 @@ def field_array_confidence(array: List[Type[BaseField]]) -> float: """ Multiply all Field's confidence in the array. - :param array: Array of fields + :params array: Array of fields :return: Product as float """ product: float = 1 @@ -134,7 +134,7 @@ def field_array_sum(array: List[Type[BaseField]]) -> float: """ Add all the Field values in the array. - :param array: Array of fields + :params array: Array of fields :return: Sum as `float`. """ arr_sum = 0 diff --git a/mindee/v1/parsing/standard/boolean.py b/mindee/v1/parsing/standard/boolean.py index 65e3a275..54bbb4d5 100644 --- a/mindee/v1/parsing/standard/boolean.py +++ b/mindee/v1/parsing/standard/boolean.py @@ -20,10 +20,10 @@ def __init__( """ Boolean field object. - :param raw_prediction: Amount prediction object from HTTP response - :param value_key: Key to use in the amount_prediction dict - :param reconstructed: Bool for reconstructed object (not extracted in the API) - :param page_id: Page number for multi-page document + :params raw_prediction: Amount prediction object from HTTP response + :params value_key: Key to use in the amount_prediction dict + :params reconstructed: Bool for reconstructed object (not extracted in the API) + :params page_id: Page number for multi-page document """ self.value = None super().__init__( diff --git a/mindee/v1/parsing/standard/classification.py b/mindee/v1/parsing/standard/classification.py index 1b5f6b12..5ca2011f 100644 --- a/mindee/v1/parsing/standard/classification.py +++ b/mindee/v1/parsing/standard/classification.py @@ -20,10 +20,10 @@ def __init__( """ Text field object. - :param raw_prediction: Amount prediction object from HTTP response - :param value_key: Key to use in the amount_prediction dict - :param reconstructed: Bool for reconstructed object (not extracted in the API) - :param page_id: Page number for multi-page document + :params raw_prediction: Amount prediction object from HTTP response + :params value_key: Key to use in the amount_prediction dict + :params reconstructed: Bool for reconstructed object (not extracted in the API) + :params page_id: Page number for multi-page document """ super().__init__( raw_prediction, diff --git a/mindee/v1/parsing/standard/date.py b/mindee/v1/parsing/standard/date.py index 42ddce34..91c5a4df 100644 --- a/mindee/v1/parsing/standard/date.py +++ b/mindee/v1/parsing/standard/date.py @@ -29,9 +29,9 @@ def __init__( """ Date field object. - :param raw_prediction: Date prediction object from HTTP response - :param reconstructed: Bool for reconstructed object (not extracted in the API) - :param page_id: Page number for multi-page document + :params raw_prediction: Date prediction object from HTTP response + :params reconstructed: Bool for reconstructed object (not extracted in the API) + :params page_id: Page number for multi-page document """ super().__init__( raw_prediction, diff --git a/mindee/v1/parsing/standard/locale.py b/mindee/v1/parsing/standard/locale.py index c92769a3..75e2965c 100644 --- a/mindee/v1/parsing/standard/locale.py +++ b/mindee/v1/parsing/standard/locale.py @@ -23,9 +23,9 @@ def __init__( """ Locale field object. - :param raw_prediction: Locale prediction object from HTTP response - :param reconstructed: Bool for reconstructed object (not extracted in the API) - :param page_id: Page number for multi-page document + :params raw_prediction: Locale prediction object from HTTP response + :params reconstructed: Bool for reconstructed object (not extracted in the API) + :params page_id: Page number for multi-page document """ value_key = ( "value" diff --git a/mindee/v1/parsing/standard/payment_details.py b/mindee/v1/parsing/standard/payment_details.py index fcd48c78..11f39dac 100644 --- a/mindee/v1/parsing/standard/payment_details.py +++ b/mindee/v1/parsing/standard/payment_details.py @@ -30,16 +30,16 @@ def __init__( """ Payment details field object. - :param raw_prediction: Payment detail prediction object from HTTP response - :param value_key: Corresponds to iban - :param account_number_key: Key to use for getting the account number in the + :params raw_prediction: Payment detail prediction object from HTTP response + :params value_key: Corresponds to iban + :params account_number_key: Key to use for getting the account number in the payment_details_prediction dict - :param iban_key: Key to use for getting the IBAN in the payment_details_prediction dict - :param routing_number_key: Key to use for getting the Routing number in the + :params iban_key: Key to use for getting the IBAN in the payment_details_prediction dict + :params routing_number_key: Key to use for getting the Routing number in the payment_details_prediction dict - :param swift_key: Key to use for getting the SWIFT in the payment_details_prediction dict - :param reconstructed: Bool for reconstructed object (not extracted in the API) - :param page_id: Page number for multi-page document + :params swift_key: Key to use for getting the SWIFT in the payment_details_prediction dict + :params reconstructed: Bool for reconstructed object (not extracted in the API) + :params page_id: Page number for multi-page document """ super().__init__( raw_prediction, diff --git a/mindee/v1/parsing/standard/position.py b/mindee/v1/parsing/standard/position.py index 16bb35f3..1479e41b 100644 --- a/mindee/v1/parsing/standard/position.py +++ b/mindee/v1/parsing/standard/position.py @@ -31,10 +31,10 @@ def __init__( """ Position field object. - :param raw_prediction: Position prediction object from HTTP response - :param value_key: Key to use in the position_prediction dict - :param reconstructed: Bool for reconstructed object (not extracted in the API) - :param page_id: Page number for multi-page document + :params raw_prediction: Position prediction object from HTTP response + :params value_key: Key to use in the position_prediction dict + :params reconstructed: Bool for reconstructed object (not extracted in the API) + :params page_id: Page number for multi-page document """ super().__init__( raw_prediction, diff --git a/mindee/v1/parsing/standard/tax.py b/mindee/v1/parsing/standard/tax.py index de917335..afebf06c 100644 --- a/mindee/v1/parsing/standard/tax.py +++ b/mindee/v1/parsing/standard/tax.py @@ -30,10 +30,10 @@ def __init__( """ Tax field object. - :param raw_prediction: Tax prediction object from HTTP response - :param value_key: Key to use in the tax_prediction dict - :param reconstructed: Bool for reconstructed object (not extracted in the API) - :param page_id: Page number for multi pages document + :params raw_prediction: Tax prediction object from HTTP response + :params value_key: Key to use in the tax_prediction dict + :params reconstructed: Bool for reconstructed object (not extracted in the API) + :params page_id: Page number for multi pages document """ super().__init__( raw_prediction, diff --git a/mindee/v1/parsing/standard/text.py b/mindee/v1/parsing/standard/text.py index b4bb36d9..c30ec204 100644 --- a/mindee/v1/parsing/standard/text.py +++ b/mindee/v1/parsing/standard/text.py @@ -22,10 +22,10 @@ def __init__( """ Text field object. - :param raw_prediction: Amount prediction object from HTTP response - :param value_key: Key to use in the amount_prediction dict - :param reconstructed: Bool for reconstructed object (not extracted in the API) - :param page_id: Page number for multi-page document + :params raw_prediction: Amount prediction object from HTTP response + :params value_key: Key to use in the amount_prediction dict + :params reconstructed: Bool for reconstructed object (not extracted in the API) + :params page_id: Page number for multi-page document """ self.value = None super().__init__( diff --git a/mindee/v1/product/barcode_reader/barcode_reader_v1.py b/mindee/v1/product/barcode_reader/barcode_reader_v1.py index 91d3185e..8116d09a 100644 --- a/mindee/v1/product/barcode_reader/barcode_reader_v1.py +++ b/mindee/v1/product/barcode_reader/barcode_reader_v1.py @@ -24,7 +24,7 @@ def __init__(self, raw_prediction: StringDict): """ Barcode Reader v1 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/barcode_reader/barcode_reader_v1_document.py b/mindee/v1/product/barcode_reader/barcode_reader_v1_document.py index daa2756e..82971b86 100644 --- a/mindee/v1/product/barcode_reader/barcode_reader_v1_document.py +++ b/mindee/v1/product/barcode_reader/barcode_reader_v1_document.py @@ -22,8 +22,8 @@ def __init__( """ Barcode Reader document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.codes_1d = [ diff --git a/mindee/v1/product/cropper/cropper_v1.py b/mindee/v1/product/cropper/cropper_v1.py index 5d9c5691..183395f6 100644 --- a/mindee/v1/product/cropper/cropper_v1.py +++ b/mindee/v1/product/cropper/cropper_v1.py @@ -27,7 +27,7 @@ def __init__(self, raw_prediction: StringDict): """ Cropper v1 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/cropper/cropper_v1_page.py b/mindee/v1/product/cropper/cropper_v1_page.py index 0cfba4c3..c68b342f 100644 --- a/mindee/v1/product/cropper/cropper_v1_page.py +++ b/mindee/v1/product/cropper/cropper_v1_page.py @@ -22,8 +22,8 @@ def __init__( """ Cropper page. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction=raw_prediction, page_id=page_id) self.cropping = [ diff --git a/mindee/v1/product/custom/custom_v1.py b/mindee/v1/product/custom/custom_v1.py index ac530967..ad9cdce1 100644 --- a/mindee/v1/product/custom/custom_v1.py +++ b/mindee/v1/product/custom/custom_v1.py @@ -23,7 +23,7 @@ def __init__(self, raw_prediction: StringDict) -> None: """ Invoice Splitter v1 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) self.prediction = CustomV1Document(raw_prediction["prediction"]) diff --git a/mindee/v1/product/custom/custom_v1_document.py b/mindee/v1/product/custom/custom_v1_document.py index 62b93575..9c71db5d 100644 --- a/mindee/v1/product/custom/custom_v1_document.py +++ b/mindee/v1/product/custom/custom_v1_document.py @@ -20,7 +20,7 @@ def __init__(self, raw_prediction: StringDict) -> None: """ Custom document. - :param raw_prediction: Dictionary containing the JSON document response + :params raw_prediction: Dictionary containing the JSON document response """ super().__init__(raw_prediction) self.fields = {} @@ -41,9 +41,9 @@ def columns_to_line_items( """ Order column fields into line items. - :param anchor_names: list of possible anchor fields. - :param field_names: list of all column fields. - :param height_tolerance: height tolerance to apply to lines. + :params anchor_names: list of possible anchor fields. + :params field_names: list of all column fields. + :params height_tolerance: height tolerance to apply to lines. """ return get_line_items( anchor_names, diff --git a/mindee/v1/product/custom/custom_v1_page.py b/mindee/v1/product/custom/custom_v1_page.py index 4fb8bb03..c58cf43f 100644 --- a/mindee/v1/product/custom/custom_v1_page.py +++ b/mindee/v1/product/custom/custom_v1_page.py @@ -17,7 +17,7 @@ def __init__(self, raw_prediction: StringDict, page_id: Optional[int]) -> None: """ Custom document object. - :param raw_prediction: Dictionary containing the JSON document response + :params raw_prediction: Dictionary containing the JSON document response """ super().__init__(raw_prediction, page_id) self.fields = {} @@ -33,9 +33,9 @@ def columns_to_line_items( """ Order column fields into line items. - :param anchor_names: list of possible anchor fields. - :param field_names: list of all column fields. - :param height_tolerance: height tolerance to apply to lines. + :params anchor_names: list of possible anchor fields. + :params field_names: list of all column fields. + :params height_tolerance: height tolerance to apply to lines. """ return get_line_items( anchor_names, diff --git a/mindee/v1/product/financial_document/financial_document_v1.py b/mindee/v1/product/financial_document/financial_document_v1.py index dca3d2d6..022d50e4 100644 --- a/mindee/v1/product/financial_document/financial_document_v1.py +++ b/mindee/v1/product/financial_document/financial_document_v1.py @@ -24,7 +24,7 @@ def __init__(self, raw_prediction: StringDict): """ Financial Document v1 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/financial_document/financial_document_v1_document.py b/mindee/v1/product/financial_document/financial_document_v1_document.py index c041fc38..b9051b20 100644 --- a/mindee/v1/product/financial_document/financial_document_v1_document.py +++ b/mindee/v1/product/financial_document/financial_document_v1_document.py @@ -98,8 +98,8 @@ def __init__( """ Financial Document document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.billing_address = AddressField( diff --git a/mindee/v1/product/fr/bank_account_details/bank_account_details_v1.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v1.py index 639b9b26..0e7a2def 100644 --- a/mindee/v1/product/fr/bank_account_details/bank_account_details_v1.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v1.py @@ -24,7 +24,7 @@ def __init__(self, raw_prediction: StringDict): """ Bank Account Details v1 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.py index 9d4c6d2e..93db710c 100644 --- a/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.py @@ -24,8 +24,8 @@ def __init__( """ Bank Account Details document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.account_holder_name = StringField( diff --git a/mindee/v1/product/fr/bank_account_details/bank_account_details_v2.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2.py index eaae960c..59e80306 100644 --- a/mindee/v1/product/fr/bank_account_details/bank_account_details_v2.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2.py @@ -24,7 +24,7 @@ def __init__(self, raw_prediction: StringDict): """ Bank Account Details v2 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.py index 24004f09..9d0284ad 100644 --- a/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.py @@ -29,8 +29,8 @@ def __init__( """ Bank Account Details document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.account_holders_names = StringField( diff --git a/mindee/v1/product/fr/carte_grise/carte_grise_v1.py b/mindee/v1/product/fr/carte_grise/carte_grise_v1.py index 7de08ee2..85f71da5 100644 --- a/mindee/v1/product/fr/carte_grise/carte_grise_v1.py +++ b/mindee/v1/product/fr/carte_grise/carte_grise_v1.py @@ -24,7 +24,7 @@ def __init__(self, raw_prediction: StringDict): """ Carte Grise v1 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/fr/carte_grise/carte_grise_v1_document.py b/mindee/v1/product/fr/carte_grise/carte_grise_v1_document.py index cd37a33e..1e459c50 100644 --- a/mindee/v1/product/fr/carte_grise/carte_grise_v1_document.py +++ b/mindee/v1/product/fr/carte_grise/carte_grise_v1_document.py @@ -101,8 +101,8 @@ def __init__( """ Carte Grise document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.a = StringField( diff --git a/mindee/v1/product/fr/id_card/id_card_v1.py b/mindee/v1/product/fr/id_card/id_card_v1.py index 5aa91667..05f31873 100644 --- a/mindee/v1/product/fr/id_card/id_card_v1.py +++ b/mindee/v1/product/fr/id_card/id_card_v1.py @@ -27,7 +27,7 @@ def __init__(self, raw_prediction: StringDict): """ Carte Nationale d'Identité v1 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/fr/id_card/id_card_v1_document.py b/mindee/v1/product/fr/id_card/id_card_v1_document.py index 948bee2e..cf589d6d 100644 --- a/mindee/v1/product/fr/id_card/id_card_v1_document.py +++ b/mindee/v1/product/fr/id_card/id_card_v1_document.py @@ -39,8 +39,8 @@ def __init__( """ Carte Nationale d'Identité document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.authority = StringField( diff --git a/mindee/v1/product/fr/id_card/id_card_v1_page.py b/mindee/v1/product/fr/id_card/id_card_v1_page.py index 5b0a5330..9431c99e 100644 --- a/mindee/v1/product/fr/id_card/id_card_v1_page.py +++ b/mindee/v1/product/fr/id_card/id_card_v1_page.py @@ -22,8 +22,8 @@ def __init__( """ Carte Nationale d'Identité page. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction=raw_prediction, page_id=page_id) self.document_side = ClassificationField( diff --git a/mindee/v1/product/fr/id_card/id_card_v2.py b/mindee/v1/product/fr/id_card/id_card_v2.py index 2b8a3df0..31179e80 100644 --- a/mindee/v1/product/fr/id_card/id_card_v2.py +++ b/mindee/v1/product/fr/id_card/id_card_v2.py @@ -27,7 +27,7 @@ def __init__(self, raw_prediction: StringDict): """ Carte Nationale d'Identité v2 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/fr/id_card/id_card_v2_document.py b/mindee/v1/product/fr/id_card/id_card_v2_document.py index 96432f1a..197cdc82 100644 --- a/mindee/v1/product/fr/id_card/id_card_v2_document.py +++ b/mindee/v1/product/fr/id_card/id_card_v2_document.py @@ -49,8 +49,8 @@ def __init__( """ Carte Nationale d'Identité document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.alternate_name = StringField( diff --git a/mindee/v1/product/fr/id_card/id_card_v2_page.py b/mindee/v1/product/fr/id_card/id_card_v2_page.py index 76a5bc0d..738b3c1c 100644 --- a/mindee/v1/product/fr/id_card/id_card_v2_page.py +++ b/mindee/v1/product/fr/id_card/id_card_v2_page.py @@ -24,8 +24,8 @@ def __init__( """ Carte Nationale d'Identité page. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction=raw_prediction, page_id=page_id) self.document_side = ClassificationField( diff --git a/mindee/v1/product/generated/generated_v1.py b/mindee/v1/product/generated/generated_v1.py index 8c984428..d26e9a9d 100644 --- a/mindee/v1/product/generated/generated_v1.py +++ b/mindee/v1/product/generated/generated_v1.py @@ -23,7 +23,7 @@ def __init__(self, raw_prediction: StringDict) -> None: """ Invoice Splitter v1 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) self.prediction = GeneratedV1Document(raw_prediction["prediction"]) diff --git a/mindee/v1/product/generated/generated_v1_document.py b/mindee/v1/product/generated/generated_v1_document.py index 3b24ec9a..53f6b1ac 100644 --- a/mindee/v1/product/generated/generated_v1_document.py +++ b/mindee/v1/product/generated/generated_v1_document.py @@ -20,7 +20,7 @@ def __init__(self, raw_prediction: StringDict) -> None: """ Generated document. - :param raw_prediction: Dictionary containing the JSON document response + :params raw_prediction: Dictionary containing the JSON document response """ super().__init__(raw_prediction) for field_name, field_contents in raw_prediction.items(): diff --git a/mindee/v1/product/generated/generated_v1_page.py b/mindee/v1/product/generated/generated_v1_page.py index f7b58d05..665a8ad8 100644 --- a/mindee/v1/product/generated/generated_v1_page.py +++ b/mindee/v1/product/generated/generated_v1_page.py @@ -22,7 +22,7 @@ def __init__( """ Generated document object. - :param raw_prediction: Dictionary containing the JSON document response + :params raw_prediction: Dictionary containing the JSON document response """ super().__init__(raw_prediction) for field_name, field_contents in raw_prediction.items(): diff --git a/mindee/v1/product/generated/generated_v1_prediction.py b/mindee/v1/product/generated/generated_v1_prediction.py index c2c934da..d7199dfa 100644 --- a/mindee/v1/product/generated/generated_v1_prediction.py +++ b/mindee/v1/product/generated/generated_v1_prediction.py @@ -19,7 +19,7 @@ def __init__(self, raw_prediction: StringDict) -> None: """ Generated document. - :param raw_prediction: Dictionary containing the JSON document response + :params raw_prediction: Dictionary containing the JSON document response """ super().__init__(raw_prediction) self.fields = {} diff --git a/mindee/v1/product/international_id/international_id_v2.py b/mindee/v1/product/international_id/international_id_v2.py index 55539722..6d60dd7f 100644 --- a/mindee/v1/product/international_id/international_id_v2.py +++ b/mindee/v1/product/international_id/international_id_v2.py @@ -24,7 +24,7 @@ def __init__(self, raw_prediction: StringDict): """ International ID v2 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/international_id/international_id_v2_document.py b/mindee/v1/product/international_id/international_id_v2_document.py index e81188cc..517c3e20 100644 --- a/mindee/v1/product/international_id/international_id_v2_document.py +++ b/mindee/v1/product/international_id/international_id_v2_document.py @@ -54,8 +54,8 @@ def __init__( """ International ID document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.address = StringField( diff --git a/mindee/v1/product/invoice/invoice_v4.py b/mindee/v1/product/invoice/invoice_v4.py index 2b609840..648329d9 100644 --- a/mindee/v1/product/invoice/invoice_v4.py +++ b/mindee/v1/product/invoice/invoice_v4.py @@ -24,7 +24,7 @@ def __init__(self, raw_prediction: StringDict): """ Invoice v4 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/invoice/invoice_v4_document.py b/mindee/v1/product/invoice/invoice_v4_document.py index 4498ad96..b5d69a5d 100644 --- a/mindee/v1/product/invoice/invoice_v4_document.py +++ b/mindee/v1/product/invoice/invoice_v4_document.py @@ -85,8 +85,8 @@ def __init__( """ Invoice document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.billing_address = AddressField( diff --git a/mindee/v1/product/invoice_splitter/invoice_splitter_v1.py b/mindee/v1/product/invoice_splitter/invoice_splitter_v1.py index 5f69a606..c68288e1 100644 --- a/mindee/v1/product/invoice_splitter/invoice_splitter_v1.py +++ b/mindee/v1/product/invoice_splitter/invoice_splitter_v1.py @@ -24,7 +24,7 @@ def __init__(self, raw_prediction: StringDict): """ Invoice Splitter v1 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.py b/mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.py index 1615b67c..27dd4c42 100644 --- a/mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.py +++ b/mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.py @@ -22,8 +22,8 @@ def __init__( """ Invoice Splitter document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.invoice_page_groups = [ diff --git a/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.py b/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.py index f728b1cb..1c67f5b4 100644 --- a/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.py +++ b/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.py @@ -24,7 +24,7 @@ def __init__(self, raw_prediction: StringDict): """ Multi Receipts Detector v1 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.py b/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.py index 6e62b3ed..2573ab17 100644 --- a/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.py +++ b/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.py @@ -20,8 +20,8 @@ def __init__( """ Multi Receipts Detector document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.receipts = [ diff --git a/mindee/v1/product/passport/passport_v1.py b/mindee/v1/product/passport/passport_v1.py index acd3dcb5..19d8ac6b 100644 --- a/mindee/v1/product/passport/passport_v1.py +++ b/mindee/v1/product/passport/passport_v1.py @@ -24,7 +24,7 @@ def __init__(self, raw_prediction: StringDict): """ Passport v1 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/passport/passport_v1_document.py b/mindee/v1/product/passport/passport_v1_document.py index 73876de5..7fb0aa10 100644 --- a/mindee/v1/product/passport/passport_v1_document.py +++ b/mindee/v1/product/passport/passport_v1_document.py @@ -41,8 +41,8 @@ def __init__( """ Passport document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.birth_date = DateField( diff --git a/mindee/v1/product/receipt/receipt_v5.py b/mindee/v1/product/receipt/receipt_v5.py index 7c42fca6..060daf80 100644 --- a/mindee/v1/product/receipt/receipt_v5.py +++ b/mindee/v1/product/receipt/receipt_v5.py @@ -24,7 +24,7 @@ def __init__(self, raw_prediction: StringDict): """ Receipt v5 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/receipt/receipt_v5_document.py b/mindee/v1/product/receipt/receipt_v5_document.py index fc9a2c12..323bdf3b 100644 --- a/mindee/v1/product/receipt/receipt_v5_document.py +++ b/mindee/v1/product/receipt/receipt_v5_document.py @@ -59,8 +59,8 @@ def __init__( """ Receipt document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.category = ClassificationField( diff --git a/mindee/v1/product/us/bank_check/bank_check_v1.py b/mindee/v1/product/us/bank_check/bank_check_v1.py index aea6d486..5bcc0f84 100644 --- a/mindee/v1/product/us/bank_check/bank_check_v1.py +++ b/mindee/v1/product/us/bank_check/bank_check_v1.py @@ -27,7 +27,7 @@ def __init__(self, raw_prediction: StringDict): """ Bank Check v1 inference. - :param raw_prediction: Raw prediction from the HTTP response. + :params raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/us/bank_check/bank_check_v1_document.py b/mindee/v1/product/us/bank_check/bank_check_v1_document.py index b23c1072..9c84c1db 100644 --- a/mindee/v1/product/us/bank_check/bank_check_v1_document.py +++ b/mindee/v1/product/us/bank_check/bank_check_v1_document.py @@ -32,8 +32,8 @@ def __init__( """ Bank Check document. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.account_number = StringField( diff --git a/mindee/v1/product/us/bank_check/bank_check_v1_page.py b/mindee/v1/product/us/bank_check/bank_check_v1_page.py index 334cc55a..8864b09c 100644 --- a/mindee/v1/product/us/bank_check/bank_check_v1_page.py +++ b/mindee/v1/product/us/bank_check/bank_check_v1_page.py @@ -24,8 +24,8 @@ def __init__( """ Bank Check page. - :param raw_prediction: Raw prediction from HTTP response - :param page_id: Page number for multi pages pdf input + :params raw_prediction: Raw prediction from HTTP response + :params page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction=raw_prediction, page_id=page_id) self.check_position = PositionField( diff --git a/mindee/v2/__init__.py b/mindee/v2/__init__.py index 719789b0..d16c51b3 100644 --- a/mindee/v2/__init__.py +++ b/mindee/v2/__init__.py @@ -4,7 +4,7 @@ extract_single_crop, ) from mindee.v2.file_operations.split import extract_splits -from mindee.v2.product.classification.param.classification_parameters import ( +from mindee.v2.product.classification.params.classification_parameters import ( ClassificationParameters, ) from mindee.v2.product.classification.classification_response import ( @@ -12,6 +12,10 @@ ) from mindee.v2.product.crop.params.crop_parameters import CropParameters from mindee.v2.product.crop.crop_response import CropResponse +from mindee.v2.product.extraction.params.extraction_parameters import ( + ExtractionParameters, +) +from mindee.v2.product.extraction.extraction_response import ExtractionResponse from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters from mindee.v2.product.ocr.ocr_response import OCRResponse from mindee.v2.product.split.params.split_parameters import SplitParameters @@ -27,6 +31,8 @@ "ClassificationParameters", "CropResponse", "CropParameters", + "ExtractionParameters", + "ExtractionResponse", "OCRResponse", "OCRParameters", "SplitResponse", diff --git a/mindee/v2/client.py b/mindee/v2/client.py index 3ea75d1b..635e1d40 100644 --- a/mindee/v2/client.py +++ b/mindee/v2/client.py @@ -7,7 +7,6 @@ from mindee.error.v2.mindee_http_error_v2 import handle_error_v2 from mindee.input import UrlInputSource from mindee.v2.input.base_parameters import BaseParameters -from mindee.v2.product.extraction.params.inference_parameters import InferenceParameters from mindee.input.polling_options import PollingOptions from mindee.input.sources.local_input_source import LocalInputSource from mindee.logger import logger @@ -18,7 +17,7 @@ ) from mindee.parsing.common.common_response import CommonStatus from mindee.v2.parsing.inference.base_response import BaseResponse -from mindee.v2.product.extraction.inference_response import InferenceResponse +from mindee.v2.product.extraction.extraction_response import ExtractionResponse from mindee.v2.parsing.inference.job_response import JobResponse TypeBaseResponse = TypeVar("TypeBaseResponse", bound=BaseResponse) @@ -38,7 +37,7 @@ def __init__(self, api_key: Optional[str] = None) -> None: """ Mindee API Client. - :param api_key: Your API key for all endpoints + :params api_key: Your API key for all endpoints """ self.api_key = api_key self.mindee_api = MindeeApiV2(api_key) @@ -66,8 +65,8 @@ def enqueue( """ Enqueues a document to a given model. - :param input_source: The document/source file to use. Can be local or remote. - :param params: Parameters to set when sending a file. + :params input_source: The document/source file to use. Can be local or remote. + :params params: Parameters to set when sending a file. :return: A valid inference response. """ @@ -87,7 +86,7 @@ def get_job(self, job_id: str) -> JobResponse: Can be used for polling. - :param job_id: UUID of the job to retrieve. + :params job_id: UUID of the job to retrieve. :return: A job response. """ logger.debug("Fetching job: %s", job_id) @@ -103,7 +102,7 @@ def get_inference( inference_id: str, ) -> BaseResponse: """[Deprecated] Use `get_result` instead.""" - return self.get_result(InferenceResponse, inference_id) + return self.get_result(ExtractionResponse, inference_id) def get_result( self, @@ -115,8 +114,8 @@ def get_result( The inference will only be available after it has finished processing. - :param inference_id: UUID of the inference to retrieve. - :param response_type: Class of the product to instantiate. + :params inference_id: UUID of the inference to retrieve. + :params response_type: Class of the product to instantiate. :return: An inference response. """ logger.debug("Fetching result: %s", inference_id) @@ -138,9 +137,9 @@ def enqueue_and_get_result( """ Enqueues to an asynchronous endpoint and automatically polls for a response. - :param input_source: The document/source file to use. Can be local or remote. - :param params: Parameters to set when sending a file. - :param response_type: The product class to use for the response object. + :params input_source: The document/source file to use. Can be local or remote. + :params params: Parameters to set when sending a file. + :params response_type: The product class to use for the response object. :return: A valid inference response. """ @@ -175,7 +174,7 @@ def enqueue_and_get_result( job_response.job.completed_at, ) result = self.get_result( - response_type or InferenceResponse, job_response.job.id + response_type or ExtractionResponse, job_response.job.id ) assert isinstance(result, response_type), ( f'Invalid response type "{type(result)}"' @@ -185,20 +184,3 @@ def enqueue_and_get_result( sleep(params.polling_options.delay_sec) raise MindeeError(f"Couldn't retrieve document after {try_counter + 1} tries.") - - def enqueue_and_get_inference( - self, - input_source: Union[LocalInputSource, UrlInputSource], - params: InferenceParameters, - ) -> InferenceResponse: - """[Deprecated] Use `enqueue_and_get_result` instead.""" - warnings.warn( - "enqueue_and_get_inference is deprecated; use enqueue_and_get_result instead", - DeprecationWarning, - stacklevel=2, - ) - response = self.enqueue_and_get_result(InferenceResponse, input_source, params) - assert isinstance(response, InferenceResponse), ( - f'Invalid response type "{type(response)}"' - ) - return response diff --git a/mindee/v2/commands/cli_parser.py b/mindee/v2/commands/cli_parser.py index fc4a895f..11629697 100644 --- a/mindee/v2/commands/cli_parser.py +++ b/mindee/v2/commands/cli_parser.py @@ -3,11 +3,11 @@ from typing import Optional, Type, Union from mindee import ( - InferenceResponse, + ExtractionResponse, CropResponse, SplitResponse, ClassificationResponse, - InferenceParameters, + ExtractionParameters, ClassificationParameters, CropParameters, SplitParameters, @@ -37,8 +37,8 @@ class ProductConfig: params_class=CropParameters, ), "extraction": ProductConfig( - response_class=InferenceResponse, - params_class=InferenceParameters, + response_class=ExtractionResponse, + params_class=ExtractionParameters, ), "split": ProductConfig( response_class=SplitResponse, diff --git a/mindee/v2/file_operations/crop.py b/mindee/v2/file_operations/crop.py index b98ea19a..96116f50 100644 --- a/mindee/v2/file_operations/crop.py +++ b/mindee/v2/file_operations/crop.py @@ -15,8 +15,8 @@ def extract_single_crop( """ Extracts a single crop as complete PDFs from the document. - :param input_source: Local Input Source to extract sub-receipts from. - :param crop: Crop to extract. + :params input_source: Local Input Source to extract sub-receipts from. + :params crop: Crop to extract. :return: ExtractedImage. """ @@ -28,8 +28,8 @@ def extract_crops(input_source: LocalInputSource, crops: List[CropBox]) -> CropF """ Extracts individual receipts from multi-receipts documents. - :param input_source: Local Input Source to extract sub-receipts from. - :param crops: List of crops. + :params input_source: Local Input Source to extract sub-receipts from. + :params crops: List of crops. :return: Individual extracted receipts as an array of ExtractedImage. """ images: List[ExtractedImage] = [] diff --git a/mindee/v2/file_operations/crop_files.py b/mindee/v2/file_operations/crop_files.py index a5e5d131..dafdfde4 100644 --- a/mindee/v2/file_operations/crop_files.py +++ b/mindee/v2/file_operations/crop_files.py @@ -11,8 +11,8 @@ def save_all_to_disk(self, path: Union[Path, str], prefix: str = "crop"): """ Save all extracted crops to disk. - :param path: Path to save the extracted splits to. - :param prefix: Prefix to add to the filename, defaults to 'crop'. + :params path: Path to save the extracted splits to. + :params prefix: Prefix to add to the filename, defaults to 'crop'. """ if isinstance(path, str): path = Path(path) diff --git a/mindee/v2/file_operations/split.py b/mindee/v2/file_operations/split.py index 68b28145..041538c1 100644 --- a/mindee/v2/file_operations/split.py +++ b/mindee/v2/file_operations/split.py @@ -13,8 +13,8 @@ def extract_single_split( """ Extracts a single split as a complete PDF from the document. - :param input_source: Input source to split. - :param split: List of pages to keep. + :params input_source: Input source to split. + :params split: List of pages to keep. :return: Extracted PDF """ return extract_splits(input_source, [split])[0] @@ -27,8 +27,8 @@ def extract_splits( """ Extracts splits as complete PDFs from the document. - :param input_source: Input source to split. - :param splits: List of sub-lists of pages to keep. + :params input_source: Input source to split. + :params splits: List of sub-lists of pages to keep. :return: A list of extracted invoices. """ pdf_extractor = PdfExtractor(input_source) diff --git a/mindee/v2/file_operations/split_files.py b/mindee/v2/file_operations/split_files.py index fe451a77..ab905be7 100644 --- a/mindee/v2/file_operations/split_files.py +++ b/mindee/v2/file_operations/split_files.py @@ -11,8 +11,8 @@ def save_all_to_disk(self, path: Union[str, Path], prefix: str = "split"): """ Save all extracted splits to disk. - :param path: Path to save the extracted splits to. - :param prefix: Prefix to add to the filename, defaults to 'split'. + :params path: Path to save the extracted splits to. + :params prefix: Prefix to add to the filename, defaults to 'split'. """ if isinstance(path, str): path = Path(path) diff --git a/mindee/v2/parsing/__init__.py b/mindee/v2/parsing/__init__.py index 85bf748e..12129a3e 100644 --- a/mindee/v2/parsing/__init__.py +++ b/mindee/v2/parsing/__init__.py @@ -2,23 +2,23 @@ from mindee.v2.parsing.inference.base_response import BaseResponse from mindee.v2.parsing.inference.error_item import ErrorItem from mindee.v2.parsing.inference.error_response import ErrorResponse -from mindee.v2.product.extraction.inference import Inference +from mindee.v2.product.extraction.extraction_inference import ExtractionInference from mindee.v2.parsing.inference.inference_active_options import InferenceActiveOptions from mindee.v2.parsing.inference.inference_file import InferenceFile from mindee.v2.parsing.inference.inference_model import InferenceModel -from mindee.v2.product.extraction.inference_response import InferenceResponse -from mindee.v2.product.extraction.inference_result import InferenceResult +from mindee.v2.product.extraction.extraction_response import ExtractionResponse +from mindee.v2.product.extraction.extraction_result import ExtractionResult from mindee.v2.parsing.inference.job_response import JobResponse __all__ = [ "BaseInference", "BaseResponse", - "Inference", + "ExtractionInference", "InferenceActiveOptions", "InferenceFile", "InferenceModel", - "InferenceResponse", - "InferenceResult", + "ExtractionResponse", + "ExtractionResult", "JobResponse", "ErrorResponse", "ErrorItem", diff --git a/mindee/v2/parsing/inference/field/field_location.py b/mindee/v2/parsing/inference/field/field_location.py index 8dae3c5f..acbc490a 100644 --- a/mindee/v2/parsing/inference/field/field_location.py +++ b/mindee/v2/parsing/inference/field/field_location.py @@ -14,7 +14,7 @@ def __init__(self, server_response: StringDict) -> None: """ Initialize FieldLocation from the server response. - :param server_response: Raw server response. + :params server_response: Raw server response. """ self.polygon = Polygon(server_response["polygon"]) self.page = int(server_response["page"]) diff --git a/mindee/v2/parsing/inference/field/object_field.py b/mindee/v2/parsing/inference/field/object_field.py index 6b2355c9..9f201fbd 100644 --- a/mindee/v2/parsing/inference/field/object_field.py +++ b/mindee/v2/parsing/inference/field/object_field.py @@ -88,7 +88,7 @@ def get_simple_field(self, field_name: str) -> "SimpleField": """ Retrieves a SimpleField from the provided field name. - :param field_name: The name of the field to retrieve. + :params field_name: The name of the field to retrieve. :type field_name: str :return: The SimpleField object corresponding to the given field name. :raises ValueError: If the specified field is not of type SimpleField. @@ -101,7 +101,7 @@ def get_list_field(self, field_name: str) -> "ListField": """ Retrieves the ``ListField`` for the specified field name. - :param field_name: The name of the field to retrieve. + :params field_name: The name of the field to retrieve. :type field_name: str :return: The corresponding ``ListField`` for the given field name. :raises ValueError: If the field is not of type ``ListField``. @@ -114,7 +114,7 @@ def get_object_field(self, field_name: str) -> "ObjectField": """ Retrieves the `ObjectField` associated with the specified field name. - :param field_name: The name of the field to retrieve. + :params field_name: The name of the field to retrieve. :type field_name: str :return: The `ObjectField` associated with the given field name. :raises ValueError: If the field specified by `field_name` is not an `ObjectField`. diff --git a/mindee/v2/product/__init__.py b/mindee/v2/product/__init__.py index 63daf638..80ca0d78 100644 --- a/mindee/v2/product/__init__.py +++ b/mindee/v2/product/__init__.py @@ -1,4 +1,4 @@ -from mindee.v2.product.classification.param.classification_parameters import ( +from mindee.v2.product.classification.params.classification_parameters import ( ClassificationParameters, ) from mindee.v2.product.classification.classification_response import ( diff --git a/mindee/v2/product/classification/__init__.py b/mindee/v2/product/classification/__init__.py index ee60dadf..7132dc06 100644 --- a/mindee/v2/product/classification/__init__.py +++ b/mindee/v2/product/classification/__init__.py @@ -4,7 +4,7 @@ from mindee.v2.product.classification.classification_inference import ( ClassificationInference, ) -from mindee.v2.product.classification.param.classification_parameters import ( +from mindee.v2.product.classification.params.classification_parameters import ( ClassificationParameters, ) from mindee.v2.product.classification.classification_response import ( diff --git a/mindee/v2/product/classification/classification_classifier.py b/mindee/v2/product/classification/classification_classifier.py index c196290e..de612181 100644 --- a/mindee/v2/product/classification/classification_classifier.py +++ b/mindee/v2/product/classification/classification_classifier.py @@ -1,7 +1,7 @@ from typing import Optional from mindee.parsing.common import StringDict -from mindee.v2.product.extraction.inference_response import InferenceResponse +from mindee.v2.product.extraction.extraction_response import ExtractionResponse class ClassificationClassifier: @@ -10,13 +10,13 @@ class ClassificationClassifier: document_type: str """The document type, as identified on given classification values.""" - extraction_response: Optional[InferenceResponse] = None + extraction_response: Optional[ExtractionResponse] = None """The extraction response associated with the classification.""" def __init__(self, server_response: StringDict): self.document_type = server_response["document_type"] if server_response.get("extraction_response") is not None: - self.extraction_response = InferenceResponse( + self.extraction_response = ExtractionResponse( server_response["extraction_response"] ) diff --git a/mindee/v2/product/classification/param/__init__.py b/mindee/v2/product/classification/param/__init__.py deleted file mode 100644 index 3d594b77..00000000 --- a/mindee/v2/product/classification/param/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from mindee.v2.product.classification.param.classification_parameters import ( - ClassificationParameters, -) - -__all__ = ["ClassificationParameters"] diff --git a/mindee/v2/product/classification/params/__init__.py b/mindee/v2/product/classification/params/__init__.py new file mode 100644 index 00000000..74f32e42 --- /dev/null +++ b/mindee/v2/product/classification/params/__init__.py @@ -0,0 +1,5 @@ +from mindee.v2.product.classification.params.classification_parameters import ( + ClassificationParameters, +) + +__all__ = ["ClassificationParameters"] diff --git a/mindee/v2/product/classification/param/classification_parameters.py b/mindee/v2/product/classification/params/classification_parameters.py similarity index 100% rename from mindee/v2/product/classification/param/classification_parameters.py rename to mindee/v2/product/classification/params/classification_parameters.py diff --git a/mindee/v2/product/crop/crop_box.py b/mindee/v2/product/crop/crop_box.py index 4508575f..a6f382b5 100644 --- a/mindee/v2/product/crop/crop_box.py +++ b/mindee/v2/product/crop/crop_box.py @@ -4,7 +4,7 @@ from mindee.input.sources.local_input_source import LocalInputSource from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.field import FieldLocation -from mindee.v2.product.extraction.inference_response import InferenceResponse +from mindee.v2.product.extraction.extraction_response import ExtractionResponse class CropBox: @@ -16,14 +16,14 @@ class CropBox: object_type: str """Type or classification of the detected object.""" - extraction_response: Optional[InferenceResponse] = None + extraction_response: Optional[ExtractionResponse] = None """The extraction response associated with the crop.""" def __init__(self, server_response: StringDict): self.location = FieldLocation(server_response["location"]) self.object_type = server_response["object_type"] if server_response.get("extraction_response") is not None: - self.extraction_response = InferenceResponse( + self.extraction_response = ExtractionResponse( server_response["extraction_response"] ) @@ -34,7 +34,7 @@ def extract_from_file(self, input_source: LocalInputSource) -> ExtractedImage: """ Apply the split range inference to a file and return a single extracted PDF. - :param input_source: Local file to apply the inference to + :params input_source: Local file to apply the inference to :return: Extracted PDF """ return extract_multiple_images_from_source( diff --git a/mindee/v2/product/crop/crop_response.py b/mindee/v2/product/crop/crop_response.py index 253fe36d..75e4773c 100644 --- a/mindee/v2/product/crop/crop_response.py +++ b/mindee/v2/product/crop/crop_response.py @@ -22,7 +22,7 @@ def extract_from_file(self, input_source: LocalInputSource) -> CropFiles: """ Apply the crop inference to a file and return a list of extracted images. - :param input_source: Local file to apply the inference to + :params input_source: Local file to apply the inference to :return: List of extracted PDFs """ return CropFiles( diff --git a/mindee/v2/product/extraction/__init__.py b/mindee/v2/product/extraction/__init__.py index 9362a5d8..dac3f171 100644 --- a/mindee/v2/product/extraction/__init__.py +++ b/mindee/v2/product/extraction/__init__.py @@ -1,17 +1,19 @@ -from mindee.v2.product.extraction.inference import Inference -from mindee.v2.product.extraction.inference_response import InferenceResponse -from mindee.v2.product.extraction.inference_result import InferenceResult -from mindee.v2.product.extraction.params.inference_parameters import InferenceParameters +from mindee.v2.product.extraction.extraction_inference import ExtractionInference +from mindee.v2.product.extraction.extraction_response import ExtractionResponse +from mindee.v2.product.extraction.extraction_result import ExtractionResult +from mindee.v2.product.extraction.params.extraction_parameters import ( + ExtractionParameters, +) from mindee.v2.product.extraction.params.data_schema import DataSchema from mindee.v2.product.extraction.params.data_schema_replace import DataSchemaReplace from mindee.v2.product.extraction.params.data_schema_field import DataSchemaField from mindee.v2.product.extraction.params.string_data_class import StringDataClass __all__ = [ - "Inference", - "InferenceParameters", - "InferenceResponse", - "InferenceResult", + "ExtractionInference", + "ExtractionParameters", + "ExtractionResponse", + "ExtractionResult", "DataSchemaField", "DataSchema", "DataSchemaReplace", diff --git a/mindee/v2/product/extraction/inference.py b/mindee/v2/product/extraction/extraction_inference.py similarity index 79% rename from mindee/v2/product/extraction/inference.py rename to mindee/v2/product/extraction/extraction_inference.py index 7da58d41..c7a65aab 100644 --- a/mindee/v2/product/extraction/inference.py +++ b/mindee/v2/product/extraction/extraction_inference.py @@ -1,20 +1,20 @@ from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.base_inference import BaseInference from mindee.v2.parsing.inference.inference_active_options import InferenceActiveOptions -from mindee.v2.product.extraction.inference_result import InferenceResult +from mindee.v2.product.extraction.extraction_result import ExtractionResult -class Inference(BaseInference): +class ExtractionInference(BaseInference): """Inference object for a V2 API return.""" - result: InferenceResult + result: ExtractionResult """Result of the inference.""" active_options: InferenceActiveOptions """Active options for the inference.""" def __init__(self, raw_response: StringDict): super().__init__(raw_response) - self.result = InferenceResult(raw_response["result"]) + self.result = ExtractionResult(raw_response["result"]) self.active_options = InferenceActiveOptions(raw_response["active_options"]) def __str__(self) -> str: diff --git a/mindee/v2/product/extraction/inference_response.py b/mindee/v2/product/extraction/extraction_response.py similarity index 71% rename from mindee/v2/product/extraction/inference_response.py rename to mindee/v2/product/extraction/extraction_response.py index 4f84be15..39c396d8 100644 --- a/mindee/v2/product/extraction/inference_response.py +++ b/mindee/v2/product/extraction/extraction_response.py @@ -1,19 +1,19 @@ from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.base_response import BaseResponse -from mindee.v2.product.extraction.inference import Inference +from mindee.v2.product.extraction.extraction_inference import ExtractionInference -class InferenceResponse(BaseResponse): +class ExtractionResponse(BaseResponse): """Represent an inference response from Mindee V2 API.""" - inference: Inference + inference: ExtractionInference """Inference result.""" _slug: str = "products/extraction/results" """Slug of the inference.""" def __init__(self, raw_response: StringDict) -> None: super().__init__(raw_response) - self.inference = Inference(raw_response["inference"]) + self.inference = ExtractionInference(raw_response["inference"]) def __str__(self) -> str: return str(self.inference) diff --git a/mindee/v2/product/extraction/inference_result.py b/mindee/v2/product/extraction/extraction_result.py similarity index 97% rename from mindee/v2/product/extraction/inference_result.py rename to mindee/v2/product/extraction/extraction_result.py index c0ba3dda..0844007d 100644 --- a/mindee/v2/product/extraction/inference_result.py +++ b/mindee/v2/product/extraction/extraction_result.py @@ -6,7 +6,7 @@ from mindee.v2.parsing.inference.raw_text import RawText -class InferenceResult: +class ExtractionResult: """Inference result info.""" fields: InferenceFields diff --git a/mindee/v2/product/extraction/params/__init__.py b/mindee/v2/product/extraction/params/__init__.py index 5553ba80..82338447 100644 --- a/mindee/v2/product/extraction/params/__init__.py +++ b/mindee/v2/product/extraction/params/__init__.py @@ -2,10 +2,12 @@ from mindee.v2.product.extraction.params.string_data_class import StringDataClass from mindee.v2.product.extraction.params.data_schema import DataSchema from mindee.v2.product.extraction.params.data_schema_replace import DataSchemaReplace -from mindee.v2.product.extraction.params.inference_parameters import InferenceParameters +from mindee.v2.product.extraction.params.extraction_parameters import ( + ExtractionParameters, +) __all__ = [ - "InferenceParameters", + "ExtractionParameters", "DataSchemaField", "StringDataClass", "DataSchema", diff --git a/mindee/v2/product/extraction/params/inference_parameters.py b/mindee/v2/product/extraction/params/extraction_parameters.py similarity index 98% rename from mindee/v2/product/extraction/params/inference_parameters.py rename to mindee/v2/product/extraction/params/extraction_parameters.py index 600fcc5c..8a4cd98f 100644 --- a/mindee/v2/product/extraction/params/inference_parameters.py +++ b/mindee/v2/product/extraction/params/extraction_parameters.py @@ -7,7 +7,7 @@ @dataclass -class InferenceParameters(BaseParameters): +class ExtractionParameters(BaseParameters): """Inference parameters to set when sending a file.""" rag: Optional[bool] = None diff --git a/mindee/v2/product/split/split_range.py b/mindee/v2/product/split/split_range.py index d63d4547..b2f95a67 100644 --- a/mindee/v2/product/split/split_range.py +++ b/mindee/v2/product/split/split_range.py @@ -1,6 +1,6 @@ from typing import List, Optional -from mindee.v2.product.extraction.inference_response import InferenceResponse +from mindee.v2.product.extraction.extraction_response import ExtractionResponse from mindee.extraction.pdf_extractor.extracted_pdf import ExtractedPdf from mindee.input.sources.local_input_source import LocalInputSource from mindee.parsing.common import StringDict @@ -19,14 +19,14 @@ class SplitRange: document_type: str """The document type, as identified on given classification values.""" - extraction_response: Optional[InferenceResponse] = None + extraction_response: Optional[ExtractionResponse] = None """The extraction response associated with the split.""" def __init__(self, server_response: StringDict): self.page_range = server_response["page_range"] self.document_type = server_response["document_type"] if server_response.get("extraction_response") is not None: - self.extraction_response = InferenceResponse( + self.extraction_response = ExtractionResponse( server_response["extraction_response"] ) @@ -38,7 +38,7 @@ def extract_from_file(self, input_source: LocalInputSource) -> ExtractedPdf: """ Apply the split range inference to a file and return a single extracted PDF. - :param input_source: Local file to apply the inference to + :params input_source: Local file to apply the inference to :return: Extracted PDF """ return extract_single_split(input_source, self.page_range) diff --git a/mindee/v2/product/split/split_response.py b/mindee/v2/product/split/split_response.py index b46a58ac..5cae909c 100644 --- a/mindee/v2/product/split/split_response.py +++ b/mindee/v2/product/split/split_response.py @@ -22,7 +22,7 @@ def extract_from_file(self, input_source: LocalInputSource) -> SplitFiles: """ Apply the split inference to a file and return a list of extracted PDFs. - :param input_source: Local file to apply the inference to + :params input_source: Local file to apply the inference to :return: List of extracted PDFs """ return SplitFiles( diff --git a/tests/utils.py b/tests/utils.py index 79948522..8de00d8f 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -41,8 +41,8 @@ def dummy_envvars(monkeypatch) -> None: def levenshtein_ratio(ref_str: str, target_str: str) -> float: """ Calculates the Levenshtein ratio between two strings. - :param ref_str: Reference string. - :param target_str: Target String. + :params ref_str: Reference string. + :params target_str: Target String. :return: Ratio between the two strings """ return SequenceMatcher(None, ref_str, target_str).ratio() diff --git a/tests/v2/file_operations/test_crop_operation_integration.py b/tests/v2/file_operations/test_crop_operation_integration.py index a95bc67f..b0c4a873 100644 --- a/tests/v2/file_operations/test_crop_operation_integration.py +++ b/tests/v2/file_operations/test_crop_operation_integration.py @@ -4,8 +4,8 @@ import pytest from mindee import ( - InferenceParameters, - InferenceResponse, + ExtractionParameters, + ExtractionResponse, CropParameters, CropResponse, ) @@ -20,7 +20,7 @@ def crop_sample(): return V2_PRODUCT_DATA_DIR / "crop" / "default_sample.jpg" -def check_findoc_return(findoc_response: InferenceResponse): +def check_findoc_return(findoc_response: ExtractionResponse): assert len(findoc_response.inference.model.id) > 0 assert findoc_response.inference.result.fields.get("total_amount").value > 0 @@ -43,9 +43,9 @@ def test_image_should_extract_crops(): assert extracted_images[1].filename == "default_sample.jpg_page1-1.jpg" invoice_0 = client.enqueue_and_get_result( - InferenceResponse, + ExtractionResponse, extracted_images[0].as_input_source(), - InferenceParameters( + ExtractionParameters( getenv("MINDEE_V2_SE_TESTS_FINDOC_MODEL_ID"), close_file=False ), ) diff --git a/tests/v2/file_operations/test_split_operation_integration.py b/tests/v2/file_operations/test_split_operation_integration.py index 8b78b24b..cc9ac43c 100644 --- a/tests/v2/file_operations/test_split_operation_integration.py +++ b/tests/v2/file_operations/test_split_operation_integration.py @@ -3,8 +3,8 @@ import pytest from mindee import ( - InferenceParameters, - InferenceResponse, + ExtractionParameters, + ExtractionResponse, SplitParameters, SplitResponse, ) @@ -18,7 +18,7 @@ def invoice_splitter_5p_path(): return V2_PRODUCT_DATA_DIR / "split" / "invoice_5p.pdf" -def check_findoc_return(findoc_response: InferenceResponse): +def check_findoc_return(findoc_response: ExtractionResponse): assert len(findoc_response.inference.model.id) > 0 assert findoc_response.inference.result.fields.get("total_amount").value > 0 @@ -44,9 +44,9 @@ def test_pdf_should_extract_splits(): assert extracted_pdfs[1].filename == "default_sample_002-002.pdf" invoice_0 = client.enqueue_and_get_result( - InferenceResponse, + ExtractionResponse, extracted_pdfs[0].as_input_source(), - InferenceParameters( + ExtractionParameters( getenv("MINDEE_V2_SE_TESTS_FINDOC_MODEL_ID"), close_file=False ), ) diff --git a/tests/v2/input/test_inference_parameters.py b/tests/v2/input/test_inference_parameters.py index 094888ff..93c54e45 100644 --- a/tests/v2/input/test_inference_parameters.py +++ b/tests/v2/input/test_inference_parameters.py @@ -2,7 +2,7 @@ import pytest -from mindee import InferenceParameters +from mindee import ExtractionParameters from mindee.v2.product.extraction.params.data_schema import DataSchema from mindee.v2.product.extraction.params.data_schema_field import DataSchemaField from mindee.v2.product.extraction.params.data_schema_replace import DataSchemaReplace @@ -17,26 +17,26 @@ def test_data_schema_replace_none(): - params = InferenceParameters(model_id="test-id") + params = ExtractionParameters(model_id="test-id") assert params.data_schema is None def test_data_schema_replace_str(): - params = InferenceParameters( + params = ExtractionParameters( model_id="test-id", data_schema=expected_data_schema_str ) assert str(params.data_schema) == expected_data_schema_str def test_data_schema_replace_dict(): - params = InferenceParameters( + params = ExtractionParameters( model_id="test-id", data_schema=expected_data_schema_dict ) assert str(params.data_schema) == expected_data_schema_str def test_data_schema_replace_obj_top(): - params = InferenceParameters( + params = ExtractionParameters( model_id="test-id", data_schema=DataSchema(replace=expected_data_schema_dict["replace"]), ) @@ -44,7 +44,7 @@ def test_data_schema_replace_obj_top(): def test_data_schema_replace_obj_fields(): - params = InferenceParameters( + params = ExtractionParameters( model_id="test-id", data_schema=DataSchema( replace=DataSchemaReplace( @@ -59,11 +59,13 @@ def test_data_schema_replace_empty_fields(): with pytest.raises( ValueError, match="Data schema replacement fields cannot be empty" ): - InferenceParameters(model_id="test-id", data_schema={"replace": {"fields": []}}) + ExtractionParameters( + model_id="test-id", data_schema={"replace": {"fields": []}} + ) def test_data_schema_replace_obj_full(): - params = InferenceParameters( + params = ExtractionParameters( model_id="test-id", data_schema=DataSchema( replace=DataSchemaReplace( diff --git a/tests/v2/input/test_local_response.py b/tests/v2/input/test_local_response.py index eaffa455..a45cc6ba 100644 --- a/tests/v2/input/test_local_response.py +++ b/tests/v2/input/test_local_response.py @@ -2,7 +2,7 @@ import pytest -from mindee import InferenceResponse +from mindee import ExtractionResponse from mindee.input import LocalResponse from tests.utils import V2_PRODUCT_DATA_DIR @@ -22,8 +22,10 @@ def _assert_local_response(local_response): ) assert signature == local_response.get_hmac_signature(fake_hmac_signing) assert local_response.is_valid_hmac_signature(fake_hmac_signing, signature) - reponse: InferenceResponse = local_response.deserialize_response(InferenceResponse) - assert isinstance(reponse, InferenceResponse) + reponse: ExtractionResponse = local_response.deserialize_response( + ExtractionResponse + ) + assert isinstance(reponse, ExtractionResponse) assert reponse.inference is not None assert reponse.inference.result is not None assert reponse.inference.result.fields is not None diff --git a/tests/v2/product/classification/test_classification_response.py b/tests/v2/product/classification/test_classification_response.py index 651a0c30..950efde0 100644 --- a/tests/v2/product/classification/test_classification_response.py +++ b/tests/v2/product/classification/test_classification_response.py @@ -1,6 +1,6 @@ import pytest -from mindee import InferenceResponse +from mindee import ExtractionResponse from mindee.v2.product.classification.classification_classifier import ( ClassificationClassifier, ) @@ -41,7 +41,7 @@ def test_classification_with_extraction_result(): ) classification = response.inference.result.classification assert classification.document_type == "invoice" - assert isinstance(classification.extraction_response, InferenceResponse) + assert isinstance(classification.extraction_response, ExtractionResponse) assert ( classification.extraction_response.inference.result.fields.get( "customer_name" diff --git a/tests/v2/product/crop/test_crop_response.py b/tests/v2/product/crop/test_crop_response.py index 761951a8..314e177a 100644 --- a/tests/v2/product/crop/test_crop_response.py +++ b/tests/v2/product/crop/test_crop_response.py @@ -1,6 +1,6 @@ import pytest -from mindee import InferenceResponse +from mindee import ExtractionResponse from mindee.v2.product.crop.crop_box import CropBox from mindee.v2.product.crop import CropInference from mindee.v2.product.crop.crop_response import CropResponse @@ -84,14 +84,14 @@ def test_crop_with_extraction_result(): ) crops = response.inference.result.crops assert crops[0].object_type == "receipt" - assert isinstance(crops[0].extraction_response, InferenceResponse) + assert isinstance(crops[0].extraction_response, ExtractionResponse) assert ( crops[0].extraction_response.inference.result.fields.get("supplier_name").value == "CHEZ ALAIN MIAM MIAM" ) assert crops[1].object_type == "receipt" - assert isinstance(crops[1].extraction_response, InferenceResponse) + assert isinstance(crops[1].extraction_response, ExtractionResponse) assert ( crops[1].extraction_response.inference.result.fields.get("supplier_name").value == "La cerise sur la pizza" diff --git a/tests/v2/product/extraction/test_extraction_response.py b/tests/v2/product/extraction/test_extraction_response.py index b35124ea..7973e02c 100644 --- a/tests/v2/product/extraction/test_extraction_response.py +++ b/tests/v2/product/extraction/test_extraction_response.py @@ -2,14 +2,14 @@ import pytest -from mindee import InferenceResponse +from mindee import ExtractionResponse from mindee.v2.parsing.inference.inference_active_options import InferenceActiveOptions from mindee.v2.parsing.inference.field import FieldConfidence from mindee.v2.parsing.inference.field import ListField from mindee.v2.parsing.inference.field.object_field import ObjectField from mindee.v2.parsing.inference.field.simple_field import SimpleField from mindee.v2.parsing.inference.field import InferenceFields -from mindee.v2.product.extraction.inference import Inference +from mindee.v2.product.extraction.extraction_inference import ExtractionInference from mindee.v2.parsing.inference.inference_file import InferenceFile from mindee.v2.parsing.inference.inference_model import InferenceModel from mindee.v2.parsing.inference.rag_metadata import RagMetadata @@ -22,8 +22,8 @@ def test_deep_nested_fields(): json_sample, _ = get_product_samples( product="extraction", file_name="deep_nested_fields" ) - response = InferenceResponse(json_sample) - assert isinstance(response.inference, Inference) + response = ExtractionResponse(json_sample) + assert isinstance(response.inference, ExtractionInference) assert isinstance(response.inference.result.fields["field_simple"], SimpleField) assert isinstance(response.inference.result.fields["field_object"], ObjectField) assert isinstance( @@ -96,8 +96,8 @@ def test_standard_field_types(): json_sample, rst_sample = get_product_samples( product="extraction", file_name="standard_field_types" ) - response = InferenceResponse(json_sample) - assert isinstance(response.inference, Inference) + response = ExtractionResponse(json_sample) + assert isinstance(response.inference, ExtractionInference) field_simple_string = response.inference.result.fields["field_simple_string"] assert isinstance(field_simple_string, SimpleField) @@ -131,7 +131,7 @@ def test_standard_field_object(): json_sample, _ = get_product_samples( product="extraction", file_name="standard_field_types" ) - response = InferenceResponse(json_sample) + response = ExtractionResponse(json_sample) object_field = response.inference.result.fields["field_object"] assert isinstance(object_field, ObjectField) @@ -153,8 +153,8 @@ def test_standard_field_object_list(): json_sample, _ = get_product_samples( product="extraction", file_name="standard_field_types" ) - response = InferenceResponse(json_sample) - assert isinstance(response.inference, Inference) + response = ExtractionResponse(json_sample) + assert isinstance(response.inference, ExtractionInference) field_object_list = response.inference.result.fields["field_object_list"] assert isinstance(field_object_list, ListField) @@ -168,8 +168,8 @@ def test_standard_field_simple_list(): json_sample, _ = get_product_samples( product="extraction", file_name="standard_field_types" ) - response = InferenceResponse(json_sample) - assert isinstance(response.inference, Inference) + response = ExtractionResponse(json_sample) + assert isinstance(response.inference, ExtractionInference) field_simple_list = response.inference.result.fields["field_simple_list"] assert isinstance(field_simple_list, ListField) @@ -181,8 +181,8 @@ def test_standard_field_simple_list(): @pytest.mark.v2 def test_raw_texts(): json_sample, _ = get_product_samples(product="extraction", file_name="raw_texts") - response = InferenceResponse(json_sample) - assert isinstance(response.inference, Inference) + response = ExtractionResponse(json_sample) + assert isinstance(response.inference, ExtractionInference) assert response.inference.result.raw_text assert len(response.inference.result.raw_text.pages) == 2 @@ -197,7 +197,7 @@ def test_raw_texts(): def test_rag_metadata_when_matched(): """RAG metadata when matched.""" json_sample, _ = get_product_samples(product="extraction", file_name="rag_matched") - response = InferenceResponse(json_sample) + response = ExtractionResponse(json_sample) rag = response.inference.result.rag assert isinstance(rag, RagMetadata) assert rag.retrieved_document_id == "12345abc-1234-1234-1234-123456789abc" @@ -210,7 +210,7 @@ def test_rag_metadata_when_not_matched(): json_sample, _ = get_product_samples( product="extraction", file_name="rag_not_matched" ) - response = InferenceResponse(json_sample) + response = ExtractionResponse(json_sample) rag = response.inference.result.rag assert isinstance(rag, RagMetadata) assert rag.retrieved_document_id is None @@ -222,9 +222,9 @@ def test_full_inference_response(): json_sample, _ = get_product_samples( product="extraction/financial_document", file_name="complete" ) - response = InferenceResponse(json_sample) + response = ExtractionResponse(json_sample) - assert isinstance(response.inference, Inference) + assert isinstance(response.inference, ExtractionInference) assert response.inference.id == "12345678-1234-1234-1234-123456789abc" assert isinstance(response.inference.result.fields["date"], SimpleField) assert response.inference.result.fields["date"].value == "2019-11-02" @@ -259,7 +259,7 @@ def test_field_locations_and_confidence() -> None: product="extraction/financial_document", file_name="complete_with_coordinates" ) - response = InferenceResponse(json_sample) + response = ExtractionResponse(json_sample) date_field: SimpleField = response.inference.result.fields["date"] @@ -300,7 +300,7 @@ def test_text_context_field_is_false() -> None: json_sample, _ = get_product_samples( product="extraction/financial_document", file_name="complete" ) - response = InferenceResponse(json_sample) + response = ExtractionResponse(json_sample) assert isinstance(response.inference.active_options, InferenceActiveOptions) assert response.inference.active_options.text_context is False @@ -311,6 +311,6 @@ def test_text_context_field_is_true() -> None: V2_PRODUCT_DATA_DIR / "extraction" / "text_context_enabled.json", "r" ) as file: json_sample = json.load(file) - response = InferenceResponse(json_sample) + response = ExtractionResponse(json_sample) assert isinstance(response.inference.active_options, InferenceActiveOptions) assert response.inference.active_options.text_context is True diff --git a/tests/v2/product/split/test_split_response.py b/tests/v2/product/split/test_split_response.py index 8b79f31b..a01c3db8 100644 --- a/tests/v2/product/split/test_split_response.py +++ b/tests/v2/product/split/test_split_response.py @@ -1,6 +1,6 @@ import pytest -from mindee import InferenceResponse +from mindee import ExtractionResponse from mindee.v2.product.split.split_range import SplitRange from mindee.v2.product.split import SplitInference from mindee.v2.product.split.split_response import SplitResponse @@ -61,7 +61,7 @@ def test_split_with_extraction_result(): split = response.inference.result.splits assert split[0].document_type == "invoice" assert split[0].page_range[0] == 0 - assert isinstance(split[0].extraction_response, InferenceResponse) + assert isinstance(split[0].extraction_response, ExtractionResponse) assert ( split[0] .extraction_response.inference.result.fields.get("supplier_phone_number") @@ -71,7 +71,7 @@ def test_split_with_extraction_result(): assert split[1].document_type == "invoice" assert split[1].page_range[0] == 1 - assert isinstance(split[1].extraction_response, InferenceResponse) + assert isinstance(split[1].extraction_response, ExtractionResponse) assert ( split[1] .extraction_response.inference.result.fields.get("supplier_phone_number") diff --git a/tests/v2/test_client.py b/tests/v2/test_client.py index f30c1915..1ccef471 100644 --- a/tests/v2/test_client.py +++ b/tests/v2/test_client.py @@ -3,14 +3,14 @@ import pytest -from mindee import InferenceParameters, InferenceResponse, LocalResponse +from mindee import ExtractionParameters, ExtractionResponse, LocalResponse from mindee.v2.client import Client from mindee.error.mindee_error import MindeeApiV2Error, MindeeError from mindee.error.v2.mindee_http_error_v2 import MindeeHTTPErrorV2 from mindee.input.sources.local_input_source import LocalInputSource from mindee.input.sources.path_input import PathInput from mindee.mindee_http.base_settings import USER_AGENT -from mindee.v2.product.extraction.inference import Inference +from mindee.v2.product.extraction.extraction_inference import ExtractionInference from mindee.v2.parsing.inference.job import Job from mindee.v2.parsing.inference.job_response import JobResponse from tests.utils import FILE_TYPES_DIR, V2_PRODUCT_DATA_DIR, V2_DATA_DIR, dummy_envvars @@ -129,7 +129,7 @@ def test_enqueue_path_with_env_token(custom_base_url_client): f"{FILE_TYPES_DIR}/receipt.jpg" ) with pytest.raises(MindeeHTTPErrorV2): - custom_base_url_client.enqueue(input_doc, InferenceParameters("dummy-model")) + custom_base_url_client.enqueue(input_doc, ExtractionParameters("dummy-model")) @pytest.mark.v2 @@ -139,9 +139,9 @@ def test_enqueue_and_parse_path_with_env_token(custom_base_url_client): ) with pytest.raises(MindeeHTTPErrorV2): custom_base_url_client.enqueue_and_get_result( - InferenceResponse, + ExtractionResponse, input_doc, - InferenceParameters( + ExtractionParameters( "dummy-model", text_context="ignore this message", data_schema=json.loads( @@ -155,11 +155,11 @@ def test_enqueue_and_parse_path_with_env_token(custom_base_url_client): ) -def _assert_findoc_inference(response: InferenceResponse): +def _assert_findoc_inference(response: ExtractionResponse): # There are already detailed tests of the inference object. # Here we are just testing whether the client can load OK. - assert isinstance(response, InferenceResponse) - assert isinstance(response.inference, Inference) + assert isinstance(response, ExtractionResponse) + assert isinstance(response.inference, ExtractionInference) assert response.inference.id assert response.inference.model.id assert len(response.inference.result.fields) > 1 @@ -170,7 +170,7 @@ def test_loads_from_prediction(): input_inference = LocalResponse( V2_PRODUCT_DATA_DIR / "extraction" / "financial_document" / "complete.json" ) - response = input_inference.deserialize_response(InferenceResponse) + response = input_inference.deserialize_response(ExtractionResponse) _assert_findoc_inference(response) with pytest.raises(MindeeError): input_inference.deserialize_response(JobResponse) @@ -179,7 +179,7 @@ def test_loads_from_prediction(): @pytest.mark.v2 def test_get_inference(custom_base_url_client): response = custom_base_url_client.get_result( - InferenceResponse, "12345678-1234-1234-1234-123456789ABC" + ExtractionResponse, "12345678-1234-1234-1234-123456789ABC" ) _assert_findoc_inference(response) @@ -194,7 +194,7 @@ def test_error_handling(custom_base_url_client): / "financial_document" / "default_sample.jpg" ), - InferenceParameters("dummy-model"), + ExtractionParameters("dummy-model"), ) assert e.status_code == -1 assert e.detail == "forced failure from test" diff --git a/tests/v2/test_client_integration.py b/tests/v2/test_client_integration.py index 9b130193..226b1e3b 100644 --- a/tests/v2/test_client_integration.py +++ b/tests/v2/test_client_integration.py @@ -3,13 +3,13 @@ import pytest -from mindee import InferenceParameters +from mindee import ExtractionParameters from mindee.v1.client import Client from mindee.input.sources.path_input import PathInput from mindee.input.sources.url_input_source import UrlInputSource from mindee.error.v2.mindee_http_error_v2 import MindeeHTTPErrorV2 from mindee.v2.parsing import InferenceActiveOptions -from mindee.v2.product.extraction.inference_response import InferenceResponse +from mindee.v2.product.extraction.extraction_response import ExtractionResponse from tests.utils import FILE_TYPES_DIR, V2_PRODUCT_DATA_DIR @@ -25,7 +25,7 @@ def v2_client() -> Client: def _basic_assert_success( - response: InferenceResponse, page_count: int, model_id: str + response: ExtractionResponse, page_count: int, model_id: str ) -> None: assert response is not None assert response.inference is not None @@ -52,7 +52,7 @@ def test_parse_file_empty_multiple_pages_must_succeed( input_path: Path = FILE_TYPES_DIR / "pdf" / "multipage_cut-2.pdf" input_source = PathInput(input_path) - params = InferenceParameters( + params = ExtractionParameters( model_id=findoc_model_id, rag=False, raw_text=True, @@ -61,8 +61,8 @@ def test_parse_file_empty_multiple_pages_must_succeed( alias="py_integration_empty_multiple", ) - response: InferenceResponse = v2_client.enqueue_and_get_result( - InferenceResponse, input_source, params + response: ExtractionResponse = v2_client.enqueue_and_get_result( + ExtractionResponse, input_source, params ) _basic_assert_success(response=response, page_count=2, model_id=findoc_model_id) @@ -94,7 +94,7 @@ def test_parse_file_empty_single_page_options_must_succeed( input_path: Path = FILE_TYPES_DIR / "pdf" / "blank_1.pdf" input_source = PathInput(input_path) - params = InferenceParameters( + params = ExtractionParameters( model_id=findoc_model_id, rag=True, raw_text=True, @@ -102,8 +102,8 @@ def test_parse_file_empty_single_page_options_must_succeed( confidence=True, alias="py_integration_empty_page_options", ) - response: InferenceResponse = v2_client.enqueue_and_get_result( - InferenceResponse, input_source, params + response: ExtractionResponse = v2_client.enqueue_and_get_result( + ExtractionResponse, input_source, params ) _basic_assert_success(response=response, page_count=1, model_id=findoc_model_id) @@ -131,7 +131,7 @@ def test_parse_file_filled_single_page_must_succeed( ) input_source = PathInput(input_path) - params = InferenceParameters( + params = ExtractionParameters( model_id=findoc_model_id, webhook_ids=[], rag=None, @@ -142,8 +142,8 @@ def test_parse_file_filled_single_page_must_succeed( text_context="this is an invoice.", ) - response: InferenceResponse = v2_client.enqueue_and_get_result( - InferenceResponse, input_source, params + response: ExtractionResponse = v2_client.enqueue_and_get_result( + ExtractionResponse, input_source, params ) _basic_assert_success(response=response, page_count=1, model_id=findoc_model_id) @@ -178,7 +178,7 @@ def test_invalid_uuid_must_throw_error(v2_client: Client) -> None: input_path: Path = FILE_TYPES_DIR / "pdf" / "blank_1.pdf" input_source = PathInput(input_path) - params = InferenceParameters( + params = ExtractionParameters( model_id="INVALID MODEL ID", text_context="ignore this message" ) @@ -201,7 +201,7 @@ def test_unknown_model_must_throw_error(v2_client: Client) -> None: input_path: Path = FILE_TYPES_DIR / "pdf" / "blank_1.pdf" input_source = PathInput(input_path) - params = InferenceParameters(model_id="fc405e37-4ba4-4d03-aeba-533a8d1f0f21") + params = ExtractionParameters(model_id="fc405e37-4ba4-4d03-aeba-533a8d1f0f21") with pytest.raises(MindeeHTTPErrorV2) as exc_info: v2_client.enqueue(input_source, params) @@ -224,7 +224,7 @@ def test_unknown_webhook_ids_must_throw_error( input_path: Path = FILE_TYPES_DIR / "pdf" / "blank_1.pdf" input_source = PathInput(input_path) - params = InferenceParameters( + params = ExtractionParameters( model_id=findoc_model_id, webhook_ids=[ "fc405e37-4ba4-4d03-aeba-533a8d1f0f21", @@ -259,7 +259,7 @@ def test_blank_url_input_source_must_succeed( url = os.getenv("MINDEE_V2_SE_TESTS_BLANK_PDF_URL") input_source = UrlInputSource(url) - params = InferenceParameters( + params = ExtractionParameters( model_id=findoc_model_id, rag=False, raw_text=False, @@ -268,8 +268,8 @@ def test_blank_url_input_source_must_succeed( webhook_ids=[], alias="py_integration_url_source", ) - response: InferenceResponse = v2_client.enqueue_and_get_result( - InferenceResponse, input_source, params + response: ExtractionResponse = v2_client.enqueue_and_get_result( + ExtractionResponse, input_source, params ) _basic_assert_success(response=response, page_count=1, model_id=findoc_model_id) @@ -289,7 +289,7 @@ def test_data_schema_must_succeed( ) input_source = PathInput(input_path) - params = InferenceParameters( + params = ExtractionParameters( model_id=findoc_model_id, rag=False, raw_text=False, @@ -299,8 +299,8 @@ def test_data_schema_must_succeed( data_schema=data_schema_replace_path.read_text(), alias="py_integration_data_schema_replace", ) - response: InferenceResponse = v2_client.enqueue_and_get_result( - InferenceResponse, input_source, params + response: ExtractionResponse = v2_client.enqueue_and_get_result( + ExtractionResponse, input_source, params ) _basic_assert_success(response=response, page_count=1, model_id=findoc_model_id) assert response.inference.active_options.data_schema.replace is True From be8a9e029b17efd6979aaaa84428171616f07b6e Mon Sep 17 00:00:00 2001 From: sebastianMindee <130448732+sebastianMindee@users.noreply.github.com> Date: Mon, 1 Jun 2026 16:49:26 +0200 Subject: [PATCH 05/10] :boom: :recycle: move more v2 and v1 internals --- .../code_samples/bank_account_details_v1.txt | 2 +- .../code_samples/bank_account_details_v2.txt | 2 +- docs/extras/code_samples/bank_check_v1.txt | 2 +- .../extras/code_samples/barcode_reader_v1.txt | 2 +- docs/extras/code_samples/carte_grise_v1.txt | 2 +- docs/extras/code_samples/cropper_v1.txt | 2 +- docs/extras/code_samples/custom_v1.txt | 2 +- docs/extras/code_samples/default.txt | 2 +- docs/extras/code_samples/default_async.txt | 2 +- .../code_samples/expense_receipts_v5.txt | 2 +- .../expense_receipts_v5_async.txt | 2 +- .../code_samples/financial_document_v1.txt | 2 +- .../financial_document_v1_async.txt | 2 +- docs/extras/code_samples/idcard_fr_v1.txt | 2 +- docs/extras/code_samples/idcard_fr_v2.txt | 2 +- .../international_id_v2_async.txt | 2 +- .../invoice_splitter_v1_async.txt | 2 +- docs/extras/code_samples/invoices_v4.txt | 2 +- .../extras/code_samples/invoices_v4_async.txt | 2 +- .../multi_receipts_detector_v1.txt | 2 +- docs/extras/code_samples/passport_v1.txt | 2 +- .../code_samples/workflow_execution.txt | 4 +-- docs/extras/code_samples/workflow_ots_rag.txt | 2 +- ...uto_invoice_splitter_extraction_example.py | 2 +- mindee/__init__.py | 20 ++++++------ mindee/client_mixin.py | 14 ++++---- .../{error/v2 => client_options}/__init__.py | 0 .../polling_options.py | 0 mindee/commands/cli_parser.py | 6 ++-- mindee/error/__init__.py | 6 ---- mindee/error/mindee_error.py | 12 ------- mindee/extraction/common/extracted_image.py | 4 +-- mindee/extraction/common/image_extractor.py | 4 +-- .../multi_receipts_extractor.py | 2 +- .../extraction/pdf_extractor/extracted_pdf.py | 2 +- .../extraction/pdf_extractor/pdf_extractor.py | 2 +- mindee/image/__init__.py | 3 ++ .../image_compressor.py | 0 mindee/image_operations/__init__.py | 3 -- mindee/input/__init__.py | 18 +++++------ mindee/input/{sources => }/base_64_input.py | 2 +- mindee/input/{sources => }/bytes_input.py | 2 +- mindee/input/{sources => }/file_input.py | 2 +- .../input/{sources => }/local_input_source.py | 2 +- mindee/input/{sources => }/path_input.py | 2 +- mindee/input/sources/__init__.py | 15 --------- .../input/{sources => }/url_input_source.py | 12 +++---- mindee/mindee_http/__init__.py | 11 ------- mindee/parsing/__init__.py | 4 ++- mindee/pdf/pdf_compressor.py | 2 +- mindee/v1/client.py | 32 +++++++++---------- mindee/v1/client_options/__init__.py | 4 +++ .../client_options}/predict_options.py | 0 .../workflow_options.py | 0 mindee/v1/error/__init__.py | 5 +++ mindee/v1/error/mindee_api_error.py | 5 +++ mindee/v1/error/mindee_product_error.py | 5 +++ mindee/v1/mindee_http/__init__.py | 14 ++++++++ mindee/{ => v1}/mindee_http/base_endpoint.py | 2 +- mindee/{ => v1}/mindee_http/base_settings.py | 0 mindee/{ => v1}/mindee_http/endpoint.py | 20 ++++++------ mindee/{ => v1}/mindee_http/mindee_api.py | 8 ++--- .../{ => v1}/mindee_http/workflow_endpoint.py | 14 ++++---- .../{ => v1}/mindee_http/workflow_settings.py | 6 ++-- mindee/v1/parsing/__init__.py | 8 +++++ mindee/v2/client.py | 24 +++++++------- .../input => v2/client_options}/__init__.py | 0 .../base_parameters.py | 2 +- mindee/v2/commands/cli_parser.py | 10 +++--- mindee/v2/error/__init__.py | 4 +++ mindee/v2/error/mindee_api_v2_error.py | 5 +++ .../v2 => v2/error}/mindee_http_error_v2.py | 0 mindee/v2/file_operations/crop.py | 2 +- mindee/v2/file_operations/split.py | 2 +- mindee/v2/{input => mindee_http}/__init__.py | 0 mindee/{ => v2}/mindee_http/mindee_api_v2.py | 20 ++++++------ .../mindee_http/response_validation_v2.py | 0 .../parsing/inference/field/dynamic_field.py | 6 ++-- .../params/classification_parameters.py | 2 +- mindee/v2/product/crop/crop_box.py | 2 +- mindee/v2/product/crop/crop_response.py | 2 +- .../v2/product/crop/params/crop_parameters.py | 2 +- .../params/extraction_parameters.py | 2 +- .../v2/product/ocr/params/ocr_parameters.py | 2 +- .../product/split/params/split_parameters.py | 2 +- mindee/v2/product/split/split_range.py | 2 +- mindee/v2/product/split/split_response.py | 2 +- tests/input/test_apply_page_options.py | 2 +- tests/input/test_compression.py | 4 +-- tests/input/test_inputs.py | 6 ++-- tests/utils.py | 2 +- tests/v1/api/test_async_response.py | 2 +- tests/v1/extraction/test_image_extractor.py | 2 +- .../test_invoice_splitter_auto_extraction.py | 2 +- .../test_multi_receipts_extractor.py | 2 +- tests/v1/extraction/test_pdf_extractor.py | 2 +- tests/v1/mindee_http/test_error.py | 2 +- tests/v1/test_client.py | 2 +- .../v1/workflows/test_workflow_integration.py | 2 +- .../v2/file_operations/test_crop_operation.py | 2 +- .../test_crop_operation_integration.py | 4 +-- .../file_operations/test_split_operation.py | 2 +- .../test_split_operation_integration.py | 4 +-- .../test_classification_integration.py | 4 +-- .../v2/product/crop/test_crop_integration.py | 4 +-- tests/v2/product/ocr/test_ocr_integration.py | 4 +-- .../product/split/test_split_integration.py | 4 +-- tests/v2/test_client.py | 19 +++++------ tests/v2/test_client_integration.py | 10 +++--- 109 files changed, 256 insertions(+), 247 deletions(-) rename mindee/{error/v2 => client_options}/__init__.py (100%) rename mindee/{input => client_options}/polling_options.py (100%) create mode 100644 mindee/image/__init__.py rename mindee/{image_operations => image}/image_compressor.py (100%) delete mode 100644 mindee/image_operations/__init__.py rename mindee/input/{sources => }/base_64_input.py (88%) rename mindee/input/{sources => }/bytes_input.py (86%) rename mindee/input/{sources => }/file_input.py (88%) rename mindee/input/{sources => }/local_input_source.py (99%) rename mindee/input/{sources => }/path_input.py (87%) delete mode 100644 mindee/input/sources/__init__.py rename mindee/input/{sources => }/url_input_source.py (95%) create mode 100644 mindee/v1/client_options/__init__.py rename mindee/{input => v1/client_options}/predict_options.py (100%) rename mindee/v1/{input => client_options}/workflow_options.py (100%) create mode 100644 mindee/v1/error/__init__.py create mode 100644 mindee/v1/error/mindee_api_error.py create mode 100644 mindee/v1/error/mindee_product_error.py create mode 100644 mindee/v1/mindee_http/__init__.py rename mindee/{ => v1}/mindee_http/base_endpoint.py (84%) rename mindee/{ => v1}/mindee_http/base_settings.py (100%) rename mindee/{ => v1}/mindee_http/endpoint.py (95%) rename mindee/{ => v1}/mindee_http/mindee_api.py (81%) rename mindee/{ => v1}/mindee_http/workflow_endpoint.py (80%) rename mindee/{ => v1}/mindee_http/workflow_settings.py (80%) rename mindee/{v1/input => v2/client_options}/__init__.py (100%) rename mindee/v2/{input => client_options}/base_parameters.py (95%) create mode 100644 mindee/v2/error/__init__.py create mode 100644 mindee/v2/error/mindee_api_v2_error.py rename mindee/{error/v2 => v2/error}/mindee_http_error_v2.py (100%) rename mindee/v2/{input => mindee_http}/__init__.py (100%) rename mindee/{ => v2}/mindee_http/mindee_api_v2.py (88%) rename mindee/{ => v2}/mindee_http/response_validation_v2.py (100%) diff --git a/docs/extras/code_samples/bank_account_details_v1.txt b/docs/extras/code_samples/bank_account_details_v1.txt index ff5643f1..efe682b3 100644 --- a/docs/extras/code_samples/bank_account_details_v1.txt +++ b/docs/extras/code_samples/bank_account_details_v1.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/bank_account_details_v2.txt b/docs/extras/code_samples/bank_account_details_v2.txt index d60f2806..87fd38ca 100644 --- a/docs/extras/code_samples/bank_account_details_v2.txt +++ b/docs/extras/code_samples/bank_account_details_v2.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/bank_check_v1.txt b/docs/extras/code_samples/bank_check_v1.txt index 28c77fa9..3fceaa09 100644 --- a/docs/extras/code_samples/bank_check_v1.txt +++ b/docs/extras/code_samples/bank_check_v1.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/barcode_reader_v1.txt b/docs/extras/code_samples/barcode_reader_v1.txt index 06bfaa2d..94983824 100644 --- a/docs/extras/code_samples/barcode_reader_v1.txt +++ b/docs/extras/code_samples/barcode_reader_v1.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/carte_grise_v1.txt b/docs/extras/code_samples/carte_grise_v1.txt index ff44e59d..0b4dedbb 100644 --- a/docs/extras/code_samples/carte_grise_v1.txt +++ b/docs/extras/code_samples/carte_grise_v1.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/cropper_v1.txt b/docs/extras/code_samples/cropper_v1.txt index 5c0633cc..f90d4a10 100644 --- a/docs/extras/code_samples/cropper_v1.txt +++ b/docs/extras/code_samples/cropper_v1.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/custom_v1.txt b/docs/extras/code_samples/custom_v1.txt index 82abd496..2ee216fe 100644 --- a/docs/extras/code_samples/custom_v1.txt +++ b/docs/extras/code_samples/custom_v1.txt @@ -1,4 +1,4 @@ -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/default.txt b/docs/extras/code_samples/default.txt index 83fa2d2c..b5df084c 100644 --- a/docs/extras/code_samples/default.txt +++ b/docs/extras/code_samples/default.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/default_async.txt b/docs/extras/code_samples/default_async.txt index b701a196..790ddfc3 100644 --- a/docs/extras/code_samples/default_async.txt +++ b/docs/extras/code_samples/default_async.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, AsyncPredictResponse, product +from mindee.v1 import Client, AsyncPredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/expense_receipts_v5.txt b/docs/extras/code_samples/expense_receipts_v5.txt index 2243cc61..cb1b552b 100644 --- a/docs/extras/code_samples/expense_receipts_v5.txt +++ b/docs/extras/code_samples/expense_receipts_v5.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/expense_receipts_v5_async.txt b/docs/extras/code_samples/expense_receipts_v5_async.txt index bf174184..266a0db9 100644 --- a/docs/extras/code_samples/expense_receipts_v5_async.txt +++ b/docs/extras/code_samples/expense_receipts_v5_async.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, product, AsyncPredictResponse +from mindee.v1 import Client, product, AsyncPredictResponse # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/financial_document_v1.txt b/docs/extras/code_samples/financial_document_v1.txt index 67a1f00d..df1e246a 100644 --- a/docs/extras/code_samples/financial_document_v1.txt +++ b/docs/extras/code_samples/financial_document_v1.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/financial_document_v1_async.txt b/docs/extras/code_samples/financial_document_v1_async.txt index 9fb1c123..483a8e3f 100644 --- a/docs/extras/code_samples/financial_document_v1_async.txt +++ b/docs/extras/code_samples/financial_document_v1_async.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, product, AsyncPredictResponse +from mindee.v1 import Client, product, AsyncPredictResponse # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/idcard_fr_v1.txt b/docs/extras/code_samples/idcard_fr_v1.txt index b0087d83..125219b3 100644 --- a/docs/extras/code_samples/idcard_fr_v1.txt +++ b/docs/extras/code_samples/idcard_fr_v1.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/idcard_fr_v2.txt b/docs/extras/code_samples/idcard_fr_v2.txt index 47bcb6b1..1f64f154 100644 --- a/docs/extras/code_samples/idcard_fr_v2.txt +++ b/docs/extras/code_samples/idcard_fr_v2.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/international_id_v2_async.txt b/docs/extras/code_samples/international_id_v2_async.txt index 36a3fa97..5534b626 100644 --- a/docs/extras/code_samples/international_id_v2_async.txt +++ b/docs/extras/code_samples/international_id_v2_async.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, product, AsyncPredictResponse +from mindee.v1 import Client, product, AsyncPredictResponse # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/invoice_splitter_v1_async.txt b/docs/extras/code_samples/invoice_splitter_v1_async.txt index c98da273..9ea947e3 100644 --- a/docs/extras/code_samples/invoice_splitter_v1_async.txt +++ b/docs/extras/code_samples/invoice_splitter_v1_async.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, product, AsyncPredictResponse +from mindee.v1 import Client, product, AsyncPredictResponse # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/invoices_v4.txt b/docs/extras/code_samples/invoices_v4.txt index 848441ed..a903df6f 100644 --- a/docs/extras/code_samples/invoices_v4.txt +++ b/docs/extras/code_samples/invoices_v4.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/invoices_v4_async.txt b/docs/extras/code_samples/invoices_v4_async.txt index a4cbf802..a221fa2a 100644 --- a/docs/extras/code_samples/invoices_v4_async.txt +++ b/docs/extras/code_samples/invoices_v4_async.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, product, AsyncPredictResponse +from mindee.v1 import Client, product, AsyncPredictResponse # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/multi_receipts_detector_v1.txt b/docs/extras/code_samples/multi_receipts_detector_v1.txt index 9c50ce44..0537611a 100644 --- a/docs/extras/code_samples/multi_receipts_detector_v1.txt +++ b/docs/extras/code_samples/multi_receipts_detector_v1.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/passport_v1.txt b/docs/extras/code_samples/passport_v1.txt index e0eae0d0..b372ccef 100644 --- a/docs/extras/code_samples/passport_v1.txt +++ b/docs/extras/code_samples/passport_v1.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, PredictResponse, product +from mindee.v1 import Client, PredictResponse, product # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/workflow_execution.txt b/docs/extras/code_samples/workflow_execution.txt index a825a8bf..69f0297d 100644 --- a/docs/extras/code_samples/workflow_execution.txt +++ b/docs/extras/code_samples/workflow_execution.txt @@ -3,8 +3,8 @@ # pip install mindee # -from mindee import Client, WorkflowResponse -from mindee.parsing.common import ExecutionPriority +from mindee.v1 import Client, WorkflowResponse +from mindee.v1.parsing.common import ExecutionPriority # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/docs/extras/code_samples/workflow_ots_rag.txt b/docs/extras/code_samples/workflow_ots_rag.txt index d6cd5de5..b457ff1b 100644 --- a/docs/extras/code_samples/workflow_ots_rag.txt +++ b/docs/extras/code_samples/workflow_ots_rag.txt @@ -3,7 +3,7 @@ # pip install mindee # -from mindee import Client, product, AsyncPredictResponse +from mindee.v1 import Client, product, AsyncPredictResponse # Init a new client mindee_client = Client(api_key="my-api-key") diff --git a/examples/auto_invoice_splitter_extraction_example.py b/examples/auto_invoice_splitter_extraction_example.py index 714f5032..1275af69 100644 --- a/examples/auto_invoice_splitter_extraction_example.py +++ b/examples/auto_invoice_splitter_extraction_example.py @@ -1,6 +1,6 @@ from mindee.v1.client import Client from mindee.extraction.pdf_extractor import PdfExtractor -from mindee.input.sources.path_input import PathInput +from mindee.input.path_input import PathInput from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 diff --git a/mindee/__init__.py b/mindee/__init__.py index 09020cd4..227ac5d6 100644 --- a/mindee/__init__.py +++ b/mindee/__init__.py @@ -1,16 +1,17 @@ +from mindee.client_options.polling_options import PollingOptions +from mindee.input import PageOptions from mindee.v1 import product -from mindee.input import LocalResponse, PageOptions, PollingOptions from mindee.v2.parsing.inference.job_response import JobResponse from mindee.v2.product.extraction.params.extraction_parameters import ( ExtractionParameters, ) -from mindee.input.sources import ( - Base64Input, - BytesInput, - FileInput, - PathInput, - UrlInputSource, -) +from mindee.input.base_64_input import Base64Input +from mindee.input.bytes_input import BytesInput +from mindee.input.file_input import FileInput +from mindee.input.path_input import PathInput +from mindee.input.url_input_source import URLInputSource +from mindee.input.local_response import LocalResponse +from mindee.input.local_input_source import LocalInputSource from mindee.v2.product.classification.params.classification_parameters import ( ClassificationParameters, ) @@ -39,6 +40,7 @@ "ExtractionResult", "JobResponse", "LocalResponse", + "LocalInputSource", "OCRParameters", "OCRResponse", "PageOptions", @@ -46,6 +48,6 @@ "PollingOptions", "SplitParameters", "SplitResponse", - "UrlInputSource", + "URLInputSource", "product", ] diff --git a/mindee/client_mixin.py b/mindee/client_mixin.py index 849e3a35..632bb641 100644 --- a/mindee/client_mixin.py +++ b/mindee/client_mixin.py @@ -2,11 +2,11 @@ from typing import BinaryIO, Union from mindee.error import MindeeClientError -from mindee.input.sources.base_64_input import Base64Input -from mindee.input.sources.bytes_input import BytesInput -from mindee.input.sources.file_input import FileInput -from mindee.input.sources.path_input import PathInput -from mindee.input.sources.url_input_source import UrlInputSource +from mindee.input.base_64_input import Base64Input +from mindee.input.bytes_input import BytesInput +from mindee.input.file_input import FileInput +from mindee.input.path_input import PathInput +from mindee.input.url_input_source import URLInputSource class ClientMixin: @@ -97,12 +97,12 @@ def _validate_async_params( @staticmethod def source_from_url( url: str, - ) -> UrlInputSource: + ) -> URLInputSource: """ Load a document from a URL. :params url: Raw byte input """ - return UrlInputSource( + return URLInputSource( url, ) diff --git a/mindee/error/v2/__init__.py b/mindee/client_options/__init__.py similarity index 100% rename from mindee/error/v2/__init__.py rename to mindee/client_options/__init__.py diff --git a/mindee/input/polling_options.py b/mindee/client_options/polling_options.py similarity index 100% rename from mindee/input/polling_options.py rename to mindee/client_options/polling_options.py diff --git a/mindee/commands/cli_parser.py b/mindee/commands/cli_parser.py index 0479e8a2..e08799f9 100644 --- a/mindee/commands/cli_parser.py +++ b/mindee/commands/cli_parser.py @@ -2,11 +2,11 @@ from argparse import ArgumentParser, Namespace from typing import Optional, Type, Union +from mindee import LocalInputSource, URLInputSource from mindee.v1.client import Client, Endpoint from mindee.commands.cli_products import PRODUCTS, CommandConfig from mindee.error.mindee_error import MindeeClientError from mindee.input.page_options import PageOptions -from mindee.input.sources import LocalInputSource, UrlInputSource from mindee.v1.parsing.common.async_predict_response import AsyncPredictResponse from mindee.v1.parsing.common import Document, serialize_for_json from mindee.v1.parsing.common.inference import Inference @@ -109,7 +109,7 @@ class MindeeParser: """Mindee client""" document_info: CommandConfig """Config of the document.""" - input_doc: Union[LocalInputSource, UrlInputSource] + input_doc: Union[LocalInputSource, URLInputSource] """Document to be parsed.""" product_class: Type[Inference] """Product to parse.""" @@ -261,7 +261,7 @@ def _set_args(self) -> Namespace: parsed_args = self.parser.parse_args() return parsed_args - def _get_input_doc(self) -> Union[LocalInputSource, UrlInputSource]: + def _get_input_doc(self) -> Union[LocalInputSource, URLInputSource]: """Loads an input document.""" if self.parsed_args.input_type == "file": with open(self.parsed_args.path, "rb", buffering=30) as file_handle: diff --git a/mindee/error/__init__.py b/mindee/error/__init__.py index 38d09642..d694ba37 100644 --- a/mindee/error/__init__.py +++ b/mindee/error/__init__.py @@ -1,11 +1,8 @@ from mindee.error.geometry_error import GeometryError from mindee.error.mimetype_error import MimeTypeError from mindee.error.mindee_error import ( - MindeeApiError, - MindeeApiV2Error, MindeeClientError, MindeeError, - MindeeProductError, ) from mindee.error.mindee_http_error import ( MindeeHTTPClientError, @@ -18,10 +15,7 @@ __all__ = [ "MindeeError", - "MindeeApiError", - "MindeeApiV2Error", "MindeeClientError", - "MindeeProductError", "MindeeHTTPError", "MindeeHTTPClientError", "MindeeHTTPServerError", diff --git a/mindee/error/mindee_error.py b/mindee/error/mindee_error.py index 5565a1a1..dd23fe89 100644 --- a/mindee/error/mindee_error.py +++ b/mindee/error/mindee_error.py @@ -10,17 +10,5 @@ class MindeeClientError(MindeeError): """ -class MindeeApiError(MindeeError): - """An exception relating to settings of the MindeeClient.""" - - -class MindeeApiV2Error(MindeeError): - """An exception relating to settings of the MindeeClient V2.""" - - class MindeeSourceError(MindeeError): """An exception relating to document loading.""" - - -class MindeeProductError(MindeeApiError): - """An exception relating to the use of an incorrect product/version.""" diff --git a/mindee/extraction/common/extracted_image.py b/mindee/extraction/common/extracted_image.py index 6fd88743..5c968d8a 100644 --- a/mindee/extraction/common/extracted_image.py +++ b/mindee/extraction/common/extracted_image.py @@ -5,8 +5,8 @@ from PIL import Image from mindee.error.mindee_error import MindeeError -from mindee.input.sources.file_input import FileInput -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.file_input import FileInput +from mindee.input.local_input_source import LocalInputSource from mindee.logger import logger diff --git a/mindee/extraction/common/image_extractor.py b/mindee/extraction/common/image_extractor.py index 08ea11e3..6e1b445e 100644 --- a/mindee/extraction/common/image_extractor.py +++ b/mindee/extraction/common/image_extractor.py @@ -8,8 +8,8 @@ from mindee.extraction.common.extracted_image import ExtractedImage from mindee.geometry.point import Point from mindee.geometry.polygon import Polygon, get_min_max_x, get_min_max_y -from mindee.input.sources.bytes_input import BytesInput -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.bytes_input import BytesInput +from mindee.input.local_input_source import LocalInputSource def attach_image_as_new_file( # type: ignore diff --git a/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py b/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py index e208238a..7d337724 100644 --- a/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py +++ b/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py @@ -5,7 +5,7 @@ from mindee.extraction.common.image_extractor import ( extract_multiple_images_from_source, ) -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource from mindee.v1.parsing.common.inference import Inference diff --git a/mindee/extraction/pdf_extractor/extracted_pdf.py b/mindee/extraction/pdf_extractor/extracted_pdf.py index 521b9f2b..d55a4a90 100644 --- a/mindee/extraction/pdf_extractor/extracted_pdf.py +++ b/mindee/extraction/pdf_extractor/extracted_pdf.py @@ -4,7 +4,7 @@ import pypdfium2 as pdfium from mindee.error.mindee_error import MindeeError -from mindee.input.sources.bytes_input import BytesInput +from mindee.input.bytes_input import BytesInput class ExtractedPdf: diff --git a/mindee/extraction/pdf_extractor/pdf_extractor.py b/mindee/extraction/pdf_extractor/pdf_extractor.py index 7bc93629..6e83e3fa 100644 --- a/mindee/extraction/pdf_extractor/pdf_extractor.py +++ b/mindee/extraction/pdf_extractor/pdf_extractor.py @@ -7,7 +7,7 @@ from mindee.error.mindee_error import MindeeError from mindee.extraction.pdf_extractor.extracted_pdf import ExtractedPdf -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource from mindee.v1.product.invoice_splitter import InvoiceSplitterV1InvoicePageGroup diff --git a/mindee/image/__init__.py b/mindee/image/__init__.py new file mode 100644 index 00000000..f562ff76 --- /dev/null +++ b/mindee/image/__init__.py @@ -0,0 +1,3 @@ +from mindee.image.image_compressor import compress_image + +__all__ = ["compress_image"] diff --git a/mindee/image_operations/image_compressor.py b/mindee/image/image_compressor.py similarity index 100% rename from mindee/image_operations/image_compressor.py rename to mindee/image/image_compressor.py diff --git a/mindee/image_operations/__init__.py b/mindee/image_operations/__init__.py deleted file mode 100644 index 4821cf3e..00000000 --- a/mindee/image_operations/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from mindee.image_operations.image_compressor import compress_image - -__all__ = ["compress_image"] diff --git a/mindee/input/__init__.py b/mindee/input/__init__.py index 5ba4687f..5e8d77e8 100644 --- a/mindee/input/__init__.py +++ b/mindee/input/__init__.py @@ -1,13 +1,12 @@ from mindee.input.local_response import LocalResponse from mindee.input.page_options import PageOptions -from mindee.input.polling_options import PollingOptions -from mindee.input.sources.base_64_input import Base64Input -from mindee.input.sources.bytes_input import BytesInput -from mindee.input.sources.file_input import FileInput -from mindee.input.sources.local_input_source import LocalInputSource -from mindee.input.sources.path_input import PathInput -from mindee.input.sources.url_input_source import UrlInputSource -from mindee.v1.input.workflow_options import WorkflowOptions +from mindee.client_options.polling_options import PollingOptions +from mindee.input.base_64_input import Base64Input +from mindee.input.bytes_input import BytesInput +from mindee.input.file_input import FileInput +from mindee.input.local_input_source import LocalInputSource +from mindee.input.path_input import PathInput +from mindee.input.url_input_source import URLInputSource __all__ = [ "Base64Input", @@ -18,6 +17,5 @@ "PageOptions", "PathInput", "PollingOptions", - "UrlInputSource", - "WorkflowOptions", + "URLInputSource", ] diff --git a/mindee/input/sources/base_64_input.py b/mindee/input/base_64_input.py similarity index 88% rename from mindee/input/sources/base_64_input.py rename to mindee/input/base_64_input.py index 0438b106..136c2024 100644 --- a/mindee/input/sources/base_64_input.py +++ b/mindee/input/base_64_input.py @@ -1,7 +1,7 @@ import base64 import io -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource class Base64Input(LocalInputSource): diff --git a/mindee/input/sources/bytes_input.py b/mindee/input/bytes_input.py similarity index 86% rename from mindee/input/sources/bytes_input.py rename to mindee/input/bytes_input.py index eda582b6..77aed5fc 100644 --- a/mindee/input/sources/bytes_input.py +++ b/mindee/input/bytes_input.py @@ -1,6 +1,6 @@ import io -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource class BytesInput(LocalInputSource): diff --git a/mindee/input/sources/file_input.py b/mindee/input/file_input.py similarity index 88% rename from mindee/input/sources/file_input.py rename to mindee/input/file_input.py index d8ba7ead..2c100667 100644 --- a/mindee/input/sources/file_input.py +++ b/mindee/input/file_input.py @@ -1,7 +1,7 @@ import os from typing import BinaryIO -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource class FileInput(LocalInputSource): diff --git a/mindee/input/sources/local_input_source.py b/mindee/input/local_input_source.py similarity index 99% rename from mindee/input/sources/local_input_source.py rename to mindee/input/local_input_source.py index af3a44cd..add5f7a1 100644 --- a/mindee/input/sources/local_input_source.py +++ b/mindee/input/local_input_source.py @@ -7,7 +7,7 @@ from mindee.error.mimetype_error import MimeTypeError from mindee.error.mindee_error import MindeeError, MindeeSourceError -from mindee.image_operations.image_compressor import compress_image +from mindee.image import compress_image from mindee.input.page_options import KEEP_ONLY, REMOVE, PageOptions from mindee.logger import logger from mindee.pdf.pdf_compressor import compress_pdf diff --git a/mindee/input/sources/path_input.py b/mindee/input/path_input.py similarity index 87% rename from mindee/input/sources/path_input.py rename to mindee/input/path_input.py index 255d5fa6..dc977e82 100644 --- a/mindee/input/sources/path_input.py +++ b/mindee/input/path_input.py @@ -2,7 +2,7 @@ from pathlib import Path from typing import Union -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource class PathInput(LocalInputSource): diff --git a/mindee/input/sources/__init__.py b/mindee/input/sources/__init__.py deleted file mode 100644 index 9b4d5bbf..00000000 --- a/mindee/input/sources/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from mindee.input.sources.base_64_input import Base64Input -from mindee.input.sources.bytes_input import BytesInput -from mindee.input.sources.file_input import FileInput -from mindee.input.sources.local_input_source import LocalInputSource -from mindee.input.sources.path_input import PathInput -from mindee.input.sources.url_input_source import UrlInputSource - -__all__ = [ - "Base64Input", - "BytesInput", - "FileInput", - "LocalInputSource", - "PathInput", - "UrlInputSource", -] diff --git a/mindee/input/sources/url_input_source.py b/mindee/input/url_input_source.py similarity index 95% rename from mindee/input/sources/url_input_source.py rename to mindee/input/url_input_source.py index 222e1eba..470b6b08 100644 --- a/mindee/input/sources/url_input_source.py +++ b/mindee/input/url_input_source.py @@ -9,11 +9,11 @@ import requests from mindee.error.mindee_error import MindeeSourceError -from mindee.input.sources.bytes_input import BytesInput +from mindee.input.bytes_input import BytesInput from mindee.logger import logger -class UrlInputSource: +class URLInputSource: """A local or distant URL input.""" url: str @@ -56,7 +56,7 @@ def __fetch_file_content( headers["Authorization"] = f"Bearer {token}" auth = None if not username or not password else (username, password) - response = UrlInputSource.__make_request( + response = URLInputSource.__make_request( self.url, auth, headers, 0, max_redirects=max_redirects ) @@ -164,11 +164,11 @@ def __fill_filename(self, filename=None) -> str: :return: A complete filename. """ if filename is None: - filename = UrlInputSource.__extract_filename_from_url(self.url) + filename = URLInputSource.__extract_filename_from_url(self.url) if not filename or not os.path.splitext(filename)[1]: filename = self.__generate_file_name( - extension=UrlInputSource.__get_file_extension(filename) + extension=URLInputSource.__get_file_extension(filename) ) return filename @@ -193,7 +193,7 @@ def __make_request(url, auth, headers, redirects, max_redirects) -> bytes: f"Can't reach URL after {redirects} out of {max_redirects} redirects, " f"aborting operation." ) - return UrlInputSource.__make_request( + return URLInputSource.__make_request( redirects.location, auth, headers, redirects + 1, max_redirects ) diff --git a/mindee/mindee_http/__init__.py b/mindee/mindee_http/__init__.py index e8b4cf3d..a7fe6b01 100644 --- a/mindee/mindee_http/__init__.py +++ b/mindee/mindee_http/__init__.py @@ -1,22 +1,11 @@ -from mindee.mindee_http.base_endpoint import BaseEndpoint -from mindee.mindee_http.endpoint import CustomEndpoint, Endpoint -from mindee.mindee_http.mindee_api import MindeeApi from mindee.mindee_http.response_validation import ( clean_request_json, is_valid_async_response, is_valid_sync_response, ) -from mindee.mindee_http.workflow_endpoint import WorkflowEndpoint -from mindee.mindee_http.workflow_settings import WorkflowSettings __all__ = [ - "BaseEndpoint", - "CustomEndpoint", - "Endpoint", - "MindeeApi", "clean_request_json", "is_valid_async_response", "is_valid_sync_response", - "WorkflowEndpoint", - "WorkflowSettings", ] diff --git a/mindee/parsing/__init__.py b/mindee/parsing/__init__.py index d5ae915f..2607a578 100644 --- a/mindee/parsing/__init__.py +++ b/mindee/parsing/__init__.py @@ -1,3 +1,5 @@ -from mindee.parsing import common +from mindee.parsing import ( + common, +) __all__ = ["common"] diff --git a/mindee/pdf/pdf_compressor.py b/mindee/pdf/pdf_compressor.py index 7a3d5c23..b4e0238a 100644 --- a/mindee/pdf/pdf_compressor.py +++ b/mindee/pdf/pdf_compressor.py @@ -8,7 +8,7 @@ import pypdfium2.raw as pdfium_c from PIL import Image -from mindee.image_operations.image_compressor import compress_image +from mindee.image import compress_image from mindee.pdf.pdf_char_data import PDFCharData from mindee.pdf.pdf_utils import ( extract_text_from_pdf, diff --git a/mindee/v1/client.py b/mindee/v1/client.py index 403c4350..8e7e84c9 100644 --- a/mindee/v1/client.py +++ b/mindee/v1/client.py @@ -4,22 +4,22 @@ from mindee.client_mixin import ClientMixin from mindee.error.mindee_error import MindeeClientError, MindeeError from mindee.error.mindee_http_error import handle_error -from mindee.input import WorkflowOptions from mindee.input.local_response import LocalResponse from mindee.input.page_options import PageOptions -from mindee.input.predict_options import AsyncPredictOptions, PredictOptions -from mindee.input.sources.local_input_source import LocalInputSource -from mindee.input.sources.url_input_source import UrlInputSource +from mindee.v1.client_options.predict_options import AsyncPredictOptions, PredictOptions +from mindee.input.local_input_source import LocalInputSource +from mindee.input.url_input_source import URLInputSource from mindee.logger import logger -from mindee.mindee_http.endpoint import CustomEndpoint, Endpoint -from mindee.mindee_http.mindee_api import MindeeApi +from mindee.v1.mindee_http.endpoint import CustomEndpoint, Endpoint +from mindee.v1.mindee_http.mindee_api import MindeeAPI from mindee.mindee_http.response_validation import ( clean_request_json, is_valid_async_response, is_valid_sync_response, ) -from mindee.mindee_http.workflow_endpoint import WorkflowEndpoint -from mindee.mindee_http.workflow_settings import WorkflowSettings +from mindee.v1.mindee_http.workflow_endpoint import WorkflowEndpoint +from mindee.v1.mindee_http.workflow_settings import WorkflowSettings +from mindee.v1.client_options.workflow_options import WorkflowOptions from mindee.v1.parsing.common.async_predict_response import AsyncPredictResponse from mindee.v1.parsing.common.feedback_response import FeedbackResponse from mindee.v1.parsing.common.inference import Inference @@ -71,7 +71,7 @@ def __init__(self, api_key: str = "") -> None: def parse( self, product_class: Type[Inference], - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], include_words: bool = False, close_file: bool = True, page_options: Optional[PageOptions] = None, @@ -132,7 +132,7 @@ def parse( def enqueue( self, product_class: Type[Inference], - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], include_words: bool = False, close_file: bool = True, page_options: Optional[PageOptions] = None, @@ -239,7 +239,7 @@ def parse_queued( def execute_workflow( self, - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], workflow_id: str, options: Optional[WorkflowOptions] = None, page_options: Optional[PageOptions] = None, @@ -274,7 +274,7 @@ def execute_workflow( def enqueue_and_parse( # pylint: disable=too-many-locals self, product_class: Type[Inference], - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], include_words: bool = False, close_file: bool = True, page_options: Optional[PageOptions] = None, @@ -403,7 +403,7 @@ def send_feedback( def _make_request( self, product_class: Type[Inference], - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], endpoint: Endpoint, options: PredictOptions, close_file: bool, @@ -428,7 +428,7 @@ def _make_request( def _predict_async( self, product_class: Type[Inference], - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], options: AsyncPredictOptions, endpoint: Optional[Endpoint] = None, close_file: bool = True, @@ -483,7 +483,7 @@ def _get_queued_document( def _send_to_workflow( self, product_class: Type[Inference], - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], workflow_id: str, options: WorkflowOptions, ) -> WorkflowResponse: @@ -529,7 +529,7 @@ def _initialize_ots_endpoint(self, product_class: Type[Inference]) -> Endpoint: def _build_endpoint( self, endpoint_name: str, account_name: str, version: str ) -> Endpoint: - api_settings = MindeeApi( + api_settings = MindeeAPI( api_key=self.api_key, endpoint_name=endpoint_name, account_name=account_name, diff --git a/mindee/v1/client_options/__init__.py b/mindee/v1/client_options/__init__.py new file mode 100644 index 00000000..ebc6b0cb --- /dev/null +++ b/mindee/v1/client_options/__init__.py @@ -0,0 +1,4 @@ +from mindee.v1.client_options.workflow_options import WorkflowOptions +from mindee.v1.client_options.predict_options import PredictOptions + +__all__ = ["WorkflowOptions", "PredictOptions"] diff --git a/mindee/input/predict_options.py b/mindee/v1/client_options/predict_options.py similarity index 100% rename from mindee/input/predict_options.py rename to mindee/v1/client_options/predict_options.py diff --git a/mindee/v1/input/workflow_options.py b/mindee/v1/client_options/workflow_options.py similarity index 100% rename from mindee/v1/input/workflow_options.py rename to mindee/v1/client_options/workflow_options.py diff --git a/mindee/v1/error/__init__.py b/mindee/v1/error/__init__.py new file mode 100644 index 00000000..f6a4c0cd --- /dev/null +++ b/mindee/v1/error/__init__.py @@ -0,0 +1,5 @@ +from mindee.v1.error.mindee_api_error import MindeeAPIError + +from mindee.v1.error.mindee_product_error import MindeeProductError + +__all__ = ["MindeeAPIError", "MindeeProductError"] diff --git a/mindee/v1/error/mindee_api_error.py b/mindee/v1/error/mindee_api_error.py new file mode 100644 index 00000000..7fa5a661 --- /dev/null +++ b/mindee/v1/error/mindee_api_error.py @@ -0,0 +1,5 @@ +from mindee.error import MindeeError + + +class MindeeAPIError(MindeeError): + """An exception relating to settings of the MindeeClient.""" diff --git a/mindee/v1/error/mindee_product_error.py b/mindee/v1/error/mindee_product_error.py new file mode 100644 index 00000000..e721ddc6 --- /dev/null +++ b/mindee/v1/error/mindee_product_error.py @@ -0,0 +1,5 @@ +from mindee.v1.error.mindee_api_error import MindeeAPIError + + +class MindeeProductError(MindeeAPIError): + """An exception relating to the use of an incorrect product/version.""" diff --git a/mindee/v1/mindee_http/__init__.py b/mindee/v1/mindee_http/__init__.py new file mode 100644 index 00000000..1abe63b5 --- /dev/null +++ b/mindee/v1/mindee_http/__init__.py @@ -0,0 +1,14 @@ +from mindee.v1.mindee_http.base_endpoint import BaseEndpoint +from mindee.v1.mindee_http.endpoint import CustomEndpoint, Endpoint +from mindee.v1.mindee_http.mindee_api import MindeeAPI +from mindee.v1.mindee_http.workflow_endpoint import WorkflowEndpoint +from mindee.v1.mindee_http.workflow_settings import WorkflowSettings + +__all__ = [ + "BaseEndpoint", + "CustomEndpoint", + "Endpoint", + "MindeeAPI", + "WorkflowEndpoint", + "WorkflowSettings", +] diff --git a/mindee/mindee_http/base_endpoint.py b/mindee/v1/mindee_http/base_endpoint.py similarity index 84% rename from mindee/mindee_http/base_endpoint.py rename to mindee/v1/mindee_http/base_endpoint.py index ad137407..2b636049 100644 --- a/mindee/mindee_http/base_endpoint.py +++ b/mindee/v1/mindee_http/base_endpoint.py @@ -1,6 +1,6 @@ from abc import ABC -from mindee.mindee_http.base_settings import BaseSettings +from mindee.v1.mindee_http.base_settings import BaseSettings class BaseEndpoint(ABC): diff --git a/mindee/mindee_http/base_settings.py b/mindee/v1/mindee_http/base_settings.py similarity index 100% rename from mindee/mindee_http/base_settings.py rename to mindee/v1/mindee_http/base_settings.py diff --git a/mindee/mindee_http/endpoint.py b/mindee/v1/mindee_http/endpoint.py similarity index 95% rename from mindee/mindee_http/endpoint.py rename to mindee/v1/mindee_http/endpoint.py index 1860bd98..0dc62ae4 100644 --- a/mindee/mindee_http/endpoint.py +++ b/mindee/v1/mindee_http/endpoint.py @@ -4,20 +4,20 @@ import requests from requests import Response -from mindee.input.sources.local_input_source import LocalInputSource -from mindee.input.sources.url_input_source import UrlInputSource -from mindee.mindee_http.base_endpoint import BaseEndpoint -from mindee.mindee_http.mindee_api import MindeeApi +from mindee.input.local_input_source import LocalInputSource +from mindee.input.url_input_source import URLInputSource +from mindee.v1.mindee_http.base_endpoint import BaseEndpoint +from mindee.v1.mindee_http.mindee_api import MindeeAPI from mindee.parsing.common import StringDict class Endpoint(BaseEndpoint): """Generic API endpoint for a product.""" - settings: MindeeApi + settings: MindeeAPI def __init__( - self, url_name: str, owner: str, version: str, settings: MindeeApi + self, url_name: str, owner: str, version: str, settings: MindeeAPI ) -> None: """ Generic API endpoint for a product. @@ -33,7 +33,7 @@ def __init__( def predict_req_post( self, - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], include_words: bool = False, close_file: bool = True, cropper: bool = False, @@ -55,7 +55,7 @@ def predict_req_post( def predict_async_req_post( self, - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], include_words: bool = False, close_file: bool = True, cropper: bool = False, @@ -89,7 +89,7 @@ def predict_async_req_post( def _custom_request( self, route: str, - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], include_words: bool = False, close_file: bool = True, cropper: bool = False, @@ -114,7 +114,7 @@ def _custom_request( else: url = f"{self.settings.url_root}/{route}" - if isinstance(input_source, UrlInputSource): + if isinstance(input_source, URLInputSource): data["document"] = input_source.url response = requests.post( url=url, diff --git a/mindee/mindee_http/mindee_api.py b/mindee/v1/mindee_http/mindee_api.py similarity index 81% rename from mindee/mindee_http/mindee_api.py rename to mindee/v1/mindee_http/mindee_api.py index 33bfc7d9..91bac530 100644 --- a/mindee/mindee_http/mindee_api.py +++ b/mindee/v1/mindee_http/mindee_api.py @@ -1,12 +1,12 @@ from dataclasses import dataclass from typing import Optional -from mindee.error.mindee_error import MindeeApiError -from mindee.mindee_http.base_settings import API_KEY_ENV_NAME, BaseSettings +from mindee.v1.error.mindee_api_error import MindeeAPIError +from mindee.v1.mindee_http.base_settings import API_KEY_ENV_NAME, BaseSettings @dataclass -class MindeeApi(BaseSettings): +class MindeeAPI(BaseSettings): """Settings class relating to API requests.""" def __init__( @@ -18,7 +18,7 @@ def __init__( ): super().__init__(api_key) if not self.api_key or len(self.api_key) == 0: - raise MindeeApiError( + raise MindeeAPIError( ( f"Missing API key for '{endpoint_name} v{version}' (belonging to {account_name})," " check your Client configuration.\n" diff --git a/mindee/mindee_http/workflow_endpoint.py b/mindee/v1/mindee_http/workflow_endpoint.py similarity index 80% rename from mindee/mindee_http/workflow_endpoint.py rename to mindee/v1/mindee_http/workflow_endpoint.py index 7473192d..b8a19f7a 100644 --- a/mindee/mindee_http/workflow_endpoint.py +++ b/mindee/v1/mindee_http/workflow_endpoint.py @@ -2,11 +2,11 @@ import requests -from mindee.input.sources.local_input_source import LocalInputSource -from mindee.input.sources.url_input_source import UrlInputSource -from mindee.v1.input.workflow_options import WorkflowOptions -from mindee.mindee_http.base_endpoint import BaseEndpoint -from mindee.mindee_http.workflow_settings import WorkflowSettings +from mindee.input.local_input_source import LocalInputSource +from mindee.input.url_input_source import URLInputSource +from mindee.v1.client_options.workflow_options import WorkflowOptions +from mindee.v1.mindee_http.base_endpoint import BaseEndpoint +from mindee.v1.mindee_http.workflow_settings import WorkflowSettings class WorkflowEndpoint(BaseEndpoint): @@ -24,7 +24,7 @@ def __init__(self, settings: WorkflowSettings) -> None: def workflow_execution_post( self, - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], options: WorkflowOptions, ): """ @@ -50,7 +50,7 @@ def workflow_execution_post( if options.rag: params["rag"] = "true" - if isinstance(input_source, UrlInputSource): + if isinstance(input_source, URLInputSource): data["document"] = input_source.url response = requests.post( self.settings.url_root, diff --git a/mindee/mindee_http/workflow_settings.py b/mindee/v1/mindee_http/workflow_settings.py similarity index 80% rename from mindee/mindee_http/workflow_settings.py rename to mindee/v1/mindee_http/workflow_settings.py index 74668920..bd272159 100644 --- a/mindee/mindee_http/workflow_settings.py +++ b/mindee/v1/mindee_http/workflow_settings.py @@ -1,8 +1,8 @@ from dataclasses import dataclass from typing import Optional -from mindee.error.mindee_error import MindeeApiError -from mindee.mindee_http.base_settings import API_KEY_ENV_NAME, BaseSettings +from mindee.v1.error.mindee_api_error import MindeeAPIError +from mindee.v1.mindee_http.base_settings import API_KEY_ENV_NAME, BaseSettings @dataclass @@ -16,7 +16,7 @@ def __init__( ): super().__init__(api_key) if not self.api_key or len(self.api_key) == 0: - raise MindeeApiError( + raise MindeeAPIError( ( f"Missing API key for workflow '{workflow_id}'," " check your Client configuration.\n" diff --git a/mindee/v1/parsing/__init__.py b/mindee/v1/parsing/__init__.py index e69de29b..52980eef 100644 --- a/mindee/v1/parsing/__init__.py +++ b/mindee/v1/parsing/__init__.py @@ -0,0 +1,8 @@ +from mindee.v1.parsing import ( + common, + custom, + generated, + standard, +) + +__all__ = ["common", "custom", "generated", "standard"] diff --git a/mindee/v2/client.py b/mindee/v2/client.py index 635e1d40..304c149b 100644 --- a/mindee/v2/client.py +++ b/mindee/v2/client.py @@ -4,14 +4,14 @@ from mindee.client_mixin import ClientMixin from mindee.error.mindee_error import MindeeError -from mindee.error.v2.mindee_http_error_v2 import handle_error_v2 -from mindee.input import UrlInputSource -from mindee.v2.input.base_parameters import BaseParameters -from mindee.input.polling_options import PollingOptions -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.v2.error.mindee_http_error_v2 import handle_error_v2 +from mindee.input import URLInputSource +from mindee.v2.client_options.base_parameters import BaseParameters +from mindee.client_options.polling_options import PollingOptions +from mindee.input.local_input_source import LocalInputSource from mindee.logger import logger -from mindee.mindee_http.mindee_api_v2 import MindeeApiV2 -from mindee.mindee_http.response_validation_v2 import ( +from mindee.v2.mindee_http.mindee_api_v2 import MindeeAPIV2 +from mindee.v2.mindee_http.response_validation_v2 import ( is_valid_get_response, is_valid_post_response, ) @@ -31,7 +31,7 @@ class Client(ClientMixin): """ api_key: Optional[str] - mindee_api: MindeeApiV2 + mindee_api: MindeeAPIV2 def __init__(self, api_key: Optional[str] = None) -> None: """ @@ -40,11 +40,11 @@ def __init__(self, api_key: Optional[str] = None) -> None: :params api_key: Your API key for all endpoints """ self.api_key = api_key - self.mindee_api = MindeeApiV2(api_key) + self.mindee_api = MindeeAPIV2(api_key) def enqueue_inference( self, - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], params: BaseParameters, disable_redundant_warnings: bool = False, ) -> JobResponse: @@ -59,7 +59,7 @@ def enqueue_inference( def enqueue( self, - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], params: BaseParameters, ) -> JobResponse: """ @@ -131,7 +131,7 @@ def get_result( def enqueue_and_get_result( self, response_type: Type[TypeBaseResponse], - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], params: BaseParameters, ) -> TypeBaseResponse: """ diff --git a/mindee/v1/input/__init__.py b/mindee/v2/client_options/__init__.py similarity index 100% rename from mindee/v1/input/__init__.py rename to mindee/v2/client_options/__init__.py diff --git a/mindee/v2/input/base_parameters.py b/mindee/v2/client_options/base_parameters.py similarity index 95% rename from mindee/v2/input/base_parameters.py rename to mindee/v2/client_options/base_parameters.py index 77e5bc76..45ce3162 100644 --- a/mindee/v2/input/base_parameters.py +++ b/mindee/v2/client_options/base_parameters.py @@ -2,7 +2,7 @@ from dataclasses import dataclass, field from typing import Dict, Optional, List, Union -from mindee.input.polling_options import PollingOptions +from mindee.client_options.polling_options import PollingOptions @dataclass diff --git a/mindee/v2/commands/cli_parser.py b/mindee/v2/commands/cli_parser.py index 11629697..550a8723 100644 --- a/mindee/v2/commands/cli_parser.py +++ b/mindee/v2/commands/cli_parser.py @@ -12,10 +12,10 @@ CropParameters, SplitParameters, ) +from mindee.input import PathInput, URLInputSource from mindee.v2.client import Client -from mindee.input.sources import PathInput, UrlInputSource -from mindee.v2.input.base_parameters import BaseParameters +from mindee.v2.client_options.base_parameters import BaseParameters from mindee.v2.parsing.inference.base_response import BaseResponse @@ -83,7 +83,7 @@ class MindeeParser: """Stores attributes relating to parsing.""" client: Client """Mindee client""" - input_source: Union[PathInput, UrlInputSource] + input_source: Union[PathInput, URLInputSource] """Document to be parsed.""" def __init__( @@ -130,9 +130,9 @@ def _set_args(self) -> Namespace: parsed_args = self.parser.parse_args() return parsed_args - def _get_input_source(self) -> Union[PathInput, UrlInputSource]: + def _get_input_source(self) -> Union[PathInput, URLInputSource]: """Loads an input document.""" if self.parsed_args.path.lower().startswith("http"): - return UrlInputSource(self.parsed_args.path) + return URLInputSource(self.parsed_args.path) return PathInput(self.parsed_args.path) diff --git a/mindee/v2/error/__init__.py b/mindee/v2/error/__init__.py new file mode 100644 index 00000000..13a5346c --- /dev/null +++ b/mindee/v2/error/__init__.py @@ -0,0 +1,4 @@ +from mindee.v2.error.mindee_api_v2_error import MindeeAPIV2Error +from mindee.v2.error.mindee_http_error_v2 import MindeeHTTPErrorV2 + +__all__ = ["MindeeAPIV2Error", "MindeeHTTPErrorV2"] diff --git a/mindee/v2/error/mindee_api_v2_error.py b/mindee/v2/error/mindee_api_v2_error.py new file mode 100644 index 00000000..61d0bb1e --- /dev/null +++ b/mindee/v2/error/mindee_api_v2_error.py @@ -0,0 +1,5 @@ +from mindee.error import MindeeError + + +class MindeeAPIV2Error(MindeeError): + """An exception relating to settings of the MindeeClient V2.""" diff --git a/mindee/error/v2/mindee_http_error_v2.py b/mindee/v2/error/mindee_http_error_v2.py similarity index 100% rename from mindee/error/v2/mindee_http_error_v2.py rename to mindee/v2/error/mindee_http_error_v2.py diff --git a/mindee/v2/file_operations/crop.py b/mindee/v2/file_operations/crop.py index 96116f50..c6fc3bb7 100644 --- a/mindee/v2/file_operations/crop.py +++ b/mindee/v2/file_operations/crop.py @@ -3,7 +3,7 @@ from mindee.error import MindeeError from mindee.extraction import ExtractedImage, extract_multiple_images_from_source from mindee.geometry import Point, Polygon -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource from mindee.v2.parsing.inference.field import FieldLocation from mindee.v2.file_operations.crop_files import CropFiles from mindee.v2.product.crop.crop_box import CropBox diff --git a/mindee/v2/file_operations/split.py b/mindee/v2/file_operations/split.py index 041538c1..74a49b81 100644 --- a/mindee/v2/file_operations/split.py +++ b/mindee/v2/file_operations/split.py @@ -3,7 +3,7 @@ from mindee.error import MindeeError from mindee.extraction.pdf_extractor.extracted_pdf import ExtractedPdf from mindee.extraction.pdf_extractor.pdf_extractor import PdfExtractor -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource from mindee.v2.file_operations.split_files import SplitFiles diff --git a/mindee/v2/input/__init__.py b/mindee/v2/mindee_http/__init__.py similarity index 100% rename from mindee/v2/input/__init__.py rename to mindee/v2/mindee_http/__init__.py diff --git a/mindee/mindee_http/mindee_api_v2.py b/mindee/v2/mindee_http/mindee_api_v2.py similarity index 88% rename from mindee/mindee_http/mindee_api_v2.py rename to mindee/v2/mindee_http/mindee_api_v2.py index cc79ba3b..b8a6d76b 100644 --- a/mindee/mindee_http/mindee_api_v2.py +++ b/mindee/v2/mindee_http/mindee_api_v2.py @@ -3,12 +3,12 @@ import requests -from mindee.error.mindee_error import MindeeApiV2Error -from mindee.v2.input.base_parameters import BaseParameters -from mindee.input.sources.local_input_source import LocalInputSource -from mindee.input.sources.url_input_source import UrlInputSource +from mindee.v2.error.mindee_api_v2_error import MindeeAPIV2Error +from mindee.v2.client_options.base_parameters import BaseParameters +from mindee.input.local_input_source import LocalInputSource +from mindee.input.url_input_source import URLInputSource from mindee.logger import logger -from mindee.mindee_http.base_settings import USER_AGENT +from mindee.v1.mindee_http.base_settings import USER_AGENT from mindee.mindee_http.settings_mixin import SettingsMixin API_KEY_V2_ENV_NAME = "MINDEE_V2_API_KEY" @@ -21,7 +21,7 @@ TIMEOUT_DEFAULT = 120 -class MindeeApiV2(SettingsMixin): +class MindeeAPIV2(SettingsMixin): """Settings class relating to API V2 requests.""" url_root: str @@ -42,7 +42,7 @@ def __init__( self.set_base_url(BASE_URL_DEFAULT) self.set_from_env() if not self.api_key: - raise MindeeApiV2Error( + raise MindeeAPIV2Error( ( f"Missing API key," " check your Client configuration.\n" @@ -74,7 +74,7 @@ def set_from_env(self) -> None: def req_post_inference_enqueue( self, - input_source: Union[LocalInputSource, UrlInputSource], + input_source: Union[LocalInputSource, URLInputSource], params: BaseParameters, slug: str, ) -> requests.Response: @@ -98,7 +98,7 @@ def req_post_inference_enqueue( data=data, timeout=self.request_timeout, ) - elif isinstance(input_source, UrlInputSource): + elif isinstance(input_source, URLInputSource): data["url"] = input_source.url response = requests.post( url=url, @@ -107,7 +107,7 @@ def req_post_inference_enqueue( timeout=self.request_timeout, ) else: - raise MindeeApiV2Error("Invalid input source.") + raise MindeeAPIV2Error("Invalid input source.") return response def req_get_job(self, job_id: str) -> requests.Response: diff --git a/mindee/mindee_http/response_validation_v2.py b/mindee/v2/mindee_http/response_validation_v2.py similarity index 100% rename from mindee/mindee_http/response_validation_v2.py rename to mindee/v2/mindee_http/response_validation_v2.py diff --git a/mindee/v2/parsing/inference/field/dynamic_field.py b/mindee/v2/parsing/inference/field/dynamic_field.py index 24e27f01..58aba6b1 100644 --- a/mindee/v2/parsing/inference/field/dynamic_field.py +++ b/mindee/v2/parsing/inference/field/dynamic_field.py @@ -2,7 +2,7 @@ from importlib import import_module from typing import TYPE_CHECKING, Union -from mindee.error import MindeeApiV2Error +from mindee.v2.error.mindee_api_v2_error import MindeeAPIV2Error from mindee.parsing.common import StringDict if TYPE_CHECKING: @@ -55,7 +55,7 @@ def get_field_type( field_file = import_module("mindee.v2.parsing.inference.field.object_field") field_class = getattr(field_file, FieldType.OBJECT.value) else: - raise MindeeApiV2Error(f"Unrecognized field type in {raw_response}.") + raise MindeeAPIV2Error(f"Unrecognized field type in {raw_response}.") return field_class(raw_response, indent_level) - raise MindeeApiV2Error(f"Unrecognized field format {raw_response}.") + raise MindeeAPIV2Error(f"Unrecognized field format {raw_response}.") diff --git a/mindee/v2/product/classification/params/classification_parameters.py b/mindee/v2/product/classification/params/classification_parameters.py index 86194d80..8a69975f 100644 --- a/mindee/v2/product/classification/params/classification_parameters.py +++ b/mindee/v2/product/classification/params/classification_parameters.py @@ -1,4 +1,4 @@ -from mindee.v2.input.base_parameters import BaseParameters +from mindee.v2.client_options.base_parameters import BaseParameters class ClassificationParameters(BaseParameters): diff --git a/mindee/v2/product/crop/crop_box.py b/mindee/v2/product/crop/crop_box.py index a6f382b5..8e836a3b 100644 --- a/mindee/v2/product/crop/crop_box.py +++ b/mindee/v2/product/crop/crop_box.py @@ -1,7 +1,7 @@ from typing import Optional from mindee.extraction import ExtractedImage, extract_multiple_images_from_source -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.field import FieldLocation from mindee.v2.product.extraction.extraction_response import ExtractionResponse diff --git a/mindee/v2/product/crop/crop_response.py b/mindee/v2/product/crop/crop_response.py index 75e4773c..82656e31 100644 --- a/mindee/v2/product/crop/crop_response.py +++ b/mindee/v2/product/crop/crop_response.py @@ -1,4 +1,4 @@ -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource from mindee.parsing.common import StringDict from mindee.v2.file_operations.crop_files import CropFiles from mindee.v2.parsing.inference.base_response import BaseResponse diff --git a/mindee/v2/product/crop/params/crop_parameters.py b/mindee/v2/product/crop/params/crop_parameters.py index a48b86c5..e46d17c9 100644 --- a/mindee/v2/product/crop/params/crop_parameters.py +++ b/mindee/v2/product/crop/params/crop_parameters.py @@ -1,4 +1,4 @@ -from mindee.v2.input.base_parameters import BaseParameters +from mindee.v2.client_options.base_parameters import BaseParameters class CropParameters(BaseParameters): diff --git a/mindee/v2/product/extraction/params/extraction_parameters.py b/mindee/v2/product/extraction/params/extraction_parameters.py index 8a4cd98f..1700ffde 100644 --- a/mindee/v2/product/extraction/params/extraction_parameters.py +++ b/mindee/v2/product/extraction/params/extraction_parameters.py @@ -2,7 +2,7 @@ from dataclasses import dataclass from typing import Dict, List, Optional, Union -from mindee.v2.input.base_parameters import BaseParameters +from mindee.v2.client_options.base_parameters import BaseParameters from mindee.v2.product.extraction.params.data_schema import DataSchema diff --git a/mindee/v2/product/ocr/params/ocr_parameters.py b/mindee/v2/product/ocr/params/ocr_parameters.py index b976760d..5e8bb449 100644 --- a/mindee/v2/product/ocr/params/ocr_parameters.py +++ b/mindee/v2/product/ocr/params/ocr_parameters.py @@ -1,4 +1,4 @@ -from mindee.v2.input.base_parameters import BaseParameters +from mindee.v2.client_options.base_parameters import BaseParameters class OCRParameters(BaseParameters): diff --git a/mindee/v2/product/split/params/split_parameters.py b/mindee/v2/product/split/params/split_parameters.py index ec57afea..0b9036b2 100644 --- a/mindee/v2/product/split/params/split_parameters.py +++ b/mindee/v2/product/split/params/split_parameters.py @@ -1,4 +1,4 @@ -from mindee.v2.input.base_parameters import BaseParameters +from mindee.v2.client_options.base_parameters import BaseParameters class SplitParameters(BaseParameters): diff --git a/mindee/v2/product/split/split_range.py b/mindee/v2/product/split/split_range.py index b2f95a67..090da4ac 100644 --- a/mindee/v2/product/split/split_range.py +++ b/mindee/v2/product/split/split_range.py @@ -2,7 +2,7 @@ from mindee.v2.product.extraction.extraction_response import ExtractionResponse from mindee.extraction.pdf_extractor.extracted_pdf import ExtractedPdf -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource from mindee.parsing.common import StringDict from mindee.v2.file_operations.split import extract_single_split diff --git a/mindee/v2/product/split/split_response.py b/mindee/v2/product/split/split_response.py index 5cae909c..7f2f6073 100644 --- a/mindee/v2/product/split/split_response.py +++ b/mindee/v2/product/split/split_response.py @@ -1,4 +1,4 @@ -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.base_response import BaseResponse from mindee.v2.file_operations.split_files import SplitFiles diff --git a/tests/input/test_apply_page_options.py b/tests/input/test_apply_page_options.py index 6640e544..cc1f6af0 100644 --- a/tests/input/test_apply_page_options.py +++ b/tests/input/test_apply_page_options.py @@ -5,7 +5,7 @@ from mindee.error.mindee_error import MindeeError from mindee.input.page_options import KEEP_ONLY, REMOVE, PageOptions -from mindee.input.sources import ( +from mindee.input import ( Base64Input, BytesInput, FileInput, diff --git a/tests/input/test_compression.py b/tests/input/test_compression.py index fde5d064..90a6ef47 100644 --- a/tests/input/test_compression.py +++ b/tests/input/test_compression.py @@ -5,8 +5,8 @@ import pytest from PIL import Image -from mindee.image_operations.image_compressor import compress_image -from mindee.input.sources import PathInput +from mindee.image import compress_image +from mindee.input import PathInput from mindee.pdf.pdf_compressor import compress_pdf from mindee.pdf.pdf_utils import extract_text_from_pdf from tests.utils import ( diff --git a/tests/input/test_inputs.py b/tests/input/test_inputs.py index b9e38e1a..ece9efa3 100644 --- a/tests/input/test_inputs.py +++ b/tests/input/test_inputs.py @@ -4,13 +4,13 @@ from mindee.error.mimetype_error import MimeTypeError from mindee.error.mindee_error import MindeeSourceError -from mindee.input.sources import ( +from mindee.input import ( Base64Input, BytesInput, FileInput, LocalInputSource, PathInput, - UrlInputSource, + URLInputSource, ) from tests.utils import FILE_TYPES_DIR @@ -44,7 +44,7 @@ def test_pdf_input_from_path(filename, page_count): def test_pdf_input_from_url(): with pytest.raises(MindeeSourceError): - UrlInputSource(url="http://example.com/invoice.pdf") + URLInputSource(url="http://example.com/invoice.pdf") TEST_IMAGES = ( diff --git a/tests/utils.py b/tests/utils.py index 8de00d8f..ec42084c 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -2,7 +2,7 @@ from difflib import SequenceMatcher from pathlib import Path -from mindee.mindee_http.base_settings import ( +from mindee.v1.mindee_http.base_settings import ( API_KEY_ENV_NAME, BASE_URL_ENV_NAME, REQUEST_TIMEOUT_ENV_NAME, diff --git a/tests/v1/api/test_async_response.py b/tests/v1/api/test_async_response.py index 139034b9..efd0f6ca 100644 --- a/tests/v1/api/test_async_response.py +++ b/tests/v1/api/test_async_response.py @@ -4,7 +4,7 @@ import requests from mindee.v1.client import Client -from mindee.input.sources.path_input import PathInput +from mindee.input.path_input import PathInput from mindee.mindee_http.response_validation import is_valid_async_response from mindee.v1.parsing.common import RequestStatus from mindee.v1.parsing.common.async_predict_response import AsyncPredictResponse diff --git a/tests/v1/extraction/test_image_extractor.py b/tests/v1/extraction/test_image_extractor.py index 77223152..72981421 100644 --- a/tests/v1/extraction/test_image_extractor.py +++ b/tests/v1/extraction/test_image_extractor.py @@ -4,7 +4,7 @@ from PIL import Image from mindee.extraction.common.image_extractor import extract_multiple_images_from_source -from mindee.input.sources.path_input import PathInput +from mindee.input.path_input import PathInput from mindee.v1.product.barcode_reader import BarcodeReaderV1 from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/extraction/test_invoice_splitter_auto_extraction.py b/tests/v1/extraction/test_invoice_splitter_auto_extraction.py index 640ccc12..b59ee51a 100644 --- a/tests/v1/extraction/test_invoice_splitter_auto_extraction.py +++ b/tests/v1/extraction/test_invoice_splitter_auto_extraction.py @@ -4,7 +4,7 @@ from mindee.v1.client import Client from mindee.extraction.pdf_extractor.pdf_extractor import PdfExtractor -from mindee.input.sources.path_input import PathInput +from mindee.input.path_input import PathInput from mindee.v1.parsing.common import Document from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 diff --git a/tests/v1/extraction/test_multi_receipts_extractor.py b/tests/v1/extraction/test_multi_receipts_extractor.py index bdc2ba5e..af1124d6 100644 --- a/tests/v1/extraction/test_multi_receipts_extractor.py +++ b/tests/v1/extraction/test_multi_receipts_extractor.py @@ -6,7 +6,7 @@ from mindee.extraction.multi_receipts_extractor.multi_receipts_extractor import ( extract_receipts, ) -from mindee.input.sources.path_input import PathInput +from mindee.input.path_input import PathInput from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1 import ( MultiReceiptsDetectorV1, ) diff --git a/tests/v1/extraction/test_pdf_extractor.py b/tests/v1/extraction/test_pdf_extractor.py index 96e0987a..04197e95 100644 --- a/tests/v1/extraction/test_pdf_extractor.py +++ b/tests/v1/extraction/test_pdf_extractor.py @@ -3,7 +3,7 @@ from mindee.v1.client import Client from mindee.extraction.pdf_extractor.pdf_extractor import PdfExtractor from mindee.input.local_response import LocalResponse -from mindee.input.sources.path_input import PathInput +from mindee.input.path_input import PathInput from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 from mindee.v1.product.invoice_splitter.invoice_splitter_v1_document import ( InvoiceSplitterV1Document, diff --git a/tests/v1/mindee_http/test_error.py b/tests/v1/mindee_http/test_error.py index b929122f..1115dc84 100644 --- a/tests/v1/mindee_http/test_error.py +++ b/tests/v1/mindee_http/test_error.py @@ -9,7 +9,7 @@ MindeeHTTPServerError, handle_error, ) -from mindee.input.sources.path_input import PathInput +from mindee.input.path_input import PathInput from tests.utils import FILE_TYPES_DIR, clear_envvars, dummy_envvars, V1_ERROR_DATA_DIR diff --git a/tests/v1/test_client.py b/tests/v1/test_client.py index 62f2ffb6..6dc3f5db 100644 --- a/tests/v1/test_client.py +++ b/tests/v1/test_client.py @@ -12,7 +12,7 @@ from mindee.error.mindee_error import MindeeClientError, MindeeError from mindee.error.mindee_http_error import MindeeHTTPError from mindee.input.local_response import LocalResponse -from mindee.input.sources.local_input_source import LocalInputSource +from mindee.input.local_input_source import LocalInputSource from mindee.v1.product import MultiReceiptsDetectorV1 from mindee.v1.product.international_id import InternationalIdV2 from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 diff --git a/tests/v1/workflows/test_workflow_integration.py b/tests/v1/workflows/test_workflow_integration.py index 954ad7c6..9e2807e6 100644 --- a/tests/v1/workflows/test_workflow_integration.py +++ b/tests/v1/workflows/test_workflow_integration.py @@ -4,7 +4,7 @@ import pytest from mindee.v1.client import Client -from mindee.input import WorkflowOptions +from mindee.v1.client_options.workflow_options import WorkflowOptions from mindee.v1.parsing.common import ExecutionPriority from mindee.v1.product import FinancialDocumentV1, GeneratedV1 from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v2/file_operations/test_crop_operation.py b/tests/v2/file_operations/test_crop_operation.py index 24fb928c..a92380d3 100644 --- a/tests/v2/file_operations/test_crop_operation.py +++ b/tests/v2/file_operations/test_crop_operation.py @@ -4,7 +4,7 @@ from PIL import Image from mindee.v2.file_operations.crop import extract_crops -from mindee.input.sources.path_input import PathInput +from mindee.input.path_input import PathInput from mindee.v2.product.crop.crop_response import ( CropResponse, ) diff --git a/tests/v2/file_operations/test_crop_operation_integration.py b/tests/v2/file_operations/test_crop_operation_integration.py index b0c4a873..c537efe1 100644 --- a/tests/v2/file_operations/test_crop_operation_integration.py +++ b/tests/v2/file_operations/test_crop_operation_integration.py @@ -9,8 +9,8 @@ CropParameters, CropResponse, ) -from mindee.v1.client import Client -from mindee.input.sources.path_input import PathInput +from mindee.v2.client import Client +from mindee.input.path_input import PathInput from mindee.v2.file_operations.crop import extract_crops from tests.utils import OUTPUT_DIR, V2_PRODUCT_DATA_DIR, cleanup_output_files diff --git a/tests/v2/file_operations/test_split_operation.py b/tests/v2/file_operations/test_split_operation.py index 60e481d4..cce9707e 100644 --- a/tests/v2/file_operations/test_split_operation.py +++ b/tests/v2/file_operations/test_split_operation.py @@ -2,7 +2,7 @@ import pytest -from mindee.input.sources.path_input import PathInput +from mindee.input.path_input import PathInput from mindee.v2.product.split.split_response import ( SplitResponse, ) diff --git a/tests/v2/file_operations/test_split_operation_integration.py b/tests/v2/file_operations/test_split_operation_integration.py index cc9ac43c..dfbd5db0 100644 --- a/tests/v2/file_operations/test_split_operation_integration.py +++ b/tests/v2/file_operations/test_split_operation_integration.py @@ -8,8 +8,8 @@ SplitParameters, SplitResponse, ) -from mindee.v1.client import Client -from mindee.input.sources.path_input import PathInput +from mindee.v2.client import Client +from mindee.input.path_input import PathInput from tests.utils import OUTPUT_DIR, V2_PRODUCT_DATA_DIR, cleanup_output_files diff --git a/tests/v2/product/classification/test_classification_integration.py b/tests/v2/product/classification/test_classification_integration.py index 1c749bb8..ab7aeac8 100644 --- a/tests/v2/product/classification/test_classification_integration.py +++ b/tests/v2/product/classification/test_classification_integration.py @@ -2,8 +2,8 @@ import pytest -from mindee.v1.client import Client -from mindee.input.sources.path_input import PathInput +from mindee.v2.client import Client +from mindee.input.path_input import PathInput from mindee.v2 import ClassificationParameters, ClassificationResponse from tests.utils import V2_PRODUCT_DATA_DIR diff --git a/tests/v2/product/crop/test_crop_integration.py b/tests/v2/product/crop/test_crop_integration.py index db707cc9..bdbd3ab5 100644 --- a/tests/v2/product/crop/test_crop_integration.py +++ b/tests/v2/product/crop/test_crop_integration.py @@ -2,8 +2,8 @@ import pytest -from mindee.v1.client import Client -from mindee.input.sources.path_input import PathInput +from mindee.v2.client import Client +from mindee.input.path_input import PathInput from mindee.v2 import CropParameters, CropResponse from tests.utils import V2_PRODUCT_DATA_DIR diff --git a/tests/v2/product/ocr/test_ocr_integration.py b/tests/v2/product/ocr/test_ocr_integration.py index b9f94666..ebd6d208 100644 --- a/tests/v2/product/ocr/test_ocr_integration.py +++ b/tests/v2/product/ocr/test_ocr_integration.py @@ -2,8 +2,8 @@ import pytest -from mindee.v1.client import Client -from mindee.input.sources.path_input import PathInput +from mindee.v2.client import Client +from mindee.input.path_input import PathInput from mindee.v2 import OCRParameters, OCRResponse from mindee.v2.product.ocr import OCRInference, OCRResult from tests.utils import V2_PRODUCT_DATA_DIR diff --git a/tests/v2/product/split/test_split_integration.py b/tests/v2/product/split/test_split_integration.py index daf2f2ef..1819249a 100644 --- a/tests/v2/product/split/test_split_integration.py +++ b/tests/v2/product/split/test_split_integration.py @@ -2,8 +2,8 @@ import pytest -from mindee.v1.client import Client -from mindee.input.sources.path_input import PathInput +from mindee.v2.client import Client +from mindee.input.path_input import PathInput from mindee.v2 import SplitParameters, SplitResponse from tests.utils import V2_PRODUCT_DATA_DIR diff --git a/tests/v2/test_client.py b/tests/v2/test_client.py index 1ccef471..1fbe533a 100644 --- a/tests/v2/test_client.py +++ b/tests/v2/test_client.py @@ -5,11 +5,12 @@ from mindee import ExtractionParameters, ExtractionResponse, LocalResponse from mindee.v2.client import Client -from mindee.error.mindee_error import MindeeApiV2Error, MindeeError -from mindee.error.v2.mindee_http_error_v2 import MindeeHTTPErrorV2 -from mindee.input.sources.local_input_source import LocalInputSource -from mindee.input.sources.path_input import PathInput -from mindee.mindee_http.base_settings import USER_AGENT +from mindee.error.mindee_error import MindeeError +from mindee.v2.error.mindee_api_v2_error import MindeeAPIV2Error +from mindee.v2.error.mindee_http_error_v2 import MindeeHTTPErrorV2 +from mindee.input.local_input_source import LocalInputSource +from mindee.input.path_input import PathInput +from mindee.v1.mindee_http.base_settings import USER_AGENT from mindee.v2.product.extraction.extraction_inference import ExtractionInference from mindee.v2.parsing.inference.job import Job from mindee.v2.parsing.inference.job_response import JobResponse @@ -86,19 +87,19 @@ def _fake_ok_get_inference(*args, **kwargs): return _FakeOkGetInferenceResp() monkeypatch.setattr( - "mindee.mindee_http.mindee_api_v2.MindeeApiV2.req_post_inference_enqueue", + "mindee.v2.mindee_http.mindee_api_v2.MindeeAPIV2.req_post_inference_enqueue", _fake_error_post_inference_enqueue, raising=True, ) monkeypatch.setattr( - "mindee.mindee_http.mindee_api_v2.MindeeApiV2.req_get_job", + "mindee.v2.mindee_http.mindee_api_v2.MindeeAPIV2.req_get_job", _fake_ok_get_job, raising=True, ) monkeypatch.setattr( - "mindee.mindee_http.mindee_api_v2.MindeeApiV2.req_get_inference", + "mindee.v2.mindee_http.mindee_api_v2.MindeeAPIV2.req_get_inference", _fake_ok_get_inference, raising=True, ) @@ -114,7 +115,7 @@ def env_no_key(monkeypatch): @pytest.mark.v2 def test_parse_path_without_token(env_no_key): - with pytest.raises(MindeeApiV2Error): + with pytest.raises(MindeeAPIV2Error): Client() diff --git a/tests/v2/test_client_integration.py b/tests/v2/test_client_integration.py index 226b1e3b..7892f697 100644 --- a/tests/v2/test_client_integration.py +++ b/tests/v2/test_client_integration.py @@ -4,10 +4,10 @@ import pytest from mindee import ExtractionParameters -from mindee.v1.client import Client -from mindee.input.sources.path_input import PathInput -from mindee.input.sources.url_input_source import UrlInputSource -from mindee.error.v2.mindee_http_error_v2 import MindeeHTTPErrorV2 +from mindee.v2.client import Client +from mindee.input.path_input import PathInput +from mindee.input.url_input_source import URLInputSource +from mindee.v2.error.mindee_http_error_v2 import MindeeHTTPErrorV2 from mindee.v2.parsing import InferenceActiveOptions from mindee.v2.product.extraction.extraction_response import ExtractionResponse from tests.utils import FILE_TYPES_DIR, V2_PRODUCT_DATA_DIR @@ -258,7 +258,7 @@ def test_blank_url_input_source_must_succeed( """ url = os.getenv("MINDEE_V2_SE_TESTS_BLANK_PDF_URL") - input_source = UrlInputSource(url) + input_source = URLInputSource(url) params = ExtractionParameters( model_id=findoc_model_id, rag=False, From 987c18846a33198116f89f900f37eb48d6a7293c Mon Sep 17 00:00:00 2001 From: sebastianMindee <130448732+sebastianMindee@users.noreply.github.com> Date: Tue, 2 Jun 2026 13:53:23 +0200 Subject: [PATCH 06/10] :boom: :recycle: move extraction PDF and Image into their respective namespaces (#408) --- ...uto_invoice_splitter_extraction_example.py | 44 ----------- .../auto_multi_receipts_extraction_example.py | 34 --------- examples/custom_line_items_reconstruction.py | 56 -------------- examples/display_cropping.py | 74 ------------------- mindee/extraction/__init__.py | 17 ----- mindee/extraction/common/__init__.py | 11 --- .../multi_receipts_extractor/__init__.py | 3 - mindee/extraction/pdf_extractor/__init__.py | 4 - .../common => image}/extracted_image.py | 0 .../common => image}/image_extractor.py | 2 +- .../pdf_extractor => pdf}/extracted_pdf.py | 0 .../pdf_extractor => pdf}/pdf_extractor.py | 42 ++--------- mindee/v1/pdf/__init__.py | 4 + .../pdf}/multi_receipts_extractor.py | 6 +- mindee/v1/pdf/pdf_extractor.py | 54 ++++++++++++++ mindee/v2/file_operations/crop.py | 3 +- mindee/v2/file_operations/crop_files.py | 2 +- mindee/v2/file_operations/split.py | 4 +- mindee/v2/file_operations/split_files.py | 2 +- mindee/v2/product/crop/crop_box.py | 3 +- mindee/v2/product/split/split_range.py | 2 +- tests/v1/extraction/test_image_extractor.py | 2 +- .../test_invoice_splitter_auto_extraction.py | 21 ++++-- .../test_multi_receipts_extractor.py | 4 +- tests/v1/extraction/test_pdf_extractor.py | 2 +- .../test_crop_operation_integration.py | 3 +- 26 files changed, 98 insertions(+), 301 deletions(-) delete mode 100644 examples/auto_invoice_splitter_extraction_example.py delete mode 100644 examples/auto_multi_receipts_extraction_example.py delete mode 100644 examples/custom_line_items_reconstruction.py delete mode 100644 examples/display_cropping.py delete mode 100644 mindee/extraction/__init__.py delete mode 100644 mindee/extraction/common/__init__.py delete mode 100644 mindee/extraction/multi_receipts_extractor/__init__.py delete mode 100644 mindee/extraction/pdf_extractor/__init__.py rename mindee/{extraction/common => image}/extracted_image.py (100%) rename mindee/{extraction/common => image}/image_extractor.py (98%) rename mindee/{extraction/pdf_extractor => pdf}/extracted_pdf.py (100%) rename mindee/{extraction/pdf_extractor => pdf}/pdf_extractor.py (59%) create mode 100644 mindee/v1/pdf/__init__.py rename mindee/{extraction/multi_receipts_extractor => v1/pdf}/multi_receipts_extractor.py (87%) create mode 100644 mindee/v1/pdf/pdf_extractor.py diff --git a/examples/auto_invoice_splitter_extraction_example.py b/examples/auto_invoice_splitter_extraction_example.py deleted file mode 100644 index 1275af69..00000000 --- a/examples/auto_invoice_splitter_extraction_example.py +++ /dev/null @@ -1,44 +0,0 @@ -from mindee.v1.client import Client -from mindee.extraction.pdf_extractor import PdfExtractor -from mindee.input.path_input import PathInput -from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 -from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 - -mindee_client = Client(api_key="my-api-key") -# mindee_client = Client() # Optionally, set from env. - - -def parse_invoice(file_path): - input_source = PathInput(file_path) - - if input_source.is_pdf() and input_source.page_count > 1: - parse_multi_page(input_source) - else: - parse_single_page(input_source) - - -def parse_single_page(input_source): - invoice_result = mindee_client.parse(InvoiceV4, input_source) - print(invoice_result.document) - - -def parse_multi_page(input_source): - pdf_extractor = PdfExtractor(input_source) - invoice_splitter_response = mindee_client.enqueue_and_parse( - InvoiceSplitterV1, input_source, close_file=False - ) - page_groups = ( - invoice_splitter_response.document.inference.prediction.invoice_page_groups - ) - extracted_pdfs = pdf_extractor.extract_invoices(page_groups, strict=False) - - for extracted_pdf in extracted_pdfs: - # Optional: Save the files locally - # extracted_pdf.write_to_file("output/path") - - invoice_result = mindee_client.parse(InvoiceV4, extracted_pdf.as_input_source()) - print(invoice_result.document) - - -if __name__ == "__main__": - parse_invoice("path/to/my/file.ext") diff --git a/examples/auto_multi_receipts_extraction_example.py b/examples/auto_multi_receipts_extraction_example.py deleted file mode 100644 index 4b83b452..00000000 --- a/examples/auto_multi_receipts_extraction_example.py +++ /dev/null @@ -1,34 +0,0 @@ -from mindee.v1.client import Client -from mindee.v1 import product -from mindee.extraction.multi_receipts_extractor.multi_receipts_extractor import ( - extract_receipts, -) - - -def parse_receipts(input_path): - mindee_client = Client(api_key="my-api-key-here") - # mindee_client = Client() # Optionally, set from env. - input_doc = mindee_client.source_from_path(input_path) - - result_split = mindee_client.parse( - product.MultiReceiptsDetectorV1, input_doc, close_file=False - ) - - extracted_receipts = extract_receipts(input_doc, result_split.document.inference) - - for idx, receipt in enumerate(extracted_receipts, 1): - result_receipt = mindee_client.parse( - product.ReceiptV5, receipt.as_input_source() - ) - print(f"Receipt {idx}:") - print(result_receipt.document) - print("-" * 40) - - # Uncomment to save each extracted receipt - # save_path = f"./receipt_{idx}.pdf" - # receipt.save_to_file(save_path) - - -if __name__ == "__main__": - input_file = "path/to/my/file.ext" - parse_receipts(input_file) diff --git a/examples/custom_line_items_reconstruction.py b/examples/custom_line_items_reconstruction.py deleted file mode 100644 index b7490c0d..00000000 --- a/examples/custom_line_items_reconstruction.py +++ /dev/null @@ -1,56 +0,0 @@ -import os - -from mindee.v1.client import Client -from mindee.v1 import product -from mindee.v1.parsing.common import PredictResponse - -CUSTOM_ENDPOINT_NAME = os.getenv("CUSTOM_ENDPOINT_NAME", "my-endpoint-name") -CUSTOM_ACCOUNT_NAME = os.getenv("CUSTOM_ACCOUNT_NAME", "my-account-name") -CUSTOM_VERSION = os.getenv("CUSTOM_VERSION", "1") -CUSTOM_DOCUMENT_PATH = os.getenv("CUSTOM_DOCUMENT_PATH", "path/to/your/file.ext") - -# This example assumes you are following the associated tutorial: -# https://developers.mindee.com/docs/extracting-line-items-tutorial#line-reconstruction-code -anchors = ["category"] -columns = ["category", "previous_year_actual", "year_actual", "year_projection"] - - -def get_field_content(line, field) -> str: - if field in line.fields: - return str(line.fields[field].content) - return "" - - -def print_line(line) -> None: - category = get_field_content(line, "category") - previous_year_actual = get_field_content(line, "previous_year_actual") - year_actual = get_field_content(line, "year_actual") - year_projection = get_field_content(line, "year_projection") - # here ljust() fills the rest of the given size with spaces - string_line = ( - category.ljust(20, " ") - + previous_year_actual.ljust(10, " ") - + year_projection.ljust(10, " ") - + year_actual - ) - - print(string_line) - - -client = Client() - -custom_endpoint = client.create_endpoint( - CUSTOM_ENDPOINT_NAME, CUSTOM_ACCOUNT_NAME, CUSTOM_VERSION -) -input_doc = client.source_from_path(CUSTOM_DOCUMENT_PATH) - - -response: PredictResponse[product.CustomV1] = client.parse( - product.CustomV1, input_doc, endpoint=custom_endpoint -) -line_items = response.document.inference.prediction.columns_to_line_items( - anchors, columns -) - -for line in line_items: - print_line(line) diff --git a/examples/display_cropping.py b/examples/display_cropping.py deleted file mode 100644 index 055e1103..00000000 --- a/examples/display_cropping.py +++ /dev/null @@ -1,74 +0,0 @@ -""" -An example using OpenCV to display the cropping data returned by Mindee's API. - -Note that this example only works for images. - -You'll need to ``pip install opencv-python`` in addition to the mindee library. - -Run as follows from project root:: - - python examples/display_cropping.py -""" - -from typing import List, Tuple - -import cv2 -import numpy as np - -from mindee.v1.client import Client -from mindee.v1 import product -from mindee.v1.parsing.common import PredictResponse - - -def relative_to_pixel_pos(polygon, image_h: int, image_w: int) -> List[Tuple[int, int]]: - """Convert from Mindee's relative format to an absolute pixel format as used by OpenCV.""" - return [(int(point[0] * image_w), int(point[1] * image_h)) for point in polygon] - - -def show_image_crops(file_path: str, cropping: list): - """Display cropping results on an image.""" - image = cv2.imread(file_path) - height = image.shape[0] - width = image.shape[1] - - img = None - for crop in cropping: - to_display = [ - {"shape": crop.polygon, "color": (0, 0, 128), "thickness": 1}, - {"shape": crop.quadrangle, "color": (0, 128, 0), "thickness": 1}, - {"shape": crop.rectangle, "color": (128, 0, 0), "thickness": 1}, - {"shape": crop.bounding_box, "color": (255, 0, 0), "thickness": 2}, - ] - for item in to_display: - abs_polygon = relative_to_pixel_pos(item["shape"], height, width) - # convert the pixel positions to a 3D numpy array - polygon_points = np.array([abs_polygon], np.int32) - img = cv2.polylines( - image, polygon_points, True, item["color"], item["thickness"] - ) - if img is None: - raise RuntimeError("Not able to set the polygons") - - # resize the image as needed by changing the fx, fy values - img_half = cv2.resize(img, (0, 0), fx=0.9, fy=0.9) - - cv2.imshow(file_path, img_half) - cv2.moveWindow(file_path, 10, 10) - cv2.waitKey(0) - cv2.destroyAllWindows() - - -if __name__ == "__main__": - image_path = "./tests/data/fr/id_card/cni-rectoverso.jpg" - - # We'll get the API key from the environment - mindee_client = Client() - - # Load a file from disk - input_doc = mindee_client.source_from_path(image_path) - - # Parse the document by passing the appropriate type - api_response: PredictResponse = mindee_client.parse(product.CropperV1, input_doc) - - # Display - show_image_crops(image_path, api_response.document.inference.pages[0].cropping) diff --git a/mindee/extraction/__init__.py b/mindee/extraction/__init__.py deleted file mode 100644 index 0e3d7333..00000000 --- a/mindee/extraction/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -from mindee.extraction.common.extracted_image import ExtractedImage -from mindee.extraction.common.image_extractor import ( - attach_image_as_new_file, - extract_multiple_images_from_source, -) -from mindee.extraction.multi_receipts_extractor import multi_receipts_extractor -from mindee.extraction.pdf_extractor.extracted_pdf import ExtractedPdf -from mindee.extraction.pdf_extractor.pdf_extractor import PdfExtractor - -__all__ = [ - "ExtractedImage", - "ExtractedPdf", - "PdfExtractor", - "attach_image_as_new_file", - "extract_multiple_images_from_source", - "multi_receipts_extractor", -] diff --git a/mindee/extraction/common/__init__.py b/mindee/extraction/common/__init__.py deleted file mode 100644 index 25c45b37..00000000 --- a/mindee/extraction/common/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from mindee.extraction.common.extracted_image import ExtractedImage -from mindee.extraction.common.image_extractor import ( - attach_image_as_new_file, - extract_multiple_images_from_source, -) - -__all__ = [ - "ExtractedImage", - "attach_image_as_new_file", - "extract_multiple_images_from_source", -] diff --git a/mindee/extraction/multi_receipts_extractor/__init__.py b/mindee/extraction/multi_receipts_extractor/__init__.py deleted file mode 100644 index bb0b1e6b..00000000 --- a/mindee/extraction/multi_receipts_extractor/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from mindee.extraction.multi_receipts_extractor import multi_receipts_extractor - -__all__ = ["multi_receipts_extractor"] diff --git a/mindee/extraction/pdf_extractor/__init__.py b/mindee/extraction/pdf_extractor/__init__.py deleted file mode 100644 index cbb431f5..00000000 --- a/mindee/extraction/pdf_extractor/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from mindee.extraction.pdf_extractor.extracted_pdf import ExtractedPdf -from mindee.extraction.pdf_extractor.pdf_extractor import PdfExtractor - -__all__ = ["ExtractedPdf", "PdfExtractor"] diff --git a/mindee/extraction/common/extracted_image.py b/mindee/image/extracted_image.py similarity index 100% rename from mindee/extraction/common/extracted_image.py rename to mindee/image/extracted_image.py diff --git a/mindee/extraction/common/image_extractor.py b/mindee/image/image_extractor.py similarity index 98% rename from mindee/extraction/common/image_extractor.py rename to mindee/image/image_extractor.py index 6e1b445e..e5ed9f6e 100644 --- a/mindee/extraction/common/image_extractor.py +++ b/mindee/image/image_extractor.py @@ -5,7 +5,7 @@ from PIL import Image from mindee.error.mindee_error import MindeeError -from mindee.extraction.common.extracted_image import ExtractedImage +from mindee.image.extracted_image import ExtractedImage from mindee.geometry.point import Point from mindee.geometry.polygon import Polygon, get_min_max_x, get_min_max_y from mindee.input.bytes_input import BytesInput diff --git a/mindee/extraction/pdf_extractor/extracted_pdf.py b/mindee/pdf/extracted_pdf.py similarity index 100% rename from mindee/extraction/pdf_extractor/extracted_pdf.py rename to mindee/pdf/extracted_pdf.py diff --git a/mindee/extraction/pdf_extractor/pdf_extractor.py b/mindee/pdf/pdf_extractor.py similarity index 59% rename from mindee/extraction/pdf_extractor/pdf_extractor.py rename to mindee/pdf/pdf_extractor.py index 6e83e3fa..25dd0028 100644 --- a/mindee/extraction/pdf_extractor/pdf_extractor.py +++ b/mindee/pdf/pdf_extractor.py @@ -1,14 +1,13 @@ import io from pathlib import Path -from typing import BinaryIO, List, Optional, Union +from typing import BinaryIO, List import pypdfium2 as pdfium from PIL import Image from mindee.error.mindee_error import MindeeError -from mindee.extraction.pdf_extractor.extracted_pdf import ExtractedPdf +from mindee.pdf.extracted_pdf import ExtractedPdf from mindee.input.local_input_source import LocalInputSource -from mindee.v1.product.invoice_splitter import InvoiceSplitterV1InvoicePageGroup class PdfExtractor: @@ -72,43 +71,16 @@ def extract_sub_documents( extracted_pdfs.append(extracted_pdf) return extracted_pdfs - def extract_invoices( + def extract_documents( self, - page_indexes: List[Union[InvoiceSplitterV1InvoicePageGroup, List[int]]], - strict: bool = False, + page_indexes: List[List[int]], ) -> List[ExtractedPdf]: """ - Extracts invoices as complete PDFs from the document. + Extracts complete PDFs from the document. - :params page_indexes: List of sub-lists of pages to keep. - :params strict: Whether to trust confidence scores above 0.5 (included) or not. + :param page_indexes: List of sub-lists of pages to keep. :return: A list of extracted invoices. """ if len(page_indexes) < 1: raise MindeeError("No indexes provided.") - if not isinstance(page_indexes[0], InvoiceSplitterV1InvoicePageGroup): - return self.extract_sub_documents(page_indexes) # type: ignore - if not strict: - indexes_as_list = [page_index.page_indexes for page_index in page_indexes] # type: ignore - return self.extract_sub_documents(indexes_as_list) - correct_page_indexes: List[List[int]] = [] - current_list: List[int] = [] - previous_confidence: Optional[float] = None - for i, page_index in enumerate(page_indexes): - assert isinstance(page_index, InvoiceSplitterV1InvoicePageGroup) - confidence = page_index.confidence - page_list = page_index.page_indexes - - if confidence >= 0.5 and previous_confidence is None: - current_list = page_list - elif confidence >= 0.5 and i != len(page_indexes) - 1: - correct_page_indexes.append(current_list) - current_list = page_list - elif confidence < 0.5 and i == len(page_indexes) - 1: - current_list.extend(page_list) - correct_page_indexes.append(current_list) - else: - correct_page_indexes.append(current_list) - correct_page_indexes.append(page_list) - previous_confidence = confidence - return self.extract_sub_documents(correct_page_indexes) + return self.extract_sub_documents(page_indexes) diff --git a/mindee/v1/pdf/__init__.py b/mindee/v1/pdf/__init__.py new file mode 100644 index 00000000..577f5ced --- /dev/null +++ b/mindee/v1/pdf/__init__.py @@ -0,0 +1,4 @@ +from mindee.v1.pdf.pdf_extractor import PdfExtractor +from mindee.v1.pdf.multi_receipts_extractor import extract_receipts + +__all__ = ["PdfExtractor", "extract_receipts"] diff --git a/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py b/mindee/v1/pdf/multi_receipts_extractor.py similarity index 87% rename from mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py rename to mindee/v1/pdf/multi_receipts_extractor.py index 7d337724..4159df29 100644 --- a/mindee/extraction/multi_receipts_extractor/multi_receipts_extractor.py +++ b/mindee/v1/pdf/multi_receipts_extractor.py @@ -1,10 +1,8 @@ from typing import List from mindee.error.mindee_error import MindeeError -from mindee.extraction.common.extracted_image import ExtractedImage -from mindee.extraction.common.image_extractor import ( - extract_multiple_images_from_source, -) +from mindee.image.extracted_image import ExtractedImage +from mindee.image.image_extractor import extract_multiple_images_from_source from mindee.input.local_input_source import LocalInputSource from mindee.v1.parsing.common.inference import Inference diff --git a/mindee/v1/pdf/pdf_extractor.py b/mindee/v1/pdf/pdf_extractor.py new file mode 100644 index 00000000..d2d4ea2d --- /dev/null +++ b/mindee/v1/pdf/pdf_extractor.py @@ -0,0 +1,54 @@ +from typing import List, Optional, Union + +from mindee.error import MindeeError +from mindee.pdf.extracted_pdf import ExtractedPdf +from mindee.pdf.pdf_extractor import PdfExtractor as BasePdfExtractor +from mindee.v1.product import InvoiceSplitterV1InvoicePageGroup + + +class PdfExtractor(BasePdfExtractor): + """V1-specific PDF extractor.""" + + def extract_invoices( + self, + page_indexes: List[Union[InvoiceSplitterV1InvoicePageGroup, List[int]]], + strict: bool = False, + ) -> List[ExtractedPdf]: + """ + Extracts invoices as complete PDFs from the document from either a list of pages + or a list of page groups. + + :params page_indexes: List of sub-lists of pages to keep. + :params strict: Whether to trust confidence scores above 0.5 (included) or not. + :return: A list of extracted invoices. + """ + + if len(page_indexes) < 1: + raise MindeeError("No indexes provided.") + if not isinstance(page_indexes[0], InvoiceSplitterV1InvoicePageGroup): + return self.extract_sub_documents(page_indexes) # type: ignore + + if not strict: + indexes_as_list = [page_index.page_indexes for page_index in page_indexes] # type: ignore + return self.extract_sub_documents(indexes_as_list) + correct_page_indexes: List[List[int]] = [] + current_list: List[int] = [] + previous_confidence: Optional[float] = None + for i, page_index in enumerate(page_indexes): + assert isinstance(page_index, InvoiceSplitterV1InvoicePageGroup) + confidence = page_index.confidence + page_list = page_index.page_indexes + + if confidence >= 0.5 and previous_confidence is None: + current_list = page_list + elif confidence >= 0.5 and i != len(page_indexes) - 1: + correct_page_indexes.append(current_list) + current_list = page_list + elif confidence < 0.5 and i == len(page_indexes) - 1: + current_list.extend(page_list) + correct_page_indexes.append(current_list) + else: + correct_page_indexes.append(current_list) + correct_page_indexes.append(page_list) + previous_confidence = confidence + return self.extract_sub_documents(correct_page_indexes) diff --git a/mindee/v2/file_operations/crop.py b/mindee/v2/file_operations/crop.py index c6fc3bb7..cbcda639 100644 --- a/mindee/v2/file_operations/crop.py +++ b/mindee/v2/file_operations/crop.py @@ -1,8 +1,9 @@ from typing import List, Union from mindee.error import MindeeError -from mindee.extraction import ExtractedImage, extract_multiple_images_from_source from mindee.geometry import Point, Polygon +from mindee.image.extracted_image import ExtractedImage +from mindee.image.image_extractor import extract_multiple_images_from_source from mindee.input.local_input_source import LocalInputSource from mindee.v2.parsing.inference.field import FieldLocation from mindee.v2.file_operations.crop_files import CropFiles diff --git a/mindee/v2/file_operations/crop_files.py b/mindee/v2/file_operations/crop_files.py index dafdfde4..d658ddc6 100644 --- a/mindee/v2/file_operations/crop_files.py +++ b/mindee/v2/file_operations/crop_files.py @@ -1,7 +1,7 @@ from pathlib import Path from typing import List, Union -from mindee.extraction import ExtractedImage +from mindee.image.extracted_image import ExtractedImage class CropFiles(List[ExtractedImage]): diff --git a/mindee/v2/file_operations/split.py b/mindee/v2/file_operations/split.py index 74a49b81..bdf6ce3a 100644 --- a/mindee/v2/file_operations/split.py +++ b/mindee/v2/file_operations/split.py @@ -1,8 +1,8 @@ from typing import List, Union from mindee.error import MindeeError -from mindee.extraction.pdf_extractor.extracted_pdf import ExtractedPdf -from mindee.extraction.pdf_extractor.pdf_extractor import PdfExtractor +from mindee.pdf.extracted_pdf import ExtractedPdf +from mindee.pdf.pdf_extractor import PdfExtractor from mindee.input.local_input_source import LocalInputSource from mindee.v2.file_operations.split_files import SplitFiles diff --git a/mindee/v2/file_operations/split_files.py b/mindee/v2/file_operations/split_files.py index ab905be7..cbd2dafe 100644 --- a/mindee/v2/file_operations/split_files.py +++ b/mindee/v2/file_operations/split_files.py @@ -1,7 +1,7 @@ from pathlib import Path from typing import List, Union -from mindee.extraction.pdf_extractor.extracted_pdf import ExtractedPdf +from mindee.pdf.extracted_pdf import ExtractedPdf class SplitFiles(List[ExtractedPdf]): diff --git a/mindee/v2/product/crop/crop_box.py b/mindee/v2/product/crop/crop_box.py index 8e836a3b..7407df41 100644 --- a/mindee/v2/product/crop/crop_box.py +++ b/mindee/v2/product/crop/crop_box.py @@ -1,6 +1,7 @@ from typing import Optional -from mindee.extraction import ExtractedImage, extract_multiple_images_from_source +from mindee.image.extracted_image import ExtractedImage +from mindee.image.image_extractor import extract_multiple_images_from_source from mindee.input.local_input_source import LocalInputSource from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.field import FieldLocation diff --git a/mindee/v2/product/split/split_range.py b/mindee/v2/product/split/split_range.py index 090da4ac..ead8bb1f 100644 --- a/mindee/v2/product/split/split_range.py +++ b/mindee/v2/product/split/split_range.py @@ -1,7 +1,7 @@ from typing import List, Optional from mindee.v2.product.extraction.extraction_response import ExtractionResponse -from mindee.extraction.pdf_extractor.extracted_pdf import ExtractedPdf +from mindee.pdf.extracted_pdf import ExtractedPdf from mindee.input.local_input_source import LocalInputSource from mindee.parsing.common import StringDict from mindee.v2.file_operations.split import extract_single_split diff --git a/tests/v1/extraction/test_image_extractor.py b/tests/v1/extraction/test_image_extractor.py index 72981421..11036b21 100644 --- a/tests/v1/extraction/test_image_extractor.py +++ b/tests/v1/extraction/test_image_extractor.py @@ -3,7 +3,7 @@ import pytest from PIL import Image -from mindee.extraction.common.image_extractor import extract_multiple_images_from_source +from mindee.image.image_extractor import extract_multiple_images_from_source from mindee.input.path_input import PathInput from mindee.v1.product.barcode_reader import BarcodeReaderV1 from tests.utils import V1_PRODUCT_DATA_DIR diff --git a/tests/v1/extraction/test_invoice_splitter_auto_extraction.py b/tests/v1/extraction/test_invoice_splitter_auto_extraction.py index b59ee51a..4c0b6fd6 100644 --- a/tests/v1/extraction/test_invoice_splitter_auto_extraction.py +++ b/tests/v1/extraction/test_invoice_splitter_auto_extraction.py @@ -3,7 +3,7 @@ import pytest from mindee.v1.client import Client -from mindee.extraction.pdf_extractor.pdf_extractor import PdfExtractor +from mindee.v1.pdf.pdf_extractor import PdfExtractor from mindee.input.path_input import PathInput from mindee.v1.parsing.common import Document from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 @@ -40,15 +40,26 @@ def test_pdf_should_extract_invoices_strict(): pdf_extractor = PdfExtractor(invoice_splitter_input) assert pdf_extractor.get_page_count() == 2 + extracted_pdfs_not_strict = pdf_extractor.extract_invoices( + inference.prediction.invoice_page_groups + ) extracted_pdfs_strict = pdf_extractor.extract_invoices( inference.prediction.invoice_page_groups ) + extracted_base_pdfs = pdf_extractor.extract_documents( + [int_list.page_indexes for int_list in inference.prediction.invoice_page_groups] + ) + for i, extracted_pdf in enumerate(extracted_base_pdfs): + assert extracted_pdf.filename == extracted_pdfs_strict[i].filename + assert ( + extracted_pdf.pdf_bytes.read() == extracted_pdfs_strict[i].pdf_bytes.read() + ) - assert len(extracted_pdfs_strict) == 2 - assert extracted_pdfs_strict[0].filename == "default_sample_001-001.pdf" - assert extracted_pdfs_strict[1].filename == "default_sample_002-002.pdf" + assert len(extracted_pdfs_not_strict) == 2 + assert extracted_pdfs_not_strict[0].filename == "default_sample_001-001.pdf" + assert extracted_pdfs_not_strict[1].filename == "default_sample_002-002.pdf" - invoice_0 = client.parse(InvoiceV4, extracted_pdfs_strict[0].as_input_source()) + invoice_0 = client.parse(InvoiceV4, extracted_pdfs_not_strict[0].as_input_source()) test_string_rst_invoice_0 = prepare_invoice_return( V1_PRODUCT_DATA_DIR / "invoices" diff --git a/tests/v1/extraction/test_multi_receipts_extractor.py b/tests/v1/extraction/test_multi_receipts_extractor.py index af1124d6..e499b970 100644 --- a/tests/v1/extraction/test_multi_receipts_extractor.py +++ b/tests/v1/extraction/test_multi_receipts_extractor.py @@ -3,9 +3,7 @@ import pytest from PIL import Image -from mindee.extraction.multi_receipts_extractor.multi_receipts_extractor import ( - extract_receipts, -) +from mindee.v1.pdf.multi_receipts_extractor import extract_receipts from mindee.input.path_input import PathInput from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1 import ( MultiReceiptsDetectorV1, diff --git a/tests/v1/extraction/test_pdf_extractor.py b/tests/v1/extraction/test_pdf_extractor.py index 04197e95..cf085a43 100644 --- a/tests/v1/extraction/test_pdf_extractor.py +++ b/tests/v1/extraction/test_pdf_extractor.py @@ -1,7 +1,7 @@ import pytest from mindee.v1.client import Client -from mindee.extraction.pdf_extractor.pdf_extractor import PdfExtractor +from mindee.v1.pdf.pdf_extractor import PdfExtractor from mindee.input.local_response import LocalResponse from mindee.input.path_input import PathInput from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 diff --git a/tests/v2/file_operations/test_crop_operation_integration.py b/tests/v2/file_operations/test_crop_operation_integration.py index c537efe1..63445f42 100644 --- a/tests/v2/file_operations/test_crop_operation_integration.py +++ b/tests/v2/file_operations/test_crop_operation_integration.py @@ -51,8 +51,9 @@ def test_image_should_extract_crops(): ) check_findoc_return(invoice_0) extracted_images.save_all_to_disk(OUTPUT_DIR) + # note: flaky assert os.path.getsize(OUTPUT_DIR / "crop_001.jpg") in (187601, 199685) - assert os.path.getsize(OUTPUT_DIR / "crop_002.jpg") == 197978 + assert os.path.getsize(OUTPUT_DIR / "crop_002.jpg") in (197978, 199433) @pytest.fixture(scope="module", autouse=True) From 2853658558c8e0c778f81e1ea2b08e07eadce82c Mon Sep 17 00:00:00 2001 From: sebastianMindee <130448732+sebastianMindee@users.noreply.github.com> Date: Tue, 2 Jun 2026 13:54:17 +0200 Subject: [PATCH 07/10] :boom: :recycle: remove support for source_from_xxx() pattern (#409) --- .../code_samples/bank_account_details_v1.txt | 3 +- .../code_samples/bank_account_details_v2.txt | 3 +- docs/extras/code_samples/bank_check_v1.txt | 3 +- .../extras/code_samples/barcode_reader_v1.txt | 3 +- docs/extras/code_samples/carte_grise_v1.txt | 3 +- docs/extras/code_samples/cropper_v1.txt | 3 +- docs/extras/code_samples/custom_v1.txt | 3 +- docs/extras/code_samples/default.txt | 3 +- docs/extras/code_samples/default_async.txt | 3 +- .../code_samples/expense_receipts_v5.txt | 3 +- .../expense_receipts_v5_async.txt | 3 +- .../code_samples/financial_document_v1.txt | 3 +- .../financial_document_v1_async.txt | 3 +- docs/extras/code_samples/idcard_fr_v1.txt | 3 +- docs/extras/code_samples/idcard_fr_v2.txt | 3 +- .../international_id_v2_async.txt | 3 +- .../invoice_splitter_v1_async.txt | 3 +- docs/extras/code_samples/invoices_v4.txt | 3 +- .../extras/code_samples/invoices_v4_async.txt | 3 +- .../multi_receipts_detector_v1.txt | 3 +- docs/extras/code_samples/passport_v1.txt | 3 +- .../code_samples/workflow_execution.txt | 3 +- docs/extras/code_samples/workflow_ots_rag.txt | 3 +- mindee/client_mixin.py | 85 ------------------- mindee/commands/cli_parser.py | 23 ++--- mindee/input/file_input.py | 12 ++- tests/v1/extras/test_extras_integration.py | 5 +- .../test_url_input_source_integration.py | 9 +- tests/v1/mindee_http/test_error.py | 14 ++- .../test_barcode_reader_v1_regression.py | 3 +- .../cropper/test_cropper_v1_regression.py | 3 +- .../test_financial_document_v1_regression.py | 3 +- ...test_bank_account_details_v1_regression.py | 3 +- ...test_bank_account_details_v2_regression.py | 3 +- .../test_carte_grise_v1_regression.py | 3 +- .../fr/id_card/test_id_card_v1_regression.py | 3 +- .../fr/id_card/test_id_card_v2_regression.py | 3 +- .../invoice/test_invoice_v4_regression.py | 3 +- .../test_invoice_splitter_v1_regression.py | 5 +- ...t_multi_receipts_detector_v1_regression.py | 3 +- .../passport/test_passport_v1_regression.py | 3 +- .../receipt/test_receipt_v5_regression.py | 3 +- .../test_bank_check_v1_regression.py | 3 +- tests/v1/test_client.py | 27 +++--- .../v1/workflows/test_workflow_integration.py | 11 +-- tests/v2/test_client.py | 8 +- 46 files changed, 130 insertions(+), 177 deletions(-) diff --git a/docs/extras/code_samples/bank_account_details_v1.txt b/docs/extras/code_samples/bank_account_details_v1.txt index efe682b3..380d0adb 100644 --- a/docs/extras/code_samples/bank_account_details_v1.txt +++ b/docs/extras/code_samples/bank_account_details_v1.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/bank_account_details_v2.txt b/docs/extras/code_samples/bank_account_details_v2.txt index 87fd38ca..85ea7a96 100644 --- a/docs/extras/code_samples/bank_account_details_v2.txt +++ b/docs/extras/code_samples/bank_account_details_v2.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/bank_check_v1.txt b/docs/extras/code_samples/bank_check_v1.txt index 3fceaa09..d0550e6b 100644 --- a/docs/extras/code_samples/bank_check_v1.txt +++ b/docs/extras/code_samples/bank_check_v1.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/barcode_reader_v1.txt b/docs/extras/code_samples/barcode_reader_v1.txt index 94983824..637a079d 100644 --- a/docs/extras/code_samples/barcode_reader_v1.txt +++ b/docs/extras/code_samples/barcode_reader_v1.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/carte_grise_v1.txt b/docs/extras/code_samples/carte_grise_v1.txt index 0b4dedbb..b87ca17c 100644 --- a/docs/extras/code_samples/carte_grise_v1.txt +++ b/docs/extras/code_samples/carte_grise_v1.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/cropper_v1.txt b/docs/extras/code_samples/cropper_v1.txt index f90d4a10..e7998667 100644 --- a/docs/extras/code_samples/cropper_v1.txt +++ b/docs/extras/code_samples/cropper_v1.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/custom_v1.txt b/docs/extras/code_samples/custom_v1.txt index 2ee216fe..6e34167b 100644 --- a/docs/extras/code_samples/custom_v1.txt +++ b/docs/extras/code_samples/custom_v1.txt @@ -1,4 +1,5 @@ from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") @@ -10,7 +11,7 @@ my_endpoint = mindee_client.create_endpoint( ) # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Parse the file. # The endpoint must be specified since it cannot be determined from the class. diff --git a/docs/extras/code_samples/default.txt b/docs/extras/code_samples/default.txt index b5df084c..d3380865 100644 --- a/docs/extras/code_samples/default.txt +++ b/docs/extras/code_samples/default.txt @@ -4,6 +4,7 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") @@ -17,7 +18,7 @@ my_endpoint = mindee_client.create_endpoint( ) # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Parse the file. # The endpoint must be specified since it cannot be determined from the class. diff --git a/docs/extras/code_samples/default_async.txt b/docs/extras/code_samples/default_async.txt index 790ddfc3..638b1da3 100644 --- a/docs/extras/code_samples/default_async.txt +++ b/docs/extras/code_samples/default_async.txt @@ -4,6 +4,7 @@ # from mindee.v1 import Client, AsyncPredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") @@ -17,7 +18,7 @@ my_endpoint = mindee_client.create_endpoint( ) # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Parse the file. # The endpoint must be specified since it cannot be determined from the class. diff --git a/docs/extras/code_samples/expense_receipts_v5.txt b/docs/extras/code_samples/expense_receipts_v5.txt index cb1b552b..e52b53b2 100644 --- a/docs/extras/code_samples/expense_receipts_v5.txt +++ b/docs/extras/code_samples/expense_receipts_v5.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/expense_receipts_v5_async.txt b/docs/extras/code_samples/expense_receipts_v5_async.txt index 266a0db9..0a5bf42d 100644 --- a/docs/extras/code_samples/expense_receipts_v5_async.txt +++ b/docs/extras/code_samples/expense_receipts_v5_async.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, product, AsyncPredictResponse +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and enqueue it. result: AsyncPredictResponse = mindee_client.enqueue_and_parse( diff --git a/docs/extras/code_samples/financial_document_v1.txt b/docs/extras/code_samples/financial_document_v1.txt index df1e246a..1585e9cf 100644 --- a/docs/extras/code_samples/financial_document_v1.txt +++ b/docs/extras/code_samples/financial_document_v1.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/financial_document_v1_async.txt b/docs/extras/code_samples/financial_document_v1_async.txt index 483a8e3f..ff598b3d 100644 --- a/docs/extras/code_samples/financial_document_v1_async.txt +++ b/docs/extras/code_samples/financial_document_v1_async.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, product, AsyncPredictResponse +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and enqueue it. result: AsyncPredictResponse = mindee_client.enqueue_and_parse( diff --git a/docs/extras/code_samples/idcard_fr_v1.txt b/docs/extras/code_samples/idcard_fr_v1.txt index 125219b3..84ac3246 100644 --- a/docs/extras/code_samples/idcard_fr_v1.txt +++ b/docs/extras/code_samples/idcard_fr_v1.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/idcard_fr_v2.txt b/docs/extras/code_samples/idcard_fr_v2.txt index 1f64f154..e6a00bea 100644 --- a/docs/extras/code_samples/idcard_fr_v2.txt +++ b/docs/extras/code_samples/idcard_fr_v2.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/international_id_v2_async.txt b/docs/extras/code_samples/international_id_v2_async.txt index 5534b626..ad88ff95 100644 --- a/docs/extras/code_samples/international_id_v2_async.txt +++ b/docs/extras/code_samples/international_id_v2_async.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, product, AsyncPredictResponse +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and enqueue it. result: AsyncPredictResponse = mindee_client.enqueue_and_parse( diff --git a/docs/extras/code_samples/invoice_splitter_v1_async.txt b/docs/extras/code_samples/invoice_splitter_v1_async.txt index 9ea947e3..568e8f4b 100644 --- a/docs/extras/code_samples/invoice_splitter_v1_async.txt +++ b/docs/extras/code_samples/invoice_splitter_v1_async.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, product, AsyncPredictResponse +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and enqueue it. result: AsyncPredictResponse = mindee_client.enqueue_and_parse( diff --git a/docs/extras/code_samples/invoices_v4.txt b/docs/extras/code_samples/invoices_v4.txt index a903df6f..0d09eb4e 100644 --- a/docs/extras/code_samples/invoices_v4.txt +++ b/docs/extras/code_samples/invoices_v4.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/invoices_v4_async.txt b/docs/extras/code_samples/invoices_v4_async.txt index a221fa2a..2a117c3e 100644 --- a/docs/extras/code_samples/invoices_v4_async.txt +++ b/docs/extras/code_samples/invoices_v4_async.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, product, AsyncPredictResponse +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and enqueue it. result: AsyncPredictResponse = mindee_client.enqueue_and_parse( diff --git a/docs/extras/code_samples/multi_receipts_detector_v1.txt b/docs/extras/code_samples/multi_receipts_detector_v1.txt index 0537611a..8cf09a8b 100644 --- a/docs/extras/code_samples/multi_receipts_detector_v1.txt +++ b/docs/extras/code_samples/multi_receipts_detector_v1.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/passport_v1.txt b/docs/extras/code_samples/passport_v1.txt index b372ccef..3ac8d957 100644 --- a/docs/extras/code_samples/passport_v1.txt +++ b/docs/extras/code_samples/passport_v1.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, PredictResponse, product +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and parse it. result: PredictResponse = mindee_client.parse( diff --git a/docs/extras/code_samples/workflow_execution.txt b/docs/extras/code_samples/workflow_execution.txt index 69f0297d..4a201830 100644 --- a/docs/extras/code_samples/workflow_execution.txt +++ b/docs/extras/code_samples/workflow_execution.txt @@ -5,6 +5,7 @@ from mindee.v1 import Client, WorkflowResponse from mindee.v1.parsing.common import ExecutionPriority +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") @@ -12,7 +13,7 @@ mindee_client = Client(api_key="my-api-key") workflow_id = "workflow-id" # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Send the file to the workflow. result: WorkflowResponse = mindee_client.execute_workflow( diff --git a/docs/extras/code_samples/workflow_ots_rag.txt b/docs/extras/code_samples/workflow_ots_rag.txt index b457ff1b..ded746c8 100644 --- a/docs/extras/code_samples/workflow_ots_rag.txt +++ b/docs/extras/code_samples/workflow_ots_rag.txt @@ -4,12 +4,13 @@ # from mindee.v1 import Client, product, AsyncPredictResponse +from mindee import PathInput # Init a new client mindee_client = Client(api_key="my-api-key") # Load a file from disk -input_doc = mindee_client.source_from_path("/path/to/the/file.ext") +input_doc = PathInput("/path/to/the/file.ext") # Load a file from disk and enqueue it. result: AsyncPredictResponse = mindee_client.enqueue_and_parse( diff --git a/mindee/client_mixin.py b/mindee/client_mixin.py index 632bb641..8a4c5753 100644 --- a/mindee/client_mixin.py +++ b/mindee/client_mixin.py @@ -1,81 +1,9 @@ -from pathlib import Path -from typing import BinaryIO, Union - from mindee.error import MindeeClientError -from mindee.input.base_64_input import Base64Input -from mindee.input.bytes_input import BytesInput -from mindee.input.file_input import FileInput -from mindee.input.path_input import PathInput -from mindee.input.url_input_source import URLInputSource class ClientMixin: """Mixin for clients V1 & V2 common static methods.""" - @staticmethod - def source_from_path( - input_path: Union[Path, str], fix_pdf: bool = False - ) -> PathInput: - """ - Load a document from a path, as a string or a `Path` object. - - :params input_path: Path of file to open - :params fix_pdf: Whether to attempt fixing PDF files before sending. - Setting this to `True` can modify the data sent to Mindee. - """ - input_doc = PathInput(input_path) - if fix_pdf: - input_doc.fix_pdf() - return input_doc - - @staticmethod - def source_from_file(input_file: BinaryIO, fix_pdf: bool = False) -> FileInput: - """ - Load a document from a normal Python file object/handle. - - :params input_file: Input file handle - :params fix_pdf: Whether to attempt fixing PDF files before sending. - Setting this to `True` can modify the data sent to Mindee. - """ - input_doc = FileInput(input_file) - if fix_pdf: - input_doc.fix_pdf() - return input_doc - - @staticmethod - def source_from_b64string( - input_string: str, filename: str, fix_pdf: bool = False - ) -> Base64Input: - """ - Load a document from a base64 encoded string. - - :params input_string: Input to parse as base64 string - :params filename: The name of the file (without the path) - :params fix_pdf: Whether to attempt fixing PDF files before sending. - Setting this to `True` can modify the data sent to Mindee. - """ - input_doc = Base64Input(input_string, filename) - if fix_pdf: - input_doc.fix_pdf() - return input_doc - - @staticmethod - def source_from_bytes( - input_bytes: bytes, filename: str, fix_pdf: bool = False - ) -> BytesInput: - """ - Load a document from raw bytes. - - :params input_bytes: Raw byte input - :params filename: The name of the file (without the path) - :params fix_pdf: Whether to attempt fixing PDF files before sending. - Setting this to `True` can modify the data sent to Mindee. - """ - input_doc = BytesInput(input_bytes, filename) - if fix_pdf: - input_doc.fix_pdf() - return input_doc - @staticmethod def _validate_async_params( initial_delay_sec: float, delay_sec: float, max_retries: int @@ -93,16 +21,3 @@ def _validate_async_params( ) if max_retries < min_retries: raise MindeeClientError(f"Cannot set retries to less than {min_retries}.") - - @staticmethod - def source_from_url( - url: str, - ) -> URLInputSource: - """ - Load a document from a URL. - - :params url: Raw byte input - """ - return URLInputSource( - url, - ) diff --git a/mindee/commands/cli_parser.py b/mindee/commands/cli_parser.py index e08799f9..577ccef2 100644 --- a/mindee/commands/cli_parser.py +++ b/mindee/commands/cli_parser.py @@ -2,7 +2,14 @@ from argparse import ArgumentParser, Namespace from typing import Optional, Type, Union -from mindee import LocalInputSource, URLInputSource +from mindee import ( + Base64Input, + BytesInput, + FileInput, + LocalInputSource, + PathInput, + URLInputSource, +) from mindee.v1.client import Client, Endpoint from mindee.commands.cli_products import PRODUCTS, CommandConfig from mindee.error.mindee_error import MindeeClientError @@ -265,17 +272,13 @@ def _get_input_doc(self) -> Union[LocalInputSource, URLInputSource]: """Loads an input document.""" if self.parsed_args.input_type == "file": with open(self.parsed_args.path, "rb", buffering=30) as file_handle: - return self.client.source_from_file(file_handle) + return FileInput(file_handle) elif self.parsed_args.input_type == "base64": with open(self.parsed_args.path, "rt", encoding="ascii") as base64_handle: - return self.client.source_from_b64string( - base64_handle.read(), "test.jpg" - ) + return Base64Input(base64_handle.read(), "test.jpg") elif self.parsed_args.input_type == "bytes": with open(self.parsed_args.path, "rb") as bytes_handle: - return self.client.source_from_bytes( - bytes_handle.read(), bytes_handle.name - ) + return BytesInput(bytes_handle.read(), bytes_handle.name) elif self.parsed_args.input_type == "url": - return self.client.source_from_url(self.parsed_args.path) - return self.client.source_from_path(self.parsed_args.path) + return URLInputSource(self.parsed_args.path) + return PathInput(self.parsed_args.path) diff --git a/mindee/input/file_input.py b/mindee/input/file_input.py index 2c100667..cc4f1dd8 100644 --- a/mindee/input/file_input.py +++ b/mindee/input/file_input.py @@ -1,5 +1,6 @@ +import io import os -from typing import BinaryIO +from typing import BinaryIO, IO, Union, cast from mindee.input.local_input_source import LocalInputSource @@ -7,7 +8,7 @@ class FileInput(LocalInputSource): """A binary file input.""" - def __init__(self, file: BinaryIO) -> None: + def __init__(self, file: Union[BinaryIO, IO[bytes]]) -> None: """ Input document from a Python binary file object. @@ -17,7 +18,12 @@ def __init__(self, file: BinaryIO) -> None: """ assert file.name, "File name must be set" - self.file_object = file + if hasattr(file, "seek") and callable(file.seek): + try: + file.seek(0) + except (io.UnsupportedOperation, OSError): + pass + self.file_object = cast(BinaryIO, file) self.filename = os.path.basename(file.name) self.filepath = file.name super().__init__() diff --git a/tests/v1/extras/test_extras_integration.py b/tests/v1/extras/test_extras_integration.py index 4e7b83b9..6986c696 100644 --- a/tests/v1/extras/test_extras_integration.py +++ b/tests/v1/extras/test_extras_integration.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.international_id import InternationalIdV2 from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 @@ -14,7 +15,7 @@ def client(): @pytest.mark.integration def test_send_cropper_extra(client): - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "invoices" / "default_sample.jpg", ) response = client.parse(InvoiceV4, sample, cropper=True) @@ -23,7 +24,7 @@ def test_send_cropper_extra(client): @pytest.mark.integration def test_send_full_text_ocr_extra(client): - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "international_id" / "default_sample.jpg", ) response = client.enqueue_and_parse(InternationalIdV2, sample, full_text=True) diff --git a/tests/v1/input/test_url_input_source_integration.py b/tests/v1/input/test_url_input_source_integration.py index 9d688c41..65f812a8 100644 --- a/tests/v1/input/test_url_input_source_integration.py +++ b/tests/v1/input/test_url_input_source_integration.py @@ -3,6 +3,7 @@ import pytest +from mindee import URLInputSource from mindee.v1.client import Client from mindee.v1.product.invoice import InvoiceV4 from tests.utils import cleanup_output_files @@ -25,7 +26,7 @@ def reference_file_path(): @pytest.mark.integration def test_load_local_file(client, reference_file_path): - url_source = client.source_from_url(reference_file_path) + url_source = URLInputSource(reference_file_path) local_source = url_source.as_local_input_source() result = client.parse(InvoiceV4, local_source) assert result.document.n_pages == 5 @@ -34,7 +35,7 @@ def test_load_local_file(client, reference_file_path): @pytest.mark.integration def test_custom_file_name(client, reference_file_path): - url_source = client.source_from_url(reference_file_path) + url_source = URLInputSource(reference_file_path) local_source = url_source.as_local_input_source("customName.pdf") result = client.parse(InvoiceV4, local_source) assert result.document.n_pages == 5 @@ -43,14 +44,14 @@ def test_custom_file_name(client, reference_file_path): @pytest.mark.integration def test_save_file(client, reference_file_path, output_file_path): - url_source = client.source_from_url(reference_file_path) + url_source = URLInputSource(reference_file_path) url_source.save_to_file(output_file_path) assert os.path.exists(os.path.join(output_file_path, "invoice_5p.pdf")) @pytest.mark.integration def test_save_file_with_filename(client, reference_file_path, output_file_path): - url_source = client.source_from_url(reference_file_path) + url_source = URLInputSource(reference_file_path) url_source.save_to_file(output_file_path, "customFileName.pdf") assert os.path.exists(os.path.join(output_file_path, "customFileName.pdf")) diff --git a/tests/v1/mindee_http/test_error.py b/tests/v1/mindee_http/test_error.py index 1115dc84..a78c3895 100644 --- a/tests/v1/mindee_http/test_error.py +++ b/tests/v1/mindee_http/test_error.py @@ -26,10 +26,8 @@ def dummy_client(monkeypatch) -> Client: @pytest.fixture -def dummy_file(monkeypatch) -> PathInput: - clear_envvars(monkeypatch) - c = Client(api_key="dummy-client") - return c.source_from_path(FILE_TYPES_DIR / "pdf" / "blank.pdf") +def dummy_file() -> PathInput: + return PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") def test_http_client_error(dummy_client: Client, dummy_file: PathInput): @@ -60,11 +58,11 @@ def test_http_400_error(): error_obj["status_code"] = 400 error_400 = handle_error("dummy-url", error_obj) with pytest.raises(MindeeHTTPClientError): + assert error_400.status_code == 400 + assert error_400.api_code == "SomeCode" + assert error_400.api_message == "Some scary message here" + assert error_400.api_details is None raise error_400 - assert error_400.status_code == 400 - assert error_400.api_code == "SomeCode" - assert error_400.api_message == "Some scary message here" - assert error_400.api_details is None def test_http_401_error(): diff --git a/tests/v1/product/barcode_reader/test_barcode_reader_v1_regression.py b/tests/v1/product/barcode_reader/test_barcode_reader_v1_regression.py index 834aa11c..22a67061 100644 --- a/tests/v1/product/barcode_reader/test_barcode_reader_v1_regression.py +++ b/tests/v1/product/barcode_reader/test_barcode_reader_v1_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.barcode_reader import BarcodeReaderV1 from tests.utils import V1_PRODUCT_DATA_DIR @@ -15,7 +16,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "barcode_reader" / "default_sample.jpg", ) response = client.parse(BarcodeReaderV1, sample) diff --git a/tests/v1/product/cropper/test_cropper_v1_regression.py b/tests/v1/product/cropper/test_cropper_v1_regression.py index dc5096bb..ffee6eab 100644 --- a/tests/v1/product/cropper/test_cropper_v1_regression.py +++ b/tests/v1/product/cropper/test_cropper_v1_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.cropper.cropper_v1 import CropperV1 from tests.utils import V1_PRODUCT_DATA_DIR @@ -15,7 +16,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "cropper" / "default_sample.jpg", ) response = client.parse(CropperV1, sample) diff --git a/tests/v1/product/financial_document/test_financial_document_v1_regression.py b/tests/v1/product/financial_document/test_financial_document_v1_regression.py index a08f9cc1..49851621 100644 --- a/tests/v1/product/financial_document/test_financial_document_v1_regression.py +++ b/tests/v1/product/financial_document/test_financial_document_v1_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.financial_document.financial_document_v1 import ( FinancialDocumentV1, @@ -20,7 +21,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "financial_document" / "default_sample.jpg", ) response = client.parse(FinancialDocumentV1, sample) diff --git a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1_regression.py b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1_regression.py index 11fa0940..20a428da 100644 --- a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1_regression.py +++ b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.fr.bank_account_details.bank_account_details_v1 import ( BankAccountDetailsV1, @@ -20,7 +21,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "bank_account_details" / "default_sample.jpg", ) response = client.parse(BankAccountDetailsV1, sample) diff --git a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2_regression.py b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2_regression.py index e65d1d4c..68e7e2c3 100644 --- a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2_regression.py +++ b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.fr.bank_account_details.bank_account_details_v2 import ( BankAccountDetailsV2, @@ -20,7 +21,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "bank_account_details" / "default_sample.jpg", ) response = client.parse(BankAccountDetailsV2, sample) diff --git a/tests/v1/product/fr/carte_grise/test_carte_grise_v1_regression.py b/tests/v1/product/fr/carte_grise/test_carte_grise_v1_regression.py index 56fbbb45..1651f59c 100644 --- a/tests/v1/product/fr/carte_grise/test_carte_grise_v1_regression.py +++ b/tests/v1/product/fr/carte_grise/test_carte_grise_v1_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.fr.carte_grise.carte_grise_v1 import CarteGriseV1 from tests.utils import V1_PRODUCT_DATA_DIR @@ -15,7 +16,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "carte_grise" / "default_sample.jpg", ) response = client.parse(CarteGriseV1, sample) diff --git a/tests/v1/product/fr/id_card/test_id_card_v1_regression.py b/tests/v1/product/fr/id_card/test_id_card_v1_regression.py index ab1986bb..620ac96a 100644 --- a/tests/v1/product/fr/id_card/test_id_card_v1_regression.py +++ b/tests/v1/product/fr/id_card/test_id_card_v1_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.fr.id_card.id_card_v1 import IdCardV1 from tests.utils import V1_PRODUCT_DATA_DIR @@ -15,7 +16,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "idcard_fr" / "default_sample.jpg", ) response = client.parse(IdCardV1, sample) diff --git a/tests/v1/product/fr/id_card/test_id_card_v2_regression.py b/tests/v1/product/fr/id_card/test_id_card_v2_regression.py index 6f29a5d1..ce6b4f05 100644 --- a/tests/v1/product/fr/id_card/test_id_card_v2_regression.py +++ b/tests/v1/product/fr/id_card/test_id_card_v2_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.fr.id_card.id_card_v2 import IdCardV2 from tests.utils import V1_PRODUCT_DATA_DIR @@ -15,7 +16,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "idcard_fr" / "default_sample.jpg", ) response = client.parse(IdCardV2, sample) diff --git a/tests/v1/product/invoice/test_invoice_v4_regression.py b/tests/v1/product/invoice/test_invoice_v4_regression.py index c29d2887..0b38743f 100644 --- a/tests/v1/product/invoice/test_invoice_v4_regression.py +++ b/tests/v1/product/invoice/test_invoice_v4_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 from tests.utils import V1_PRODUCT_DATA_DIR @@ -15,7 +16,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "invoices" / "default_sample.jpg", ) response = client.parse(InvoiceV4, sample) diff --git a/tests/v1/product/invoice_splitter/test_invoice_splitter_v1_regression.py b/tests/v1/product/invoice_splitter/test_invoice_splitter_v1_regression.py index 277f5214..58bf45a2 100644 --- a/tests/v1/product/invoice_splitter/test_invoice_splitter_v1_regression.py +++ b/tests/v1/product/invoice_splitter/test_invoice_splitter_v1_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 from tests.utils import V1_PRODUCT_DATA_DIR @@ -15,9 +16,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( - V1_PRODUCT_DATA_DIR / "invoice_splitter" / "default_sample.pdf" - ) + sample = PathInput(V1_PRODUCT_DATA_DIR / "invoice_splitter" / "default_sample.pdf") response = client.enqueue_and_parse(InvoiceSplitterV1, sample) doc_response = response.document diff --git a/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1_regression.py b/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1_regression.py index 0c221973..062a304c 100644 --- a/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1_regression.py +++ b/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1 import ( MultiReceiptsDetectorV1, @@ -20,7 +21,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "multi_receipts_detector" / "default_sample.jpg", ) response = client.parse(MultiReceiptsDetectorV1, sample) diff --git a/tests/v1/product/passport/test_passport_v1_regression.py b/tests/v1/product/passport/test_passport_v1_regression.py index 0c95e07a..ff36f803 100644 --- a/tests/v1/product/passport/test_passport_v1_regression.py +++ b/tests/v1/product/passport/test_passport_v1_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.passport import PassportV1 from tests.utils import V1_PRODUCT_DATA_DIR @@ -15,7 +16,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "passport" / "default_sample.jpg", ) response = client.parse(PassportV1, sample) diff --git a/tests/v1/product/receipt/test_receipt_v5_regression.py b/tests/v1/product/receipt/test_receipt_v5_regression.py index 7792d8e1..6029d590 100644 --- a/tests/v1/product/receipt/test_receipt_v5_regression.py +++ b/tests/v1/product/receipt/test_receipt_v5_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.receipt.receipt_v5 import ReceiptV5 from tests.utils import V1_PRODUCT_DATA_DIR @@ -15,7 +16,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "expense_receipts" / "default_sample.jpg", ) response = client.parse(ReceiptV5, sample) diff --git a/tests/v1/product/us/bank_check/test_bank_check_v1_regression.py b/tests/v1/product/us/bank_check/test_bank_check_v1_regression.py index 9063e712..a8c4287d 100644 --- a/tests/v1/product/us/bank_check/test_bank_check_v1_regression.py +++ b/tests/v1/product/us/bank_check/test_bank_check_v1_regression.py @@ -1,5 +1,6 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.product.us.bank_check.bank_check_v1 import BankCheckV1 from tests.utils import V1_PRODUCT_DATA_DIR @@ -15,7 +16,7 @@ def test_default_sample(): ) as rst_file: rst_ref = rst_file.read() - sample = client.source_from_path( + sample = PathInput( V1_PRODUCT_DATA_DIR / "bank_check" / "default_sample.jpg", ) response = client.parse(BankCheckV1, sample) diff --git a/tests/v1/test_client.py b/tests/v1/test_client.py index 6dc3f5db..45b35c72 100644 --- a/tests/v1/test_client.py +++ b/tests/v1/test_client.py @@ -2,6 +2,7 @@ import pytest +from mindee import Base64Input, PathInput from mindee.v1 import ( AsyncPredictResponse, Client, @@ -46,32 +47,32 @@ def dummy_client() -> Client: def test_parse_path_without_token(empty_client: Client): with pytest.raises(RuntimeError): - input_doc = empty_client.source_from_path(FILE_TYPES_DIR / "pdf" / "blank.pdf") + input_doc = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") empty_client.parse(product.ReceiptV5, input_doc) def test_parse_path_with_env_token(env_client: Client): with pytest.raises(MindeeHTTPError): - input_doc = env_client.source_from_path(FILE_TYPES_DIR / "pdf" / "blank.pdf") + input_doc = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") env_client.parse(product.ReceiptV5, input_doc) def test_parse_path_with_wrong_filetype(dummy_client: Client): with pytest.raises(AssertionError): - dummy_client.source_from_path(FILE_TYPES_DIR / "receipt.jpga") + PathInput(FILE_TYPES_DIR / "receipt.jpga") def test_parse_path_with_wrong_token(dummy_client: Client): with pytest.raises(MindeeHTTPError): - input_doc = dummy_client.source_from_path(FILE_TYPES_DIR / "pdf" / "blank.pdf") + input_doc = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") dummy_client.parse(product.ReceiptV5, input_doc) def test_request_with_wrong_type(dummy_client: Client): with pytest.raises(FileNotFoundError): - dummy_client.source_from_path(open("./tests/data/test.txt").read()) + PathInput(open("./tests/data/test.txt").read()) with pytest.raises(binascii.Error): - dummy_client.source_from_b64string("./tests/data/test.txt", "test.jpg") + Base64Input("./tests/data/test.txt", "test.jpg") def test_interface_version(dummy_client: Client): @@ -81,14 +82,12 @@ def test_interface_version(dummy_client: Client): version="1.1", ) with pytest.raises(MindeeHTTPError): - input_doc = dummy_client.source_from_path(FILE_TYPES_DIR / "receipt.jpg") + input_doc = PathInput(FILE_TYPES_DIR / "receipt.jpg") dummy_client.parse(product.CustomV1, input_doc, endpoint=dummy_endpoint) def test_keep_file_open(dummy_client: Client): - input_doc: LocalInputSource = dummy_client.source_from_path( - f"{FILE_TYPES_DIR}/receipt.jpg" - ) + input_doc: LocalInputSource = PathInput(f"{FILE_TYPES_DIR}/receipt.jpg") try: dummy_client.parse(product.ReceiptV5, input_doc, close_file=False) except MindeeHTTPError: @@ -99,9 +98,7 @@ def test_keep_file_open(dummy_client: Client): def test_cut_options(dummy_client: Client): - input_doc: LocalInputSource = dummy_client.source_from_path( - f"{FILE_TYPES_DIR}/pdf/multipage.pdf" - ) + input_doc: LocalInputSource = PathInput(f"{FILE_TYPES_DIR}/pdf/multipage.pdf") try: # need to keep file open to count the pages after parsing dummy_client.parse( @@ -117,7 +114,7 @@ def test_cut_options(dummy_client: Client): def test_async_wrong_initial_delay(dummy_client: Client): - input_doc = dummy_client.source_from_path(FILE_TYPES_DIR / "pdf" / "blank.pdf") + input_doc = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") with pytest.raises(MindeeClientError): dummy_client.enqueue_and_parse( InvoiceSplitterV1, input_doc, initial_delay_sec=0 @@ -125,7 +122,7 @@ def test_async_wrong_initial_delay(dummy_client: Client): def test_async_wrong_polling_delay(dummy_client: Client): - input_doc = dummy_client.source_from_path(FILE_TYPES_DIR / "pdf" / "blank.pdf") + input_doc = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") with pytest.raises(MindeeClientError): dummy_client.enqueue_and_parse(InvoiceSplitterV1, input_doc, delay_sec=0) diff --git a/tests/v1/workflows/test_workflow_integration.py b/tests/v1/workflows/test_workflow_integration.py index 9e2807e6..00544a9c 100644 --- a/tests/v1/workflows/test_workflow_integration.py +++ b/tests/v1/workflows/test_workflow_integration.py @@ -3,6 +3,7 @@ import pytest +from mindee import PathInput from mindee.v1.client import Client from mindee.v1.client_options.workflow_options import WorkflowOptions from mindee.v1.parsing.common import ExecutionPriority @@ -27,7 +28,7 @@ def input_path(): @pytest.mark.integration def test_workflow_execution(mindee_client: Client, workflow_id: str, input_path: str): - input_source = mindee_client.source_from_path(str(input_path)) + input_source = PathInput(str(input_path)) current_date_time = datetime.now().strftime("%Y-%m-%d-%H:%M:%S") alias = f"python-{current_date_time}" priority = ExecutionPriority.LOW @@ -44,7 +45,7 @@ def test_workflow_execution(mindee_client: Client, workflow_id: str, input_path: def test_workflow_predict_ots_rag( mindee_client: Client, workflow_id: str, input_path: str ): - input_source = mindee_client.source_from_path(str(input_path)) + input_source = PathInput(str(input_path)) response = mindee_client.enqueue_and_parse( FinancialDocumentV1, @@ -59,7 +60,7 @@ def test_workflow_predict_ots_rag( def test_workflow_predict_ots_no_rag( mindee_client: Client, workflow_id: str, input_path: str ): - input_source = mindee_client.source_from_path(str(input_path)) + input_source = PathInput(str(input_path)) response = mindee_client.enqueue_and_parse( FinancialDocumentV1, @@ -78,7 +79,7 @@ def test_workflow_predict_custom_rag( endpoint_name="financial_document", ) - input_source = mindee_client.source_from_path(str(input_path)) + input_source = PathInput(str(input_path)) response = mindee_client.enqueue_and_parse( GeneratedV1, @@ -99,7 +100,7 @@ def test_workflow_predict_custom_no_rag( endpoint_name="financial_document", ) - input_source = mindee_client.source_from_path(str(input_path)) + input_source = PathInput(str(input_path)) response = mindee_client.enqueue_and_parse( GeneratedV1, diff --git a/tests/v2/test_client.py b/tests/v2/test_client.py index 1fbe533a..ded27855 100644 --- a/tests/v2/test_client.py +++ b/tests/v2/test_client.py @@ -126,18 +126,14 @@ def test_enqueue_path_with_env_token(custom_base_url_client): assert custom_base_url_client.mindee_api.api_key == "dummy" assert custom_base_url_client.mindee_api.base_headers["Authorization"] == "dummy" assert custom_base_url_client.mindee_api.base_headers["User-Agent"] == USER_AGENT - input_doc: LocalInputSource = custom_base_url_client.source_from_path( - f"{FILE_TYPES_DIR}/receipt.jpg" - ) + input_doc: LocalInputSource = PathInput(f"{FILE_TYPES_DIR}/receipt.jpg") with pytest.raises(MindeeHTTPErrorV2): custom_base_url_client.enqueue(input_doc, ExtractionParameters("dummy-model")) @pytest.mark.v2 def test_enqueue_and_parse_path_with_env_token(custom_base_url_client): - input_doc: LocalInputSource = custom_base_url_client.source_from_path( - f"{FILE_TYPES_DIR}/receipt.jpg" - ) + input_doc: LocalInputSource = PathInput(f"{FILE_TYPES_DIR}/receipt.jpg") with pytest.raises(MindeeHTTPErrorV2): custom_base_url_client.enqueue_and_get_result( ExtractionResponse, From 59ff0c9f4e4c5919dc47cb0be4b58a1bf5cee045 Mon Sep 17 00:00:00 2001 From: sebastianMindee <130448732+sebastianMindee@users.noreply.github.com> Date: Tue, 2 Jun 2026 13:53:31 +0200 Subject: [PATCH 08/10] :arrow_up: upgrade dependencies and add more tools --- .github/dependabot.yml | 70 +++++++++++++++++++ .github/workflows/_publish-docs.yml | 6 ++ .pre-commit-config.yaml | 13 ++-- mindee/image/image_extractor.py | 4 +- mindee/pdf/pdf_compressor.py | 3 +- pyproject.toml | 27 +++---- .../test_crop_operation_integration.py | 7 +- 7 files changed, 106 insertions(+), 24 deletions(-) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..b4290f2e --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,70 @@ +version: 2 + +updates: + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "09:00" + timezone: "Europe/Paris" + open-pull-requests-limit: 8 + commit-message: + prefix: "chore(deps)" + groups: + runtime-dependencies: + patterns: + - "pytz" + - "requests" + optional-dependencies: + patterns: + - "pypdfium2" + - "Pillow" + test-dependencies: + patterns: + - "pytest" + - "pytest-cov" + - "toml" + lint-dependencies: + patterns: + - "pylint" + - "pre-commit" + - "types-*" + docs-dependencies: + patterns: + - "sphinx" + - "sphinx-*" + build-dependencies: + patterns: + - "build" + - "twine" + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "09:30" + timezone: "Europe/Paris" + open-pull-requests-limit: 3 + commit-message: + prefix: "chore(ci)" + groups: + github-actions: + patterns: + - "*" + + - package-ecosystem: "pre-commit" + directory: "/" + schedule: + interval: "weekly" + day: "monday" + time: "10:00" + timezone: "Europe/Paris" + open-pull-requests-limit: 3 + commit-message: + prefix: "chore(pre-commit)" + groups: + pre-commit-hooks: + patterns: + - "*" diff --git a/.github/workflows/_publish-docs.yml b/.github/workflows/_publish-docs.yml index 691d7a1a..e401ab76 100644 --- a/.github/workflows/_publish-docs.yml +++ b/.github/workflows/_publish-docs.yml @@ -39,8 +39,14 @@ jobs: cd ./docs make html + - name: Sphinx make linkcheck + run: | + cd ./docs + make linkcheck + - name: Deploy uses: peaceiris/actions-gh-pages@v4 + if: success() with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./docs/_build/html diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 312ff209..11e634ab 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,13 +6,13 @@ repos: args: [ --fix, --exit-non-zero-on-fix] - id: ruff-format - - repo: https://github.com/gitleaks/gitleaks - rev: v8.30.0 + - repo: https://github.com/betterleaks/betterleaks + rev: v1.3.1 hooks: - - id: gitleaks + - id: betterleaks - repo: https://github.com/PyCQA/pylint - rev: v3.3.9 + rev: v4.0.5 hooks: - id: pylint name: pylint @@ -22,6 +22,11 @@ repos: args: [ "-j2" ] + - repo: https://github.com/pypa/pip-audit + rev: v2.10.0 + hooks: + - id: pip-audit + args: ["."] - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.18.2 diff --git a/mindee/image/image_extractor.py b/mindee/image/image_extractor.py index e5ed9f6e..09c79c07 100644 --- a/mindee/image/image_extractor.py +++ b/mindee/image/image_extractor.py @@ -21,7 +21,6 @@ def attach_image_as_new_file( # type: ignore :params input_buffer: Input buffer. :return: A PdfDocument handle. """ - # Create a new page in the PdfDocument input_buffer.seek(0) image = Image.open(input_buffer) image.convert("RGB") @@ -32,8 +31,7 @@ def attach_image_as_new_file( # type: ignore image_pdf = pdfium.PdfImage.new(pdf) image_pdf.load_jpeg(image_buffer) - width, height = image_pdf.get_size() - + width, height = image.width, image.height matrix = pdfium.PdfMatrix().scale(width, height) image_pdf.set_matrix(matrix) diff --git a/mindee/pdf/pdf_compressor.py b/mindee/pdf/pdf_compressor.py index b4e0238a..2d5710b8 100644 --- a/mindee/pdf/pdf_compressor.py +++ b/mindee/pdf/pdf_compressor.py @@ -213,7 +213,8 @@ def _collect_images_as_pdf(image_list: List[bytes]) -> pdfium.PdfDocument: # ty pdf_image = pdfium.PdfImage.new(out_pdf) pdf_image.load_jpeg(io.BytesIO(image_bytes)) - width, height = pdf_image.get_size() + metadata = pdf_image.get_metadata() + width, height = metadata.width, metadata.height page = out_pdf.new_page(width, height) page.insert_obj(pdf_image) page.gen_content() diff --git a/pyproject.toml b/pyproject.toml index 5f4ff6b2..5538115b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,10 +28,10 @@ classifiers = [ requires-python = ">=3.10" dependencies = [ - "pypdfium2>=4.0,<4.30.1", - "Pillow>=9.5.0", - "pytz>=2023.3", - "requests>=2.31.0", + "pypdfium2>=4.0,<6.0", + "Pillow>=12.2.0", + "pytz>=2026.2", + "requests>=2.34.2", ] [project.urls] @@ -43,20 +43,21 @@ Changelog = "https://github.com/mindee/mindee-api-python/blob/main/CHANGELOG.md" [project.optional-dependencies] lint = [ - "pylint==3.3.9", - "pre-commit~=3.6.0", - "types-pytz>=2024.2", - "types-requests>=2.31", + "pylint==4.0.5", + "pre-commit~=4.6.0", + "types-pytz>=2026.2.0.20260518", + "types-requests>=2.33.0.20260518", + "pip-audit>=2.10.0", ] test = [ "toml~=0.10.2", - "pytest~=8.0.0", - "pytest-cov~=5.0", + "pytest~=9.0.3", + "pytest-cov~=7.1.0", ] docs = [ - "sphinx~=7.3", - "sphinx_rtd_theme~=2.0", - "sphinx-autodoc-typehints~=2.2", + "sphinx~=9.1.0", + "sphinx_rtd_theme~=3.1.0", + "sphinx-autodoc-typehints~=3.10.4", ] build = [ "build", diff --git a/tests/v2/file_operations/test_crop_operation_integration.py b/tests/v2/file_operations/test_crop_operation_integration.py index 63445f42..f48b6f05 100644 --- a/tests/v2/file_operations/test_crop_operation_integration.py +++ b/tests/v2/file_operations/test_crop_operation_integration.py @@ -51,9 +51,10 @@ def test_image_should_extract_crops(): ) check_findoc_return(invoice_0) extracted_images.save_all_to_disk(OUTPUT_DIR) - # note: flaky - assert os.path.getsize(OUTPUT_DIR / "crop_001.jpg") in (187601, 199685) - assert os.path.getsize(OUTPUT_DIR / "crop_002.jpg") in (197978, 199433) + crop1size = os.path.getsize(OUTPUT_DIR / "crop_001.jpg") + crop2size = os.path.getsize(OUTPUT_DIR / "crop_002.jpg") + assert 187601 <= crop1size <= 199685 + assert crop2size == 197978 @pytest.fixture(scope="module", autouse=True) From e5dbc74c2ee02c7b063a5cde87f31a3b895b2983 Mon Sep 17 00:00:00 2001 From: sebastianMindee <130448732+sebastianMindee@users.noreply.github.com> Date: Tue, 2 Jun 2026 15:26:37 +0200 Subject: [PATCH 09/10] :memo: fix doc --- .pylintrc | 4 - docs/client.rst | 10 -- docs/client_mixin.rst | 7 + docs/client_options.rst | 8 + docs/{misc => }/error.rst | 0 docs/{misc => }/geometry.rst | 0 docs/image.rst | 10 ++ docs/index.rst | 22 ++- docs/{misc => }/input.rst | 10 +- docs/logger.rst | 7 + docs/mindee_http.rst | 15 ++ docs/misc/index.rst | 9 - docs/parsing/common.rst | 99 ++--------- docs/parsing/custom.rst | 32 ---- docs/parsing/generated.rst | 16 -- docs/parsing/index.rst | 3 - docs/parsing/standard.rst | 68 -------- docs/{misc/mindee_http.rst => pdf.rst} | 10 +- docs/product/financial_document_v1.rst | 19 --- docs/product/fr/bank_account_details_v2.rst | 19 --- docs/product/invoice_splitter_v1.rst | 19 --- docs/v1/client.rst | 6 + docs/v1/client_options.rst | 16 ++ docs/v1/error.rst | 16 ++ docs/v1/index.rst | 13 ++ docs/v1/mindee_http.rst | 38 +++++ docs/v1/parsing/common.rst | 155 ++++++++++++++++++ docs/v1/parsing/custom.rst | 27 +++ docs/v1/parsing/generated.rst | 16 ++ docs/v1/parsing/index.rst | 11 ++ docs/v1/parsing/standard.rst | 80 +++++++++ docs/v1/pdf.rst | 16 ++ docs/{ => v1}/product/barcode_reader_v1.rst | 4 +- docs/{ => v1}/product/cropper_v1.rst | 6 +- docs/{ => v1}/product/custom_v1.rst | 6 +- docs/v1/product/financial_document_v1.rst | 19 +++ .../product/fr/bank_account_details_v1.rst | 4 +- .../v1/product/fr/bank_account_details_v2.rst | 19 +++ docs/{ => v1}/product/fr/carte_grise_v1.rst | 4 +- docs/{ => v1}/product/fr/id_card_v1.rst | 6 +- docs/{ => v1}/product/fr/id_card_v2.rst | 6 +- docs/{ => v1}/product/fr/index.rst | 0 docs/{ => v1}/product/generated_v1.rst | 6 +- docs/{ => v1}/product/index.rst | 6 +- docs/{ => v1}/product/international_id_v2.rst | 4 +- docs/v1/product/invoice_splitter_v1.rst | 19 +++ docs/{ => v1}/product/invoice_v4.rst | 6 +- .../product/multi_receipts_detector_v1.rst | 4 +- docs/{ => v1}/product/passport_v1.rst | 4 +- docs/{ => v1}/product/receipt_v5.rst | 6 +- docs/{ => v1}/product/us/bank_check_v1.rst | 6 +- docs/{ => v1}/product/us/index.rst | 0 docs/v2/client_options.rst | 8 + docs/v2/error.rst | 14 ++ docs/v2/file_operations.rst | 26 +++ docs/v2/index.rst | 20 +++ docs/v2/mindee_http.rst | 14 ++ docs/v2/parsing/index.rst | 8 + docs/v2/parsing/inference/field.rst | 51 ++++++ docs/v2/parsing/inference/index.rst | 95 +++++++++++ docs/v2/product/classification/index.rst | 33 ++++ docs/v2/product/classification/params.rst | 9 + docs/v2/product/crop/index.rst | 39 +++++ docs/v2/product/crop/params.rst | 9 + docs/v2/product/extraction/index.rst | 27 +++ docs/v2/product/extraction/params.rst | 32 ++++ docs/v2/product/index.rst | 12 ++ docs/v2/product/ocr/index.rst | 39 +++++ docs/v2/product/ocr/params.rst | 9 + docs/v2/product/split/index.rst | 33 ++++ docs/v2/product/split/params.rst | 9 + mindee/cli.py | 2 +- mindee/commands/__init__.py | 0 mindee/pdf/extracted_pdf.py | 2 +- mindee/pdf/pdf_extractor.py | 12 +- mindee/v1/commands/__init__.py | 9 + mindee/{ => v1}/commands/cli_parser.py | 2 +- mindee/{ => v1}/commands/cli_products.py | 0 mindee/v1/parsing/common/__init__.py | 4 +- mindee/v1/parsing/common/document.py | 6 +- mindee/v1/parsing/common/extras/extras.py | 14 +- .../common/extras/full_text_ocr_extra.py | 2 +- mindee/v1/parsing/common/extras/rag_extra.py | 2 +- mindee/v1/parsing/common/ocr/__init__.py | 4 +- mindee/v1/parsing/common/ocr/mvision_v1.py | 6 +- mindee/v1/parsing/common/ocr/ocr.py | 2 +- mindee/v1/parsing/common/ocr/ocr_line.py | 4 +- mindee/v1/parsing/common/ocr/ocr_page.py | 28 ++-- mindee/v1/parsing/common/ocr/ocr_word.py | 2 +- mindee/v1/pdf/__init__.py | 4 +- mindee/v1/pdf/pdf_extractor.py | 8 +- mindee/v2/file_operations/split.py | 8 +- mindee/v2/file_operations/split_files.py | 4 +- mindee/v2/parsing/inference/rag_metadata.py | 2 +- .../product/extraction/extraction_result.py | 6 +- mindee/v2/product/split/split_range.py | 4 +- .../test_invoice_splitter_auto_extraction.py | 4 +- tests/v1/extraction/test_pdf_extractor.py | 8 +- tests/v1/parsing/common/test_ocr.py | 4 +- tests/v1/test_cli.py | 2 +- .../test_crop_operation_integration.py | 2 +- .../extraction/test_extraction_response.py | 6 +- 102 files changed, 1148 insertions(+), 418 deletions(-) delete mode 100644 docs/client.rst create mode 100644 docs/client_mixin.rst create mode 100644 docs/client_options.rst rename docs/{misc => }/error.rst (100%) rename docs/{misc => }/geometry.rst (100%) create mode 100644 docs/image.rst rename docs/{misc => }/input.rst (57%) create mode 100644 docs/logger.rst create mode 100644 docs/mindee_http.rst delete mode 100644 docs/misc/index.rst delete mode 100644 docs/parsing/custom.rst delete mode 100644 docs/parsing/generated.rst delete mode 100644 docs/parsing/standard.rst rename docs/{misc/mindee_http.rst => pdf.rst} (50%) delete mode 100644 docs/product/financial_document_v1.rst delete mode 100644 docs/product/fr/bank_account_details_v2.rst delete mode 100644 docs/product/invoice_splitter_v1.rst create mode 100644 docs/v1/client.rst create mode 100644 docs/v1/client_options.rst create mode 100644 docs/v1/error.rst create mode 100644 docs/v1/index.rst create mode 100644 docs/v1/mindee_http.rst create mode 100644 docs/v1/parsing/common.rst create mode 100644 docs/v1/parsing/custom.rst create mode 100644 docs/v1/parsing/generated.rst create mode 100644 docs/v1/parsing/index.rst create mode 100644 docs/v1/parsing/standard.rst create mode 100644 docs/v1/pdf.rst rename docs/{ => v1}/product/barcode_reader_v1.rst (55%) rename docs/{ => v1}/product/cropper_v1.rst (53%) rename docs/{ => v1}/product/custom_v1.rst (55%) create mode 100644 docs/v1/product/financial_document_v1.rst rename docs/{ => v1}/product/fr/bank_account_details_v1.rst (52%) create mode 100644 docs/v1/product/fr/bank_account_details_v2.rst rename docs/{ => v1}/product/fr/carte_grise_v1.rst (55%) rename docs/{ => v1}/product/fr/id_card_v1.rst (56%) rename docs/{ => v1}/product/fr/id_card_v2.rst (56%) rename docs/{ => v1}/product/fr/index.rst (100%) rename docs/{ => v1}/product/generated_v1.rst (62%) rename docs/{ => v1}/product/index.rst (82%) rename docs/{ => v1}/product/international_id_v2.rst (54%) create mode 100644 docs/v1/product/invoice_splitter_v1.rst rename docs/{ => v1}/product/invoice_v4.rst (52%) rename docs/{ => v1}/product/multi_receipts_detector_v1.rst (51%) rename docs/{ => v1}/product/passport_v1.rst (58%) rename docs/{ => v1}/product/receipt_v5.rst (53%) rename docs/{ => v1}/product/us/bank_check_v1.rst (50%) rename docs/{ => v1}/product/us/index.rst (100%) create mode 100644 docs/v2/client_options.rst create mode 100644 docs/v2/error.rst create mode 100644 docs/v2/file_operations.rst create mode 100644 docs/v2/index.rst create mode 100644 docs/v2/mindee_http.rst create mode 100644 docs/v2/parsing/index.rst create mode 100644 docs/v2/parsing/inference/field.rst create mode 100644 docs/v2/parsing/inference/index.rst create mode 100644 docs/v2/product/classification/index.rst create mode 100644 docs/v2/product/classification/params.rst create mode 100644 docs/v2/product/crop/index.rst create mode 100644 docs/v2/product/crop/params.rst create mode 100644 docs/v2/product/extraction/index.rst create mode 100644 docs/v2/product/extraction/params.rst create mode 100644 docs/v2/product/index.rst create mode 100644 docs/v2/product/ocr/index.rst create mode 100644 docs/v2/product/ocr/params.rst create mode 100644 docs/v2/product/split/index.rst create mode 100644 docs/v2/product/split/params.rst delete mode 100644 mindee/commands/__init__.py create mode 100644 mindee/v1/commands/__init__.py rename mindee/{ => v1}/commands/cli_parser.py (99%) rename mindee/{ => v1}/commands/cli_products.py (100%) diff --git a/.pylintrc b/.pylintrc index a5c1bc55..4604c52f 100644 --- a/.pylintrc +++ b/.pylintrc @@ -104,10 +104,6 @@ recursive=no # source root. source-roots= -# When enabled, pylint would attempt to guess common misconfiguration and emit -# user-friendly hints instead of false-positive error messages. -suggestion-mode=yes - # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no diff --git a/docs/client.rst b/docs/client.rst deleted file mode 100644 index 9463f39f..00000000 --- a/docs/client.rst +++ /dev/null @@ -1,10 +0,0 @@ -------------- -Mindee Client -------------- - -.. currentmodule:: mindee.client - -Client ------- -.. autoclass:: mindee.client.Client - :members: diff --git a/docs/client_mixin.rst b/docs/client_mixin.rst new file mode 100644 index 00000000..d8a9d424 --- /dev/null +++ b/docs/client_mixin.rst @@ -0,0 +1,7 @@ +------------ +Client Mixin +------------ + +.. autoclass:: mindee.client_mixin + :members: + :inherited-members: diff --git a/docs/client_options.rst b/docs/client_options.rst new file mode 100644 index 00000000..81fbf507 --- /dev/null +++ b/docs/client_options.rst @@ -0,0 +1,8 @@ +Client Options +############## + +Polling Options +=============== +.. autoclass:: mindee.client_options.polling_options.PollingOptions + :members: + :inherited-members: diff --git a/docs/misc/error.rst b/docs/error.rst similarity index 100% rename from docs/misc/error.rst rename to docs/error.rst diff --git a/docs/misc/geometry.rst b/docs/geometry.rst similarity index 100% rename from docs/misc/geometry.rst rename to docs/geometry.rst diff --git a/docs/image.rst b/docs/image.rst new file mode 100644 index 00000000..32c935a7 --- /dev/null +++ b/docs/image.rst @@ -0,0 +1,10 @@ +------------- +Image Helpers +------------- + +.. automodule:: mindee.image + :imported-members: + :inherited-members: + :members: + :undoc-members: + diff --git a/docs/index.rst b/docs/index.rst index 5c799f90..ff17a908 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,6 +1,6 @@ -======================= -Python Client Reference -======================= +=========================== +Mindee Python SDK Reference +=========================== This is purely a reference manual. @@ -10,10 +10,18 @@ the client. https://developers.mindee.com/docs/python-sdk .. toctree:: - :maxdepth: 2 + :maxdepth: 3 :caption: Contents: - client + client_options + error + geometry + image + input + mindee_http parsing/index - product/index - misc/index + pdf + v1/index + v2/index + client_mixin + logger diff --git a/docs/misc/input.rst b/docs/input.rst similarity index 57% rename from docs/misc/input.rst rename to docs/input.rst index 0a1530a8..350168c0 100644 --- a/docs/misc/input.rst +++ b/docs/input.rst @@ -1,8 +1,10 @@ ------ -Input ------ +------------ +Mindee Input +------------ .. automodule:: mindee.input - :members: :imported-members: + :inherited-members: + :members: :undoc-members: + diff --git a/docs/logger.rst b/docs/logger.rst new file mode 100644 index 00000000..129332f8 --- /dev/null +++ b/docs/logger.rst @@ -0,0 +1,7 @@ +------------- +Mindee Logger +------------- + +.. automodule:: mindee.logger + :members: + :inherited-members: diff --git a/docs/mindee_http.rst b/docs/mindee_http.rst new file mode 100644 index 00000000..8b193694 --- /dev/null +++ b/docs/mindee_http.rst @@ -0,0 +1,15 @@ +Mindee HTTP +########### + +Response Validation +=================== +.. automodule:: mindee.mindee_http.response_validation + :members: + :inherited-members: + + +Settings Mixin +============== +.. autoclass:: mindee.mindee_http.settings_mixin.SettingsMixin + :members: + :inherited-members: diff --git a/docs/misc/index.rst b/docs/misc/index.rst deleted file mode 100644 index 4131b880..00000000 --- a/docs/misc/index.rst +++ /dev/null @@ -1,9 +0,0 @@ ----- -Misc ----- - -.. toctree:: - :maxdepth: 2 - :glob: - - ./* diff --git a/docs/parsing/common.rst b/docs/parsing/common.rst index 1ddd7b39..6ab9c01a 100644 --- a/docs/parsing/common.rst +++ b/docs/parsing/common.rst @@ -1,95 +1,20 @@ -------------- -Common Fields -------------- +Common Parsing Utilities +======================== -Documents -========= - -Document --------- -.. autoclass:: mindee.parsing.common.document.Document - :members: - -Page ----- -.. autoclass:: mindee.parsing.common.page.Page - :members: - -Page Fields -=========== - -Orientation ------------ -.. autoclass:: mindee.parsing.common.orientation.OrientationField - :members: - - -API -=== - -ApiRequest ----------- -.. autoclass:: mindee.parsing.common.api_request.ApiRequest +Common Response +--------------- +.. autoclass:: mindee.parsing.common.common_response.CommonResponse :members: + :inherited-members: -ApiResponse +String Dict ----------- -.. autoclass:: mindee.parsing.common.api_response.ApiResponse - :members: - -Prediction ----------- -.. autoclass:: mindee.parsing.common.prediction.Prediction - :members: - -Asynchronous Parsing -==================== - -AsyncPredictResponse --------------------- -.. autoclass:: mindee.parsing.common.async_predict_response.AsyncPredictResponse - :members: - -Job ---- -.. autoclass:: mindee.parsing.common.job.Job - :members: - - -Miscellaneous Parsing -===================== - -FeedbackResponse ----------------- -.. autoclass:: mindee.parsing.common.feedback_response.FeedbackResponse - :members: - - -OCR Extraction -============== - -OCR ---- -.. autoclass:: mindee.parsing.common.ocr.ocr.Ocr - :members: - -MVisionV1 ---------- -.. autoclass:: mindee.parsing.common.ocr.mvision_v1.MVisionV1 - :members: - -OcrPage -------- -.. autoclass:: mindee.parsing.common.ocr.ocr_page.OcrPage - :members: - -OcrLine -------- -.. autoclass:: mindee.parsing.common.ocr.ocr_line.OcrLine +.. autoclass:: mindee.parsing.common.string_dict.StringDict :members: + :inherited-members: -OcrWord -------- -.. autoclass:: mindee.parsing.common.ocr.ocr_word.OcrWord +Summary Helper +-------------- +.. automodule:: mindee.parsing.common.summary_helper :members: :inherited-members: diff --git a/docs/parsing/custom.rst b/docs/parsing/custom.rst deleted file mode 100644 index 48a53eb4..00000000 --- a/docs/parsing/custom.rst +++ /dev/null @@ -1,32 +0,0 @@ -------------- -Custom Fields -------------- - -Classification -============== -.. autoclass:: mindee.parsing.custom.classification.ClassificationField - :members: - - -Line Items -========== -.. autoclass:: mindee.parsing.custom.line_items.CustomLine - :members: - -Lists -===== - -List Field ----------- -.. autoclass:: mindee.parsing.custom.list.ListField - :members: - -List Field Value ----------------- -.. autoclass:: mindee.parsing.custom.list.ListFieldValue - :members: - -String Dict ------------ -.. autoclass:: mindee.parsing.common.string_dict.StringDict - :members: diff --git a/docs/parsing/generated.rst b/docs/parsing/generated.rst deleted file mode 100644 index c7e00918..00000000 --- a/docs/parsing/generated.rst +++ /dev/null @@ -1,16 +0,0 @@ ----------------- -Generated Fields ----------------- - -Generated Lists -=============== -.. autoclass:: mindee.parsing.generated.generated_list - :members: - - -Generated Objects -================= -.. autoclass:: mindee.parsing.generated.generated_object - :members: - -.. autofunction:: mindee.parsing.generated.is_generated_object diff --git a/docs/parsing/index.rst b/docs/parsing/index.rst index 25e1abe1..eeb1a56c 100644 --- a/docs/parsing/index.rst +++ b/docs/parsing/index.rst @@ -4,8 +4,5 @@ Parsing Utilities .. toctree:: :maxdepth: 2 - ./standard ./common - ./custom - ./generated diff --git a/docs/parsing/standard.rst b/docs/parsing/standard.rst deleted file mode 100644 index 1343c6f7..00000000 --- a/docs/parsing/standard.rst +++ /dev/null @@ -1,68 +0,0 @@ ---------------- -Standard Fields ---------------- - -Base Field ----------- -.. autoclass:: mindee.parsing.standard.base.BaseField - :members: - :inherited-members: - -Text Field ----------- -.. autoclass:: mindee.parsing.standard.text.StringField - :members: - :inherited-members: - -Classification Field --------------------- -.. autoclass:: mindee.parsing.standard.classification.ClassificationField - :members: - :inherited-members: - -Company Registration Field --------------------------- -.. autoclass:: mindee.parsing.standard.company_registration.CompanyRegistrationField - :members: - :inherited-members: - -Amount Field ------------- -.. autoclass:: mindee.parsing.standard.amount.AmountField - :members: - :inherited-members: - -Date Field ----------- -.. autoclass:: mindee.parsing.standard.date.DateField - :members: - :inherited-members: - -List of Taxes -------------- -.. autoclass:: mindee.parsing.standard.tax.Taxes - :members: - -Tax Line --------- -.. autoclass:: mindee.parsing.standard.tax.TaxField - :members: - :inherited-members: - -Locale Field ------------- -.. autoclass:: mindee.parsing.standard.locale.LocaleField - :members: - :inherited-members: - -Payment Details ---------------- -.. autoclass:: mindee.parsing.standard.payment_details.PaymentDetailsField - :members: - :inherited-members: - -Position --------- -.. autoclass:: mindee.parsing.standard.position.PositionField - :members: - :inherited-members: diff --git a/docs/misc/mindee_http.rst b/docs/pdf.rst similarity index 50% rename from docs/misc/mindee_http.rst rename to docs/pdf.rst index 68e52d4e..f1b33745 100644 --- a/docs/misc/mindee_http.rst +++ b/docs/pdf.rst @@ -1,10 +1,10 @@ ----------- -Mindee HTTP +PDF Helpers ----------- -Mindee-specific HTTP operations. - -.. automodule:: mindee.mindee_http - :members: +.. automodule:: mindee.pdf :imported-members: + :inherited-members: + :members: :undoc-members: + diff --git a/docs/product/financial_document_v1.rst b/docs/product/financial_document_v1.rst deleted file mode 100644 index 0973a270..00000000 --- a/docs/product/financial_document_v1.rst +++ /dev/null @@ -1,19 +0,0 @@ -Financial Document V1 ---------------------- - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/financial_document_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.financial_document.financial_document_v1.FinancialDocumentV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.financial_document.financial_document_v1_document.FinancialDocumentV1Document - :members: - :inherited-members: - -.. autoclass:: mindee.product.financial_document.financial_document_v1_line_item.FinancialDocumentV1LineItem - :members: - :inherited-members: diff --git a/docs/product/fr/bank_account_details_v2.rst b/docs/product/fr/bank_account_details_v2.rst deleted file mode 100644 index 9978c225..00000000 --- a/docs/product/fr/bank_account_details_v2.rst +++ /dev/null @@ -1,19 +0,0 @@ -Bank Account Details V2 ------------------------ - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/bank_account_details_v2.txt - :language: Python - -.. autoclass:: mindee.product.fr.bank_account_details.bank_account_details_v2.BankAccountDetailsV2 - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.bank_account_details.bank_account_details_v2_document.BankAccountDetailsV2Document - :members: - :inherited-members: - -.. autoclass:: mindee.product.fr.bank_account_details.bank_account_details_v2_bban.BankAccountDetailsV2Bban - :members: - :inherited-members: diff --git a/docs/product/invoice_splitter_v1.rst b/docs/product/invoice_splitter_v1.rst deleted file mode 100644 index 3c26f8d7..00000000 --- a/docs/product/invoice_splitter_v1.rst +++ /dev/null @@ -1,19 +0,0 @@ -Invoice Splitter V1 -------------------- - -**Sample Code:** - -.. literalinclude:: /extras/code_samples/invoice_splitter_v1_async.txt - :language: Python - -.. autoclass:: mindee.product.invoice_splitter.invoice_splitter_v1.InvoiceSplitterV1 - :members: - :inherited-members: - -.. autoclass:: mindee.product.invoice_splitter.invoice_splitter_v1_document.InvoiceSplitterV1Document - :members: - :inherited-members: - -.. autoclass:: mindee.product.invoice_splitter.invoice_splitter_v1_invoice_page_group.InvoiceSplitterV1InvoicePageGroup - :members: - :inherited-members: diff --git a/docs/v1/client.rst b/docs/v1/client.rst new file mode 100644 index 00000000..e7d2361b --- /dev/null +++ b/docs/v1/client.rst @@ -0,0 +1,6 @@ +V1 Client +######### + +.. automodule:: mindee.v1.client + :members: + :inherited-members: diff --git a/docs/v1/client_options.rst b/docs/v1/client_options.rst new file mode 100644 index 00000000..f6d6a8ee --- /dev/null +++ b/docs/v1/client_options.rst @@ -0,0 +1,16 @@ +V1 Client Options +################# + +Predict Options +=============== +.. autoclass:: mindee.v1.client_options.predict_options.PredictOptions + :members: + :inherited-members: + + +Workflow Options +================ +.. autoclass:: mindee.v1.client_options.workflow_options.WorkflowOptions + :members: + :inherited-members: + diff --git a/docs/v1/error.rst b/docs/v1/error.rst new file mode 100644 index 00000000..6840219a --- /dev/null +++ b/docs/v1/error.rst @@ -0,0 +1,16 @@ +V1 Error +######## + +Mindee API Error +================ +.. autoclass:: mindee.v1.error.mindee_api_error.MindeeAPIError + :members: + :inherited-members: + + +Mindee Product Error +==================== +.. autoclass:: mindee.v1.error.mindee_product_error.MindeeProductError + :members: + :inherited-members: + diff --git a/docs/v1/index.rst b/docs/v1/index.rst new file mode 100644 index 00000000..6ab98ad5 --- /dev/null +++ b/docs/v1/index.rst @@ -0,0 +1,13 @@ +V1 Utilities +############ + +.. toctree:: + :maxdepth: 3 + + ./client + ./client_options + ./error + ./mindee_http + ./parsing/index + ./pdf + ./product/index diff --git a/docs/v1/mindee_http.rst b/docs/v1/mindee_http.rst new file mode 100644 index 00000000..a619a939 --- /dev/null +++ b/docs/v1/mindee_http.rst @@ -0,0 +1,38 @@ +V1 Mindee HTTP +############## + +Base Endpoint +============= +.. autoclass:: mindee.v1.mindee_http.base_endpoint.BaseEndpoint + :members: + :inherited-members: + +Base Settings +============= +.. autoclass:: mindee.v1.mindee_http.base_settings.BaseSettings + :members: + :inherited-members: + +Endpoint +======== +.. autoclass:: mindee.v1.mindee_http.endpoint.Endpoint + :members: + :inherited-members: + +MindeeAPI +========= +.. autoclass:: mindee.v1.mindee_http.mindee_api.MindeeAPI + :members: + :inherited-members: + +Workflow Endpoint +================= +.. autoclass:: mindee.v1.mindee_http.workflow_endpoint.WorkflowEndpoint + :members: + :inherited-members: + +Workflow Settings +================= +.. autoclass:: mindee.v1.mindee_http.workflow_settings.WorkflowSettings + :members: + :inherited-members: diff --git a/docs/v1/parsing/common.rst b/docs/v1/parsing/common.rst new file mode 100644 index 00000000..45f6327b --- /dev/null +++ b/docs/v1/parsing/common.rst @@ -0,0 +1,155 @@ +---------------- +V1 Common Fields +---------------- + +Documents +========= + +Document +-------- +.. autoclass:: mindee.v1.parsing.common.document.Document + :members: + +Page +---- +.. autoclass:: mindee.v1.parsing.common.page.Page + :members: + +Page Fields +=========== + +Orientation +----------- +.. autoclass:: mindee.v1.parsing.common.orientation.OrientationField + :members: + + +API +=== + +ApiRequest +---------- +.. autoclass:: mindee.v1.parsing.common.api_request.ApiRequest + :members: + +ApiResponse +----------- +.. autoclass:: mindee.v1.parsing.common.api_response.ApiResponse + :members: + +Prediction +---------- +.. autoclass:: mindee.v1.parsing.common.prediction.Prediction + :members: + +Asynchronous Parsing +==================== + +AsyncPredictResponse +-------------------- +.. autoclass:: mindee.v1.parsing.common.async_predict_response.AsyncPredictResponse + :members: + +Job +--- +.. autoclass:: mindee.v1.parsing.common.job.Job + :members: + + +Miscellaneous Parsing +===================== + +PredictResponse +--------------- + +.. autoclass:: mindee.v1.parsing.common.predict_response.PredictResponse + :members: + +Product +------- + +.. autoclass:: mindee.v1.parsing.common.product.Product + :members: + +FeedbackResponse +---------------- +.. autoclass:: mindee.v1.parsing.common.feedback_response.FeedbackResponse + :members: + +Workflow Parsing +================ + +Execution +--------- +.. autoclass:: mindee.v1.parsing.common.execution.Execution + :members: + +Execution File +-------------- +.. autoclass:: mindee.v1.parsing.common.execution_file.ExecutionFile + :members: + +WorkflowResponse +---------------- +.. autoclass:: mindee.v1.parsing.common.workflow_response.WorkflowResponse + :members: + + +OCR Extraction +============== + +OCR +--- +.. autoclass:: mindee.v1.parsing.common.ocr.ocr.OCR + :members: + +MVisionV1 +--------- +.. autoclass:: mindee.v1.parsing.common.ocr.mvision_v1.MVisionV1 + :members: + +OCRPage +------- +.. autoclass:: mindee.v1.parsing.common.ocr.ocr_page.OCRPage + :members: + +OCRLine +------- +.. autoclass:: mindee.v1.parsing.common.ocr.ocr_line.OCRLine + :members: + +OCRWord +------- +.. autoclass:: mindee.v1.parsing.common.ocr.ocr_word.OCRWord + :members: + :inherited-members: + +Extras +====== + +Extras +------ +.. autoclass:: mindee.v1.parsing.common.extras.extras.Extras + :members: + :inherited-members: + +Cropper Extra +------------- + +.. autoclass:: mindee.v1.parsing.common.extras.cropper_extra.CropperExtra + :members: + :inherited-members: + +Full-Text OCR Extra +------------------- + +.. autoclass:: mindee.v1.parsing.common.extras.full_text_ocr_extra.FullTextOCRExtra + :members: + :inherited-members: + +RAG Extra +--------- + +.. autoclass:: mindee.v1.parsing.common.extras.rag_extra.RAGExtra + :members: + :inherited-members: diff --git a/docs/v1/parsing/custom.rst b/docs/v1/parsing/custom.rst new file mode 100644 index 00000000..c127a66c --- /dev/null +++ b/docs/v1/parsing/custom.rst @@ -0,0 +1,27 @@ +---------------- +V1 Custom Fields +---------------- + +Classification +============== +.. autoclass:: mindee.v1.parsing.custom.classification.ClassificationField + :members: + + +Line Items +========== +.. autoclass:: mindee.v1.parsing.custom.line_items.CustomLine + :members: + +Lists +===== + +List Field +---------- +.. autoclass:: mindee.v1.parsing.custom.list.ListField + :members: + +List Field Value +---------------- +.. autoclass:: mindee.v1.parsing.custom.list.ListFieldValue + :members: diff --git a/docs/v1/parsing/generated.rst b/docs/v1/parsing/generated.rst new file mode 100644 index 00000000..d0c460b6 --- /dev/null +++ b/docs/v1/parsing/generated.rst @@ -0,0 +1,16 @@ +------------------- +V1 Generated Fields +------------------- + +Generated Lists +=============== +.. autoclass:: mindee.v1.parsing.generated.generated_list + :members: + + +Generated Objects +================= +.. autoclass:: mindee.v1.parsing.generated.generated_object + :members: + +.. autofunction:: mindee.v1.parsing.generated.is_generated_object diff --git a/docs/v1/parsing/index.rst b/docs/v1/parsing/index.rst new file mode 100644 index 00000000..d9c12c09 --- /dev/null +++ b/docs/v1/parsing/index.rst @@ -0,0 +1,11 @@ +V1 Parsing Utilities +#################### + +.. toctree:: + :maxdepth: 2 + + ./standard + ./common + ./custom + ./generated + diff --git a/docs/v1/parsing/standard.rst b/docs/v1/parsing/standard.rst new file mode 100644 index 00000000..10bae9fd --- /dev/null +++ b/docs/v1/parsing/standard.rst @@ -0,0 +1,80 @@ +------------------ +V1 Standard Fields +------------------ + +Address Field +============= +.. autoclass:: mindee.v1.parsing.standard.address.AddressField + :members: + :inherited-members: + +Amount Field +============ +.. autoclass:: mindee.v1.parsing.standard.amount.AmountField + :members: + :inherited-members: + +Base Field +========== +.. autoclass:: mindee.v1.parsing.standard.base.BaseField + :members: + :inherited-members: + +Boolean Field +============= +.. autoclass:: mindee.v1.parsing.standard.boolean.BooleanField + :members: + :inherited-members: + +Text Field +========== +.. autoclass:: mindee.v1.parsing.standard.text.StringField + :members: + :inherited-members: + +Classification Field +==================== +.. autoclass:: mindee.v1.parsing.standard.classification.ClassificationField + :members: + :inherited-members: + +Company Registration Field +========================== +.. autoclass:: mindee.v1.parsing.standard.company_registration.CompanyRegistrationField + :members: + :inherited-members: + +Date Field +========== +.. autoclass:: mindee.v1.parsing.standard.date.DateField + :members: + :inherited-members: + +List of Taxes +============= +.. autoclass:: mindee.v1.parsing.standard.tax.Taxes + :members: + +Tax Line +======== +.. autoclass:: mindee.v1.parsing.standard.tax.TaxField + :members: + :inherited-members: + +Locale Field +============ +.. autoclass:: mindee.v1.parsing.standard.locale.LocaleField + :members: + :inherited-members: + +Payment Details +=============== +.. autoclass:: mindee.v1.parsing.standard.payment_details.PaymentDetailsField + :members: + :inherited-members: + +Position +======== +.. autoclass:: mindee.v1.parsing.standard.position.PositionField + :members: + :inherited-members: diff --git a/docs/v1/pdf.rst b/docs/v1/pdf.rst new file mode 100644 index 00000000..947614fa --- /dev/null +++ b/docs/v1/pdf.rst @@ -0,0 +1,16 @@ +V1 PDF +###### + +Multi-Receipts Extractor +======================== +.. automodule:: mindee.v1.pdf.multi_receipts_extractor + :members: + :inherited-members: + + +PDF Extractor +============= +.. autoclass:: mindee.v1.pdf.pdf_extractor.PDFExtractor + :members: + :inherited-members: + diff --git a/docs/product/barcode_reader_v1.rst b/docs/v1/product/barcode_reader_v1.rst similarity index 55% rename from docs/product/barcode_reader_v1.rst rename to docs/v1/product/barcode_reader_v1.rst index 63f44f8c..ff0598be 100644 --- a/docs/product/barcode_reader_v1.rst +++ b/docs/v1/product/barcode_reader_v1.rst @@ -6,10 +6,10 @@ Barcode Reader V1 .. literalinclude:: /extras/code_samples/barcode_reader_v1.txt :language: Python -.. autoclass:: mindee.product.barcode_reader.barcode_reader_v1.BarcodeReaderV1 +.. autoclass:: mindee.v1.product.barcode_reader.barcode_reader_v1.BarcodeReaderV1 :members: :inherited-members: -.. autoclass:: mindee.product.barcode_reader.barcode_reader_v1_document.BarcodeReaderV1Document +.. autoclass:: mindee.v1.product.barcode_reader.barcode_reader_v1_document.BarcodeReaderV1Document :members: :inherited-members: diff --git a/docs/product/cropper_v1.rst b/docs/v1/product/cropper_v1.rst similarity index 53% rename from docs/product/cropper_v1.rst rename to docs/v1/product/cropper_v1.rst index cda53391..bb80dc0a 100644 --- a/docs/product/cropper_v1.rst +++ b/docs/v1/product/cropper_v1.rst @@ -6,14 +6,14 @@ Cropper V1 .. literalinclude:: /extras/code_samples/cropper_v1.txt :language: Python -.. autoclass:: mindee.product.cropper.cropper_v1.CropperV1 +.. autoclass:: mindee.v1.product.cropper.cropper_v1.CropperV1 :members: :inherited-members: -.. autoclass:: mindee.product.cropper.cropper_v1_document.CropperV1Document +.. autoclass:: mindee.v1.product.cropper.cropper_v1_document.CropperV1Document :members: :inherited-members: -.. autoclass:: mindee.product.cropper.cropper_v1_page.CropperV1Page +.. autoclass:: mindee.v1.product.cropper.cropper_v1_page.CropperV1Page :members: :inherited-members: diff --git a/docs/product/custom_v1.rst b/docs/v1/product/custom_v1.rst similarity index 55% rename from docs/product/custom_v1.rst rename to docs/v1/product/custom_v1.rst index 762447a2..e3183515 100644 --- a/docs/product/custom_v1.rst +++ b/docs/v1/product/custom_v1.rst @@ -6,14 +6,14 @@ Custom V1 .. literalinclude:: /extras/code_samples/custom_v1.txt :language: Python -.. autoclass:: mindee.product.custom.custom_v1.CustomV1 +.. autoclass:: mindee.v1.product.custom.custom_v1.CustomV1 :members: :inherited-members: -.. autoclass:: mindee.product.custom.custom_v1.CustomV1Document +.. autoclass:: mindee.v1.product.custom.custom_v1.CustomV1Document :members: :inherited-members: -.. autoclass:: mindee.product.custom.custom_v1.CustomV1Page +.. autoclass:: mindee.v1.product.custom.custom_v1.CustomV1Page :members: :inherited-members: diff --git a/docs/v1/product/financial_document_v1.rst b/docs/v1/product/financial_document_v1.rst new file mode 100644 index 00000000..61148951 --- /dev/null +++ b/docs/v1/product/financial_document_v1.rst @@ -0,0 +1,19 @@ +Financial Document V1 +--------------------- + +**Sample Code:** + +.. literalinclude:: /extras/code_samples/financial_document_v1_async.txt + :language: Python + +.. autoclass:: mindee.v1.product.financial_document.financial_document_v1.FinancialDocumentV1 + :members: + :inherited-members: + +.. autoclass:: mindee.v1.product.financial_document.financial_document_v1_document.FinancialDocumentV1Document + :members: + :inherited-members: + +.. autoclass:: mindee.v1.product.financial_document.financial_document_v1_line_item.FinancialDocumentV1LineItem + :members: + :inherited-members: diff --git a/docs/product/fr/bank_account_details_v1.rst b/docs/v1/product/fr/bank_account_details_v1.rst similarity index 52% rename from docs/product/fr/bank_account_details_v1.rst rename to docs/v1/product/fr/bank_account_details_v1.rst index e95548b1..55164faf 100644 --- a/docs/product/fr/bank_account_details_v1.rst +++ b/docs/v1/product/fr/bank_account_details_v1.rst @@ -6,10 +6,10 @@ Bank Account Details V1 .. literalinclude:: /extras/code_samples/bank_account_details_v1.txt :language: Python -.. autoclass:: mindee.product.fr.bank_account_details.bank_account_details_v1.BankAccountDetailsV1 +.. autoclass:: mindee.v1.product.fr.bank_account_details.bank_account_details_v1.BankAccountDetailsV1 :members: :inherited-members: -.. autoclass:: mindee.product.fr.bank_account_details.bank_account_details_v1_document.BankAccountDetailsV1Document +.. autoclass:: mindee.v1.product.fr.bank_account_details.bank_account_details_v1_document.BankAccountDetailsV1Document :members: :inherited-members: diff --git a/docs/v1/product/fr/bank_account_details_v2.rst b/docs/v1/product/fr/bank_account_details_v2.rst new file mode 100644 index 00000000..66d362c1 --- /dev/null +++ b/docs/v1/product/fr/bank_account_details_v2.rst @@ -0,0 +1,19 @@ +Bank Account Details V2 +----------------------- + +**Sample Code:** + +.. literalinclude:: /extras/code_samples/bank_account_details_v2.txt + :language: Python + +.. autoclass:: mindee.v1.product.fr.bank_account_details.bank_account_details_v2.BankAccountDetailsV2 + :members: + :inherited-members: + +.. autoclass:: mindee.v1.product.fr.bank_account_details.bank_account_details_v2_document.BankAccountDetailsV2Document + :members: + :inherited-members: + +.. autoclass:: mindee.v1.product.fr.bank_account_details.bank_account_details_v2_bban.BankAccountDetailsV2Bban + :members: + :inherited-members: diff --git a/docs/product/fr/carte_grise_v1.rst b/docs/v1/product/fr/carte_grise_v1.rst similarity index 55% rename from docs/product/fr/carte_grise_v1.rst rename to docs/v1/product/fr/carte_grise_v1.rst index 7a0a8545..e266a959 100644 --- a/docs/product/fr/carte_grise_v1.rst +++ b/docs/v1/product/fr/carte_grise_v1.rst @@ -6,10 +6,10 @@ Carte Grise V1 .. literalinclude:: /extras/code_samples/carte_grise_v1.txt :language: Python -.. autoclass:: mindee.product.fr.carte_grise.carte_grise_v1.CarteGriseV1 +.. autoclass:: mindee.v1.product.fr.carte_grise.carte_grise_v1.CarteGriseV1 :members: :inherited-members: -.. autoclass:: mindee.product.fr.carte_grise.carte_grise_v1_document.CarteGriseV1Document +.. autoclass:: mindee.v1.product.fr.carte_grise.carte_grise_v1_document.CarteGriseV1Document :members: :inherited-members: diff --git a/docs/product/fr/id_card_v1.rst b/docs/v1/product/fr/id_card_v1.rst similarity index 56% rename from docs/product/fr/id_card_v1.rst rename to docs/v1/product/fr/id_card_v1.rst index 300a8cf1..4b0aa676 100644 --- a/docs/product/fr/id_card_v1.rst +++ b/docs/v1/product/fr/id_card_v1.rst @@ -6,14 +6,14 @@ Carte Nationale d'Identité V1 .. literalinclude:: /extras/code_samples/idcard_fr_v1.txt :language: Python -.. autoclass:: mindee.product.fr.id_card.id_card_v1.IdCardV1 +.. autoclass:: mindee.v1.product.fr.id_card.id_card_v1.IdCardV1 :members: :inherited-members: -.. autoclass:: mindee.product.fr.id_card.id_card_v1_document.IdCardV1Document +.. autoclass:: mindee.v1.product.fr.id_card.id_card_v1_document.IdCardV1Document :members: :inherited-members: -.. autoclass:: mindee.product.fr.id_card.id_card_v1_page.IdCardV1Page +.. autoclass:: mindee.v1.product.fr.id_card.id_card_v1_page.IdCardV1Page :members: :inherited-members: diff --git a/docs/product/fr/id_card_v2.rst b/docs/v1/product/fr/id_card_v2.rst similarity index 56% rename from docs/product/fr/id_card_v2.rst rename to docs/v1/product/fr/id_card_v2.rst index 82d69a0c..99af0bb9 100644 --- a/docs/product/fr/id_card_v2.rst +++ b/docs/v1/product/fr/id_card_v2.rst @@ -6,14 +6,14 @@ Carte Nationale d'Identité V2 .. literalinclude:: /extras/code_samples/idcard_fr_v2.txt :language: Python -.. autoclass:: mindee.product.fr.id_card.id_card_v2.IdCardV2 +.. autoclass:: mindee.v1.product.fr.id_card.id_card_v2.IdCardV2 :members: :inherited-members: -.. autoclass:: mindee.product.fr.id_card.id_card_v2_document.IdCardV2Document +.. autoclass:: mindee.v1.product.fr.id_card.id_card_v2_document.IdCardV2Document :members: :inherited-members: -.. autoclass:: mindee.product.fr.id_card.id_card_v2_page.IdCardV2Page +.. autoclass:: mindee.v1.product.fr.id_card.id_card_v2_page.IdCardV2Page :members: :inherited-members: diff --git a/docs/product/fr/index.rst b/docs/v1/product/fr/index.rst similarity index 100% rename from docs/product/fr/index.rst rename to docs/v1/product/fr/index.rst diff --git a/docs/product/generated_v1.rst b/docs/v1/product/generated_v1.rst similarity index 62% rename from docs/product/generated_v1.rst rename to docs/v1/product/generated_v1.rst index c4654c45..2866b8b4 100644 --- a/docs/product/generated_v1.rst +++ b/docs/v1/product/generated_v1.rst @@ -12,14 +12,14 @@ Generated V1 .. literalinclude:: /extras/code_samples/default_async.txt :language: Python -.. autoclass:: mindee.product.generated.generated_v1.GeneratedV1 +.. autoclass:: mindee.v1.product.generated.generated_v1.GeneratedV1 :members: :inherited-members: -.. autoclass:: mindee.product.generated.generated_v1.GeneratedV1Document +.. autoclass:: mindee.v1.product.generated.generated_v1.GeneratedV1Document :members: :inherited-members: -.. autoclass:: mindee.product.generated.generated_v1.GeneratedV1Page +.. autoclass:: mindee.v1.product.generated.generated_v1.GeneratedV1Page :members: :inherited-members: diff --git a/docs/product/index.rst b/docs/v1/product/index.rst similarity index 82% rename from docs/product/index.rst rename to docs/v1/product/index.rst index ef773210..d1f26a33 100644 --- a/docs/product/index.rst +++ b/docs/v1/product/index.rst @@ -1,6 +1,6 @@ -------- -Product -------- +----------- +V1 Products +----------- Region-Specific diff --git a/docs/product/international_id_v2.rst b/docs/v1/product/international_id_v2.rst similarity index 54% rename from docs/product/international_id_v2.rst rename to docs/v1/product/international_id_v2.rst index 04a0206c..af4a2b43 100644 --- a/docs/product/international_id_v2.rst +++ b/docs/v1/product/international_id_v2.rst @@ -6,10 +6,10 @@ International ID V2 .. literalinclude:: /extras/code_samples/international_id_v2_async.txt :language: Python -.. autoclass:: mindee.product.international_id.international_id_v2.InternationalIdV2 +.. autoclass:: mindee.v1.product.international_id.international_id_v2.InternationalIdV2 :members: :inherited-members: -.. autoclass:: mindee.product.international_id.international_id_v2_document.InternationalIdV2Document +.. autoclass:: mindee.v1.product.international_id.international_id_v2_document.InternationalIdV2Document :members: :inherited-members: diff --git a/docs/v1/product/invoice_splitter_v1.rst b/docs/v1/product/invoice_splitter_v1.rst new file mode 100644 index 00000000..648ef2cb --- /dev/null +++ b/docs/v1/product/invoice_splitter_v1.rst @@ -0,0 +1,19 @@ +Invoice Splitter V1 +------------------- + +**Sample Code:** + +.. literalinclude:: /extras/code_samples/invoice_splitter_v1_async.txt + :language: Python + +.. autoclass:: mindee.v1.product.invoice_splitter.invoice_splitter_v1.InvoiceSplitterV1 + :members: + :inherited-members: + +.. autoclass:: mindee.v1.product.invoice_splitter.invoice_splitter_v1_document.InvoiceSplitterV1Document + :members: + :inherited-members: + +.. autoclass:: mindee.v1.product.invoice_splitter.invoice_splitter_v1_invoice_page_group.InvoiceSplitterV1InvoicePageGroup + :members: + :inherited-members: diff --git a/docs/product/invoice_v4.rst b/docs/v1/product/invoice_v4.rst similarity index 52% rename from docs/product/invoice_v4.rst rename to docs/v1/product/invoice_v4.rst index 03698156..154cef22 100644 --- a/docs/product/invoice_v4.rst +++ b/docs/v1/product/invoice_v4.rst @@ -6,14 +6,14 @@ Invoice V4 .. literalinclude:: /extras/code_samples/invoices_v4_async.txt :language: Python -.. autoclass:: mindee.product.invoice.invoice_v4.InvoiceV4 +.. autoclass:: mindee.v1.product.invoice.invoice_v4.InvoiceV4 :members: :inherited-members: -.. autoclass:: mindee.product.invoice.invoice_v4_document.InvoiceV4Document +.. autoclass:: mindee.v1.product.invoice.invoice_v4_document.InvoiceV4Document :members: :inherited-members: -.. autoclass:: mindee.product.invoice.invoice_v4_line_item.InvoiceV4LineItem +.. autoclass:: mindee.v1.product.invoice.invoice_v4_line_item.InvoiceV4LineItem :members: :inherited-members: diff --git a/docs/product/multi_receipts_detector_v1.rst b/docs/v1/product/multi_receipts_detector_v1.rst similarity index 51% rename from docs/product/multi_receipts_detector_v1.rst rename to docs/v1/product/multi_receipts_detector_v1.rst index e41229ba..c43375fe 100644 --- a/docs/product/multi_receipts_detector_v1.rst +++ b/docs/v1/product/multi_receipts_detector_v1.rst @@ -6,10 +6,10 @@ Multi Receipts Detector V1 .. literalinclude:: /extras/code_samples/multi_receipts_detector_v1.txt :language: Python -.. autoclass:: mindee.product.multi_receipts_detector.multi_receipts_detector_v1.MultiReceiptsDetectorV1 +.. autoclass:: mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1.MultiReceiptsDetectorV1 :members: :inherited-members: -.. autoclass:: mindee.product.multi_receipts_detector.multi_receipts_detector_v1_document.MultiReceiptsDetectorV1Document +.. autoclass:: mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1_document.MultiReceiptsDetectorV1Document :members: :inherited-members: diff --git a/docs/product/passport_v1.rst b/docs/v1/product/passport_v1.rst similarity index 58% rename from docs/product/passport_v1.rst rename to docs/v1/product/passport_v1.rst index f9f92169..f5e9d6bd 100644 --- a/docs/product/passport_v1.rst +++ b/docs/v1/product/passport_v1.rst @@ -6,10 +6,10 @@ Passport V1 .. literalinclude:: /extras/code_samples/passport_v1.txt :language: Python -.. autoclass:: mindee.product.passport.passport_v1.PassportV1 +.. autoclass:: mindee.v1.product.passport.passport_v1.PassportV1 :members: :inherited-members: -.. autoclass:: mindee.product.passport.passport_v1_document.PassportV1Document +.. autoclass:: mindee.v1.product.passport.passport_v1_document.PassportV1Document :members: :inherited-members: diff --git a/docs/product/receipt_v5.rst b/docs/v1/product/receipt_v5.rst similarity index 53% rename from docs/product/receipt_v5.rst rename to docs/v1/product/receipt_v5.rst index 2003f064..12ad67b6 100644 --- a/docs/product/receipt_v5.rst +++ b/docs/v1/product/receipt_v5.rst @@ -6,14 +6,14 @@ Receipt V5 .. literalinclude:: /extras/code_samples/expense_receipts_v5_async.txt :language: Python -.. autoclass:: mindee.product.receipt.receipt_v5.ReceiptV5 +.. autoclass:: mindee.v1.product.receipt.receipt_v5.ReceiptV5 :members: :inherited-members: -.. autoclass:: mindee.product.receipt.receipt_v5_document.ReceiptV5Document +.. autoclass:: mindee.v1.product.receipt.receipt_v5_document.ReceiptV5Document :members: :inherited-members: -.. autoclass:: mindee.product.receipt.receipt_v5_line_item.ReceiptV5LineItem +.. autoclass:: mindee.v1.product.receipt.receipt_v5_line_item.ReceiptV5LineItem :members: :inherited-members: diff --git a/docs/product/us/bank_check_v1.rst b/docs/v1/product/us/bank_check_v1.rst similarity index 50% rename from docs/product/us/bank_check_v1.rst rename to docs/v1/product/us/bank_check_v1.rst index 9cbb8604..06decc31 100644 --- a/docs/product/us/bank_check_v1.rst +++ b/docs/v1/product/us/bank_check_v1.rst @@ -6,14 +6,14 @@ Bank Check V1 .. literalinclude:: /extras/code_samples/bank_check_v1.txt :language: Python -.. autoclass:: mindee.product.us.bank_check.bank_check_v1.BankCheckV1 +.. autoclass:: mindee.v1.product.us.bank_check.bank_check_v1.BankCheckV1 :members: :inherited-members: -.. autoclass:: mindee.product.us.bank_check.bank_check_v1_document.BankCheckV1Document +.. autoclass:: mindee.v1.product.us.bank_check.bank_check_v1_document.BankCheckV1Document :members: :inherited-members: -.. autoclass:: mindee.product.us.bank_check.bank_check_v1_page.BankCheckV1Page +.. autoclass:: mindee.v1.product.us.bank_check.bank_check_v1_page.BankCheckV1Page :members: :inherited-members: diff --git a/docs/product/us/index.rst b/docs/v1/product/us/index.rst similarity index 100% rename from docs/product/us/index.rst rename to docs/v1/product/us/index.rst diff --git a/docs/v2/client_options.rst b/docs/v2/client_options.rst new file mode 100644 index 00000000..22842a12 --- /dev/null +++ b/docs/v2/client_options.rst @@ -0,0 +1,8 @@ +V2 Client Options +################# + +Base Parameters +=============== +.. autoclass:: mindee.v2.client_options.base_parameters.BaseParameters + :members: + :inherited-members: diff --git a/docs/v2/error.rst b/docs/v2/error.rst new file mode 100644 index 00000000..0718ad71 --- /dev/null +++ b/docs/v2/error.rst @@ -0,0 +1,14 @@ +V2 Error +######## + +Mindee API V2 Error +=================== +.. autoclass:: mindee.v2.error.mindee_api_v2_error.MindeeAPIV2Error + :members: + :inherited-members: + +Mindee HTTP Error V2 +==================== +.. autoclass:: mindee.v2.error.mindee_http_error_v2.MindeeHTTPErrorV2 + :members: + :inherited-members: diff --git a/docs/v2/file_operations.rst b/docs/v2/file_operations.rst new file mode 100644 index 00000000..55d0a194 --- /dev/null +++ b/docs/v2/file_operations.rst @@ -0,0 +1,26 @@ +File Operations +############### + +Crop +==== +.. automodule:: mindee.v2.file_operations.crop + :members: + :inherited-members: + +Crop Files +========== +.. autoclass:: mindee.v2.file_operations.crop_files.CropFiles + :members: + :inherited-members: + +Split +===== +.. automodule:: mindee.v2.file_operations.split + :members: + :inherited-members: + +Split Files +=========== +.. autoclass:: mindee.v2.file_operations.split_files.SplitFiles + :members: + :inherited-members: diff --git a/docs/v2/index.rst b/docs/v2/index.rst new file mode 100644 index 00000000..2f3aed59 --- /dev/null +++ b/docs/v2/index.rst @@ -0,0 +1,20 @@ +V2 Utilities +############ + +.. toctree:: + :maxdepth: 3 + + ./client_options + ./error + ./file_operations + ./mindee_http + ./parsing/index + ./product/index + + + +Client V2 +######### +.. autoclass:: mindee.v2.client.Client + :members: + :inherited-members: diff --git a/docs/v2/mindee_http.rst b/docs/v2/mindee_http.rst new file mode 100644 index 00000000..5037d5c8 --- /dev/null +++ b/docs/v2/mindee_http.rst @@ -0,0 +1,14 @@ +V2 Mindee HTTP +############## + +Mindee API V2 +============= +.. autoclass:: mindee.v2.mindee_http.mindee_api_v2.MindeeAPIV2 + :members: + :inherited-members: + +Response Validation V2 +====================== +.. automodule:: mindee.v2.mindee_http.response_validation_v2 + :members: + :inherited-members: diff --git a/docs/v2/parsing/index.rst b/docs/v2/parsing/index.rst new file mode 100644 index 00000000..2a703250 --- /dev/null +++ b/docs/v2/parsing/index.rst @@ -0,0 +1,8 @@ +---------- +V2 Parsing +---------- + +.. toctree:: + :maxdepth: 3 + + ./inference/index \ No newline at end of file diff --git a/docs/v2/parsing/inference/field.rst b/docs/v2/parsing/inference/field.rst new file mode 100644 index 00000000..50c4b773 --- /dev/null +++ b/docs/v2/parsing/inference/field.rst @@ -0,0 +1,51 @@ +Inference Field +=============== + +Base Field +---------- +.. autoclass:: mindee.v2.parsing.inference.field.base_field.BaseField + :members: + :inherited-members: + +Dynamic Field +------------- +.. autoclass:: mindee.v2.parsing.inference.field.base_field.DynamicField + :members: + :inherited-members: + +Field Confidence +---------------- +.. autoclass:: mindee.v2.parsing.inference.field.field_confidence.FieldConfidence + :members: + :inherited-members: + +Field Location +-------------- +.. autoclass:: mindee.v2.parsing.inference.field.field_location.FieldLocation + :members: + :inherited-members: + +Inference Fields +---------------- +.. autoclass:: mindee.v2.parsing.inference.field.inference_fields.InferenceFields + :members: + :inherited-members: + + +List Field +---------- +.. autoclass:: mindee.v2.parsing.inference.field.list_field.ListField + :members: + :inherited-members: + +Object Field +------------ +.. autoclass:: mindee.v2.parsing.inference.field.object_field.ObjectField + :members: + :inherited-members: + +Simple Field +------------ +.. autoclass:: mindee.v2.parsing.inference.field.simple_field.SimpleField + :members: + :inherited-members: diff --git a/docs/v2/parsing/inference/index.rst b/docs/v2/parsing/inference/index.rst new file mode 100644 index 00000000..7a6721d5 --- /dev/null +++ b/docs/v2/parsing/inference/index.rst @@ -0,0 +1,95 @@ +------------ +Inference V2 +------------ + +.. toctree:: + :maxdepth: 3 + + ./field + + +Base Inference +============== +.. autoclass:: mindee.v2.parsing.inference.base_inference.BaseInference + :members: + :inherited-members: + +Base Response +============= +.. autoclass:: mindee.v2.parsing.inference.base_response.BaseResponse + :members: + :inherited-members: + + +Error Item +========== +.. autoclass:: mindee.v2.parsing.inference.error_item.ErrorItem + :members: + :inherited-members: + +Error Response +============== +.. autoclass:: mindee.v2.parsing.inference.error_response.ErrorResponse + :members: + :inherited-members: + +Inference Active Options +======================== +.. autoclass:: mindee.v2.parsing.inference.inference_active_options.InferenceActiveOptions + :members: + :inherited-members: + +Inference File +=============== +.. autoclass:: mindee.v2.parsing.inference.inference_file.InferenceFile + :members: + :inherited-members: + +Inference Job +============= +.. autoclass:: mindee.v2.parsing.inference.inference_job.InferenceJob + :members: + :inherited-members: + +Inference Model +================= +.. autoclass:: mindee.v2.parsing.inference.inference_model.InferenceModel + :members: + :inherited-members: + +Job +=== +.. autoclass:: mindee.v2.parsing.inference.job.Job + :members: + :inherited-members: + +Job Response +============ +.. autoclass:: mindee.v2.parsing.inference.job_response.JobResponse + :members: + :inherited-members: + +Job Webhook +=========== +.. autoclass:: mindee.v2.parsing.inference.job_webhook.JobWebhook + :members: + :inherited-members: + +RAG Metadata +============ +.. autoclass:: mindee.v2.parsing.inference.rag_metadata.RAGMetadata + :members: + :inherited-members: + +Raw Text +======== +.. autoclass:: mindee.v2.parsing.inference.raw_text.RawText + :members: + :inherited-members: + + +Raw Text Page +============= +.. autoclass:: mindee.v2.parsing.inference.raw_text_page.RawTextPage + :members: + :inherited-members: diff --git a/docs/v2/product/classification/index.rst b/docs/v2/product/classification/index.rst new file mode 100644 index 00000000..9fb1b18a --- /dev/null +++ b/docs/v2/product/classification/index.rst @@ -0,0 +1,33 @@ +-------------- +Classification +-------------- + + +.. toctree:: + :maxdepth: 3 + + ./params + +Classification Classifier +========================= +.. autoclass:: mindee.v2.product.classification.classification_classifier.ClassificationClassifier + :members: + :inherited-members: + +Classification Inference +======================== +.. autoclass:: mindee.v2.product.classification.classification_inference.ClassificationInference + :members: + :inherited-members: + +Classification Response +======================= +.. autoclass:: mindee.v2.product.classification.classification_response.ClassificationResponse + :members: + :inherited-members: + +Classification Result +===================== +.. autoclass:: mindee.v2.product.classification.classification_result.ClassificationResult + :members: + :inherited-members: diff --git a/docs/v2/product/classification/params.rst b/docs/v2/product/classification/params.rst new file mode 100644 index 00000000..e3c9889a --- /dev/null +++ b/docs/v2/product/classification/params.rst @@ -0,0 +1,9 @@ +Classification Params +===================== + +Classification Parameters +------------------------- + +.. autoclass:: mindee.v2.product.classification.params.classification_parameters.ClassificationParameters + :members: + :inherited-members: diff --git a/docs/v2/product/crop/index.rst b/docs/v2/product/crop/index.rst new file mode 100644 index 00000000..6f0c342b --- /dev/null +++ b/docs/v2/product/crop/index.rst @@ -0,0 +1,39 @@ +---- +Crop +---- + + +.. toctree:: + :maxdepth: 3 + + ./params + +Crop Box +======== +.. autoclass:: mindee.v2.product.crop.crop_box.CropBox + :members: + :inherited-members: + +Crop Item +========= +.. autoclass:: mindee.v2.product.crop.crop_item.CropItem + :members: + :inherited-members: + +Crop Inference +============== +.. autoclass:: mindee.v2.product.crop.crop_inference.CropInference + :members: + :inherited-members: + +Crop Response +============= +.. autoclass:: mindee.v2.product.crop.crop_response.CropResponse + :members: + :inherited-members: + +Crop Result +=========== +.. autoclass:: mindee.v2.product.crop.crop_result.CropResult + :members: + :inherited-members: diff --git a/docs/v2/product/crop/params.rst b/docs/v2/product/crop/params.rst new file mode 100644 index 00000000..ba98bc69 --- /dev/null +++ b/docs/v2/product/crop/params.rst @@ -0,0 +1,9 @@ +Crop Params +=========== + +Crop Parameters +--------------- + +.. autoclass:: mindee.v2.product.crop.params.crop_parameters.CropParameters + :members: + :inherited-members: diff --git a/docs/v2/product/extraction/index.rst b/docs/v2/product/extraction/index.rst new file mode 100644 index 00000000..66250a74 --- /dev/null +++ b/docs/v2/product/extraction/index.rst @@ -0,0 +1,27 @@ +---------- +Extraction +---------- + + +.. toctree:: + :maxdepth: 3 + + ./params + +Extraction Inference +==================== +.. autoclass:: mindee.v2.product.extraction.extraction_inference.ExtractionInference + :members: + :inherited-members: + +Extraction Response +=================== +.. autoclass:: mindee.v2.product.extraction.extraction_response.ExtractionResponse + :members: + :inherited-members: + +Extraction Result +================= +.. autoclass:: mindee.v2.product.extraction.extraction_result.ExtractionResult + :members: + :inherited-members: diff --git a/docs/v2/product/extraction/params.rst b/docs/v2/product/extraction/params.rst new file mode 100644 index 00000000..dfeda273 --- /dev/null +++ b/docs/v2/product/extraction/params.rst @@ -0,0 +1,32 @@ +Extraction Params +================= + +Extraction Parameters +--------------------- +.. autoclass:: mindee.v2.product.extraction.params.extraction_parameters.ExtractionParameters + :members: + :inherited-members: + +Data Schema +----------- +.. autoclass:: mindee.v2.product.extraction.params.data_schema.DataSchema + :members: + :inherited-members: + +Data Schema Field +----------------- +.. autoclass:: mindee.v2.product.extraction.params.data_schema_field.DataSchemaField + :members: + :inherited-members: + +Data Schema Replace +------------------- +.. autoclass:: mindee.v2.product.extraction.params.data_schema_replace.DataSchemaReplace + :members: + :inherited-members: + +String Data Class +----------------- +.. autoclass:: mindee.v2.product.extraction.params.string_data_class.StringDataClass + :members: + :inherited-members: diff --git a/docs/v2/product/index.rst b/docs/v2/product/index.rst new file mode 100644 index 00000000..abd5f258 --- /dev/null +++ b/docs/v2/product/index.rst @@ -0,0 +1,12 @@ +----------- +V2 Products +----------- + +.. toctree:: + :maxdepth: 3 + + ./classification/index + ./crop/index + ./extraction/index + ./ocr/index + ./split/index diff --git a/docs/v2/product/ocr/index.rst b/docs/v2/product/ocr/index.rst new file mode 100644 index 00000000..8be77a15 --- /dev/null +++ b/docs/v2/product/ocr/index.rst @@ -0,0 +1,39 @@ +--- +OCR +--- + + +.. toctree:: + :maxdepth: 3 + + ./params + +OCR Page +======== +.. autoclass:: mindee.v2.product.ocr.ocr_page.OCRPage + :members: + :inherited-members: + +OCR Word +======== +.. autoclass:: mindee.v2.product.ocr.ocr_word.OCRWord + :members: + :inherited-members: + +Ocr Inference +============= +.. autoclass:: mindee.v2.product.ocr.ocr_inference.OCRInference + :members: + :inherited-members: + +OCR Response +============ +.. autoclass:: mindee.v2.product.ocr.ocr_response.OCRResponse + :members: + :inherited-members: + +OCR Result +========== +.. autoclass:: mindee.v2.product.ocr.ocr_result.OCRResult + :members: + :inherited-members: diff --git a/docs/v2/product/ocr/params.rst b/docs/v2/product/ocr/params.rst new file mode 100644 index 00000000..29ede70c --- /dev/null +++ b/docs/v2/product/ocr/params.rst @@ -0,0 +1,9 @@ +OCR Params +========== + +OCR Parameters +-------------- + +.. autoclass:: mindee.v2.product.ocr.params.ocr_parameters.OCRParameters + :members: + :inherited-members: diff --git a/docs/v2/product/split/index.rst b/docs/v2/product/split/index.rst new file mode 100644 index 00000000..3519cffc --- /dev/null +++ b/docs/v2/product/split/index.rst @@ -0,0 +1,33 @@ +----- +Split +----- + + +.. toctree:: + :maxdepth: 3 + + ./params + +Split Range +=========== +.. autoclass:: mindee.v2.product.split.split_range.SplitRange + :members: + :inherited-members: + +Split Inference +=============== +.. autoclass:: mindee.v2.product.split.split_inference.SplitInference + :members: + :inherited-members: + +Split Response +============== +.. autoclass:: mindee.v2.product.split.split_response.SplitResponse + :members: + :inherited-members: + +Split Result +============ +.. autoclass:: mindee.v2.product.split.split_result.SplitResult + :members: + :inherited-members: diff --git a/docs/v2/product/split/params.rst b/docs/v2/product/split/params.rst new file mode 100644 index 00000000..7d587f25 --- /dev/null +++ b/docs/v2/product/split/params.rst @@ -0,0 +1,9 @@ +Split Params +============ + +Split Parameters +---------------- + +.. autoclass:: mindee.v2.product.split.params.split_parameters.SplitParameters + :members: + :inherited-members: diff --git a/mindee/cli.py b/mindee/cli.py index 86fa8221..3a3f807d 100644 --- a/mindee/cli.py +++ b/mindee/cli.py @@ -1,4 +1,4 @@ -from mindee.commands.cli_parser import MindeeParser +from mindee.v1.commands.cli_parser import MindeeParser def main() -> None: diff --git a/mindee/commands/__init__.py b/mindee/commands/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/mindee/pdf/extracted_pdf.py b/mindee/pdf/extracted_pdf.py index d55a4a90..bad7e207 100644 --- a/mindee/pdf/extracted_pdf.py +++ b/mindee/pdf/extracted_pdf.py @@ -7,7 +7,7 @@ from mindee.input.bytes_input import BytesInput -class ExtractedPdf: +class ExtractedPDF: """An extracted sub-Pdf.""" pdf_bytes: BinaryIO diff --git a/mindee/pdf/pdf_extractor.py b/mindee/pdf/pdf_extractor.py index 25dd0028..fb16a54a 100644 --- a/mindee/pdf/pdf_extractor.py +++ b/mindee/pdf/pdf_extractor.py @@ -6,11 +6,11 @@ from PIL import Image from mindee.error.mindee_error import MindeeError -from mindee.pdf.extracted_pdf import ExtractedPdf +from mindee.pdf.extracted_pdf import ExtractedPDF from mindee.input.local_input_source import LocalInputSource -class PdfExtractor: +class PDFExtractor: """PDF extraction class.""" _source_pdf: BinaryIO @@ -47,14 +47,14 @@ def cut_pages(self, page_indexes: List) -> BinaryIO: def extract_sub_documents( self, page_indexes: List[List[int]] - ) -> List[ExtractedPdf]: + ) -> List[ExtractedPDF]: """ Extract the sub-documents from the main pdf, based on the given list of page indexes. :params page_indexes: List of list of numbers, representing page indexes. :return: A list of created PDFS. """ - extracted_pdfs: List[ExtractedPdf] = [] + extracted_pdfs: List[ExtractedPDF] = [] extension = Path(self._filename).suffix stem = Path(self._filename).stem for page_index_elem in page_indexes: @@ -65,7 +65,7 @@ def extract_sub_documents( raise MindeeError(f"Index {page_index} is out of range.") formatted_max_index = f"{page_index_elem[len(page_index_elem) - 1] + 1:03d}" field_filename = f"{stem}_{(page_index_elem[0] + 1):03d}-{formatted_max_index}{extension}" - extracted_pdf = ExtractedPdf( + extracted_pdf = ExtractedPDF( self.cut_pages(page_index_elem), field_filename ) extracted_pdfs.append(extracted_pdf) @@ -74,7 +74,7 @@ def extract_sub_documents( def extract_documents( self, page_indexes: List[List[int]], - ) -> List[ExtractedPdf]: + ) -> List[ExtractedPDF]: """ Extracts complete PDFs from the document. diff --git a/mindee/v1/commands/__init__.py b/mindee/v1/commands/__init__.py new file mode 100644 index 00000000..008d0ca7 --- /dev/null +++ b/mindee/v1/commands/__init__.py @@ -0,0 +1,9 @@ +from mindee.v1.commands.cli_products import CommandConfig, PRODUCTS +from mindee.v1.commands.cli_parser import MindeeParser, MindeeArgumentParser + +__all__ = [ + "CommandConfig", + "MindeeArgumentParser", + "MindeeParser", + "PRODUCTS", +] diff --git a/mindee/commands/cli_parser.py b/mindee/v1/commands/cli_parser.py similarity index 99% rename from mindee/commands/cli_parser.py rename to mindee/v1/commands/cli_parser.py index 577ccef2..473c27db 100644 --- a/mindee/commands/cli_parser.py +++ b/mindee/v1/commands/cli_parser.py @@ -11,7 +11,7 @@ URLInputSource, ) from mindee.v1.client import Client, Endpoint -from mindee.commands.cli_products import PRODUCTS, CommandConfig +from mindee.v1.commands.cli_products import PRODUCTS, CommandConfig from mindee.error.mindee_error import MindeeClientError from mindee.input.page_options import PageOptions from mindee.v1.parsing.common.async_predict_response import AsyncPredictResponse diff --git a/mindee/commands/cli_products.py b/mindee/v1/commands/cli_products.py similarity index 100% rename from mindee/commands/cli_products.py rename to mindee/v1/commands/cli_products.py diff --git a/mindee/v1/parsing/common/__init__.py b/mindee/v1/parsing/common/__init__.py index e08df2a7..4a9bf7ad 100644 --- a/mindee/v1/parsing/common/__init__.py +++ b/mindee/v1/parsing/common/__init__.py @@ -10,7 +10,7 @@ from mindee.v1.parsing.common.inference import Inference, TypeInference from mindee.v1.parsing.common.job import Job from mindee.v1.parsing.common.ocr.mvision_v1 import MVisionV1 -from mindee.v1.parsing.common.ocr.ocr import Ocr +from mindee.v1.parsing.common.ocr.ocr import OCR from mindee.v1.parsing.common.orientation import OrientationField from mindee.v1.parsing.common.page import Page from mindee.v1.parsing.common.predict_response import PredictResponse @@ -37,7 +37,7 @@ "Page", "PredictResponse", "MVisionV1", - "Ocr", + "OCR", "RequestStatus", "serialize_for_json", ] diff --git a/mindee/v1/parsing/common/document.py b/mindee/v1/parsing/common/document.py index 7d982375..ede62dbd 100644 --- a/mindee/v1/parsing/common/document.py +++ b/mindee/v1/parsing/common/document.py @@ -3,7 +3,7 @@ from mindee.v1.parsing.common.extras.extras import Extras from mindee.v1.parsing.common.inference import Inference -from mindee.v1.parsing.common.ocr.ocr import Ocr +from mindee.v1.parsing.common.ocr.ocr import OCR from mindee.v1.parsing.common.page import TypePage from mindee.v1.parsing.common.prediction import TypePrediction from mindee.parsing.common.string_dict import StringDict @@ -31,7 +31,7 @@ class Document(Generic[TypePrediction, TypePage]): """Id of the document as sent back by the server""" extras: Optional[Extras] = None """Potential Extras fields sent back along the prediction""" - ocr: Optional[Ocr] = None + ocr: Optional[OCR] = None """Potential raw text results read by the OCR (limited feature)""" n_pages: int """Amount of pages in the document""" @@ -44,7 +44,7 @@ def __init__( self.id = raw_response.get("id", "") self.filename = raw_response.get("name", "") if "ocr" in raw_response and raw_response["ocr"]: - self.ocr = Ocr(raw_response["ocr"]) + self.ocr = OCR(raw_response["ocr"]) if "extras" in raw_response and raw_response["inference"]["extras"]: self.extras = Extras(raw_response["extras"]) self._inject_full_text_ocr(raw_response) diff --git a/mindee/v1/parsing/common/extras/extras.py b/mindee/v1/parsing/common/extras/extras.py index 8dcb589a..ca4d7586 100644 --- a/mindee/v1/parsing/common/extras/extras.py +++ b/mindee/v1/parsing/common/extras/extras.py @@ -1,8 +1,8 @@ from typing import Optional from mindee.v1.parsing.common.extras.cropper_extra import CropperExtra -from mindee.v1.parsing.common.extras.full_text_ocr_extra import FullTextOcrExtra -from mindee.v1.parsing.common.extras.rag_extra import RagExtra +from mindee.v1.parsing.common.extras.full_text_ocr_extra import FullTextOCRExtra +from mindee.v1.parsing.common.extras.rag_extra import RAGExtra from mindee.parsing.common.string_dict import StringDict @@ -14,16 +14,16 @@ class Extras: """ cropper: Optional[CropperExtra] = None - full_text_ocr: Optional[FullTextOcrExtra] = None - rag: Optional[RagExtra] = None + full_text_ocr: Optional[FullTextOCRExtra] = None + rag: Optional[RAGExtra] = None def __init__(self, raw_prediction: StringDict) -> None: if "cropper" in raw_prediction and raw_prediction["cropper"]: self.cropper = CropperExtra(raw_prediction["cropper"]) if "full_text_ocr" in raw_prediction and raw_prediction["full_text_ocr"]: - self.full_text_ocr = FullTextOcrExtra(raw_prediction["full_text_ocr"]) + self.full_text_ocr = FullTextOCRExtra(raw_prediction["full_text_ocr"]) if "rag" in raw_prediction and raw_prediction["rag"]: - self.rag = RagExtra(raw_prediction["rag"]) + self.rag = RAGExtra(raw_prediction["rag"]) for key, extra in raw_prediction.items(): if key not in ["cropper", "full_text_ocr", "rag"]: setattr(self, key, extra) @@ -42,4 +42,4 @@ def add_artificial_extra(self, raw_prediction: StringDict): :params raw_prediction: Raw prediction used by the document. """ if "full_text_ocr" in raw_prediction and raw_prediction["full_text_ocr"]: - self.full_text_ocr = FullTextOcrExtra(raw_prediction["full_text_ocr"]) + self.full_text_ocr = FullTextOCRExtra(raw_prediction["full_text_ocr"]) diff --git a/mindee/v1/parsing/common/extras/full_text_ocr_extra.py b/mindee/v1/parsing/common/extras/full_text_ocr_extra.py index 489ee868..f877afa4 100644 --- a/mindee/v1/parsing/common/extras/full_text_ocr_extra.py +++ b/mindee/v1/parsing/common/extras/full_text_ocr_extra.py @@ -3,7 +3,7 @@ from mindee.parsing.common.string_dict import StringDict -class FullTextOcrExtra: +class FullTextOCRExtra: """Full Text OCR result.""" content: Optional[str] diff --git a/mindee/v1/parsing/common/extras/rag_extra.py b/mindee/v1/parsing/common/extras/rag_extra.py index 088675dd..79ad063b 100644 --- a/mindee/v1/parsing/common/extras/rag_extra.py +++ b/mindee/v1/parsing/common/extras/rag_extra.py @@ -3,7 +3,7 @@ from mindee.parsing.common.string_dict import StringDict -class RagExtra: +class RAGExtra: """Contains information on the Retrieval-Augmented-Generation of a prediction.""" matching_document_id: Optional[str] = None diff --git a/mindee/v1/parsing/common/ocr/__init__.py b/mindee/v1/parsing/common/ocr/__init__.py index ea56ce8c..4cf11d0d 100644 --- a/mindee/v1/parsing/common/ocr/__init__.py +++ b/mindee/v1/parsing/common/ocr/__init__.py @@ -1,3 +1,3 @@ -from mindee.v1.parsing.common.ocr.ocr import Ocr +from mindee.v1.parsing.common.ocr.ocr import OCR -__all__ = ["Ocr"] +__all__ = ["OCR"] diff --git a/mindee/v1/parsing/common/ocr/mvision_v1.py b/mindee/v1/parsing/common/ocr/mvision_v1.py index fb9afeb3..a8d5e890 100644 --- a/mindee/v1/parsing/common/ocr/mvision_v1.py +++ b/mindee/v1/parsing/common/ocr/mvision_v1.py @@ -1,18 +1,18 @@ from typing import List -from mindee.v1.parsing.common.ocr.ocr_page import OcrPage +from mindee.v1.parsing.common.ocr.ocr_page import OCRPage from mindee.parsing.common.string_dict import StringDict class MVisionV1: """Mindee Vision V1.""" - pages: List[OcrPage] + pages: List[OCRPage] """List of pages.""" def __init__(self, raw_prediction: StringDict) -> None: self.pages = [ - OcrPage(page_prediction) for page_prediction in raw_prediction["pages"] + OCRPage(page_prediction) for page_prediction in raw_prediction["pages"] ] def __str__(self) -> str: diff --git a/mindee/v1/parsing/common/ocr/ocr.py b/mindee/v1/parsing/common/ocr/ocr.py index b0b10986..a6cbdd0e 100644 --- a/mindee/v1/parsing/common/ocr/ocr.py +++ b/mindee/v1/parsing/common/ocr/ocr.py @@ -2,7 +2,7 @@ from mindee.parsing.common.string_dict import StringDict -class Ocr: +class OCR: """OCR extraction from the entire document.""" mvision_v1: MVisionV1 diff --git a/mindee/v1/parsing/common/ocr/ocr_line.py b/mindee/v1/parsing/common/ocr/ocr_line.py index a94ac815..6113abd5 100644 --- a/mindee/v1/parsing/common/ocr/ocr_line.py +++ b/mindee/v1/parsing/common/ocr/ocr_line.py @@ -1,10 +1,10 @@ from typing import List from mindee.geometry.minmax import get_min_max_x -from mindee.v1.parsing.common.ocr.ocr_word import OcrWord +from mindee.v1.parsing.common.ocr.ocr_word import OCRWord -class OcrLine(List[OcrWord]): +class OCRLine(List[OCRWord]): """A list of words which are on the same line.""" def sort_on_x(self) -> None: diff --git a/mindee/v1/parsing/common/ocr/ocr_page.py b/mindee/v1/parsing/common/ocr/ocr_page.py index f0795ff4..361c867e 100644 --- a/mindee/v1/parsing/common/ocr/ocr_page.py +++ b/mindee/v1/parsing/common/ocr/ocr_page.py @@ -3,20 +3,20 @@ from mindee.geometry.minmax import get_min_max_y from mindee.geometry.polygon import is_point_in_polygon_y from mindee.geometry.polygon_utils import get_centroid -from mindee.v1.parsing.common.ocr.ocr_line import OcrLine -from mindee.v1.parsing.common.ocr.ocr_word import OcrWord +from mindee.v1.parsing.common.ocr.ocr_line import OCRLine +from mindee.v1.parsing.common.ocr.ocr_word import OCRWord from mindee.parsing.common.string_dict import StringDict -class OcrPage: +class OCRPage: """OCR extraction for a single page.""" - _all_words: List[OcrWord] - _lines: List[OcrLine] + _all_words: List[OCRWord] + _lines: List[OCRLine] def __init__(self, raw_prediction: StringDict) -> None: self._all_words = [ - OcrWord(word_prediction) for word_prediction in raw_prediction["all_words"] + OCRWord(word_prediction) for word_prediction in raw_prediction["all_words"] ] # make sure words are sorted from top to bottom self._all_words.sort( @@ -25,7 +25,7 @@ def __init__(self, raw_prediction: StringDict) -> None: self._lines = [] @staticmethod - def _are_words_on_same_line(current_word: OcrWord, next_word: OcrWord) -> bool: + def _are_words_on_same_line(current_word: OCRWord, next_word: OCRWord) -> bool: """Determine if two words are on the same line.""" current_in_next = is_point_in_polygon_y( get_centroid(current_word.polygon), @@ -37,21 +37,21 @@ def _are_words_on_same_line(current_word: OcrWord, next_word: OcrWord) -> bool: # We need to check both to eliminate any issues due to word order. return current_in_next or next_in_current - def _to_lines(self) -> List[OcrLine]: + def _to_lines(self) -> List[OCRLine]: """Order all the words on the page into lines.""" - current: Optional[OcrWord] = None + current: Optional[OCRWord] = None indexes: List[int] = [] - lines: List[OcrLine] = [] + lines: List[OCRLine] = [] for _ in self._all_words: - line: OcrLine = OcrLine() + line: OCRLine = OCRLine() for idx, word in enumerate(self._all_words): if idx in indexes: continue if current is None: current = word indexes.append(idx) - line = OcrLine() + line = OCRLine() line.append(word) else: if self._are_words_on_same_line(current, word): @@ -64,14 +64,14 @@ def _to_lines(self) -> List[OcrLine]: return lines @property - def all_lines(self) -> List[OcrLine]: + def all_lines(self) -> List[OCRLine]: """All the words on the page, ordered in lines.""" if not self._lines: self._lines = self._to_lines() return self._lines @property - def all_words(self) -> List[OcrWord]: + def all_words(self) -> List[OCRWord]: """All the words on the page, in semi-random order.""" return self._all_words diff --git a/mindee/v1/parsing/common/ocr/ocr_word.py b/mindee/v1/parsing/common/ocr/ocr_word.py index 3af9ee6b..c5f2f9e4 100644 --- a/mindee/v1/parsing/common/ocr/ocr_word.py +++ b/mindee/v1/parsing/common/ocr/ocr_word.py @@ -2,7 +2,7 @@ from mindee.v1.parsing.standard.base import FieldPositionMixin -class OcrWord(FieldPositionMixin): +class OCRWord(FieldPositionMixin): """A single word.""" confidence: float diff --git a/mindee/v1/pdf/__init__.py b/mindee/v1/pdf/__init__.py index 577f5ced..35d056e4 100644 --- a/mindee/v1/pdf/__init__.py +++ b/mindee/v1/pdf/__init__.py @@ -1,4 +1,4 @@ -from mindee.v1.pdf.pdf_extractor import PdfExtractor +from mindee.v1.pdf.pdf_extractor import PDFExtractor from mindee.v1.pdf.multi_receipts_extractor import extract_receipts -__all__ = ["PdfExtractor", "extract_receipts"] +__all__ = ["PDFExtractor", "extract_receipts"] diff --git a/mindee/v1/pdf/pdf_extractor.py b/mindee/v1/pdf/pdf_extractor.py index d2d4ea2d..a622b4a3 100644 --- a/mindee/v1/pdf/pdf_extractor.py +++ b/mindee/v1/pdf/pdf_extractor.py @@ -1,19 +1,19 @@ from typing import List, Optional, Union from mindee.error import MindeeError -from mindee.pdf.extracted_pdf import ExtractedPdf -from mindee.pdf.pdf_extractor import PdfExtractor as BasePdfExtractor +from mindee.pdf.extracted_pdf import ExtractedPDF +from mindee.pdf.pdf_extractor import PDFExtractor as BasePDFExtractor from mindee.v1.product import InvoiceSplitterV1InvoicePageGroup -class PdfExtractor(BasePdfExtractor): +class PDFExtractor(BasePDFExtractor): """V1-specific PDF extractor.""" def extract_invoices( self, page_indexes: List[Union[InvoiceSplitterV1InvoicePageGroup, List[int]]], strict: bool = False, - ) -> List[ExtractedPdf]: + ) -> List[ExtractedPDF]: """ Extracts invoices as complete PDFs from the document from either a list of pages or a list of page groups. diff --git a/mindee/v2/file_operations/split.py b/mindee/v2/file_operations/split.py index bdf6ce3a..4f6ef31f 100644 --- a/mindee/v2/file_operations/split.py +++ b/mindee/v2/file_operations/split.py @@ -1,15 +1,15 @@ from typing import List, Union from mindee.error import MindeeError -from mindee.pdf.extracted_pdf import ExtractedPdf -from mindee.pdf.pdf_extractor import PdfExtractor +from mindee.pdf.extracted_pdf import ExtractedPDF +from mindee.pdf.pdf_extractor import PDFExtractor from mindee.input.local_input_source import LocalInputSource from mindee.v2.file_operations.split_files import SplitFiles def extract_single_split( input_source: LocalInputSource, split: List[int] -) -> ExtractedPdf: +) -> ExtractedPDF: """ Extracts a single split as a complete PDF from the document. @@ -31,7 +31,7 @@ def extract_splits( :params splits: List of sub-lists of pages to keep. :return: A list of extracted invoices. """ - pdf_extractor = PdfExtractor(input_source) + pdf_extractor = PDFExtractor(input_source) page_groups = [] for split in splits: page_groups.append(list(range(split[0], split[1] + 1))) diff --git a/mindee/v2/file_operations/split_files.py b/mindee/v2/file_operations/split_files.py index cbd2dafe..29189671 100644 --- a/mindee/v2/file_operations/split_files.py +++ b/mindee/v2/file_operations/split_files.py @@ -1,10 +1,10 @@ from pathlib import Path from typing import List, Union -from mindee.pdf.extracted_pdf import ExtractedPdf +from mindee.pdf.extracted_pdf import ExtractedPDF -class SplitFiles(List[ExtractedPdf]): +class SplitFiles(List[ExtractedPDF]): """Split files.""" def save_all_to_disk(self, path: Union[str, Path], prefix: str = "split"): diff --git a/mindee/v2/parsing/inference/rag_metadata.py b/mindee/v2/parsing/inference/rag_metadata.py index 40eb00a9..1dd89ebd 100644 --- a/mindee/v2/parsing/inference/rag_metadata.py +++ b/mindee/v2/parsing/inference/rag_metadata.py @@ -3,7 +3,7 @@ from mindee.parsing.common import StringDict -class RagMetadata: +class RAGMetadata: """Metadata about the RAG operation.""" retrieved_document_id: Optional[str] diff --git a/mindee/v2/product/extraction/extraction_result.py b/mindee/v2/product/extraction/extraction_result.py index 0844007d..30c056eb 100644 --- a/mindee/v2/product/extraction/extraction_result.py +++ b/mindee/v2/product/extraction/extraction_result.py @@ -2,7 +2,7 @@ from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.field import InferenceFields -from mindee.v2.parsing.inference.rag_metadata import RagMetadata +from mindee.v2.parsing.inference.rag_metadata import RAGMetadata from mindee.v2.parsing.inference.raw_text import RawText @@ -13,7 +13,7 @@ class ExtractionResult: """Fields contained in the inference.""" raw_text: Optional[RawText] = None """Potential options retrieved alongside the inference.""" - rag: Optional[RagMetadata] = None + rag: Optional[RAGMetadata] = None """RAG metadata.""" def __init__(self, raw_response: StringDict) -> None: @@ -21,7 +21,7 @@ def __init__(self, raw_response: StringDict) -> None: if raw_response.get("raw_text"): self.raw_text = RawText(raw_response["raw_text"]) if raw_response.get("rag"): - self.rag = RagMetadata(raw_response["rag"]) + self.rag = RAGMetadata(raw_response["rag"]) def __str__(self) -> str: out_str = f"Fields\n======{self.fields}" diff --git a/mindee/v2/product/split/split_range.py b/mindee/v2/product/split/split_range.py index ead8bb1f..15b702cb 100644 --- a/mindee/v2/product/split/split_range.py +++ b/mindee/v2/product/split/split_range.py @@ -1,7 +1,7 @@ from typing import List, Optional from mindee.v2.product.extraction.extraction_response import ExtractionResponse -from mindee.pdf.extracted_pdf import ExtractedPdf +from mindee.pdf.extracted_pdf import ExtractedPDF from mindee.input.local_input_source import LocalInputSource from mindee.parsing.common import StringDict from mindee.v2.file_operations.split import extract_single_split @@ -34,7 +34,7 @@ def __str__(self) -> str: page_range = ",".join([str(page_index) for page_index in self.page_range]) return f"* :Page Range: {page_range}\n :Document Type: {self.document_type}" - def extract_from_file(self, input_source: LocalInputSource) -> ExtractedPdf: + def extract_from_file(self, input_source: LocalInputSource) -> ExtractedPDF: """ Apply the split range inference to a file and return a single extracted PDF. diff --git a/tests/v1/extraction/test_invoice_splitter_auto_extraction.py b/tests/v1/extraction/test_invoice_splitter_auto_extraction.py index 4c0b6fd6..575cd12f 100644 --- a/tests/v1/extraction/test_invoice_splitter_auto_extraction.py +++ b/tests/v1/extraction/test_invoice_splitter_auto_extraction.py @@ -3,7 +3,7 @@ import pytest from mindee.v1.client import Client -from mindee.v1.pdf.pdf_extractor import PdfExtractor +from mindee.v1.pdf.pdf_extractor import PDFExtractor from mindee.input.path_input import PathInput from mindee.v1.parsing.common import Document from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 @@ -37,7 +37,7 @@ def test_pdf_should_extract_invoices_strict(): InvoiceSplitterV1, invoice_splitter_input, close_file=False ) inference = response.document.inference - pdf_extractor = PdfExtractor(invoice_splitter_input) + pdf_extractor = PDFExtractor(invoice_splitter_input) assert pdf_extractor.get_page_count() == 2 extracted_pdfs_not_strict = pdf_extractor.extract_invoices( diff --git a/tests/v1/extraction/test_pdf_extractor.py b/tests/v1/extraction/test_pdf_extractor.py index cf085a43..f93eee38 100644 --- a/tests/v1/extraction/test_pdf_extractor.py +++ b/tests/v1/extraction/test_pdf_extractor.py @@ -1,7 +1,7 @@ import pytest from mindee.v1.client import Client -from mindee.v1.pdf.pdf_extractor import PdfExtractor +from mindee.v1.pdf.pdf_extractor import PDFExtractor from mindee.input.local_response import LocalResponse from mindee.input.path_input import PathInput from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 @@ -36,7 +36,7 @@ def loaded_prediction(): def test_image_should_extract_pdf(invoice_default_sample_path): jpg_input = PathInput(invoice_default_sample_path) assert not jpg_input.is_pdf() - extractor = PdfExtractor(jpg_input) + extractor = PDFExtractor(jpg_input) assert extractor.get_page_count() == 1 @@ -44,7 +44,7 @@ def test_pdf_should_extract_invoices_no_strict( invoice_splitter_5p_path, loaded_prediction ): pdf_input = PathInput(invoice_splitter_5p_path) - extractor = PdfExtractor(pdf_input) + extractor = PDFExtractor(pdf_input) assert extractor.get_page_count() == 5 extracted_pdfs_no_strict = extractor.extract_invoices( loaded_prediction.invoice_page_groups @@ -65,7 +65,7 @@ def test_pdf_should_extract_invoices_strict( invoice_splitter_5p_path, loaded_prediction ): pdf_input = PathInput(invoice_splitter_5p_path) - extractor = PdfExtractor(pdf_input) + extractor = PDFExtractor(pdf_input) assert extractor.get_page_count() == 5 extracted_pdfs_strict = extractor.extract_invoices( loaded_prediction.invoice_page_groups, True diff --git a/tests/v1/parsing/common/test_ocr.py b/tests/v1/parsing/common/test_ocr.py index daa8706a..ca369aad 100644 --- a/tests/v1/parsing/common/test_ocr.py +++ b/tests/v1/parsing/common/test_ocr.py @@ -1,6 +1,6 @@ import json -from mindee.v1.parsing.common import Ocr +from mindee.v1.parsing.common import OCR from tests.utils import V1_DATA_DIR @@ -8,6 +8,6 @@ def test_response(): json_data = json.load(open(V1_DATA_DIR / "extras" / "ocr" / "complete.json")) with open(V1_DATA_DIR / "extras" / "ocr" / "ocr.txt") as file_handle: expected_text = file_handle.read() - ocr = Ocr(json_data["document"]["ocr"]) + ocr = OCR(json_data["document"]["ocr"]) assert str(ocr) == expected_text assert str(ocr.mvision_v1.pages[0]) == expected_text diff --git a/tests/v1/test_cli.py b/tests/v1/test_cli.py index 0d0d947d..88d636d4 100644 --- a/tests/v1/test_cli.py +++ b/tests/v1/test_cli.py @@ -3,7 +3,7 @@ import pytest -from mindee.commands.cli_parser import MindeeParser +from mindee.v1.commands import MindeeParser from mindee.error.mindee_http_error import MindeeHTTPError from tests.utils import FILE_TYPES_DIR, V1_PRODUCT_DATA_DIR, clear_envvars diff --git a/tests/v2/file_operations/test_crop_operation_integration.py b/tests/v2/file_operations/test_crop_operation_integration.py index f48b6f05..72d89611 100644 --- a/tests/v2/file_operations/test_crop_operation_integration.py +++ b/tests/v2/file_operations/test_crop_operation_integration.py @@ -53,7 +53,7 @@ def test_image_should_extract_crops(): extracted_images.save_all_to_disk(OUTPUT_DIR) crop1size = os.path.getsize(OUTPUT_DIR / "crop_001.jpg") crop2size = os.path.getsize(OUTPUT_DIR / "crop_002.jpg") - assert 187601 <= crop1size <= 199685 + assert 187484 <= crop1size <= 199685 assert crop2size == 197978 diff --git a/tests/v2/product/extraction/test_extraction_response.py b/tests/v2/product/extraction/test_extraction_response.py index 7973e02c..745afc39 100644 --- a/tests/v2/product/extraction/test_extraction_response.py +++ b/tests/v2/product/extraction/test_extraction_response.py @@ -12,7 +12,7 @@ from mindee.v2.product.extraction.extraction_inference import ExtractionInference from mindee.v2.parsing.inference.inference_file import InferenceFile from mindee.v2.parsing.inference.inference_model import InferenceModel -from mindee.v2.parsing.inference.rag_metadata import RagMetadata +from mindee.v2.parsing.inference.rag_metadata import RAGMetadata from tests.utils import V2_PRODUCT_DATA_DIR from tests.v2.product.utils import get_product_samples @@ -199,7 +199,7 @@ def test_rag_metadata_when_matched(): json_sample, _ = get_product_samples(product="extraction", file_name="rag_matched") response = ExtractionResponse(json_sample) rag = response.inference.result.rag - assert isinstance(rag, RagMetadata) + assert isinstance(rag, RAGMetadata) assert rag.retrieved_document_id == "12345abc-1234-1234-1234-123456789abc" assert response.inference.active_options.rag is True @@ -212,7 +212,7 @@ def test_rag_metadata_when_not_matched(): ) response = ExtractionResponse(json_sample) rag = response.inference.result.rag - assert isinstance(rag, RagMetadata) + assert isinstance(rag, RAGMetadata) assert rag.retrieved_document_id is None assert response.inference.active_options.rag is True From 5280d1cf9448905a5533a62f2be229f32600947a Mon Sep 17 00:00:00 2001 From: sebastianMindee <130448732+sebastianMindee@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:04:48 +0200 Subject: [PATCH 10/10] :muscle: :wrench: beef up rust criteria and fix many errors --- mindee/__init__.py | 30 +- mindee/error/__init__.py | 12 +- mindee/error/geometry_error.py | 2 +- mindee/error/mindee_http_error.py | 32 ++- mindee/geometry/__init__.py | 16 +- mindee/geometry/bbox.py | 6 +- mindee/geometry/minmax.py | 4 +- mindee/geometry/point.py | 3 +- mindee/geometry/polygon.py | 27 +- mindee/geometry/polygon_utils.py | 14 +- mindee/geometry/quadrilateral.py | 11 +- mindee/image/extracted_image.py | 20 +- mindee/image/image_compressor.py | 16 +- mindee/image/image_extractor.py | 38 +-- mindee/input/__init__.py | 4 +- mindee/input/base_64_input.py | 4 +- mindee/input/bytes_input.py | 4 +- mindee/input/file_input.py | 11 +- mindee/input/local_input_source.py | 54 ++-- mindee/input/local_response.py | 26 +- mindee/input/page_options.py | 3 +- mindee/input/path_input.py | 9 +- mindee/input/url_input_source.py | 89 +++--- mindee/mindee_http/response_validation.py | 28 +- mindee/mindee_http/settings_mixin.py | 5 +- mindee/parsing/common/__init__.py | 4 +- mindee/parsing/common/string_dict.py | 4 +- mindee/parsing/common/summary_helper.py | 5 +- mindee/pdf/extracted_pdf.py | 6 +- mindee/pdf/pdf_char_data.py | 5 +- mindee/pdf/pdf_compressor.py | 46 +-- mindee/pdf/pdf_extractor.py | 20 +- mindee/pdf/pdf_utils.py | 86 +++--- mindee/v1/__init__.py | 8 +- mindee/v1/client.py | 271 ++++++++++-------- mindee/v1/client_options/__init__.py | 4 +- mindee/v1/client_options/predict_options.py | 5 +- mindee/v1/client_options/workflow_options.py | 18 +- mindee/v1/commands/__init__.py | 6 +- mindee/v1/commands/cli_parser.py | 34 ++- mindee/v1/commands/cli_products.py | 6 +- mindee/v1/error/__init__.py | 1 - mindee/v1/mindee_http/base_endpoint.py | 6 +- mindee/v1/mindee_http/base_settings.py | 9 +- mindee/v1/mindee_http/endpoint.py | 73 +++-- mindee/v1/mindee_http/mindee_api.py | 13 +- mindee/v1/mindee_http/workflow_endpoint.py | 10 +- mindee/v1/mindee_http/workflow_settings.py | 13 +- mindee/v1/parsing/common/__init__.py | 12 +- mindee/v1/parsing/common/api_request.py | 3 +- mindee/v1/parsing/common/api_response.py | 2 +- .../parsing/common/async_predict_response.py | 12 +- mindee/v1/parsing/common/document.py | 12 +- mindee/v1/parsing/common/execution.py | 24 +- mindee/v1/parsing/common/execution_file.py | 6 +- mindee/v1/parsing/common/extras/__init__.py | 2 +- .../v1/parsing/common/extras/cropper_extra.py | 12 +- mindee/v1/parsing/common/extras/extras.py | 20 +- .../common/extras/full_text_ocr_extra.py | 6 +- mindee/v1/parsing/common/extras/rag_extra.py | 4 +- mindee/v1/parsing/common/feedback_response.py | 2 +- mindee/v1/parsing/common/inference.py | 26 +- mindee/v1/parsing/common/job.py | 7 +- mindee/v1/parsing/common/ocr/mvision_v1.py | 6 +- mindee/v1/parsing/common/ocr/ocr.py | 2 +- mindee/v1/parsing/common/ocr/ocr_line.py | 4 +- mindee/v1/parsing/common/ocr/ocr_page.py | 20 +- mindee/v1/parsing/common/orientation.py | 12 +- mindee/v1/parsing/common/page.py | 12 +- mindee/v1/parsing/common/predict_response.py | 8 +- mindee/v1/parsing/common/prediction.py | 8 +- mindee/v1/parsing/common/workflow_response.py | 6 +- mindee/v1/parsing/custom/__init__.py | 2 +- mindee/v1/parsing/custom/line_items.py | 38 +-- mindee/v1/parsing/custom/list.py | 16 +- mindee/v1/parsing/generated/generated_list.py | 14 +- .../v1/parsing/generated/generated_object.py | 21 +- mindee/v1/parsing/standard/__init__.py | 26 +- mindee/v1/parsing/standard/address.py | 26 +- mindee/v1/parsing/standard/amount.py | 12 +- mindee/v1/parsing/standard/base.py | 51 ++-- mindee/v1/parsing/standard/boolean.py | 14 +- mindee/v1/parsing/standard/classification.py | 12 +- .../parsing/standard/company_registration.py | 7 +- mindee/v1/parsing/standard/date.py | 15 +- mindee/v1/parsing/standard/locale.py | 24 +- mindee/v1/parsing/standard/payment_details.py | 28 +- mindee/v1/parsing/standard/position.py | 32 +-- mindee/v1/parsing/standard/tax.py | 28 +- mindee/v1/parsing/standard/text.py | 16 +- mindee/v1/pdf/__init__.py | 2 +- mindee/v1/pdf/multi_receipts_extractor.py | 10 +- mindee/v1/pdf/pdf_extractor.py | 16 +- mindee/v1/product/__init__.py | 13 +- .../barcode_reader/barcode_reader_v1.py | 8 +- .../barcode_reader_v1_document.py | 14 +- mindee/v1/product/cropper/cropper_v1.py | 8 +- mindee/v1/product/cropper/cropper_v1_page.py | 10 +- mindee/v1/product/custom/custom_v1.py | 8 +- .../v1/product/custom/custom_v1_document.py | 22 +- mindee/v1/product/custom/custom_v1_page.py | 22 +- .../financial_document_v1.py | 8 +- .../financial_document_v1_document.py | 20 +- .../financial_document_v1_line_item.py | 33 +-- .../bank_account_details_v1.py | 8 +- .../bank_account_details_v1_document.py | 10 +- .../bank_account_details_v2.py | 8 +- .../bank_account_details_v2_bban.py | 21 +- .../bank_account_details_v2_document.py | 10 +- .../product/fr/carte_grise/carte_grise_v1.py | 8 +- .../fr/carte_grise/carte_grise_v1_document.py | 10 +- mindee/v1/product/fr/id_card/id_card_v1.py | 8 +- .../product/fr/id_card/id_card_v1_document.py | 12 +- .../v1/product/fr/id_card/id_card_v1_page.py | 8 +- mindee/v1/product/fr/id_card/id_card_v2.py | 8 +- .../product/fr/id_card/id_card_v2_document.py | 12 +- .../v1/product/fr/id_card/id_card_v2_page.py | 8 +- mindee/v1/product/generated/generated_v1.py | 8 +- .../generated/generated_v1_document.py | 6 +- .../v1/product/generated/generated_v1_page.py | 10 +- .../generated/generated_v1_prediction.py | 15 +- .../international_id/international_id_v2.py | 8 +- .../international_id_v2_document.py | 14 +- mindee/v1/product/invoice/invoice_v4.py | 8 +- .../v1/product/invoice/invoice_v4_document.py | 20 +- .../product/invoice/invoice_v4_line_item.py | 33 +-- .../invoice_splitter/invoice_splitter_v1.py | 8 +- .../invoice_splitter_v1_document.py | 12 +- .../invoice_splitter_v1_invoice_page_group.py | 19 +- .../multi_receipts_detector_v1.py | 8 +- .../multi_receipts_detector_v1_document.py | 12 +- mindee/v1/product/passport/passport_v1.py | 8 +- .../product/passport/passport_v1_document.py | 12 +- mindee/v1/product/receipt/receipt_v5.py | 8 +- .../v1/product/receipt/receipt_v5_document.py | 14 +- .../product/receipt/receipt_v5_line_item.py | 25 +- .../v1/product/us/bank_check/bank_check_v1.py | 8 +- .../us/bank_check/bank_check_v1_document.py | 12 +- .../us/bank_check/bank_check_v1_page.py | 10 +- mindee/v2/__init__.py | 30 +- mindee/v2/client.py | 85 +++--- mindee/v2/client_options/base_parameters.py | 11 +- mindee/v2/commands/cli_parser.py | 26 +- mindee/v2/error/mindee_http_error_v2.py | 7 +- mindee/v2/file_operations/__init__.py | 2 +- mindee/v2/file_operations/crop.py | 22 +- mindee/v2/file_operations/crop_files.py | 9 +- mindee/v2/file_operations/split.py | 16 +- mindee/v2/file_operations/split_files.py | 9 +- mindee/v2/mindee_http/mindee_api_v2.py | 37 ++- .../v2/mindee_http/response_validation_v2.py | 16 +- mindee/v2/parsing/__init__.py | 12 +- mindee/v2/parsing/inference/base_response.py | 2 +- mindee/v2/parsing/inference/error_item.py | 4 +- mindee/v2/parsing/inference/error_response.py | 4 +- mindee/v2/parsing/inference/field/__init__.py | 2 +- .../v2/parsing/inference/field/base_field.py | 6 +- .../parsing/inference/field/dynamic_field.py | 4 +- .../parsing/inference/field/field_location.py | 2 +- .../inference/field/inference_fields.py | 4 +- .../v2/parsing/inference/field/list_field.py | 8 +- .../parsing/inference/field/object_field.py | 15 +- .../parsing/inference/field/simple_field.py | 4 +- mindee/v2/parsing/inference/job.py | 9 +- mindee/v2/parsing/inference/job_webhook.py | 7 +- mindee/v2/parsing/inference/rag_metadata.py | 4 +- mindee/v2/parsing/inference/raw_text.py | 4 +- mindee/v2/product/__init__.py | 16 +- mindee/v2/product/classification/__init__.py | 6 +- .../classification_classifier.py | 4 +- mindee/v2/product/crop/__init__.py | 4 +- mindee/v2/product/crop/crop_box.py | 6 +- mindee/v2/product/crop/crop_response.py | 2 +- mindee/v2/product/crop/crop_result.py | 4 +- mindee/v2/product/extraction/__init__.py | 12 +- .../product/extraction/extraction_result.py | 6 +- .../v2/product/extraction/params/__init__.py | 10 +- .../product/extraction/params/data_schema.py | 3 +- .../extraction/params/data_schema_field.py | 11 +- .../extraction/params/data_schema_replace.py | 3 +- .../params/extraction_parameters.py | 15 +- mindee/v2/product/ocr/__init__.py | 2 +- mindee/v2/product/ocr/ocr_page.py | 4 +- mindee/v2/product/ocr/ocr_result.py | 4 +- mindee/v2/product/split/__init__.py | 6 +- mindee/v2/product/split/split_range.py | 12 +- mindee/v2/product/split/split_response.py | 4 +- mindee/v2/product/split/split_result.py | 4 +- pyproject.toml | 86 +++--- tests/input/test_apply_page_options.py | 8 +- tests/input/test_fix_pdf.py | 2 +- tests/input/test_inputs.py | 12 +- tests/test_geometry.py | 20 +- tests/utils.py | 4 +- tests/v1/api/test_async_response.py | 17 +- tests/v1/api/test_feedback_response.py | 7 +- tests/v1/api/test_response.py | 43 +-- .../test_invoice_splitter_auto_extraction.py | 6 +- .../test_multi_receipts_extractor.py | 2 +- tests/v1/extraction/test_pdf_extractor.py | 4 +- tests/v1/extras/test_full_text_ocr.py | 2 +- tests/v1/input/test_local_response.py | 2 +- .../test_url_input_source_integration.py | 8 +- tests/v1/mindee_http/test_error.py | 33 +-- tests/v1/parsing/common/test_ocr.py | 3 +- .../barcode_reader/test_barcode_reader_v1.py | 6 +- tests/v1/product/cropper/test_cropper_v1.py | 12 +- tests/v1/product/custom/test_custom_v1.py | 46 +-- .../custom/test_custom_v1_line_items.py | 6 +- tests/v1/product/custom/test_custom_v1_v2.py | 46 +-- .../test_financial_document_v1.py | 18 +- .../test_bank_account_details_v1.py | 6 +- .../test_bank_account_details_v2.py | 6 +- .../fr/carte_grise/test_carte_grise_v1.py | 6 +- .../v1/product/fr/id_card/test_id_card_v1.py | 10 +- .../v1/product/fr/id_card/test_id_card_v2.py | 10 +- .../v1/product/generated/test_generated_v1.py | 104 ++++--- .../test_international_id_v2.py | 6 +- tests/v1/product/invoice/test_invoice_v4.py | 6 +- .../test_invoice_splitter_v1.py | 6 +- .../test_multi_receipts_detector_v1.py | 6 +- tests/v1/product/passport/test_passport_v1.py | 6 +- tests/v1/product/receipt/test_receipt_v5.py | 6 +- .../us/bank_check/test_bank_check_v1.py | 12 +- tests/v1/test_cli.py | 32 +-- tests/v1/test_client.py | 36 ++- tests/v1/workflows/test_workflow.py | 4 +- .../v2/file_operations/test_crop_operation.py | 2 +- .../test_crop_operation_integration.py | 6 +- .../test_split_operation_integration.py | 2 +- tests/v2/input/test_local_response.py | 2 +- .../test_classification_integration.py | 2 +- .../test_classification_response.py | 2 +- .../v2/product/crop/test_crop_integration.py | 2 +- tests/v2/product/crop/test_crop_response.py | 3 +- .../extraction/test_extraction_response.py | 16 +- tests/v2/product/ocr/test_ocr_integration.py | 2 +- tests/v2/product/ocr/test_ocr_response.py | 3 +- .../product/split/test_split_integration.py | 2 +- tests/v2/product/split/test_split_response.py | 2 +- tests/v2/product/utils.py | 7 +- tests/v2/test_client.py | 50 +++- tests/v2/test_client_integration.py | 2 +- 243 files changed, 1701 insertions(+), 1892 deletions(-) diff --git a/mindee/__init__.py b/mindee/__init__.py index 227ac5d6..8d96f0aa 100644 --- a/mindee/__init__.py +++ b/mindee/__init__.py @@ -1,46 +1,46 @@ from mindee.client_options.polling_options import PollingOptions from mindee.input import PageOptions -from mindee.v1 import product -from mindee.v2.parsing.inference.job_response import JobResponse -from mindee.v2.product.extraction.params.extraction_parameters import ( - ExtractionParameters, -) from mindee.input.base_64_input import Base64Input from mindee.input.bytes_input import BytesInput from mindee.input.file_input import FileInput +from mindee.input.local_input_source import LocalInputSource +from mindee.input.local_response import LocalResponse from mindee.input.path_input import PathInput from mindee.input.url_input_source import URLInputSource -from mindee.input.local_response import LocalResponse -from mindee.input.local_input_source import LocalInputSource -from mindee.v2.product.classification.params.classification_parameters import ( - ClassificationParameters, -) +from mindee.v1 import product +from mindee.v2.parsing.inference.job_response import JobResponse from mindee.v2.product.classification.classification_response import ( ClassificationResponse, ) -from mindee.v2.product.crop.params.crop_parameters import CropParameters +from mindee.v2.product.classification.params.classification_parameters import ( + ClassificationParameters, +) from mindee.v2.product.crop.crop_response import CropResponse +from mindee.v2.product.crop.params.crop_parameters import CropParameters from mindee.v2.product.extraction.extraction_response import ExtractionResponse from mindee.v2.product.extraction.extraction_result import ExtractionResult -from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters +from mindee.v2.product.extraction.params.extraction_parameters import ( + ExtractionParameters, +) from mindee.v2.product.ocr.ocr_response import OCRResponse +from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters from mindee.v2.product.split.params.split_parameters import SplitParameters from mindee.v2.product.split.split_response import SplitResponse __all__ = [ "Base64Input", "BytesInput", - "ClassificationResponse", "ClassificationParameters", + "ClassificationResponse", "CropParameters", "CropResponse", - "FileInput", "ExtractionParameters", "ExtractionResponse", "ExtractionResult", + "FileInput", "JobResponse", - "LocalResponse", "LocalInputSource", + "LocalResponse", "OCRParameters", "OCRResponse", "PageOptions", diff --git a/mindee/error/__init__.py b/mindee/error/__init__.py index d694ba37..c71e5c02 100644 --- a/mindee/error/__init__.py +++ b/mindee/error/__init__.py @@ -1,4 +1,4 @@ -from mindee.error.geometry_error import GeometryError +from mindee.error.geometry_error import MindeeGeometryError from mindee.error.mimetype_error import MimeTypeError from mindee.error.mindee_error import ( MindeeClientError, @@ -14,14 +14,14 @@ from mindee.error.mindee_pdf_error import MindeePDFError __all__ = [ - "MindeeError", + "MimeTypeError", "MindeeClientError", - "MindeeHTTPError", + "MindeeError", + "MindeeGeometryError", "MindeeHTTPClientError", + "MindeeHTTPError", "MindeeHTTPServerError", - "handle_error", "MindeeImageError", "MindeePDFError", - "GeometryError", - "MimeTypeError", + "handle_error", ] diff --git a/mindee/error/geometry_error.py b/mindee/error/geometry_error.py index 7680291c..d2ec8efd 100644 --- a/mindee/error/geometry_error.py +++ b/mindee/error/geometry_error.py @@ -1,2 +1,2 @@ -class GeometryError(RuntimeError): +class MindeeGeometryError(RuntimeError): """An error related to geometry operations.""" diff --git a/mindee/error/mindee_http_error.py b/mindee/error/mindee_http_error.py index c7f75099..40c4fbf5 100644 --- a/mindee/error/mindee_http_error.py +++ b/mindee/error/mindee_http_error.py @@ -1,5 +1,3 @@ -from typing import Optional, Union - from mindee.error.mindee_error import MindeeError from mindee.parsing.common import StringDict @@ -8,32 +6,36 @@ class MindeeHTTPError(RuntimeError): """An exception relating to HTTP calls.""" status_code: int - api_code: Optional[str] - api_details: Optional[str] - api_message: Optional[str] + api_code: str | None + api_details: str | None + api_message: str | None def __init__(self, http_error: StringDict, url: str, code: int) -> None: """ Base exception for HTTP calls. - :params http_error: formatted & parsed error - :params url: url/endpoint the exception was raised on - :params code: HTTP code for the error + :param http_error: formatted & parsed error + :param url: url/endpoint the exception was raised on + :param code: HTTP code for the error """ self.status_code = code - self.api_code = http_error["code"] if "code" in http_error else None - self.api_details = http_error["details"] if "details" in http_error else None - self.api_message = http_error["message"] if "message" in http_error else None + self.api_code = http_error.get("code", None) if "code" in http_error else None + self.api_details = ( + http_error.get("details", None) if "details" in http_error else None + ) + self.api_message = ( + http_error.get("message", None) if "message" in http_error else None + ) super().__init__( f"{url} {self.status_code} HTTP error: {self.api_details} - {self.api_message}" ) -def create_error_obj(response: Union[StringDict, str]) -> StringDict: +def create_error_obj(response: StringDict | str) -> StringDict: """ Creates an error object based on a requests' payload. - :params response: response as sent by the server, as a dict. + :param response: response as sent by the server, as a dict. In _very_ rare instances, this can be an html string. """ if not isinstance(response, str): @@ -92,8 +94,8 @@ def handle_error(url: str, response: StringDict) -> MindeeHTTPError: """ Creates an appropriate HTTP error exception, based on retrieved HTTP error code. - :params url: url of the product - :params response: StringDict + :param url: url of the product + :param response: StringDict """ error_obj = create_error_obj(response) if not isinstance(response, str) and ( # type: ignore diff --git a/mindee/geometry/__init__.py b/mindee/geometry/__init__.py index 55a183b9..1c002f2a 100644 --- a/mindee/geometry/__init__.py +++ b/mindee/geometry/__init__.py @@ -22,16 +22,16 @@ "Points", "Polygon", "Quadrilateral", - "is_point_in_polygon_x", - "is_point_in_polygon_y", - "is_point_in_y", - "is_point_in_x", - "quadrilateral_from_prediction", "get_bbox", - "get_min_max_x", - "get_min_max_y", "get_bounding_box", "get_centroid", - "polygon_from_prediction", + "get_min_max_x", + "get_min_max_y", + "is_point_in_polygon_x", + "is_point_in_polygon_y", + "is_point_in_x", + "is_point_in_y", "merge_polygons", + "polygon_from_prediction", + "quadrilateral_from_prediction", ] diff --git a/mindee/geometry/bbox.py b/mindee/geometry/bbox.py index b7677280..7f3d4153 100644 --- a/mindee/geometry/bbox.py +++ b/mindee/geometry/bbox.py @@ -35,7 +35,7 @@ def get_bbox(points: Points) -> BBox: """ Given a sequence of points, calculate a bbox that encompasses all points. - :params points: Polygon to process. + :param points: Polygon to process. :return: A bbox that encompasses all points """ y_min = min(v[1] for v in points) @@ -59,8 +59,8 @@ def extend_bbox(bbox: BBox, points: Points) -> BBox: """ Given a BBox and a sequence of points, calculate the surrounding bbox that encompasses all. - :params bbox: initial BBox to extend. - :params points: Sequence of points to process. Accepts polygons and similar + :param bbox: initial BBox to extend. + :param points: Sequence of points to process. Accepts polygons and similar """ all_points = [] for point in points: diff --git a/mindee/geometry/minmax.py b/mindee/geometry/minmax.py index 22ed8060..0d82b0eb 100644 --- a/mindee/geometry/minmax.py +++ b/mindee/geometry/minmax.py @@ -16,7 +16,7 @@ def get_min_max_y(points: Points) -> MinMax: """ Get the maximum and minimum Y value given a sequence of points. - :params points: List of points + :param points: List of points """ y_coords = [y for _, y in points] return MinMax(min=min(y_coords), max=max(y_coords)) @@ -26,7 +26,7 @@ def get_min_max_x(points: Points) -> MinMax: """ Get the maximum and minimum Y value given a sequence of points. - :params points: List of points + :param points: List of points """ x_coords = [x for x, _ in points] return MinMax(min=min(x_coords), max=max(x_coords)) diff --git a/mindee/geometry/point.py b/mindee/geometry/point.py index a5d0905c..6dcb6456 100644 --- a/mindee/geometry/point.py +++ b/mindee/geometry/point.py @@ -1,4 +1,5 @@ -from typing import NamedTuple, Sequence +from collections.abc import Sequence +from typing import NamedTuple class Point(NamedTuple): diff --git a/mindee/geometry/polygon.py b/mindee/geometry/polygon.py index da6e9f68..93d1a8ca 100644 --- a/mindee/geometry/polygon.py +++ b/mindee/geometry/polygon.py @@ -1,18 +1,19 @@ -from typing import List, Optional, Sequence +from collections.abc import Sequence +from mindee.error.geometry_error import MindeeGeometryError from mindee.geometry.minmax import get_min_max_x, get_min_max_y from mindee.geometry.point import Point from mindee.geometry.polygon_utils import get_centroid, is_point_in_x, is_point_in_y -class Polygon(List[Point]): +class Polygon(list[Point]): """ Contains any number of vertex coordinates (Points). Inherits from base class ``list`` so is compatible with type ``Points``. """ - def __init__(self, vertices: Optional[list] = None): + def __init__(self, vertices: list | None = None): # we should NOT allow the creation of invalid polygons, but it would be a breaking change if not vertices: vertices = [] @@ -22,7 +23,7 @@ def __init__(self, vertices: Optional[list] = None): def _raise_if_invalid(self) -> None: if len(self) < 3: - raise ValueError("A polygon must have at least 3 vertices") + raise MindeeGeometryError("A polygon must have at least 3 vertices") @property def centroid(self) -> Point: @@ -34,7 +35,7 @@ def is_point_in_x(self, point: Point) -> bool: """ Determine if the Point is in the Polygon's X-axis. - :params point: Point to compare + :param point: Point to compare """ self._raise_if_invalid() min_x, max_x = get_min_max_x(self) @@ -44,7 +45,7 @@ def is_point_in_y(self, point: Point) -> bool: """ Determine if the Point is in the Polygon's Y-axis. - :params point: Point to compare + :param point: Point to compare """ self._raise_if_invalid() min_y, max_y = get_min_max_y(self) @@ -60,8 +61,8 @@ def is_point_in_polygon_x(point: Point, polygon: Polygon) -> bool: Determine if the Point is in the Polygon's X-axis. - :params point: Point to compare - :params polygon: Polygon to look into + :param point: Point to compare + :param polygon: Polygon to look into """ min_x, max_x = get_min_max_x(polygon) return is_point_in_x(point, min_x, max_x) @@ -73,20 +74,20 @@ def is_point_in_polygon_y(point: Point, polygon: Polygon) -> bool: Determine if the Point is in the Polygon's Y-axis. - :params point: Point to compare - :params polygon: Polygon to look into + :param point: Point to compare + :param polygon: Polygon to look into """ min_y, max_y = get_min_max_y(polygon) return is_point_in_y(point, min_y, max_y) -def polygon_from_prediction(prediction: Sequence[List[float]]) -> Polygon: +def polygon_from_prediction(prediction: Sequence[list[float]]) -> Polygon: """ Deprecated, init ``Polygon`` class directly instead. Transform a prediction into a Polygon. - :params prediction: API prediction. + :param prediction: API prediction. """ return Polygon([Point(point[0], point[1]) for point in prediction]) @@ -95,7 +96,7 @@ def merge_polygons(vertices: Sequence[Polygon]) -> Polygon: """ Given a sequence of polygons, calculate a polygon box that encompasses all polygons. - :params vertices: List of polygons + :param vertices: List of polygons :return: A bounding box that encompasses all polygons """ y_min = min(y for v in vertices for _, y in v) diff --git a/mindee/geometry/polygon_utils.py b/mindee/geometry/polygon_utils.py index 8fe6dab6..3d234a0d 100644 --- a/mindee/geometry/polygon_utils.py +++ b/mindee/geometry/polygon_utils.py @@ -5,7 +5,7 @@ def get_centroid(points: Points) -> Point: """ Get the central point (centroid) given a sequence of points. - :params points: Polygon to process. + :param points: Polygon to process. :return: The centroid """ vertices_count = len(points) @@ -18,9 +18,9 @@ def is_point_in_y(point: Point, min_y: float, max_y: float) -> bool: """ Determine if the Point is in the Polygon's Y-axis. - :params point: Point to compare - :params min_y: Minimum Y-axis value - :params max_y: Maximum Y-axis value + :param point: Point to compare + :param min_y: Minimum Y-axis value + :param max_y: Maximum Y-axis value """ return min_y <= point.y <= max_y @@ -29,8 +29,8 @@ def is_point_in_x(point: Point, min_x: float, max_x: float) -> bool: """ Determine if the Point is within the X-axis interval. - :params point: Point to compare - :params min_x: Minimum X-axis value - :params max_x: Maximum X-axis value + :param point: Point to compare + :param min_x: Minimum X-axis value + :param max_x: Maximum X-axis value """ return min_x <= point.x <= max_x diff --git a/mindee/geometry/quadrilateral.py b/mindee/geometry/quadrilateral.py index dc182fe2..2e31f665 100644 --- a/mindee/geometry/quadrilateral.py +++ b/mindee/geometry/quadrilateral.py @@ -1,6 +1,7 @@ -from typing import NamedTuple, Sequence +from collections.abc import Sequence +from typing import NamedTuple -from mindee.error.geometry_error import GeometryError +from mindee.error.geometry_error import MindeeGeometryError from mindee.geometry.bbox import get_bbox from mindee.geometry.point import Point, Points from mindee.geometry.polygon_utils import get_centroid @@ -28,10 +29,10 @@ def quadrilateral_from_prediction(prediction: Sequence[list]) -> Quadrilateral: """ Transform a prediction into a Quadrilateral. - :params prediction: API prediction. + :param prediction: API prediction. """ if len(prediction) != 4: - raise GeometryError("Prediction must have exactly 4 points") + raise MindeeGeometryError("Prediction must have exactly 4 points") return Quadrilateral( Point(prediction[0][0], prediction[0][1]), Point(prediction[1][0], prediction[1][1]), @@ -44,7 +45,7 @@ def get_bounding_box(points: Points) -> Quadrilateral: """ Given a sequence of points, calculate a bounding box that encompasses all points. - :params points: Polygon to process. + :param points: Polygon to process. :return: A bounding box that encompasses all points. """ x_min, y_min, x_max, y_max = get_bbox(points) diff --git a/mindee/image/extracted_image.py b/mindee/image/extracted_image.py index 5c968d8a..0029c30c 100644 --- a/mindee/image/extracted_image.py +++ b/mindee/image/extracted_image.py @@ -1,6 +1,5 @@ import io from pathlib import Path -from typing import Optional, Union from PIL import Image @@ -26,9 +25,9 @@ def __init__( """ Initialize the ExtractedImage with a buffer and an internal file name. - :params input_source: Local source for input. - :params page_id: ID of the page the element was found on. - :params element_id: ID of the element in a page. + :param input_source: Local source for input. + :param page_id: ID of the page the element was found on. + :param element_id: ID of the element in a page. """ self.buffer = io.BytesIO(input_source.file_object.read()) self.buffer.name = input_source.filename @@ -46,21 +45,18 @@ def __init__( self._page_id = page_id self._element_id = 0 if element_id is None else element_id - def save_to_file( - self, output_path: Union[Path, str], file_format: Optional[str] = None - ): + def save_to_file(self, output_path: Path | str, file_format: str | None = None): """ Saves the document to a file. - :params output_path: Path to save the file to. - :params file_format: Optional PIL-compatible format for the file. Inferred from file extension if not provided. + :param output_path: Path to save the file to. + :param file_format: Optional PIL-compatible format for the file. Inferred from file extension if not provided. :raises MindeeError: If an invalid path or filename is provided. """ try: resolved_path = Path(output_path).resolve() - if not file_format: - if len(resolved_path.suffix) < 1: - raise ValueError("Invalid file format.") + if not file_format and len(resolved_path.suffix) < 1: + raise ValueError("Invalid file format.") self.buffer.seek(0) image = Image.open(self.buffer) if file_format: diff --git a/mindee/image/image_compressor.py b/mindee/image/image_compressor.py index 9848000d..d2d75ab7 100644 --- a/mindee/image/image_compressor.py +++ b/mindee/image/image_compressor.py @@ -1,22 +1,22 @@ import io -from typing import BinaryIO, Union +from typing import BinaryIO from PIL import Image def compress_image( - image_buffer: Union[BinaryIO, bytes], + image_buffer: BinaryIO | bytes, quality: int = 85, - max_width: Union[int, float, None] = None, - max_height: Union[int, float, None] = None, + max_width: int | float | None = None, + max_height: int | float | None = None, ) -> bytes: """ Compresses an image with the given parameters. - :params image_buffer: Buffer representation of an image, also accepts BinaryIO. - :params quality: Quality to apply to the image (JPEG compression). - :params max_width: Maximum bound for the width. - :params max_height: Maximum bound for the height. + :param image_buffer: Buffer representation of an image, also accepts BinaryIO. + :param quality: Quality to apply to the image (JPEG compression). + :param max_width: Maximum bound for the width. + :param max_height: Maximum bound for the height. :return: """ if isinstance(image_buffer, bytes): diff --git a/mindee/image/image_extractor.py b/mindee/image/image_extractor.py index 09c79c07..2dc04728 100644 --- a/mindee/image/image_extractor.py +++ b/mindee/image/image_extractor.py @@ -1,13 +1,13 @@ import io -from typing import BinaryIO, List, Union +from typing import BinaryIO import pypdfium2 as pdfium from PIL import Image from mindee.error.mindee_error import MindeeError -from mindee.image.extracted_image import ExtractedImage from mindee.geometry.point import Point from mindee.geometry.polygon import Polygon, get_min_max_x, get_min_max_y +from mindee.image.extracted_image import ExtractedImage from mindee.input.bytes_input import BytesInput from mindee.input.local_input_source import LocalInputSource @@ -18,7 +18,7 @@ def attach_image_as_new_file( # type: ignore """ Attaches an image as a new page in a PdfDocument object. - :params input_buffer: Input buffer. + :param input_buffer: Input buffer. :return: A PdfDocument handle. """ input_buffer.seek(0) @@ -44,7 +44,7 @@ def attach_image_as_new_file( # type: ignore def extract_image_from_polygon( page_content: Image.Image, - polygon: List[Point], + polygon: list[Point], width: float, height: float, file_format: str, @@ -52,11 +52,11 @@ def extract_image_from_polygon( """ Crops the image from the given polygon. - :params page_content: Contents of the page as a Pillow object. - :params polygon: Polygon coordinates for the image. - :params width: Width of the generated image. - :params height: Height of the generated image. - :params file_format: Format for the generated file. + :param page_content: Contents of the page as a Pillow object. + :param polygon: Polygon coordinates for the image. + :param width: Width of the generated image. + :param height: Height of the generated image. + :param file_format: Format for the generated file. :return: A generated image as a buffer. """ min_max_x = get_min_max_x(polygon) @@ -76,8 +76,8 @@ def save_image_to_buffer(image: Image.Image, file_format: str) -> bytes: """ Saves an image as a buffer. - :params image: Pillow wrapper for the image. - :params file_format: Format to save the file as. + :param image: Pillow wrapper for the image. + :param file_format: Format to save the file as. :return: A valid buffer. """ buffer = io.BytesIO() @@ -90,7 +90,7 @@ def determine_file_format(input_source: LocalInputSource) -> str: """ Retrieves the file format from an input source. - :params input_source: Local input source to retrieve the format from. + :param input_source: Local input source to retrieve the format from. :return: A valid pillow file format. """ if input_source.is_pdf(): @@ -105,7 +105,7 @@ def get_file_extension(file_format: str): """ Extract the correct file extension. - :params file_format: Format of the file. + :param file_format: Format of the file. :return: A valid file extension. """ return file_format.lower() if file_format != "JPEG" else "jpg" @@ -114,14 +114,14 @@ def get_file_extension(file_format: str): def extract_multiple_images_from_source( input_source: LocalInputSource, page_id: int, - polygons: List[Union[Polygon, List[Point]]], -) -> List[ExtractedImage]: + polygons: list[Polygon | list[Point]], +) -> list[ExtractedImage]: """ Extracts elements from a page based on a list of bounding boxes. - :params input_source: Local Input source to extract elements from. - :params page_id: id of the page to extract from. - :params polygons: List of coordinates to pull the elements from. + :param input_source: Local Input source to extract elements from. + :param page_id: id of the page to extract from. + :param polygons: List of coordinates to pull the elements from. :return: List of byte arrays representing the extracted elements. """ page = load_pdf_doc(input_source).get_page(page_id) @@ -154,7 +154,7 @@ def load_pdf_doc(input_file: LocalInputSource) -> pdfium.PdfDocument: # type: i """ Loads a PDF document from a local input source. - :params input_file: Local input. + :param input_file: Local input. :return: A valid PdfDocument handle. """ if input_file.is_pdf(): diff --git a/mindee/input/__init__.py b/mindee/input/__init__.py index 5e8d77e8..ca34e96a 100644 --- a/mindee/input/__init__.py +++ b/mindee/input/__init__.py @@ -1,10 +1,10 @@ -from mindee.input.local_response import LocalResponse -from mindee.input.page_options import PageOptions from mindee.client_options.polling_options import PollingOptions from mindee.input.base_64_input import Base64Input from mindee.input.bytes_input import BytesInput from mindee.input.file_input import FileInput from mindee.input.local_input_source import LocalInputSource +from mindee.input.local_response import LocalResponse +from mindee.input.page_options import PageOptions from mindee.input.path_input import PathInput from mindee.input.url_input_source import URLInputSource diff --git a/mindee/input/base_64_input.py b/mindee/input/base_64_input.py index 136c2024..7269adff 100644 --- a/mindee/input/base_64_input.py +++ b/mindee/input/base_64_input.py @@ -11,8 +11,8 @@ def __init__(self, base64_string: str, filename: str) -> None: """ Input document from a base64 encoded string. - :params base64_string: Raw data as a base64 encoded string - :params filename: File name of the input + :param base64_string: Raw data as a base64 encoded string + :param filename: File name of the input """ self.file_object = io.BytesIO(base64.standard_b64decode(base64_string)) self.filename = filename diff --git a/mindee/input/bytes_input.py b/mindee/input/bytes_input.py index 77aed5fc..e017e81c 100644 --- a/mindee/input/bytes_input.py +++ b/mindee/input/bytes_input.py @@ -10,8 +10,8 @@ def __init__(self, raw_bytes: bytes, filename: str) -> None: """ Input document from raw bytes (no buffer). - :params raw_bytes: Raw data as bytes - :params filename: File name of the input + :param raw_bytes: Raw data as bytes + :param filename: File name of the input """ self.file_object = io.BytesIO(raw_bytes) self.filename = filename diff --git a/mindee/input/file_input.py b/mindee/input/file_input.py index cc4f1dd8..7a64c44a 100644 --- a/mindee/input/file_input.py +++ b/mindee/input/file_input.py @@ -1,6 +1,7 @@ +import contextlib import io import os -from typing import BinaryIO, IO, Union, cast +from typing import IO, BinaryIO, cast from mindee.input.local_input_source import LocalInputSource @@ -8,21 +9,19 @@ class FileInput(LocalInputSource): """A binary file input.""" - def __init__(self, file: Union[BinaryIO, IO[bytes]]) -> None: + def __init__(self, file: BinaryIO | IO[bytes]) -> None: """ Input document from a Python binary file object. Note: the calling function is responsible for closing the file. - :params file: FileIO object + :param file: FileIO object """ assert file.name, "File name must be set" if hasattr(file, "seek") and callable(file.seek): - try: + with contextlib.suppress(io.UnsupportedOperation, OSError): file.seek(0) - except (io.UnsupportedOperation, OSError): - pass self.file_object = cast(BinaryIO, file) self.filename = os.path.basename(file.name) self.filepath = file.name diff --git a/mindee/input/local_input_source.py b/mindee/input/local_input_source.py index add5f7a1..15033925 100644 --- a/mindee/input/local_input_source.py +++ b/mindee/input/local_input_source.py @@ -1,7 +1,8 @@ import io import mimetypes import tempfile -from typing import BinaryIO, Optional, Sequence, Tuple +from collections.abc import Sequence +from typing import BinaryIO import pypdfium2 as pdfium @@ -33,8 +34,8 @@ class LocalInputSource: file_object: BinaryIO filename: str file_mimetype: str - filepath: Optional[str] - _page_count: Optional[int] = None + filepath: str | None + _page_count: int | None = None def __init__(self) -> None: """ @@ -67,7 +68,7 @@ def fix_pdf(self, maximum_offset: int = 500) -> None: or until the maximum offset has been reached. If a tag denoting a PDF file is found, deletes all bytes before it. - :params maximum_offset: maximum byte offset where superfluous headers will be removed. + :param maximum_offset: maximum byte offset where superfluous headers will be removed. Cannot be less than 0. """ if maximum_offset < 0: @@ -79,11 +80,10 @@ def fix_pdf(self, maximum_offset: int = 500) -> None: if pos != -1 and pos < maximum_offset: self.file_object.seek(pos) raw_bytes = self.file_object.read() - temp_file = tempfile.TemporaryFile() - temp_file.write(raw_bytes) - temp_file.seek(0) - self.file_object = io.BytesIO(temp_file.read()) - temp_file.close() + with tempfile.TemporaryFile() as temp_file: + temp_file.write(raw_bytes) + temp_file.seek(0) + self.file_object = io.BytesIO(temp_file.read()) else: if pos < 0: raise MimeTypeError( @@ -172,7 +172,7 @@ def merge_pdf_pages(self, page_numbers: set) -> None: """ Create a new PDF from pages and set it to ``file_object``. - :params page_numbers: List of page numbers to use for merging in the original PDF. + :param page_numbers: List of page numbers to use for merging in the original PDF. :return: None """ self.file_object.seek(0) @@ -198,11 +198,11 @@ def is_pdf_empty(self) -> bool: return False return True - def read_contents(self, close_file: bool) -> Tuple[str, bytes]: + def read_contents(self, close_file: bool) -> tuple[str, bytes]: """ Read the contents of the input file. - :params close_file: whether to close the file after reading + :param close_file: whether to close the file after reading :return: a Tuple with the file name and binary data """ logger.debug("Reading data from: %s", self.filename) @@ -214,9 +214,10 @@ def read_contents(self, close_file: bool) -> Tuple[str, bytes]: self.file_object.seek(0) return self.filename, data - def close(self) -> None: - """Close the file object.""" - self.file_object.close() + def close(self): + """Allow explicit closing for users not using a context manager.""" + if self.file_object and not self.file_object.closed: + self.file_object.close() def has_source_text(self) -> bool: """ @@ -231,20 +232,20 @@ def has_source_text(self) -> bool: def compress( self, quality: int = 85, - max_width: Optional[int] = None, - max_height: Optional[int] = None, + max_width: int | None = None, + max_height: int | None = None, force_source_text: bool = False, disable_source_text: bool = True, ) -> None: """ Compresses the file object, either as a PDF or an image. - :params quality: Quality of the compression. For images, this is the JPEG quality. + :param quality: Quality of the compression. For images, this is the JPEG quality. For PDFs, this affects image quality within the PDF. - :params max_width: Maximum width for image resizing. Ignored for PDFs. - :params max_height: Maximum height for image resizing. Ignored for PDFs. - :params force_source_text: For PDFs, whether to force compression even if source text is present. - :params disable_source_text: For PDFs, whether to disable source text during compression. + :param max_width: Maximum width for image resizing. Ignored for PDFs. + :param max_height: Maximum height for image resizing. Ignored for PDFs. + :param force_source_text: For PDFs, whether to force compression even if source text is present. + :param disable_source_text: For PDFs, whether to disable source text during compression. """ new_file_bytes: bytes if self.is_pdf(): @@ -257,3 +258,12 @@ def compress( ) self.file_object = io.BytesIO(new_file_bytes) + + def __enter__(self): + """Allows the class to be used as a context manager.""" + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Ensures the file is closed when the context block exits.""" + if self.file_object and not self.file_object.closed: + self.file_object.close() diff --git a/mindee/input/local_response.py b/mindee/input/local_response.py index 580adec2..4eaf3115 100644 --- a/mindee/input/local_response.py +++ b/mindee/input/local_response.py @@ -4,7 +4,7 @@ import json import os from pathlib import Path -from typing import Any, BinaryIO, Dict, Type, TypeVar, Union +from typing import Any, BinaryIO, TypeVar from mindee.error.mindee_error import MindeeError from mindee.parsing.common.common_response import CommonResponse @@ -16,7 +16,7 @@ class LocalResponse: _file: BinaryIO """File object of the local response.""" - def __init__(self, input_file: Union[BinaryIO, str, Path, bytes]): + def __init__(self, input_file: BinaryIO | str | Path | bytes): if isinstance(input_file, (BinaryIO, io.BufferedReader)): str_stripped = ( input_file.read().decode("utf-8").replace("\r", "").replace("\n", "") @@ -26,7 +26,7 @@ def __init__(self, input_file: Union[BinaryIO, str, Path, bytes]): elif isinstance(input_file, Path) or ( isinstance(input_file, str) and os.path.exists(input_file) ): - with open(input_file, "r", encoding="utf-8") as file: + with open(input_file, encoding="utf-8") as file: self._file = io.BytesIO( file.read().replace("\r", "").replace("\n", "").encode() ) @@ -44,7 +44,7 @@ def __init__(self, input_file: Union[BinaryIO, str, Path, bytes]): raise MindeeError(f"Incompatible type for input '{type(input_file)}'.") @property - def as_dict(self) -> Dict[str, Any]: + def as_dict(self) -> dict[str, Any]: """ Returns the dictionary representation of the file. @@ -59,23 +59,23 @@ def as_dict(self) -> Dict[str, Any]: @staticmethod def _process_secret_key( - secret_key: Union[str, bytes, bytearray], - ) -> Union[bytes, bytearray]: + secret_key: str | bytes | bytearray, + ) -> bytes | bytearray: """ Processes the secret key as a byte array. - :params secret_key: Secret key, either a string or a byte/byte array. + :param secret_key: Secret key, either a string or a byte/byte array. :return: a byte/byte array secret key. """ if isinstance(secret_key, (bytes, bytearray)): return secret_key return secret_key.encode("utf-8") - def get_hmac_signature(self, secret_key: Union[str, bytes, bytearray]): + def get_hmac_signature(self, secret_key: str | bytes | bytearray): """ Returns the hmac signature of the local response, from the secret key provided. - :params secret_key: Secret key, either a string or a byte/byte array. + :param secret_key: Secret key, either a string or a byte/byte array. :return: The hmac signature of the local response. """ algorithm = hashlib.sha256 @@ -93,20 +93,20 @@ def get_hmac_signature(self, secret_key: Union[str, bytes, bytearray]): return mac.hexdigest() def is_valid_hmac_signature( - self, secret_key: Union[str, bytes, bytearray], signature: str + self, secret_key: str | bytes | bytearray, signature: str ): """ Checks if the hmac signature of the local response is valid. - :params secret_key: Secret key, given as a string. - :params signature: HMAC signature, given as a string. + :param secret_key: Secret key, given as a string. + :param signature: HMAC signature, given as a string. :return: True if the HMAC signature is valid. """ return signature == self.get_hmac_signature(secret_key) ResponseT = TypeVar("ResponseT", bound=CommonResponse) - def deserialize_response(self, response_class: Type[ResponseT]) -> ResponseT: + def deserialize_response(self, response_class: type[ResponseT]) -> ResponseT: """ Load a local inference. diff --git a/mindee/input/page_options.py b/mindee/input/page_options.py index b03ab935..c0406677 100644 --- a/mindee/input/page_options.py +++ b/mindee/input/page_options.py @@ -1,4 +1,5 @@ -from typing import NamedTuple, Sequence +from collections.abc import Sequence +from typing import NamedTuple KEEP_ONLY = "KEEP_ONLY" REMOVE = "REMOVE" diff --git a/mindee/input/path_input.py b/mindee/input/path_input.py index dc977e82..21c846f4 100644 --- a/mindee/input/path_input.py +++ b/mindee/input/path_input.py @@ -1,6 +1,5 @@ import os from pathlib import Path -from typing import Union from mindee.input.local_input_source import LocalInputSource @@ -8,13 +7,13 @@ class PathInput(LocalInputSource): """A local path input.""" - def __init__(self, filepath: Union[Path, str]) -> None: + def __init__(self, filepath: Path | str) -> None: """ Input document from a path. - :params filepath: Path to open + :param filepath: Path to open """ - self.file_object = open(filepath, "rb") # pylint: disable=consider-using-with - self.filename = os.path.basename(filepath) + self.file_object = open(filepath, "rb") # noqa: SIM115 # pylint: disable=consider-using-with + self.filename = os.path.basename(Path(filepath)) self.filepath = str(filepath) super().__init__() diff --git a/mindee/input/url_input_source.py b/mindee/input/url_input_source.py index 470b6b08..1a9e3f8b 100644 --- a/mindee/input/url_input_source.py +++ b/mindee/input/url_input_source.py @@ -3,7 +3,6 @@ import string from datetime import datetime from pathlib import Path -from typing import Optional, Union from urllib.parse import urlparse import requests @@ -23,7 +22,7 @@ def __init__(self, url: str) -> None: """ Input document from a base64 encoded string. - :params url: URL to send, must be HTTPS. + :param url: URL to send, must be HTTPS. """ if not url.lower().startswith("https"): raise MindeeSourceError("URL must be HTTPS") @@ -34,20 +33,20 @@ def __init__(self, url: str) -> None: def __fetch_file_content( self, - username: Optional[str] = None, - password: Optional[str] = None, - token: Optional[str] = None, - headers: Optional[dict] = None, + username: str | None = None, + password: str | None = None, + token: str | None = None, + headers: dict | None = None, max_redirects: int = 3, ) -> bytes: """ Fetch the content of the file from the URL. - :params username: Optional username for authentication. - :params password: Optional password for authentication. - :params token: Optional token for authentication. - :params headers: Optional additional headers for the request. - :params max_redirects: Maximum number of redirects to follow. + :param username: Optional username for authentication. + :param password: Optional password for authentication. + :param token: Optional token for authentication. + :param headers: Optional additional headers for the request. + :param max_redirects: Maximum number of redirects to follow. :return: The content of the file as bytes. """ if not headers: @@ -64,24 +63,24 @@ def __fetch_file_content( def save_to_file( self, - filepath: Union[Path, str], - filename: Optional[str] = None, - username: Optional[str] = None, - password: Optional[str] = None, - token: Optional[str] = None, - headers: Optional[dict] = None, + filepath: Path | str, + filename: str | None = None, + username: str | None = None, + password: str | None = None, + token: str | None = None, + headers: dict | None = None, max_redirects: int = 3, ) -> Path: """ Save the content of the URL to a file. - :params filepath: Path to save the content to. - :params filename: Optional filename to give to the file. - :params username: Optional username for authentication. - :params password: Optional password for authentication. - :params token: Optional token for authentication. - :params headers: Optional additional headers for the request. - :params max_redirects: Maximum number of redirects to follow. + :param filepath: Path to save the content to. + :param filename: Optional filename to give to the file. + :param username: Optional username for authentication. + :param password: Optional password for authentication. + :param token: Optional token for authentication. + :param headers: Optional additional headers for the request. + :param max_redirects: Maximum number of redirects to follow. :return: The path to the saved file. """ response = self.__fetch_file_content( @@ -95,22 +94,22 @@ def save_to_file( def as_local_input_source( self, - filename: Optional[str] = None, - username: Optional[str] = None, - password: Optional[str] = None, - token: Optional[str] = None, - headers: Optional[dict] = None, + filename: str | None = None, + username: str | None = None, + password: str | None = None, + token: str | None = None, + headers: dict | None = None, max_redirects: int = 3, ) -> BytesInput: """ Convert the URL content to a BytesInput object. - :params filename: Optional filename for the BytesInput. - :params username: Optional username for authentication. - :params password: Optional password for authentication. - :params token: Optional token for authentication. - :params headers: Optional additional headers for the request. - :params max_redirects: Maximum number of redirects to follow. + :param filename: Optional filename for the BytesInput. + :param username: Optional username for authentication. + :param password: Optional password for authentication. + :param token: Optional token for authentication. + :param headers: Optional additional headers for the request. + :param max_redirects: Maximum number of redirects to follow. :return: A BytesInput object containing the file content. """ response = self.__fetch_file_content( @@ -125,7 +124,7 @@ def __extract_filename_from_url(uri) -> str: """ Extract the filename from a given URL. - :params uri: The URL to extract the filename from. + :param uri: The URL to extract the filename from. :return: The extracted filename or an empty string if not found. """ filename = os.path.basename(urlparse(uri).path) @@ -136,7 +135,7 @@ def __generate_file_name(extension=".tmp") -> str: """ Generate a unique filename with a timestamp and random string. - :params extension: The file extension to use (default is '.tmp'). + :param extension: The file extension to use (default is '.tmp'). :return: A generated filename. """ random_string = "".join( @@ -146,11 +145,11 @@ def __generate_file_name(extension=".tmp") -> str: return f"mindee_temp_{timestamp}_{random_string}{extension}" @staticmethod - def __get_file_extension(filename) -> Optional[str]: + def __get_file_extension(filename) -> str | None: """ Get the extension from a filename. - :params filename: The filename to extract the extension from. + :param filename: The filename to extract the extension from. :return: The lowercase file extension or None if not found. """ ext = os.path.splitext(filename)[1] @@ -160,7 +159,7 @@ def __fill_filename(self, filename=None) -> str: """ Fill in a filename if not provided or incomplete. - :params filename: Optional filename to use. + :param filename: Optional filename to use. :return: A complete filename. """ if filename is None: @@ -178,11 +177,11 @@ def __make_request(url, auth, headers, redirects, max_redirects) -> bytes: """ Makes an HTTP request to the given URL, while following redirections. - :params url: The URL to request. - :params auth: Authentication tuple (username, password). - :params headers: Headers for the request. - :params redirects: Current number of redirects. - :params max_redirects: Maximum number of redirects to follow. + :param url: The URL to request. + :param auth: Authentication tuple (username, password). + :param headers: Headers for the request. + :param redirects: Current number of redirects. + :param max_redirects: Maximum number of redirects to follow. :return: The content of the response. :raises MindeeSourceError: If max redirects are exceeded or the request fails. """ diff --git a/mindee/mindee_http/response_validation.py b/mindee/mindee_http/response_validation.py index 03160fcd..24cb87ce 100644 --- a/mindee/mindee_http/response_validation.py +++ b/mindee/mindee_http/response_validation.py @@ -9,16 +9,14 @@ def is_valid_sync_response(response: requests.Response) -> bool: """ Checks if the synchronous response is valid. Returns True if the response is valid. - :params response: a requests response object. + :param response: a requests response object. :return: bool """ if not response or not response.ok: return False response_json = json.loads(response.content) - # VERY rare edge case where raw html is sent instead of json. - if not isinstance(response_json, dict): - return False - return True + # EXTREMELY rare edge case where raw html is sent instead of json. + return isinstance(response_json, dict) def is_valid_async_response(response: requests.Response) -> bool: @@ -27,7 +25,7 @@ def is_valid_async_response(response: requests.Response) -> bool: Returns True if the response is valid. - :params response: a requests response object. + :param response: a requests response object. :return: bool """ if not is_valid_sync_response(response): @@ -38,24 +36,18 @@ def is_valid_async_response(response: requests.Response) -> bool: response.status_code < 200 or response.status_code > 302 ): return False - # Async errors. - if "job" not in response_json and "execution" not in response_json: - return False - if ( - "job" in response_json - and "error" in response_json["job"] - and response_json["job"]["error"] - ): - return False - - return True + if "job" in response_json: + return not response_json["job"].get("error") + if "execution" in response_json: + return not response_json["execution"].get("error") + return False def clean_request_json(response: requests.Response) -> StringDict: """ Checks and correct the response error format depending on the two possible kind of returns. - :params response: Raw request response. + :param response: Raw request response. :return: Returns the job error if the error is due to parsing, returns the http error otherwise. """ response_json = response.json() diff --git a/mindee/mindee_http/settings_mixin.py b/mindee/mindee_http/settings_mixin.py index 10edaf6d..a5452869 100644 --- a/mindee/mindee_http/settings_mixin.py +++ b/mindee/mindee_http/settings_mixin.py @@ -1,6 +1,3 @@ -from typing import Union - - class SettingsMixin: """Settings mixin for V2 & V2 common methods & attributes.""" @@ -9,7 +6,7 @@ class SettingsMixin: request_timeout: int """Timeout for all requests.""" - def set_timeout(self, value: Union[str, int]) -> None: + def set_timeout(self, value: str | int) -> None: """Set the timeout for all requests.""" self.request_timeout = int(value) diff --git a/mindee/parsing/common/__init__.py b/mindee/parsing/common/__init__.py index b48f6d25..737cfc5a 100644 --- a/mindee/parsing/common/__init__.py +++ b/mindee/parsing/common/__init__.py @@ -2,14 +2,14 @@ from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import ( clean_out_string, - line_separator, format_for_display, + line_separator, ) __all__ = [ "CommonResponse", "StringDict", "clean_out_string", - "line_separator", "format_for_display", + "line_separator", ] diff --git a/mindee/parsing/common/string_dict.py b/mindee/parsing/common/string_dict.py index cf91cdd0..86fea54d 100644 --- a/mindee/parsing/common/string_dict.py +++ b/mindee/parsing/common/string_dict.py @@ -1,4 +1,4 @@ -from typing import Any, Dict +from typing import Any -StringDict = Dict[str, Any] +StringDict = dict[str, Any] """Basic JSON-compliant python dictionary.""" diff --git a/mindee/parsing/common/summary_helper.py b/mindee/parsing/common/summary_helper.py index 10428ca8..ec7c312a 100644 --- a/mindee/parsing/common/summary_helper.py +++ b/mindee/parsing/common/summary_helper.py @@ -1,8 +1,7 @@ import re -from typing import List, Optional -def line_separator(column_sizes: List[int], separator: str) -> str: +def line_separator(column_sizes: list[int], separator: str) -> str: """Adds custom separators for console display in line-items-like fields.""" out_str = " +" for size in column_sizes: @@ -17,7 +16,7 @@ def clean_out_string(out_string: str) -> str: def format_for_display( - out_string: Optional[str] = None, max_col_size: Optional[int] = None + out_string: str | None = None, max_col_size: int | None = None ) -> str: """Truncates line-items to the max width of their corresponding column.""" if not out_string or len(out_string) == 0: diff --git a/mindee/pdf/extracted_pdf.py b/mindee/pdf/extracted_pdf.py index bad7e207..0d6c0118 100644 --- a/mindee/pdf/extracted_pdf.py +++ b/mindee/pdf/extracted_pdf.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import BinaryIO, Union +from typing import BinaryIO import pypdfium2 as pdfium @@ -31,11 +31,11 @@ def write_to_file(self, output_path: str): """Deprecated. Use ``save_to_file`` instead.""" self.save_to_file(output_path) - def save_to_file(self, output_path: Union[Path, str]): + def save_to_file(self, output_path: Path | str): """ Writes the contents of the current PDF object to a file. - :params output_path: Path of the destination file. If + :param output_path: Path of the destination file. If not extension is provided, pdf will be appended by default. """ out_path = Path(output_path) diff --git a/mindee/pdf/pdf_char_data.py b/mindee/pdf/pdf_char_data.py index 58d46db9..cc230b30 100644 --- a/mindee/pdf/pdf_char_data.py +++ b/mindee/pdf/pdf_char_data.py @@ -1,5 +1,4 @@ from dataclasses import dataclass -from typing import Tuple @dataclass @@ -24,9 +23,9 @@ class PDFCharData: """The font weight.""" font_flags: int """The font flags.""" - font_stroke_color: Tuple[int, int, int, int] + font_stroke_color: tuple[int, int, int, int] """RGBA representation of the font's stroke color.""" - font_fill_color: Tuple[int, int, int, int] + font_fill_color: tuple[int, int, int, int] """RGBA representation of the font's fill color.""" page_id: int """ID of the page the character was found on.""" diff --git a/mindee/pdf/pdf_compressor.py b/mindee/pdf/pdf_compressor.py index 2d5710b8..cac26607 100644 --- a/mindee/pdf/pdf_compressor.py +++ b/mindee/pdf/pdf_compressor.py @@ -2,7 +2,7 @@ import logging from ctypes import POINTER, c_char_p, c_ushort from threading import RLock -from typing import BinaryIO, List, Optional, Tuple, Union +from typing import BinaryIO import pypdfium2 as pdfium import pypdfium2.raw as pdfium_c @@ -21,7 +21,7 @@ def compress_pdf( - pdf_data: Union[BinaryIO, bytes], + pdf_data: BinaryIO | bytes, image_quality: int = 85, force_source_text_compression: bool = False, disable_source_text: bool = True, @@ -29,10 +29,10 @@ def compress_pdf( """ Compresses each page of a provided PDF buffer. - :params pdf_data: The input PDF as bytes. - :params image_quality: Compression quality (70-100 for most JPG images). - :params force_source_text_compression: If true, attempts to re-write detected text. - :params disable_source_text: If true, doesn't re-apply source text to the output PDF. + :param pdf_data: The input PDF as bytes. + :param image_quality: Compression quality (70-100 for most JPG images). + :param force_source_text_compression: If true, attempts to re-write detected text. + :param disable_source_text: If true, doesn't re-apply source text to the output PDF. :return: Compressed PDF as bytes. """ if not isinstance(pdf_data, bytes): @@ -86,12 +86,12 @@ def compress_pdf( def _compress_pdf_pages( pdf_data: bytes, image_quality: int, -) -> Optional[List[Tuple[bytes, int, int]]]: +) -> list[tuple[bytes, int, int]] | None: """ Compresses PDF pages and returns an array of compressed page buffers. - :params pdf_data: The input PDF as bytes. - :params image_quality: Initial compression quality. + :param pdf_data: The input PDF as bytes. + :param image_quality: Initial compression quality. :return: List of compressed page buffers, or None if compression fails. """ original_size = len(pdf_data) @@ -114,14 +114,14 @@ def _compress_pdf_pages( def add_text_to_pdf_page( # type: ignore page: pdfium.PdfPage, page_id: int, - extracted_text: Optional[List[List[PDFCharData]]], + extracted_text: list[list[PDFCharData]] | None, ) -> None: """ Adds text to a PDF page based on the extracted text data. - :params page: The PDFDocument object. - :params page_id: The ID of the page. - :params extracted_text: List of PDFCharData objects containing text and positioning information. + :param page: The PDFDocument object. + :param page_id: The ID of the page. + :param extracted_text: List of PDFCharData objects containing text and positioning information. """ if not extracted_text or not extracted_text[page_id]: return @@ -149,12 +149,12 @@ def add_text_to_pdf_page( # type: ignore def _compress_pages_with_quality( pdf_data: bytes, image_quality: int, -) -> List[Tuple[bytes, int, int]]: +) -> list[tuple[bytes, int, int]]: """ Compresses pages with a specific quality. - :params pdf_data: The input PDF as bytes. - :params image_quality: Compression quality. + :param pdf_data: The input PDF as bytes. + :param image_quality: Compression quality. :return: List of compressed page buffers. """ pdf_document = pdfium.PdfDocument(pdf_data) @@ -174,9 +174,9 @@ def _is_compression_successful( """ Checks if the compression was successful based on the compressed size and original size. - :params total_compressed_size: Total size of compressed pages. - :params original_size: Original PDF size. - :params image_quality: Compression quality. + :param total_compressed_size: Total size of compressed pages. + :param original_size: Original PDF size. + :param image_quality: Compression quality. :return: True if compression was successful, false otherwise. """ overhead = lerp(0.54, 0.18, image_quality / 100) @@ -190,8 +190,8 @@ def _rasterize_page( # type: ignore """ Rasterizes a PDF page. - :params page: PdfPage object to rasterize. - :params quality: Quality to apply during rasterization. + :param page: PdfPage object to rasterize. + :param quality: Quality to apply during rasterization. :return: Rasterized page as bytes. """ image = page.render().to_pil() @@ -200,11 +200,11 @@ def _rasterize_page( # type: ignore return buffer.getvalue() -def _collect_images_as_pdf(image_list: List[bytes]) -> pdfium.PdfDocument: # type: ignore +def _collect_images_as_pdf(image_list: list[bytes]) -> pdfium.PdfDocument: # type: ignore """ Converts a list of JPEG images into pages in a PdfDocument. - :params image_list: A list of bytes representing JPEG images. + :param image_list: A list of bytes representing JPEG images. :return: A PdfDocument handle containing the images as pages. """ out_pdf = pdfium.PdfDocument.new() diff --git a/mindee/pdf/pdf_extractor.py b/mindee/pdf/pdf_extractor.py index fb16a54a..1c599c1a 100644 --- a/mindee/pdf/pdf_extractor.py +++ b/mindee/pdf/pdf_extractor.py @@ -1,13 +1,13 @@ import io from pathlib import Path -from typing import BinaryIO, List +from typing import BinaryIO import pypdfium2 as pdfium from PIL import Image from mindee.error.mindee_error import MindeeError -from mindee.pdf.extracted_pdf import ExtractedPDF from mindee.input.local_input_source import LocalInputSource +from mindee.pdf.extracted_pdf import ExtractedPDF class PDFExtractor: @@ -30,11 +30,11 @@ def get_page_count(self) -> int: pdf = pdfium.PdfDocument(self._source_pdf) return len(pdf) - def cut_pages(self, page_indexes: List) -> BinaryIO: + def cut_pages(self, page_indexes: list) -> BinaryIO: """ Create a new PDF from pages and save it into a buffer. - :params page_indexes: List of pages number to use for merging in the original PDF. + :param page_indexes: List of pages number to use for merging in the original PDF. :return: The buffer containing the new PDF. """ self._source_pdf.seek(0) @@ -46,15 +46,15 @@ def cut_pages(self, page_indexes: List) -> BinaryIO: return bytes_io def extract_sub_documents( - self, page_indexes: List[List[int]] - ) -> List[ExtractedPDF]: + self, page_indexes: list[list[int]] + ) -> list[ExtractedPDF]: """ Extract the sub-documents from the main pdf, based on the given list of page indexes. - :params page_indexes: List of list of numbers, representing page indexes. + :param page_indexes: List of list of numbers, representing page indexes. :return: A list of created PDFS. """ - extracted_pdfs: List[ExtractedPDF] = [] + extracted_pdfs: list[ExtractedPDF] = [] extension = Path(self._filename).suffix stem = Path(self._filename).stem for page_index_elem in page_indexes: @@ -73,8 +73,8 @@ def extract_sub_documents( def extract_documents( self, - page_indexes: List[List[int]], - ) -> List[ExtractedPDF]: + page_indexes: list[list[int]], + ) -> list[ExtractedPDF]: """ Extracts complete PDFs from the document. diff --git a/mindee/pdf/pdf_utils.py b/mindee/pdf/pdf_utils.py index 83541280..f7b96b22 100644 --- a/mindee/pdf/pdf_utils.py +++ b/mindee/pdf/pdf_utils.py @@ -1,7 +1,6 @@ import ctypes from ctypes import byref, c_double, c_int, create_string_buffer from threading import RLock -from typing import List, Tuple import pypdfium2 as pdfium import pypdfium2.raw as pdfium_c @@ -15,26 +14,23 @@ def has_source_text(pdf_bytes: bytes) -> bool: """ Checks if the provided PDF bytes contain source text. - :params pdf_bytes: Raw bytes representation of a PDF file + :param pdf_bytes: Raw bytes representation of a PDF file :return: """ pdf = pdfium.PdfDocument(pdf_bytes) - for page in pdf: - if len(page.get_textpage().get_text_bounded().strip()) > 0: - return True - return False + return any(len(page.get_textpage().get_text_bounded().strip()) > 0 for page in pdf) -def extract_text_from_pdf(pdf_bytes: bytes) -> List[List[PDFCharData]]: +def extract_text_from_pdf(pdf_bytes: bytes) -> list[list[PDFCharData]]: """ Extracts the raw text from a given PDF's bytes along with font data. - :params pdf_bytes: Raw bytes representation of a PDF file. + :param pdf_bytes: Raw bytes representation of a PDF file. :return: A list of info regarding each read character. """ pdfium_lock = RLock() pdf = pdfium.PdfDocument(pdf_bytes) - char_data_list: List[List[PDFCharData]] = [] + char_data_list: list[list[PDFCharData]] = [] for i, page in enumerate(pdf): char_data_list.append(_process_page(page, i, pdfium_lock)) @@ -42,15 +38,15 @@ def extract_text_from_pdf(pdf_bytes: bytes) -> List[List[PDFCharData]]: return char_data_list -def _process_page(page, page_id: int, pdfium_lock: RLock) -> List[PDFCharData]: +def _process_page(page, page_id: int, pdfium_lock: RLock) -> list[PDFCharData]: """ Processes a single page of the PDF. - :params page: The PDF page to process. - :params page_id: ID of the page. - :params pdfium_lock: Lock for thread-safe operations. + :param page: The PDF page to process. + :param page_id: ID of the page. + :param pdfium_lock: Lock for thread-safe operations. """ - char_data_list: List[PDFCharData] = [] + char_data_list: list[PDFCharData] = [] internal_height = page.get_height() internal_width = page.get_width() @@ -78,17 +74,17 @@ def _process_char( internal_height: float, internal_width: float, page_id: int, -) -> List[PDFCharData]: +) -> list[PDFCharData]: """ Processes a single character from the PDF. - :params i: The index of the character. - :params text_handler: The text handler for the current page. - :params page: The current page being processed. - :params pdfium_lock: Lock for thread-safe operations. - :params internal_height: The height of the page. - :params internal_width: The width of the page. - :params page_id: ID of the page the character was found on. + :param i: The index of the character. + :param text_handler: The text handler for the current page. + :param page: The current page being processed. + :param pdfium_lock: Lock for thread-safe operations. + :param internal_height: The height of the page. + :param internal_width: The width of the page. + :param page_id: ID of the page the character was found on. :return: List of character data for a page. """ char_info = _get_char_info(i, text_handler, pdfium_lock) @@ -98,7 +94,7 @@ def _process_char( rotation = _get_page_rotation(page, pdfium_lock) adjusted_box = _adjust_char_box(char_box, rotation, internal_height, internal_width) - char_data_list: List[PDFCharData] = [] + char_data_list: list[PDFCharData] = [] for c in char_info["char"] or " ": if c in ( "\n", @@ -132,9 +128,9 @@ def _get_char_info(i: int, text_handler, pdfium_lock: RLock) -> dict: """ Retrieves information about a specific character. - :params i: The index of the character. - :params text_handler: The text handler for the current page. - :params pdfium_lock: Lock for thread-safe operations. + :param i: The index of the character. + :param text_handler: The text handler for the current page. + :param pdfium_lock: Lock for thread-safe operations. :return: A dictionary containing character information. """ stroke = (ctypes.c_uint(), ctypes.c_uint(), ctypes.c_uint(), ctypes.c_uint()) @@ -171,8 +167,8 @@ def _get_font_name(text_handler, i: int) -> str: """ Retrieves the font name for a specific character. - :params text_handler: The text handler for the current page. - :params i: The index of the character. + :param text_handler: The text handler for the current page. + :param i: The index of the character. :return: The font name as a string. """ buffer_length = 128 @@ -190,8 +186,8 @@ def _get_font_flags(text_handler, i: int) -> int: """ Retrieves the font flags for a specific character. - :params text_handler: The text handler for the current page. - :params i: The index of the character. + :param text_handler: The text handler for the current page. + :param i: The index of the character. :return: The font flags as an integer. """ flags = c_int(0) @@ -201,13 +197,13 @@ def _get_font_flags(text_handler, i: int) -> int: def _get_char_box( i: int, text_handler, pdfium_lock: RLock -) -> Tuple[float, float, float, float]: +) -> tuple[float, float, float, float]: """ Retrieves the bounding box for a specific character. - :params i: The index of the character. - :params text_handler: The text handler for the current page. - :params pdfium_lock: Lock for thread-safe operations. + :param i: The index of the character. + :param text_handler: The text handler for the current page. + :param pdfium_lock: Lock for thread-safe operations. :return: A tuple containing left, right, bottom, and top coordinates. """ left, right, bottom, top = (c_double(0), c_double(0), c_double(0), c_double(0)) @@ -222,8 +218,8 @@ def _get_page_rotation(page, pdfium_lock: RLock) -> int: """ Retrieves the rotation value for a specific page. - :params page: The page to get the rotation for. - :params pdfium_lock: Lock for thread-safe operations. + :param page: The page to get the rotation for. + :param pdfium_lock: Lock for thread-safe operations. :return: The rotation value in degrees. """ with pdfium_lock: @@ -233,18 +229,18 @@ def _get_page_rotation(page, pdfium_lock: RLock) -> int: def _adjust_char_box( - char_box: Tuple[float, float, float, float], + char_box: tuple[float, float, float, float], rotation: int, internal_height: float, internal_width: float, -) -> Tuple[float, float, float, float]: +) -> tuple[float, float, float, float]: """ Adjusts the character bounding box based on page rotation. - :params char_box: The original character bounding box. - :params rotation: The page rotation in degrees. - :params internal_height: The height of the page. - :params internal_width: The width of the page. + :param char_box: The original character bounding box. + :param rotation: The page rotation in degrees. + :param internal_height: The height of the page. + :param internal_width: The width of the page. :return: The adjusted character bounding box. """ left, right, bottom, top = char_box @@ -269,9 +265,9 @@ def lerp(start: float, end: float, t: float) -> float: """ Performs linear interpolation between two numbers. - :params start: The starting value. - :params end: The ending value. - :params t: The interpolation factor (0 to 1). + :param start: The starting value. + :param end: The ending value. + :param t: The interpolation factor (0 to 1). :return: The interpolated value. """ return start * (1 - t) + end * t diff --git a/mindee/v1/__init__.py b/mindee/v1/__init__.py index 589a36a7..6d59496c 100644 --- a/mindee/v1/__init__.py +++ b/mindee/v1/__init__.py @@ -1,17 +1,17 @@ from mindee.v1.client import ( - Client, AsyncPredictOptions, AsyncPredictResponse, + Client, PageOptions, - PredictResponse, PredictOptions, + PredictResponse, ) __all__ = [ - "Client", "AsyncPredictOptions", "AsyncPredictResponse", + "Client", "PageOptions", - "PredictResponse", "PredictOptions", + "PredictResponse", ] diff --git a/mindee/v1/client.py b/mindee/v1/client.py index 8e7e84c9..275c7177 100644 --- a/mindee/v1/client.py +++ b/mindee/v1/client.py @@ -1,30 +1,29 @@ from time import sleep -from typing import Dict, Optional, Type, Union from mindee.client_mixin import ClientMixin from mindee.error.mindee_error import MindeeClientError, MindeeError from mindee.error.mindee_http_error import handle_error +from mindee.input.local_input_source import LocalInputSource from mindee.input.local_response import LocalResponse from mindee.input.page_options import PageOptions -from mindee.v1.client_options.predict_options import AsyncPredictOptions, PredictOptions -from mindee.input.local_input_source import LocalInputSource from mindee.input.url_input_source import URLInputSource from mindee.logger import logger -from mindee.v1.mindee_http.endpoint import CustomEndpoint, Endpoint -from mindee.v1.mindee_http.mindee_api import MindeeAPI from mindee.mindee_http.response_validation import ( clean_request_json, is_valid_async_response, is_valid_sync_response, ) +from mindee.parsing.common.string_dict import StringDict +from mindee.v1.client_options.predict_options import AsyncPredictOptions, PredictOptions +from mindee.v1.client_options.workflow_options import WorkflowOptions +from mindee.v1.mindee_http.endpoint import CustomEndpoint, Endpoint +from mindee.v1.mindee_http.mindee_api import MindeeAPI from mindee.v1.mindee_http.workflow_endpoint import WorkflowEndpoint from mindee.v1.mindee_http.workflow_settings import WorkflowSettings -from mindee.v1.client_options.workflow_options import WorkflowOptions from mindee.v1.parsing.common.async_predict_response import AsyncPredictResponse from mindee.v1.parsing.common.feedback_response import FeedbackResponse from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.predict_response import PredictResponse -from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.workflow_response import WorkflowResponse from mindee.v1.product import GeneratedV1 @@ -38,9 +37,10 @@ def get_bound_classname(type_var) -> str: def _clean_account_name(account_name: str) -> str: """ - Checks that an account name is provided for custom products, and sets the default one otherwise. + Checks that an account name is provided for custom products, and sets the default + one otherwise. - :params account_name: name of the account's holder. Only needed for custom products. + :param account_name: name of the account's holder. Only needed for custom products. """ if not account_name or len(account_name) < 1: logger.warning( @@ -64,46 +64,49 @@ def __init__(self, api_key: str = "") -> None: """ Mindee API Client. - :params api_key: Your API key for all endpoints + :param api_key: Your API key for all endpoints """ self.api_key = api_key def parse( self, - product_class: Type[Inference], - input_source: Union[LocalInputSource, URLInputSource], + product_class: type[Inference], + input_source: LocalInputSource | URLInputSource, include_words: bool = False, close_file: bool = True, - page_options: Optional[PageOptions] = None, + page_options: PageOptions | None = None, cropper: bool = False, - endpoint: Optional[Endpoint] = None, + endpoint: Endpoint | None = None, full_text: bool = False, ) -> PredictResponse: """ Call prediction API on the document and parse the results. - :params product_class: The document class to use. + :param product_class: The document class to use. The response object will be instantiated based on this parameter. - :params input_source: The document/source file to use. + :param input_source: The document/source file to use. Has to be created beforehand. - :params include_words: Whether to include the full text for each page. - This performs a full OCR operation on the server and will increase response time. + :param include_words: Whether to include the full text for each page. + This performs a full OCR operation on the server and will increase + response time. Only available on financial document APIs. - :params close_file: Whether to ``close()`` the file after parsing it. + :param close_file: Whether to ``close()`` the file after parsing it. Set to ``False`` if you need to access the file after this operation. - :params page_options: If set, remove pages from the document as specified. + :param page_options: If set, remove pages from the document as specified. This is done before sending the file to the server. It is useful to avoid page limitations. - :params cropper: Whether to include cropper results for each page. - This performs a cropping operation on the server and will increase response time. + :param cropper: Whether to include cropper results for each page. + This performs a cropping operation on the server and will increase + response time. - :params endpoint: For custom endpoints, an endpoint has to be given. - :params full_text: Whether to include the full OCR text response in compatible APIs. + :param endpoint: For custom endpoints, an endpoint has to be given. + :param full_text: Whether to include the full OCR text response in + compatible APIs. """ if input_source is None: raise MindeeClientError("No input document provided.") @@ -113,13 +116,16 @@ def parse( logger.debug("Parsing document as '%s'", endpoint.url_name) - if isinstance(input_source, LocalInputSource): - if page_options and input_source.is_pdf(): - input_source.process_pdf( - page_options.operation, - page_options.on_min_pages, - page_options.page_indexes, - ) + if ( + isinstance(input_source, LocalInputSource) + and page_options + and input_source.is_pdf() + ): + input_source.process_pdf( + page_options.operation, + page_options.on_min_pages, + page_options.page_indexes, + ) options = PredictOptions(cropper, full_text, include_words) return self._make_request( product_class, @@ -131,46 +137,49 @@ def parse( def enqueue( self, - product_class: Type[Inference], - input_source: Union[LocalInputSource, URLInputSource], + product_class: type[Inference], + input_source: LocalInputSource | URLInputSource, include_words: bool = False, close_file: bool = True, - page_options: Optional[PageOptions] = None, + page_options: PageOptions | None = None, cropper: bool = False, - endpoint: Optional[Endpoint] = None, + endpoint: Endpoint | None = None, full_text: bool = False, - workflow_id: Optional[str] = None, + workflow_id: str | None = None, rag: bool = False, ) -> AsyncPredictResponse: """ Enqueues a document to an asynchronous endpoint. - :params product_class: The document class to use. + :param product_class: The document class to use. The response object will be instantiated based on this parameter. - :params input_source: The document/source file to use. + :param input_source: The document/source file to use. Has to be created beforehand. - :params include_words: Whether to include the full text for each page. - This performs a full OCR operation on the server and will increase response time. + :param include_words: Whether to include the full text for each page. + This performs a full OCR operation on the server and will increase + response time. - :params close_file: Whether to ``close()`` the file after parsing it. + :param close_file: Whether to ``close()`` the file after parsing it. Set to ``False`` if you need to access the file after this operation. - :params page_options: If set, remove pages from the document as specified. + :param page_options: If set, remove pages from the document as specified. This is done before sending the file to the server. It is useful to avoid page limitations. - :params cropper: Whether to include cropper results for each page. - This performs a cropping operation on the server and will increase response time. + :param cropper: Whether to include cropper results for each page. + This performs a cropping operation on the server and will increase + response time. - :params endpoint: For custom endpoints, an endpoint has to be given. + :param endpoint: For custom endpoints, an endpoint has to be given. - :params full_text: Whether to include the full OCR text response in compatible APIs. + :param full_text: Whether to include the full OCR text response in + compatible APIs. - :params workflow_id: Workflow ID. + :param workflow_id: Workflow ID. - :params rag: If set, will enable Retrieval-Augmented Generation. + :param rag: If set, will enable Retrieval-Augmented Generation. Only works if a valid ``workflow_id`` is set. """ if input_source is None: @@ -181,13 +190,16 @@ def enqueue( logger.debug("Enqueuing document as '%s'", endpoint.url_name) - if isinstance(input_source, LocalInputSource): - if page_options and input_source.is_pdf(): - input_source.process_pdf( - page_options.operation, - page_options.on_min_pages, - page_options.page_indexes, - ) + if ( + isinstance(input_source, LocalInputSource) + and page_options + and input_source.is_pdf() + ): + input_source.process_pdf( + page_options.operation, + page_options.on_min_pages, + page_options.page_indexes, + ) options = AsyncPredictOptions( cropper, full_text, include_words, workflow_id, rag ) @@ -200,13 +212,13 @@ def enqueue( ) def load_prediction( - self, product_class: Type[Inference], local_response: LocalResponse - ) -> Union[AsyncPredictResponse, PredictResponse]: + self, product_class: type[Inference], local_response: LocalResponse + ) -> AsyncPredictResponse | PredictResponse: """ Load a prediction. - :params product_class: Class of the product to use. - :params local_response: Local response to load. + :param product_class: Class of the product to use. + :param local_response: Local response to load. :return: A valid prediction. """ try: @@ -218,17 +230,17 @@ def load_prediction( def parse_queued( self, - product_class: Type[Inference], + product_class: type[Inference], queue_id: str, - endpoint: Optional[Endpoint] = None, + endpoint: Endpoint | None = None, ) -> AsyncPredictResponse: """ Parses a queued document. - :params product_class: The document class to use. + :param product_class: The document class to use. The response object will be instantiated based on this parameter. - :params queue_id: queue_id received from the API. - :params endpoint: For custom endpoints, an endpoint has to be given. + :param queue_id: queue_id received from the API. + :param endpoint: For custom endpoints, an endpoint has to be given. """ if not endpoint: endpoint = self._initialize_ots_endpoint(product_class) @@ -239,30 +251,33 @@ def parse_queued( def execute_workflow( self, - input_source: Union[LocalInputSource, URLInputSource], + input_source: LocalInputSource | URLInputSource, workflow_id: str, - options: Optional[WorkflowOptions] = None, - page_options: Optional[PageOptions] = None, + options: WorkflowOptions | None = None, + page_options: PageOptions | None = None, ) -> WorkflowResponse: """ Send the document to a workflow execution. - :params input_source: The document/source file to use. + :param input_source: The document/source file to use. Has to be created beforehand. - :params workflow_id: ID of the workflow. - :params page_options: If set, remove pages from the document as specified. + :param workflow_id: ID of the workflow. + :param page_options: If set, remove pages from the document as specified. This is done before sending the file to the server. It is useful to avoid page limitations. - :params options: Options for the workflow. + :param options: Options for the workflow. :return: """ - if isinstance(input_source, LocalInputSource): - if page_options and input_source.is_pdf(): - input_source.process_pdf( - page_options.operation, - page_options.on_min_pages, - page_options.page_indexes, - ) + if ( + isinstance(input_source, LocalInputSource) + and page_options + and input_source.is_pdf() + ): + input_source.process_pdf( + page_options.operation, + page_options.on_min_pages, + page_options.page_indexes, + ) if not options: options = WorkflowOptions( @@ -273,57 +288,60 @@ def execute_workflow( def enqueue_and_parse( # pylint: disable=too-many-locals self, - product_class: Type[Inference], - input_source: Union[LocalInputSource, URLInputSource], + product_class: type[Inference], + input_source: LocalInputSource | URLInputSource, include_words: bool = False, close_file: bool = True, - page_options: Optional[PageOptions] = None, + page_options: PageOptions | None = None, cropper: bool = False, - endpoint: Optional[Endpoint] = None, + endpoint: Endpoint | None = None, initial_delay_sec: float = 2, delay_sec: float = 1.5, max_retries: int = 80, full_text: bool = False, - workflow_id: Optional[str] = None, + workflow_id: str | None = None, rag: bool = False, ) -> AsyncPredictResponse: """ Enqueues to an asynchronous endpoint and automatically polls for a response. - :params product_class: The document class to use. + :param product_class: The document class to use. The response object will be instantiated based on this parameter. - :params input_source: The document/source file to use. + :param input_source: The document/source file to use. Has to be created beforehand. - :params include_words: Whether to include the full text for each page. - This performs a full OCR operation on the server and will increase response time. + :param include_words: Whether to include the full text for each page. + This performs a full OCR operation on the server and will increase + response time. - :params close_file: Whether to ``close()`` the file after parsing it. + :param close_file: Whether to ``close()`` the file after parsing it. Set to ``False`` if you need to access the file after this operation. - :params page_options: If set, remove pages from the document as specified. + :param page_options: If set, remove pages from the document as specified. This is done before sending the file to the server. It is useful to avoid page limitations. - :params cropper: Whether to include cropper results for each page. - This performs a cropping operation on the server and will increase response time. + :param cropper: Whether to include cropper results for each page. + This performs a cropping operation on the server and will increase + response time. - :params endpoint: For custom endpoints, an endpoint has to be given. + :param endpoint: For custom endpoints, an endpoint has to be given. - :params initial_delay_sec: Delay between each polling attempts. + :param initial_delay_sec: Delay between each polling attempts. This should not be shorter than 1 second. - :params delay_sec: Delay between each polling attempts. + :param delay_sec: Delay between each polling attempts. This should not be shorter than 1 second. - :params max_retries: Total amount of polling attempts. + :param max_retries: Total amount of polling attempts. - :params full_text: Whether to include the full OCR text response in compatible APIs. + :param full_text: Whether to include the full OCR text response in + compatible APIs. - :params workflow_id: Workflow ID. + :param workflow_id: Workflow ID. - :params rag: If set, will enable Retrieval-Augmented Generation. + :param rag: If set, will enable Retrieval-Augmented Generation. Only works if a valid ``workflow_id`` is set. """ self._validate_async_params(initial_delay_sec, delay_sec, max_retries) @@ -370,20 +388,20 @@ def enqueue_and_parse( # pylint: disable=too-many-locals def send_feedback( self, - product_class: Type[Inference], + product_class: type[Inference], document_id: str, feedback: StringDict, - endpoint: Optional[Endpoint] = None, + endpoint: Endpoint | None = None, ) -> FeedbackResponse: """ Send a feedback for a document. - :params product_class: The document class to use. + :param product_class: The document class to use. The response object will be instantiated based on this parameter. - :params document_id: The id of the document to send feedback to. - :params feedback: Feedback to send. - :params endpoint: For custom endpoints, an endpoint has to be given. + :param document_id: The id of the document to send feedback to. + :param feedback: Feedback to send. + :param endpoint: For custom endpoints, an endpoint has to be given. """ if not document_id or len(document_id) == 0: raise MindeeClientError("Invalid document_id.") @@ -402,8 +420,8 @@ def send_feedback( def _make_request( self, - product_class: Type[Inference], - input_source: Union[LocalInputSource, URLInputSource], + product_class: type[Inference], + input_source: LocalInputSource | URLInputSource, endpoint: Endpoint, options: PredictOptions, close_file: bool, @@ -427,13 +445,14 @@ def _make_request( def _predict_async( self, - product_class: Type[Inference], - input_source: Union[LocalInputSource, URLInputSource], + product_class: type[Inference], + input_source: LocalInputSource | URLInputSource, options: AsyncPredictOptions, - endpoint: Optional[Endpoint] = None, + endpoint: Endpoint | None = None, close_file: bool = True, ) -> AsyncPredictResponse: - """Sends a document to the queue, and sends back an asynchronous predict response.""" + """Sends a document to the queue, and sends back an asynchronous predict + response.""" if input_source is None: raise MindeeClientError("No input document provided") if not endpoint: @@ -460,14 +479,14 @@ def _predict_async( def _get_queued_document( self, - product_class: Type[Inference], + product_class: type[Inference], endpoint: Endpoint, queue_id: str, ) -> AsyncPredictResponse: """ Fetches a document or a Job from a given queue. - :params queue_id: Queue_id received from the API + :param queue_id: Queue_id received from the API """ queue_response = endpoint.document_queue_req_get(queue_id=queue_id) @@ -482,21 +501,21 @@ def _get_queued_document( def _send_to_workflow( self, - product_class: Type[Inference], - input_source: Union[LocalInputSource, URLInputSource], + product_class: type[Inference], + input_source: LocalInputSource | URLInputSource, workflow_id: str, options: WorkflowOptions, ) -> WorkflowResponse: """ Sends a document to a workflow. - :params product_class: The document class to use. + :param product_class: The document class to use. The response object will be instantiated based on this parameter. - :params input_source: The document/source file to use. + :param input_source: The document/source file to use. Has to be created beforehand. - :params workflow_id: ID of the workflow. - :params options: Optional options for the workflow. + :param workflow_id: ID of the workflow. + :param options: Optional options for the workflow. :return: """ if input_source is None: @@ -518,10 +537,10 @@ def _send_to_workflow( ) return WorkflowResponse(product_class, dict_response) - def _initialize_ots_endpoint(self, product_class: Type[Inference]) -> Endpoint: + def _initialize_ots_endpoint(self, product_class: type[Inference]) -> Endpoint: if product_class.__name__ == "CustomV1": raise MindeeClientError("Missing endpoint specifications for custom build.") - endpoint_info: Dict[str, str] = product_class.get_endpoint_info(product_class) + endpoint_info: dict[str, str] = product_class.get_endpoint_info(product_class) return self._build_endpoint( endpoint_info["name"], OTS_OWNER, endpoint_info["version"] ) @@ -543,14 +562,15 @@ def create_endpoint( self, endpoint_name: str, account_name: str = "mindee", - version: Optional[str] = None, + version: str | None = None, ) -> Endpoint: """ Add a custom endpoint, created using the Mindee API Builder. - :params endpoint_name: The "API name" field in the "Settings" page of the API Builder - :params account_name: Your organization's username on the API Builder - :params version: If set, locks the version of the model to use. + :param endpoint_name: The "API name" field in the "Settings" page of the API + Builder + :param account_name: Your organization's username on the API Builder + :param version: If set, locks the version of the model to use. If not set, use the latest version of the model. """ if len(endpoint_name) == 0: @@ -558,7 +578,8 @@ def create_endpoint( account_name = _clean_account_name(account_name) if not version or len(version) < 1: logger.debug( - "No version provided for a custom build, will attempt to poll version 1 by default." + "No version provided for a custom build, will attempt to poll version " + "1 by default." ) version = "1" return self._build_endpoint(endpoint_name, account_name, version) diff --git a/mindee/v1/client_options/__init__.py b/mindee/v1/client_options/__init__.py index ebc6b0cb..07ab99b2 100644 --- a/mindee/v1/client_options/__init__.py +++ b/mindee/v1/client_options/__init__.py @@ -1,4 +1,4 @@ -from mindee.v1.client_options.workflow_options import WorkflowOptions from mindee.v1.client_options.predict_options import PredictOptions +from mindee.v1.client_options.workflow_options import WorkflowOptions -__all__ = ["WorkflowOptions", "PredictOptions"] +__all__ = ["PredictOptions", "WorkflowOptions"] diff --git a/mindee/v1/client_options/predict_options.py b/mindee/v1/client_options/predict_options.py index b3aa17b2..3d188e28 100644 --- a/mindee/v1/client_options/predict_options.py +++ b/mindee/v1/client_options/predict_options.py @@ -1,6 +1,3 @@ -from typing import Optional - - class PredictOptions: """Options to pass to a prediction.""" @@ -23,7 +20,7 @@ def __init__( cropper: bool = False, full_text: bool = False, include_words: bool = False, - workflow_id: Optional[str] = None, + workflow_id: str | None = None, rag: bool = False, ): super().__init__(cropper, full_text, include_words) diff --git a/mindee/v1/client_options/workflow_options.py b/mindee/v1/client_options/workflow_options.py index fa032588..3a2fc3e1 100644 --- a/mindee/v1/client_options/workflow_options.py +++ b/mindee/v1/client_options/workflow_options.py @@ -1,29 +1,27 @@ -from typing import Optional - from mindee.v1.parsing.common import ExecutionPriority class WorkflowOptions: """Options to pass to a workflow execution.""" - alias: Optional[str] + alias: str | None """Alias for the document.""" - priority: Optional[ExecutionPriority] + priority: ExecutionPriority | None """Priority of the document.""" full_text: bool """Whether to include the full OCR text response in compatible APIs.""" - public_url: Optional[str] + public_url: str | None """A unique, encrypted URL for accessing the document validation interface without requiring authentication.""" rag: bool """Whether to enable Retrieval-Augmented Generation.""" def __init__( self, - alias: Optional[str] = None, - priority: Optional[ExecutionPriority] = None, - full_text: Optional[bool] = False, - public_url: Optional[str] = None, - rag: Optional[bool] = False, + alias: str | None = None, + priority: ExecutionPriority | None = None, + full_text: bool | None = False, + public_url: str | None = None, + rag: bool | None = False, ): self.alias = alias self.priority = priority diff --git a/mindee/v1/commands/__init__.py b/mindee/v1/commands/__init__.py index 008d0ca7..5d54c30c 100644 --- a/mindee/v1/commands/__init__.py +++ b/mindee/v1/commands/__init__.py @@ -1,9 +1,9 @@ -from mindee.v1.commands.cli_products import CommandConfig, PRODUCTS -from mindee.v1.commands.cli_parser import MindeeParser, MindeeArgumentParser +from mindee.v1.commands.cli_parser import MindeeArgumentParser, MindeeParser +from mindee.v1.commands.cli_products import PRODUCTS, CommandConfig __all__ = [ + "PRODUCTS", "CommandConfig", "MindeeArgumentParser", "MindeeParser", - "PRODUCTS", ] diff --git a/mindee/v1/commands/cli_parser.py b/mindee/v1/commands/cli_parser.py index 473c27db..323bb016 100644 --- a/mindee/v1/commands/cli_parser.py +++ b/mindee/v1/commands/cli_parser.py @@ -1,6 +1,5 @@ import json from argparse import ArgumentParser, Namespace -from typing import Optional, Type, Union from mindee import ( Base64Input, @@ -10,14 +9,13 @@ PathInput, URLInputSource, ) -from mindee.v1.client import Client, Endpoint -from mindee.v1.commands.cli_products import PRODUCTS, CommandConfig from mindee.error.mindee_error import MindeeClientError from mindee.input.page_options import PageOptions +from mindee.v1.client import Client, Endpoint +from mindee.v1.commands.cli_products import PRODUCTS, CommandConfig +from mindee.v1.parsing.common import Document, PredictResponse, serialize_for_json from mindee.v1.parsing.common.async_predict_response import AsyncPredictResponse -from mindee.v1.parsing.common import Document, serialize_for_json from mindee.v1.parsing.common.inference import Inference -from mindee.v1.parsing.common import PredictResponse class MindeeArgumentParser(ArgumentParser): @@ -116,17 +114,17 @@ class MindeeParser: """Mindee client""" document_info: CommandConfig """Config of the document.""" - input_doc: Union[LocalInputSource, URLInputSource] + input_doc: LocalInputSource | URLInputSource """Document to be parsed.""" - product_class: Type[Inference] + product_class: type[Inference] """Product to parse.""" def __init__( self, - parser: Optional[MindeeArgumentParser] = None, - parsed_args: Optional[Namespace] = None, - client: Optional[Client] = None, - document_info: Optional[CommandConfig] = None, + parser: MindeeArgumentParser | None = None, + parsed_args: Namespace | None = None, + client: Client | None = None, + document_info: CommandConfig | None = None, ) -> None: self.parser = ( parser if parser else MindeeArgumentParser(description="Mindee_API") @@ -144,7 +142,7 @@ def __init__( def call_parse(self) -> None: """Calls an endpoint with the appropriate method, and displays the results.""" - response: Union[PredictResponse, AsyncPredictResponse] + response: PredictResponse | AsyncPredictResponse if self.document_info.is_sync: if self.document_info.is_async: if ( @@ -176,12 +174,12 @@ def call_parse(self) -> None: def _parse_sync(self) -> PredictResponse: """Processes the results of a synchronous request.""" - page_options: Optional[PageOptions] = None + page_options: PageOptions | None = None if self.parsed_args.cut_doc and self.parsed_args.doc_pages: page_options = PageOptions( range(self.parsed_args.doc_pages), on_min_pages=0 ) - custom_endpoint: Optional[Endpoint] = None + custom_endpoint: Endpoint | None = None if self.parsed_args.product_name in ("custom", "generated"): include_words = False custom_endpoint = self.client.create_endpoint( @@ -201,12 +199,12 @@ def _parse_sync(self) -> PredictResponse: def _parse_async(self) -> AsyncPredictResponse: """Enqueues and processes the results of an asynchronous request.""" - page_options: Optional[PageOptions] = None + page_options: PageOptions | None = None if self.parsed_args.cut_doc and self.parsed_args.doc_pages: page_options = PageOptions( range(self.parsed_args.doc_pages), on_min_pages=0 ) - custom_endpoint: Optional[Endpoint] = None + custom_endpoint: Endpoint | None = None if self.parsed_args.product_name in ("custom", "generated"): include_words = False custom_endpoint = self.client.create_endpoint( @@ -268,13 +266,13 @@ def _set_args(self) -> Namespace: parsed_args = self.parser.parse_args() return parsed_args - def _get_input_doc(self) -> Union[LocalInputSource, URLInputSource]: + def _get_input_doc(self) -> LocalInputSource | URLInputSource: """Loads an input document.""" if self.parsed_args.input_type == "file": with open(self.parsed_args.path, "rb", buffering=30) as file_handle: return FileInput(file_handle) elif self.parsed_args.input_type == "base64": - with open(self.parsed_args.path, "rt", encoding="ascii") as base64_handle: + with open(self.parsed_args.path, encoding="ascii") as base64_handle: return Base64Input(base64_handle.read(), "test.jpg") elif self.parsed_args.input_type == "bytes": with open(self.parsed_args.path, "rb") as bytes_handle: diff --git a/mindee/v1/commands/cli_products.py b/mindee/v1/commands/cli_products.py index 5216e3de..49d125a4 100644 --- a/mindee/v1/commands/cli_products.py +++ b/mindee/v1/commands/cli_products.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import Dict, Generic, Type +from typing import Generic from mindee.v1 import product from mindee.v1.parsing.common import TypeInference @@ -10,12 +10,12 @@ class CommandConfig(Generic[TypeInference]): """Configuration for a command.""" help: str - doc_class: Type[TypeInference] + doc_class: type[TypeInference] is_sync: bool is_async: bool -PRODUCTS: Dict[str, CommandConfig] = { +PRODUCTS: dict[str, CommandConfig] = { "custom": CommandConfig( help="Custom document type from API builder", doc_class=product.CustomV1, diff --git a/mindee/v1/error/__init__.py b/mindee/v1/error/__init__.py index f6a4c0cd..18f92021 100644 --- a/mindee/v1/error/__init__.py +++ b/mindee/v1/error/__init__.py @@ -1,5 +1,4 @@ from mindee.v1.error.mindee_api_error import MindeeAPIError - from mindee.v1.error.mindee_product_error import MindeeProductError __all__ = ["MindeeAPIError", "MindeeProductError"] diff --git a/mindee/v1/mindee_http/base_endpoint.py b/mindee/v1/mindee_http/base_endpoint.py index 2b636049..6b252d8a 100644 --- a/mindee/v1/mindee_http/base_endpoint.py +++ b/mindee/v1/mindee_http/base_endpoint.py @@ -1,15 +1,13 @@ -from abc import ABC - from mindee.v1.mindee_http.base_settings import BaseSettings -class BaseEndpoint(ABC): +class BaseEndpoint: """Base endpoint class for the Mindee API.""" def __init__(self, settings: BaseSettings) -> None: """ Base API endpoint class for all endpoints. - :params settings: Settings relating to all endpoints. + :param settings: Settings relating to all endpoints. """ self.settings = settings diff --git a/mindee/v1/mindee_http/base_settings.py b/mindee/v1/mindee_http/base_settings.py index cc6ede7e..84470b46 100644 --- a/mindee/v1/mindee_http/base_settings.py +++ b/mindee/v1/mindee_http/base_settings.py @@ -1,6 +1,5 @@ import os from dataclasses import dataclass -from typing import Dict, Optional from mindee.logger import logger from mindee.mindee_http.settings_mixin import SettingsMixin @@ -23,26 +22,26 @@ class BaseSettings(SettingsMixin): """Settings class relating to API requests.""" - api_key: Optional[str] + api_key: str | None """API Key for the client.""" base_url: str request_timeout: int - def __init__(self, api_key: Optional[str]): + def __init__(self, api_key: str | None): self._set_api_key(api_key) self.request_timeout = TIMEOUT_DEFAULT self.set_base_url(BASE_URL_DEFAULT) self.set_from_env() @property - def base_headers(self) -> Dict[str, str]: + def base_headers(self) -> dict[str, str]: """Base headers to send with all API requests.""" return { "Authorization": f"Token {self.api_key}", "User-Agent": USER_AGENT, } - def _set_api_key(self, api_key: Optional[str]) -> None: + def _set_api_key(self, api_key: str | None) -> None: """Set the endpoint's API key from an environment variable, if present.""" env_val = os.getenv(API_KEY_ENV_NAME, "") if env_val and (not api_key or len(api_key) == 0): diff --git a/mindee/v1/mindee_http/endpoint.py b/mindee/v1/mindee_http/endpoint.py index 0dc62ae4..4b29737d 100644 --- a/mindee/v1/mindee_http/endpoint.py +++ b/mindee/v1/mindee_http/endpoint.py @@ -1,14 +1,13 @@ import json -from typing import Optional, Union import requests from requests import Response from mindee.input.local_input_source import LocalInputSource from mindee.input.url_input_source import URLInputSource +from mindee.parsing.common import StringDict from mindee.v1.mindee_http.base_endpoint import BaseEndpoint from mindee.v1.mindee_http.mindee_api import MindeeAPI -from mindee.parsing.common import StringDict class Endpoint(BaseEndpoint): @@ -22,9 +21,9 @@ def __init__( """ Generic API endpoint for a product. - :params owner: owner of the product - :params url_name: name of the product as it appears in the URL - :params version: interface version + :param owner: owner of the product + :param url_name: name of the product as it appears in the URL + :param version: interface version """ super().__init__(settings) self.owner = owner @@ -33,7 +32,7 @@ def __init__( def predict_req_post( self, - input_source: Union[LocalInputSource, URLInputSource], + input_source: LocalInputSource | URLInputSource, include_words: bool = False, close_file: bool = True, cropper: bool = False, @@ -42,11 +41,11 @@ def predict_req_post( """ Make a request to POST a document for prediction. - :params input_source: Input object - :params include_words: Include raw OCR words in the response - :params close_file: Whether to `close()` the file after parsing it. - :params cropper: Including Mindee cropping results. - :params full_text: Whether to include the full OCR text response in compatible APIs. + :param input_source: Input object + :param include_words: Include raw OCR words in the response + :param close_file: Whether to `close()` the file after parsing it. + :param cropper: Including Mindee cropping results. + :param full_text: Whether to include the full OCR text response in compatible APIs. :return: requests response """ return self._custom_request( @@ -55,24 +54,24 @@ def predict_req_post( def predict_async_req_post( self, - input_source: Union[LocalInputSource, URLInputSource], + input_source: LocalInputSource | URLInputSource, include_words: bool = False, close_file: bool = True, cropper: bool = False, full_text: bool = False, - workflow_id: Optional[str] = None, + workflow_id: str | None = None, rag: bool = False, ) -> requests.Response: """ Make an asynchronous request to POST a document for prediction. - :params input_source: Input object - :params include_words: Include raw OCR words in the response - :params close_file: Whether to `close()` the file after parsing it. - :params cropper: Including Mindee cropping results. - :params full_text: Whether to include the full OCR text response in compatible APIs. - :params workflow_id: Workflow ID. - :params rag: If set, will enable Retrieval-Augmented Generation. + :param input_source: Input object + :param include_words: Include raw OCR words in the response + :param close_file: Whether to `close()` the file after parsing it. + :param cropper: Including Mindee cropping results. + :param full_text: Whether to include the full OCR text response in compatible APIs. + :param workflow_id: Workflow ID. + :param rag: If set, will enable Retrieval-Augmented Generation. :return: requests response """ return self._custom_request( @@ -89,12 +88,12 @@ def predict_async_req_post( def _custom_request( self, route: str, - input_source: Union[LocalInputSource, URLInputSource], + input_source: LocalInputSource | URLInputSource, include_words: bool = False, close_file: bool = True, cropper: bool = False, full_text: bool = False, - workflow_id: Optional[str] = None, + workflow_id: str | None = None, rag: bool = False, ): data = {} @@ -140,7 +139,7 @@ def document_queue_req_get(self, queue_id: str) -> requests.Response: """ Sends a request matching a given queue_id. Returns either a Job or a Document. - :params queue_id: queue_id received from the API + :param queue_id: queue_id received from the API """ return requests.get( f"{self.settings.url_root}/documents/queue/{queue_id}", @@ -162,8 +161,8 @@ def document_feedback_req_put( """ Send a feedback. - :params document_id: ID of the document to send feedback to. - :params feedback: Feedback object to send. + :param document_id: ID of the document to send feedback to. + :param feedback: Feedback object to send. """ return requests.put( f"{self.settings.base_url}/documents/{document_id}/feedback", @@ -182,9 +181,9 @@ def training_req_post( """ Make a request to POST a document for training. - :params input_source: Input object + :param input_source: Input object :return: requests response - :params close_file: Whether to `close()` the file after parsing it. + :param close_file: Whether to `close()` the file after parsing it. """ files = {"document": input_source.read_contents(close_file)} params = {"training": True, "with_candidates": True} @@ -204,9 +203,9 @@ def training_async_req_post( """ Make a request to POST a document for training without processing. - :params input_source: Input object + :param input_source: Input object :return: requests response - :params close_file: Whether to `close()` the file after parsing it. + :param close_file: Whether to `close()` the file after parsing it. """ files = {"document": input_source.read_contents(close_file)} params = {"training": True, "async": True} @@ -224,7 +223,7 @@ def document_req_del(self, document_id: str) -> requests.Response: """ Make a request to DELETE a document. - :params document_id: ID of the document + :param document_id: ID of the document """ response = requests.delete( f"{self.settings.url_root}/documents/{document_id}", @@ -237,7 +236,7 @@ def documents_req_get(self, page_id: int = 1) -> requests.Response: """ Make a request to GET info on all documents. - :params page_id: Page number + :param page_id: Page number """ params = { "page": page_id, @@ -254,7 +253,7 @@ def document_req_get(self, document_id: str) -> requests.Response: """ Make a request to GET annotations for a document. - :params document_id: ID of the document + :param document_id: ID of the document """ params = { "include_annotations": True, @@ -275,8 +274,8 @@ def annotations_req_post( """ Make a request to POST annotations for a document. - :params document_id: ID of the document to annotate - :params annotations: Annotations object + :param document_id: ID of the document to annotate + :param annotations: Annotations object :return: requests response """ response = requests.post( @@ -293,8 +292,8 @@ def annotations_req_put( """ Make a request to PUT annotations for a document. - :params document_id: ID of the document to annotate - :params annotations: Annotations object + :param document_id: ID of the document to annotate + :param annotations: Annotations object :return: requests response """ response = requests.put( @@ -309,7 +308,7 @@ def annotations_req_del(self, document_id: str) -> requests.Response: """ Make a request to DELETE annotations for a document. - :params document_id: ID of the document to annotate + :param document_id: ID of the document to annotate :return: requests response """ response = requests.delete( diff --git a/mindee/v1/mindee_http/mindee_api.py b/mindee/v1/mindee_http/mindee_api.py index 91bac530..e7408de7 100644 --- a/mindee/v1/mindee_http/mindee_api.py +++ b/mindee/v1/mindee_http/mindee_api.py @@ -1,5 +1,4 @@ from dataclasses import dataclass -from typing import Optional from mindee.v1.error.mindee_api_error import MindeeAPIError from mindee.v1.mindee_http.base_settings import API_KEY_ENV_NAME, BaseSettings @@ -11,7 +10,7 @@ class MindeeAPI(BaseSettings): def __init__( self, - api_key: Optional[str], + api_key: str | None, endpoint_name: str, account_name: str, version: str, @@ -19,12 +18,10 @@ def __init__( super().__init__(api_key) if not self.api_key or len(self.api_key) == 0: raise MindeeAPIError( - ( - f"Missing API key for '{endpoint_name} v{version}' (belonging to {account_name})," - " check your Client configuration.\n" - "You can set this using the " - f"'{API_KEY_ENV_NAME}' environment variable." - ) + f"Missing API key for '{endpoint_name} v{version}' (belonging to {account_name})," + " check your Client configuration.\n" + "You can set this using the " + f"'{API_KEY_ENV_NAME}' environment variable." ) self.endpoint_name = endpoint_name self.account_name = account_name diff --git a/mindee/v1/mindee_http/workflow_endpoint.py b/mindee/v1/mindee_http/workflow_endpoint.py index b8a19f7a..1e139a7b 100644 --- a/mindee/v1/mindee_http/workflow_endpoint.py +++ b/mindee/v1/mindee_http/workflow_endpoint.py @@ -1,5 +1,3 @@ -from typing import Union - import requests from mindee.input.local_input_source import LocalInputSource @@ -18,21 +16,21 @@ def __init__(self, settings: WorkflowSettings) -> None: """ Workflow Endpoint. - :params settings: Settings object. + :param settings: Settings object. """ super().__init__(settings) def workflow_execution_post( self, - input_source: Union[LocalInputSource, URLInputSource], + input_source: LocalInputSource | URLInputSource, options: WorkflowOptions, ): """ Sends the document to the workflow. - :params input_source: The document/source file to use. + :param input_source: The document/source file to use. Has to be created beforehand. - :params options: Options for the workflow. + :param options: Options for the workflow. :return: """ data = {} diff --git a/mindee/v1/mindee_http/workflow_settings.py b/mindee/v1/mindee_http/workflow_settings.py index bd272159..625c074d 100644 --- a/mindee/v1/mindee_http/workflow_settings.py +++ b/mindee/v1/mindee_http/workflow_settings.py @@ -1,5 +1,4 @@ from dataclasses import dataclass -from typing import Optional from mindee.v1.error.mindee_api_error import MindeeAPIError from mindee.v1.mindee_http.base_settings import API_KEY_ENV_NAME, BaseSettings @@ -11,17 +10,15 @@ class WorkflowSettings(BaseSettings): def __init__( self, - api_key: Optional[str], + api_key: str | None, workflow_id: str, ): super().__init__(api_key) if not self.api_key or len(self.api_key) == 0: raise MindeeAPIError( - ( - f"Missing API key for workflow '{workflow_id}'," - " check your Client configuration.\n" - "You can set this using the " - f"'{API_KEY_ENV_NAME}' environment variable." - ) + f"Missing API key for workflow '{workflow_id}'," + " check your Client configuration.\n" + "You can set this using the " + f"'{API_KEY_ENV_NAME}' environment variable." ) self.url_root = f"{self.base_url}/workflows/{workflow_id}/executions" diff --git a/mindee/v1/parsing/common/__init__.py b/mindee/v1/parsing/common/__init__.py index 4a9bf7ad..be0d2c60 100644 --- a/mindee/v1/parsing/common/__init__.py +++ b/mindee/v1/parsing/common/__init__.py @@ -18,26 +18,26 @@ from mindee.v1.parsing.common.workflow_response import WorkflowResponse __all__ = [ + "OCR", "ApiRequest", "ApiResponse", "AsyncPredictResponse", + "CropperExtra", "Document", "Execution", "ExecutionFile", "ExecutionPriority", - "CropperExtra", "Extras", "FeedbackResponse", "Inference", - "TypeInference", - "WorkflowResponse", - "Prediction", "Job", + "MVisionV1", "OrientationField", "Page", "PredictResponse", - "MVisionV1", - "OCR", + "Prediction", "RequestStatus", + "TypeInference", + "WorkflowResponse", "serialize_for_json", ] diff --git a/mindee/v1/parsing/common/api_request.py b/mindee/v1/parsing/common/api_request.py index b21d6387..3d95a727 100644 --- a/mindee/v1/parsing/common/api_request.py +++ b/mindee/v1/parsing/common/api_request.py @@ -1,5 +1,4 @@ from enum import Enum -from typing import List from mindee.parsing.common.string_dict import StringDict @@ -15,7 +14,7 @@ class ApiRequest: """Information on the API request made to the server.""" error: StringDict - resources: List[str] + resources: list[str] status: RequestStatus status_code: int """HTTP status code.""" diff --git a/mindee/v1/parsing/common/api_response.py b/mindee/v1/parsing/common/api_response.py index 08825eaa..c596435e 100644 --- a/mindee/v1/parsing/common/api_response.py +++ b/mindee/v1/parsing/common/api_response.py @@ -2,8 +2,8 @@ from abc import ABC from mindee.logger import logger -from mindee.v1.parsing.common.api_request import ApiRequest from mindee.parsing.common.string_dict import StringDict +from mindee.v1.parsing.common.api_request import ApiRequest class ApiResponse(ABC): diff --git a/mindee/v1/parsing/common/async_predict_response.py b/mindee/v1/parsing/common/async_predict_response.py index 268ad939..9550f4fe 100644 --- a/mindee/v1/parsing/common/async_predict_response.py +++ b/mindee/v1/parsing/common/async_predict_response.py @@ -1,4 +1,4 @@ -from typing import Generic, Optional, Type +from typing import Generic from mindee.v1.parsing.common.api_response import ApiResponse, StringDict from mindee.v1.parsing.common.document import Document @@ -15,10 +15,10 @@ class AsyncPredictResponse(Generic[TypeInference], ApiResponse): job: Job """Job object link to the prediction. As long as it isn't complete, the prediction doesn't exist.""" - document: Optional[Document] = None + document: Document | None = None def __init__( - self, inference_type: Type[TypeInference], raw_response: StringDict + self, inference_type: type[TypeInference], raw_response: StringDict ) -> None: """ Container wrapper for a raw API response. @@ -26,10 +26,10 @@ def __init__( Inherits and instantiates a normal PredictResponse if the product of the current queue is both requested and done. - :params inference_type: Type of the inference. - :params raw_response: json response from HTTP call. + :param inference_type: Type of the inference. + :param raw_response: json response from HTTP call. """ super().__init__(raw_response) self.job = Job(raw_response["job"]) - if "document" in raw_response and raw_response["document"]: + if raw_response.get("document"): self.document = Document(inference_type, raw_response["document"]) diff --git a/mindee/v1/parsing/common/document.py b/mindee/v1/parsing/common/document.py index ede62dbd..49e2bf2c 100644 --- a/mindee/v1/parsing/common/document.py +++ b/mindee/v1/parsing/common/document.py @@ -1,12 +1,12 @@ import datetime -from typing import Any, Generic, Optional, Type +from typing import Any, Generic +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.extras.extras import Extras from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.ocr.ocr import OCR from mindee.v1.parsing.common.page import TypePage from mindee.v1.parsing.common.prediction import TypePrediction -from mindee.parsing.common.string_dict import StringDict def serialize_for_json(obj: Any) -> Any: @@ -29,21 +29,21 @@ class Document(Generic[TypePrediction, TypePage]): """Result of the base inference""" id: str """Id of the document as sent back by the server""" - extras: Optional[Extras] = None + extras: Extras | None = None """Potential Extras fields sent back along the prediction""" - ocr: Optional[OCR] = None + ocr: OCR | None = None """Potential raw text results read by the OCR (limited feature)""" n_pages: int """Amount of pages in the document""" def __init__( self, - inference_type: Type[Inference], + inference_type: type[Inference], raw_response: StringDict, ): self.id = raw_response.get("id", "") self.filename = raw_response.get("name", "") - if "ocr" in raw_response and raw_response["ocr"]: + if raw_response.get("ocr"): self.ocr = OCR(raw_response["ocr"]) if "extras" in raw_response and raw_response["inference"]["extras"]: self.extras = Extras(raw_response["extras"]) diff --git a/mindee/v1/parsing/common/execution.py b/mindee/v1/parsing/common/execution.py index d7ebf889..1bc3ca19 100644 --- a/mindee/v1/parsing/common/execution.py +++ b/mindee/v1/parsing/common/execution.py @@ -1,12 +1,12 @@ from datetime import datetime -from typing import Generic, Optional, Type +from typing import Generic, Optional +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.execution_file import ExecutionFile from mindee.v1.parsing.common.execution_priority import ExecutionPriority from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page from mindee.v1.parsing.common.prediction import TypePrediction -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.generated import GeneratedV1Document @@ -16,7 +16,7 @@ class Execution(Generic[TypePrediction]): batch_name: str """Identifier for the batch to which the execution belongs.""" - created_at: Optional[datetime] = None + created_at: datetime | None = None """The time at which the execution started.""" file: ExecutionFile @@ -25,16 +25,16 @@ class Execution(Generic[TypePrediction]): id: str """Identifier for the execution.""" - inference: Optional[Inference[TypePrediction, Page[TypePrediction]]] + inference: Inference[TypePrediction, Page[TypePrediction]] | None """Deserialized inference object.""" priority: Optional["ExecutionPriority"] = None """Priority of the execution.""" - reviewed_at: Optional[datetime] + reviewed_at: datetime | None """The time at which the file was tagged as reviewed.""" - available_at: Optional[datetime] + available_at: datetime | None """The time at which the file was uploaded to a workflow.""" reviewed_prediction: Optional["GeneratedV1Document"] = None @@ -43,16 +43,13 @@ class Execution(Generic[TypePrediction]): status: str """Execution Status.""" - type: Optional[str] - """Execution type.""" - - uploaded_at: Optional[datetime] = None + uploaded_at: datetime | None = None """The time at which the file was uploaded to a workflow.""" workflow_id: str """Identifier for the workflow.""" - def __init__(self, inference_type: Type[Inference], json_response: StringDict): + def __init__(self, inference_type: type[Inference], json_response: StringDict): self.batch_name = json_response["batch_name"] self.created_at = self.parse_date(json_response.get("created_at", None)) self.file = ExecutionFile(json_response["file"]) @@ -75,8 +72,11 @@ def __init__(self, inference_type: Type[Inference], json_response: StringDict): self.uploaded_at = self.parse_date(json_response.get("uploaded_at", None)) self.workflow_id = json_response["workflow_id"] + type: str | None + """Execution type.""" + @staticmethod - def parse_date(date_string: Optional[str]) -> Optional[datetime]: + def parse_date(date_string: str | None) -> datetime | None: """Shorthand to parse the date, if present.""" if not date_string: return None diff --git a/mindee/v1/parsing/common/execution_file.py b/mindee/v1/parsing/common/execution_file.py index ae9ad24a..116a2379 100644 --- a/mindee/v1/parsing/common/execution_file.py +++ b/mindee/v1/parsing/common/execution_file.py @@ -1,15 +1,13 @@ -from typing import Optional - from mindee.parsing.common.string_dict import StringDict class ExecutionFile: """Execution File class.""" - name: Optional[str] + name: str | None """File name.""" - alias: Optional[str] + alias: str | None """File name.""" def __init__(self, raw_response: StringDict): diff --git a/mindee/v1/parsing/common/extras/__init__.py b/mindee/v1/parsing/common/extras/__init__.py index 268a629e..22055b95 100644 --- a/mindee/v1/parsing/common/extras/__init__.py +++ b/mindee/v1/parsing/common/extras/__init__.py @@ -2,6 +2,6 @@ from mindee.v1.parsing.common.extras.extras import Extras __all__ = [ - "Extras", "CropperExtra", + "Extras", ] diff --git a/mindee/v1/parsing/common/extras/cropper_extra.py b/mindee/v1/parsing/common/extras/cropper_extra.py index 68d80628..638907c9 100644 --- a/mindee/v1/parsing/common/extras/cropper_extra.py +++ b/mindee/v1/parsing/common/extras/cropper_extra.py @@ -1,5 +1,3 @@ -from typing import List, Optional - from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.standard.position import PositionField @@ -7,14 +5,12 @@ class CropperExtra: """Contains information on the cropping of a prediction.""" - croppings: List[PositionField] + croppings: list[PositionField] """List of all cropping coordinates.""" - def __init__( - self, raw_prediction: StringDict, page_id: Optional[int] = None - ) -> None: - croppings: List[PositionField] = [] - if "cropping" in raw_prediction and raw_prediction["cropping"]: + def __init__(self, raw_prediction: StringDict, page_id: int | None = None) -> None: + croppings: list[PositionField] = [] + if raw_prediction.get("cropping"): for cropping in raw_prediction["cropping"]: croppings.append(PositionField(cropping, page_id=page_id)) self.cropping = croppings diff --git a/mindee/v1/parsing/common/extras/extras.py b/mindee/v1/parsing/common/extras/extras.py index ca4d7586..73704812 100644 --- a/mindee/v1/parsing/common/extras/extras.py +++ b/mindee/v1/parsing/common/extras/extras.py @@ -1,9 +1,7 @@ -from typing import Optional - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.extras.cropper_extra import CropperExtra from mindee.v1.parsing.common.extras.full_text_ocr_extra import FullTextOCRExtra from mindee.v1.parsing.common.extras.rag_extra import RAGExtra -from mindee.parsing.common.string_dict import StringDict class Extras: @@ -13,16 +11,16 @@ class Extras: Is roughly equivalent to a dict of Extras, with a bit more utility. """ - cropper: Optional[CropperExtra] = None - full_text_ocr: Optional[FullTextOCRExtra] = None - rag: Optional[RAGExtra] = None + cropper: CropperExtra | None = None + full_text_ocr: FullTextOCRExtra | None = None + rag: RAGExtra | None = None def __init__(self, raw_prediction: StringDict) -> None: - if "cropper" in raw_prediction and raw_prediction["cropper"]: + if raw_prediction.get("cropper"): self.cropper = CropperExtra(raw_prediction["cropper"]) - if "full_text_ocr" in raw_prediction and raw_prediction["full_text_ocr"]: + if raw_prediction.get("full_text_ocr"): self.full_text_ocr = FullTextOCRExtra(raw_prediction["full_text_ocr"]) - if "rag" in raw_prediction and raw_prediction["rag"]: + if raw_prediction.get("rag"): self.rag = RAGExtra(raw_prediction["rag"]) for key, extra in raw_prediction.items(): if key not in ["cropper", "full_text_ocr", "rag"]: @@ -39,7 +37,7 @@ def add_artificial_extra(self, raw_prediction: StringDict): """ Adds artificial extra data for reconstructed extras. Currently only used for full_text_ocr. - :params raw_prediction: Raw prediction used by the document. + :param raw_prediction: Raw prediction used by the document. """ - if "full_text_ocr" in raw_prediction and raw_prediction["full_text_ocr"]: + if raw_prediction.get("full_text_ocr"): self.full_text_ocr = FullTextOCRExtra(raw_prediction["full_text_ocr"]) diff --git a/mindee/v1/parsing/common/extras/full_text_ocr_extra.py b/mindee/v1/parsing/common/extras/full_text_ocr_extra.py index f877afa4..7d076f11 100644 --- a/mindee/v1/parsing/common/extras/full_text_ocr_extra.py +++ b/mindee/v1/parsing/common/extras/full_text_ocr_extra.py @@ -1,13 +1,11 @@ -from typing import Optional - from mindee.parsing.common.string_dict import StringDict class FullTextOCRExtra: """Full Text OCR result.""" - content: Optional[str] - language: Optional[str] + content: str | None + language: str | None def __init__(self, raw_prediction: StringDict) -> None: if raw_prediction and "content" in raw_prediction: diff --git a/mindee/v1/parsing/common/extras/rag_extra.py b/mindee/v1/parsing/common/extras/rag_extra.py index 79ad063b..3f8bbc94 100644 --- a/mindee/v1/parsing/common/extras/rag_extra.py +++ b/mindee/v1/parsing/common/extras/rag_extra.py @@ -1,12 +1,10 @@ -from typing import Optional - from mindee.parsing.common.string_dict import StringDict class RAGExtra: """Contains information on the Retrieval-Augmented-Generation of a prediction.""" - matching_document_id: Optional[str] = None + matching_document_id: str | None = None def __init__(self, raw_prediction: StringDict) -> None: if raw_prediction and "matching_document_id" in raw_prediction: diff --git a/mindee/v1/parsing/common/feedback_response.py b/mindee/v1/parsing/common/feedback_response.py index a7b76640..2f8eb07c 100644 --- a/mindee/v1/parsing/common/feedback_response.py +++ b/mindee/v1/parsing/common/feedback_response.py @@ -1,5 +1,5 @@ -from mindee.v1.parsing.common.api_response import ApiResponse from mindee.parsing.common.string_dict import StringDict +from mindee.v1.parsing.common.api_response import ApiResponse class FeedbackResponse(ApiResponse): diff --git a/mindee/v1/parsing/common/inference.py b/mindee/v1/parsing/common/inference.py index 0bc32d67..ecfb694f 100644 --- a/mindee/v1/parsing/common/inference.py +++ b/mindee/v1/parsing/common/inference.py @@ -1,11 +1,11 @@ -from typing import Dict, Generic, List, Optional, Type, TypeVar +from typing import Generic, TypeVar from mindee.error.mindee_error import MindeeError +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.extras import Extras from mindee.v1.parsing.common.page import TypePage from mindee.v1.parsing.common.prediction import TypePrediction from mindee.v1.parsing.common.product import Product -from mindee.parsing.common.string_dict import StringDict class Inference(Generic[TypePrediction, TypePage]): @@ -13,22 +13,22 @@ class Inference(Generic[TypePrediction, TypePage]): product: Product """Name and version of a given product, as sent back by the API.""" - endpoint_name: Optional[str] + endpoint_name: str | None """Name of the endpoint for OTS APIs""" - endpoint_version: Optional[str] + endpoint_version: str | None """Version of the endpoint for OTS APIs""" prediction: TypePrediction """A document's top-level Prediction.""" - pages: List[TypePage] + pages: list[TypePage] """A document's pages.""" - is_rotation_applied: Optional[bool] + is_rotation_applied: bool | None """Whether the document has had any rotation applied to it.""" - page_id: Optional[int] + page_id: int | None """Optional page id for page-level predictions.""" - extras: Optional[Extras] = None + extras: Extras | None = None """Potential Extras fields sent back along with the prediction.""" - def __init__(self, raw_prediction: StringDict, page_id: Optional[int] = None): + def __init__(self, raw_prediction: StringDict, page_id: int | None = None): self.is_rotation_applied = None if "is_rotation_applied" in raw_prediction: self.is_rotation_applied = raw_prediction["is_rotation_applied"] @@ -36,7 +36,7 @@ def __init__(self, raw_prediction: StringDict, page_id: Optional[int] = None): if page_id: self.page_id = page_id - if "extras" in raw_prediction and raw_prediction["extras"]: + if raw_prediction.get("extras"): self.extras = Extras(raw_prediction["extras"]) def __str__(self) -> str: @@ -44,7 +44,7 @@ def __str__(self) -> str: prediction_str = "" pages_str = "" if self.prediction and len(str(self.prediction)) > 0: - prediction_str = f"{str(self.prediction)}\n" + prediction_str = f"{self.prediction!s}\n" if len(self.pages) > 0: pages_str = "\nPage Predictions\n================\n\n" + "\n".join( [str(page) for page in self.pages] @@ -61,13 +61,13 @@ def __str__(self) -> str: ) @staticmethod - def get_endpoint_info(klass: Type["Inference"]) -> Dict[str, str]: + def get_endpoint_info(klass: type["Inference"]) -> dict[str, str]: """ Retrieves the endpoint information for an Inference. Should never retrieve info for CustomV1, as a custom endpoint should be created to use CustomV1. - :params klass: product subclass to access endpoint information. + :param klass: product subclass to access endpoint information. """ if klass.endpoint_name and klass.endpoint_version: return {"name": klass.endpoint_name, "version": klass.endpoint_version} diff --git a/mindee/v1/parsing/common/job.py b/mindee/v1/parsing/common/job.py index 67287c42..2b81d265 100644 --- a/mindee/v1/parsing/common/job.py +++ b/mindee/v1/parsing/common/job.py @@ -1,6 +1,5 @@ import json from datetime import datetime -from typing import Optional from mindee.parsing.common.string_dict import StringDict @@ -14,11 +13,11 @@ class Job: id: str """ID of the job sent by the API in response to an enqueue request.""" - error: Optional[StringDict] = None + error: StringDict | None = None """Information about an error that occurred during the job processing.""" issued_at: datetime """Timestamp of the request reception by the API.""" - available_at: Optional[datetime] = None + available_at: datetime | None = None """Timestamp of the request after it has been completed.""" status: str """Status of the request, as seen by the API.""" @@ -29,7 +28,7 @@ def __init__(self, json_response: dict) -> None: """ Wrapper for the HTTP response sent from the API when a document is enqueued. - :params json_response: JSON response sent by the server + :param json_response: JSON response sent by the server """ self.issued_at = datetime.fromisoformat(json_response["issued_at"]) if json_response.get("available_at"): diff --git a/mindee/v1/parsing/common/ocr/mvision_v1.py b/mindee/v1/parsing/common/ocr/mvision_v1.py index a8d5e890..81195c06 100644 --- a/mindee/v1/parsing/common/ocr/mvision_v1.py +++ b/mindee/v1/parsing/common/ocr/mvision_v1.py @@ -1,13 +1,11 @@ -from typing import List - -from mindee.v1.parsing.common.ocr.ocr_page import OCRPage from mindee.parsing.common.string_dict import StringDict +from mindee.v1.parsing.common.ocr.ocr_page import OCRPage class MVisionV1: """Mindee Vision V1.""" - pages: List[OCRPage] + pages: list[OCRPage] """List of pages.""" def __init__(self, raw_prediction: StringDict) -> None: diff --git a/mindee/v1/parsing/common/ocr/ocr.py b/mindee/v1/parsing/common/ocr/ocr.py index a6cbdd0e..bba0e7a3 100644 --- a/mindee/v1/parsing/common/ocr/ocr.py +++ b/mindee/v1/parsing/common/ocr/ocr.py @@ -1,5 +1,5 @@ -from mindee.v1.parsing.common.ocr.mvision_v1 import MVisionV1 from mindee.parsing.common.string_dict import StringDict +from mindee.v1.parsing.common.ocr.mvision_v1 import MVisionV1 class OCR: diff --git a/mindee/v1/parsing/common/ocr/ocr_line.py b/mindee/v1/parsing/common/ocr/ocr_line.py index 6113abd5..6d82ef98 100644 --- a/mindee/v1/parsing/common/ocr/ocr_line.py +++ b/mindee/v1/parsing/common/ocr/ocr_line.py @@ -1,10 +1,8 @@ -from typing import List - from mindee.geometry.minmax import get_min_max_x from mindee.v1.parsing.common.ocr.ocr_word import OCRWord -class OCRLine(List[OCRWord]): +class OCRLine(list[OCRWord]): """A list of words which are on the same line.""" def sort_on_x(self) -> None: diff --git a/mindee/v1/parsing/common/ocr/ocr_page.py b/mindee/v1/parsing/common/ocr/ocr_page.py index 361c867e..37da47ee 100644 --- a/mindee/v1/parsing/common/ocr/ocr_page.py +++ b/mindee/v1/parsing/common/ocr/ocr_page.py @@ -1,18 +1,16 @@ -from typing import List, Optional - from mindee.geometry.minmax import get_min_max_y from mindee.geometry.polygon import is_point_in_polygon_y from mindee.geometry.polygon_utils import get_centroid +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.ocr.ocr_line import OCRLine from mindee.v1.parsing.common.ocr.ocr_word import OCRWord -from mindee.parsing.common.string_dict import StringDict class OCRPage: """OCR extraction for a single page.""" - _all_words: List[OCRWord] - _lines: List[OCRLine] + _all_words: list[OCRWord] + _lines: list[OCRLine] def __init__(self, raw_prediction: StringDict) -> None: self._all_words = [ @@ -37,11 +35,11 @@ def _are_words_on_same_line(current_word: OCRWord, next_word: OCRWord) -> bool: # We need to check both to eliminate any issues due to word order. return current_in_next or next_in_current - def _to_lines(self) -> List[OCRLine]: + def _to_lines(self) -> list[OCRLine]: """Order all the words on the page into lines.""" - current: Optional[OCRWord] = None - indexes: List[int] = [] - lines: List[OCRLine] = [] + current: OCRWord | None = None + indexes: list[int] = [] + lines: list[OCRLine] = [] for _ in self._all_words: line: OCRLine = OCRLine() @@ -64,14 +62,14 @@ def _to_lines(self) -> List[OCRLine]: return lines @property - def all_lines(self) -> List[OCRLine]: + def all_lines(self) -> list[OCRLine]: """All the words on the page, ordered in lines.""" if not self._lines: self._lines = self._to_lines() return self._lines @property - def all_words(self) -> List[OCRWord]: + def all_words(self) -> list[OCRWord]: """All the words on the page, in semi-random order.""" return self._all_words diff --git a/mindee/v1/parsing/common/orientation.py b/mindee/v1/parsing/common/orientation.py index 8fa0c0c3..9dfaf817 100644 --- a/mindee/v1/parsing/common/orientation.py +++ b/mindee/v1/parsing/common/orientation.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.standard.base import BaseField @@ -15,15 +13,15 @@ def __init__( raw_prediction: StringDict, value_key: str = "value", reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Page orientation. - :params raw_prediction: Orientation prediction object from HTTP response - :params value_key: Key to use in the orientation_prediction dict - :params reconstructed: Bool for reconstructed object (not extracted in the API) - :params page_id: Page number for multi-page document + :param raw_prediction: Orientation prediction object from HTTP response + :param value_key: Key to use in the orientation_prediction dict + :param reconstructed: Bool for reconstructed object (not extracted in the API) + :param page_id: Page number for multi-page document """ super().__init__( raw_prediction, diff --git a/mindee/v1/parsing/common/page.py b/mindee/v1/parsing/common/page.py index f49c52b4..17ff43d0 100644 --- a/mindee/v1/parsing/common/page.py +++ b/mindee/v1/parsing/common/page.py @@ -1,9 +1,9 @@ -from typing import Generic, Optional, Type, TypeVar +from typing import Generic, TypeVar +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.extras.extras import Extras from mindee.v1.parsing.common.orientation import OrientationField from mindee.v1.parsing.common.prediction import TypePrediction -from mindee.parsing.common.string_dict import StringDict class Page(Generic[TypePrediction]): @@ -11,15 +11,15 @@ class Page(Generic[TypePrediction]): id: int """Id of the current page.""" - orientation: Optional[OrientationField] = None + orientation: OrientationField | None = None """Orientation of the page""" prediction: TypePrediction """Type of Page prediction.""" - extras: Optional[Extras] = None + extras: Extras | None = None def __init__( self, - prediction_type: Type[TypePrediction], + prediction_type: type[TypePrediction], raw_prediction: StringDict, ) -> None: self.id = raw_prediction["id"] @@ -35,7 +35,7 @@ def __init__( except TypeError: self.prediction = prediction_type(raw_prediction["prediction"]) - if "extras" in raw_prediction and raw_prediction["extras"]: + if raw_prediction.get("extras"): self.extras = Extras(raw_prediction["extras"]) def __str__(self) -> str: diff --git a/mindee/v1/parsing/common/predict_response.py b/mindee/v1/parsing/common/predict_response.py index f976bed1..c7842165 100644 --- a/mindee/v1/parsing/common/predict_response.py +++ b/mindee/v1/parsing/common/predict_response.py @@ -1,4 +1,4 @@ -from typing import Generic, Type +from typing import Generic from mindee.v1.parsing.common.api_response import ApiResponse, StringDict from mindee.v1.parsing.common.document import Document @@ -16,13 +16,13 @@ class PredictResponse(Generic[TypeInference], ApiResponse): """The document object, properly parsed after being retrieved from the server.""" def __init__( - self, inference_type: Type[TypeInference], raw_response: StringDict + self, inference_type: type[TypeInference], raw_response: StringDict ) -> None: """ Container for the raw API response and the parsed document. - :params inference_type: Type of the inference. - :params raw_response: json response from HTTP call. + :param inference_type: Type of the inference. + :param raw_response: json response from HTTP call. """ super().__init__(raw_response) self.document = Document(inference_type, raw_response["document"]) diff --git a/mindee/v1/parsing/common/prediction.py b/mindee/v1/parsing/common/prediction.py index 8bab63cc..8f67b5b0 100644 --- a/mindee/v1/parsing/common/prediction.py +++ b/mindee/v1/parsing/common/prediction.py @@ -1,4 +1,4 @@ -from typing import Optional, TypeVar +from typing import TypeVar from mindee.parsing.common.string_dict import StringDict @@ -6,12 +6,12 @@ class Prediction: """Base Prediction class.""" - def __init__(self, raw_prediction: StringDict, page_id: Optional[int] = None): + def __init__(self, raw_prediction: StringDict, page_id: int | None = None): """ Base prediction. - :params raw_prediction: a json-equivalent dictionary containing prediction results. - :params page_id: an optional page number for page-level predictions. + :param raw_prediction: a json-equivalent dictionary containing prediction results. + :param page_id: an optional page number for page-level predictions. """ diff --git a/mindee/v1/parsing/common/workflow_response.py b/mindee/v1/parsing/common/workflow_response.py index 5e0ebbe5..17e7ac0e 100644 --- a/mindee/v1/parsing/common/workflow_response.py +++ b/mindee/v1/parsing/common/workflow_response.py @@ -1,10 +1,10 @@ -from typing import Generic, Type +from typing import Generic +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.api_response import ApiResponse from mindee.v1.parsing.common.execution import Execution from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.prediction import TypePrediction -from mindee.parsing.common.string_dict import StringDict class WorkflowResponse(Generic[TypePrediction], ApiResponse): @@ -16,6 +16,6 @@ class WorkflowResponse(Generic[TypePrediction], ApiResponse): The response object will be instantiated based on this parameter. """ - def __init__(self, inference_type: Type[Inference], raw_response: StringDict): + def __init__(self, inference_type: type[Inference], raw_response: StringDict): super().__init__(raw_response) self.execution = Execution(inference_type, raw_response["execution"]) diff --git a/mindee/v1/parsing/custom/__init__.py b/mindee/v1/parsing/custom/__init__.py index 10e5584a..3df8f57c 100644 --- a/mindee/v1/parsing/custom/__init__.py +++ b/mindee/v1/parsing/custom/__init__.py @@ -5,7 +5,7 @@ __all__ = [ "ClassificationField", "CustomLine", - "get_line_items", "ListField", "ListFieldValue", + "get_line_items", ] diff --git a/mindee/v1/parsing/custom/line_items.py b/mindee/v1/parsing/custom/line_items.py index fbc55d46..257a0108 100644 --- a/mindee/v1/parsing/custom/line_items.py +++ b/mindee/v1/parsing/custom/line_items.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Sequence +from collections.abc import Sequence from mindee.error.mindee_error import MindeeError from mindee.geometry.bbox import BBox, extend_bbox, get_bbox @@ -7,7 +7,7 @@ from mindee.v1.parsing.custom.list import ListField, ListFieldValue -def _find_best_anchor(anchors: Sequence[str], fields: Dict[str, ListField]) -> str: +def _find_best_anchor(anchors: Sequence[str], fields: dict[str, ListField]) -> str: """ Find the anchor with the most rows, in the order specified by `anchors`. @@ -28,7 +28,7 @@ class CustomLine: row_number: int """Index of the row of a given line.""" - fields: Dict[str, ListFieldValue] + fields: dict[str, ListFieldValue] """Fields contained in the line.""" bbox: BBox """Simplified bounding box of the line.""" @@ -42,8 +42,8 @@ def update_field(self, field_name: str, field_value: ListFieldValue) -> None: """ Updates a field value if it exists. - :params field_name: name of the field to update. - :params field_value: value of the field to set. + :param field_name: name of the field to update. + :param field_value: value of the field to set. """ if field_name in self.fields: existing_field = self.fields[field_name] @@ -74,9 +74,9 @@ def is_box_in_line(line: CustomLine, bbox: BBox, height_line_tolerance: float) - """ Checks if the bbox fits inside the given line. - :params line: Line to check. - :params bbox: Bbox to check. - :params height_line_tolerance: line height tolerance for custom line reconstruction. + :param line: Line to check. + :param bbox: Bbox to check. + :param height_line_tolerance: line height tolerance for custom line reconstruction. """ if abs(bbox.y_min - line.bbox.y_min) <= height_line_tolerance: return True @@ -84,16 +84,16 @@ def is_box_in_line(line: CustomLine, bbox: BBox, height_line_tolerance: float) - def prepare( - anchor_name: str, fields: Dict[str, ListField], height_line_tolerance: float -) -> List[CustomLine]: + anchor_name: str, fields: dict[str, ListField], height_line_tolerance: float +) -> list[CustomLine]: """ Prepares lines before filling them. - :params anchor_name: name of the anchor. - :params fields: fields to build lines from. - :params height_line_tolerance: line height tolerance for custom line reconstruction. + :param anchor_name: name of the anchor. + :param fields: fields to build lines from. + :param height_line_tolerance: line height tolerance for custom line reconstruction. """ - lines_prepared: List[CustomLine] = [] + lines_prepared: list[CustomLine] = [] try: anchor_field: ListField = fields[anchor_name] except KeyError as exc: @@ -138,9 +138,9 @@ def prepare( def get_line_items( anchors: Sequence[str], field_names: Sequence[str], - fields: Dict[str, ListField], + fields: dict[str, ListField], height_line_tolerance: float = 0.01, -) -> List[CustomLine]: +) -> list[CustomLine]: """ Reconstruct line items from fields. @@ -148,8 +148,8 @@ def get_line_items( :columns: All fields which are columns :fields: List of field names to reconstruct table with """ - line_items: List[CustomLine] = [] - fields_to_transform: Dict[str, ListField] = {} + line_items: list[CustomLine] = [] + fields_to_transform: dict[str, ListField] = {} for field_name, field_value in fields.items(): if field_name in field_names: fields_to_transform[field_name] = field_value @@ -157,7 +157,7 @@ def get_line_items( if not anchor: print(Warning("Could not find an anchor!")) return line_items - lines_prepared: List[CustomLine] = prepare( + lines_prepared: list[CustomLine] = prepare( anchor, fields_to_transform, height_line_tolerance ) diff --git a/mindee/v1/parsing/custom/list.py b/mindee/v1/parsing/custom/list.py index 01b61018..91982d8f 100644 --- a/mindee/v1/parsing/custom/list.py +++ b/mindee/v1/parsing/custom/list.py @@ -1,5 +1,3 @@ -from typing import List, Optional - from mindee.parsing.common import StringDict from mindee.v1.parsing.standard.base import FieldPositionMixin @@ -11,12 +9,10 @@ class ListFieldValue(FieldPositionMixin): """The content text""" confidence: float """Confidence score""" - page_id: Optional[int] + page_id: int | None """Id of the page the field was found on.""" - def __init__( - self, raw_prediction: StringDict, page_id: Optional[int] = None - ) -> None: + def __init__(self, raw_prediction: StringDict, page_id: int | None = None) -> None: self.content = raw_prediction["content"] self.confidence = raw_prediction["confidence"] self.page_id = page_id @@ -33,14 +29,14 @@ class ListField: """Confidence score""" reconstructed: bool """Whether the field was reconstructed from other fields.""" - values: List[ListFieldValue] + values: list[ListFieldValue] """List of word values""" def __init__( self, raw_prediction: StringDict, reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ) -> None: self.values = [] self.reconstructed = reconstructed @@ -52,7 +48,7 @@ def __init__( self.confidence = raw_prediction["confidence"] @property - def contents_list(self) -> List[str]: + def contents_list(self) -> list[str]: """Return a List of the contents of all values.""" return [value.content for value in self.values] @@ -60,7 +56,7 @@ def contents_string(self, separator: str = " ") -> str: """ Return a string representation of all values. - :params separator: Character(s) to use when concatenating fields. + :param separator: Character(s) to use when concatenating fields. """ return separator.join(self.contents_list) diff --git a/mindee/v1/parsing/generated/generated_list.py b/mindee/v1/parsing/generated/generated_list.py index ab19dd3b..5712a5fc 100644 --- a/mindee/v1/parsing/generated/generated_list.py +++ b/mindee/v1/parsing/generated/generated_list.py @@ -1,5 +1,3 @@ -from typing import List, Optional, Union - from mindee.parsing.common import StringDict from mindee.v1.parsing.generated.generated_object import ( GeneratedObjectField, @@ -11,15 +9,15 @@ class GeneratedListField: """A list of values or objects, used in generated APIs.""" - page_id: Optional[int] + page_id: int | None """Id of the page the object was found on""" - values: List[Union[GeneratedObjectField, StringField]] + values: list[GeneratedObjectField | StringField] """List of word values""" def __init__( self, - raw_prediction: List[StringDict], - page_id: Optional[int] = None, + raw_prediction: list[StringDict], + page_id: int | None = None, ) -> None: self.values = [] @@ -40,7 +38,7 @@ def __init__( ) @property - def contents_list(self) -> List[str]: + def contents_list(self) -> list[str]: """Return a List of the contents of all values.""" return [str(v or "") for v in self.values] @@ -48,7 +46,7 @@ def contents_string(self, separator: str = " ") -> str: """ Return a string representation of all values. - :params separator: Character(s) to use when concatenating fields. + :param separator: Character(s) to use when concatenating fields. """ return separator.join(self.contents_list) diff --git a/mindee/v1/parsing/generated/generated_object.py b/mindee/v1/parsing/generated/generated_object.py index 57106756..f29e15e0 100644 --- a/mindee/v1/parsing/generated/generated_object.py +++ b/mindee/v1/parsing/generated/generated_object.py @@ -1,5 +1,3 @@ -from typing import List, Optional - from mindee.parsing.common import StringDict from mindee.v1.parsing.standard.position import PositionField @@ -7,19 +5,19 @@ class GeneratedObjectField: """A JSON-like object, with miscellaneous values.""" - page_id: Optional[int] + page_id: int | None """Id of the page the object was found on.""" - confidence: Optional[float] + confidence: float | None """Confidence with which the value was assessed.""" - raw_value: Optional[str] + raw_value: str | None """Raw unprocessed value, as it was sent by the server.""" - __printable_values: List[str] + __printable_values: list[str] """List of all printable field names.""" def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ) -> None: item_page_id = None self.__printable_values = [] @@ -50,7 +48,7 @@ def _str_level(self, level=0) -> str: Takes into account level of indentation & displays elements as list elements. - :params level: level of indent (times 2 spaces). + :param level: level of indent (times 2 spaces). """ indent = " " + " " * level out_str = "" @@ -68,7 +66,7 @@ def is_generated_object(str_dict: StringDict) -> bool: """ Checks whether an field is a custom object or not. - :params str_dict: input dictionary to check. + :param str_dict: input dictionary to check. """ common_keys = [ "value", @@ -80,7 +78,4 @@ def is_generated_object(str_dict: StringDict) -> bool: "values", "raw_value", ] - for key in str_dict.keys(): - if key not in common_keys: - return True - return False + return any(key not in common_keys for key in str_dict) diff --git a/mindee/v1/parsing/standard/__init__.py b/mindee/v1/parsing/standard/__init__.py index dc52b092..e8292744 100644 --- a/mindee/v1/parsing/standard/__init__.py +++ b/mindee/v1/parsing/standard/__init__.py @@ -2,12 +2,12 @@ from mindee.v1.parsing.standard.amount import AmountField from mindee.v1.parsing.standard.base import ( BaseField, + FieldConfidenceMixin, + FieldPositionMixin, bool_to_string, compare_field_arrays, field_array_confidence, field_array_sum, - FieldConfidenceMixin, - FieldPositionMixin, float_to_string, int_to_string, to_opt_bool, @@ -28,25 +28,25 @@ "AddressField", "AmountField", "BaseField", + "BooleanField", + "ClassificationField", + "CompanyRegistrationField", + "DateField", "FieldConfidenceMixin", "FieldPositionMixin", + "LocaleField", + "PaymentDetailsField", + "PositionField", + "StringField", + "TaxField", + "Taxes", "bool_to_string", - "float_to_string", "compare_field_arrays", "field_array_confidence", "field_array_sum", + "float_to_string", "int_to_string", "to_opt_bool", "to_opt_float", "to_opt_int", - "BooleanField", - "ClassificationField", - "CompanyRegistrationField", - "DateField", - "LocaleField", - "PaymentDetailsField", - "PositionField", - "Taxes", - "TaxField", - "StringField", ] diff --git a/mindee/v1/parsing/standard/address.py b/mindee/v1/parsing/standard/address.py index 0f3a2dbf..7ee280bd 100644 --- a/mindee/v1/parsing/standard/address.py +++ b/mindee/v1/parsing/standard/address.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.parsing.common import StringDict from mindee.v1.parsing.standard.text import StringField @@ -7,35 +5,35 @@ class AddressField(StringField): """A field containing an address value.""" - street_number: Optional[str] + street_number: str | None """Street number.""" - street_name: Optional[str] + street_name: str | None """Street name.""" - po_box: Optional[str] + po_box: str | None """PO Box number.""" - address_complement: Optional[str] + address_complement: str | None """Address complement.""" - city: Optional[str] + city: str | None """City name.""" - postal_code: Optional[str] + postal_code: str | None """Postal code.""" - state: Optional[str] + state: str | None """State name.""" - country: Optional[str] + country: str | None """Country name.""" def __init__( self, raw_prediction: StringDict, reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Text field object. - :params raw_prediction: Amount prediction object from HTTP response. - :params reconstructed: Bool for reconstructed object (not extracted in the API). - :params page_id: Page number for multi-page document. + :param raw_prediction: Amount prediction object from HTTP response. + :param reconstructed: Bool for reconstructed object (not extracted in the API). + :param page_id: Page number for multi-page document. """ self.value = None super().__init__( diff --git a/mindee/v1/parsing/standard/amount.py b/mindee/v1/parsing/standard/amount.py index b24094da..84b68063 100644 --- a/mindee/v1/parsing/standard/amount.py +++ b/mindee/v1/parsing/standard/amount.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.parsing.common import StringDict from mindee.v1.parsing.standard.base import ( BaseField, @@ -11,21 +9,21 @@ class AmountField(FieldPositionMixin, BaseField): """A field containing an amount value.""" - value: Optional[float] + value: float | None """The amount value as a float.""" def __init__( self, raw_prediction: StringDict, reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Amount field object. - :params raw_prediction: Amount prediction object from HTTP response - :params reconstructed: Bool for reconstructed object (not extracted in the API) - :params page_id: Page number for multi-page document + :param raw_prediction: Amount prediction object from HTTP response + :param reconstructed: Bool for reconstructed object (not extracted in the API) + :param page_id: Page number for multi-page document """ self.value = None super().__init__( diff --git a/mindee/v1/parsing/standard/base.py b/mindee/v1/parsing/standard/base.py index 6b009877..0362728d 100644 --- a/mindee/v1/parsing/standard/base.py +++ b/mindee/v1/parsing/standard/base.py @@ -1,4 +1,5 @@ -from typing import Any, List, Optional, Type +import contextlib +from typing import Any from mindee.geometry.polygon import Polygon from mindee.geometry.quadrilateral import Quadrilateral, get_bounding_box @@ -8,7 +9,7 @@ class FieldPositionMixin: """Mixin class to add position information.""" - bounding_box: Optional[Quadrilateral] + bounding_box: Quadrilateral | None """A right rectangle containing the word in the document.""" polygon: Polygon """A polygon containing the word in the document.""" @@ -41,11 +42,11 @@ def _set_confidence(self, raw_prediction: StringDict): class BaseField(FieldConfidenceMixin): """Base class for most fields.""" - value: Optional[Any] + value: Any | None """Raw field value""" reconstructed: bool """Whether the field was reconstructed from other fields.""" - page_id: Optional[int] + page_id: int | None """The document page on which the information was found.""" def __init__( @@ -53,23 +54,21 @@ def __init__( raw_prediction: StringDict, value_key: str = "value", reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): self.value = None self.confidence = 0.0 """ Base field object. - :params raw_prediction: Prediction object from HTTP response - :params value_key: Key to use in the abstract_prediction dict - :params reconstructed: Bool for reconstructed object (not extracted in the API) - :params page_id: Page number for multi-page PDF + :param raw_prediction: Prediction object from HTTP response + :param value_key: Key to use in the abstract_prediction dict + :param reconstructed: Bool for reconstructed object (not extracted in the API) + :param page_id: Page number for multi-page PDF """ if page_id is None: - try: + with contextlib.suppress(KeyError, TypeError): self.page_id = raw_prediction["page_id"] - except (KeyError, TypeError): - pass else: self.page_id = page_id @@ -99,14 +98,14 @@ def __str__(self) -> str: def compare_field_arrays( - array1: List[Type[BaseField]], array2: List[Type[BaseField]], attr: str = "value" + array1: list[type[BaseField]], array2: list[type[BaseField]], attr: str = "value" ) -> bool: """ Check that all elements are present in both arrays. - :params array1: Array of Fields - :params array2: Array of Fields - :params attr: Attribute to compare + :param array1: Array of Fields + :param array2: Array of Fields + :param attr: Attribute to compare :return: True if all elements in array1 exist in array2, False otherwise """ set1 = {getattr(f1, attr) for f1 in array1} @@ -114,11 +113,11 @@ def compare_field_arrays( return set1 == set2 -def field_array_confidence(array: List[Type[BaseField]]) -> float: +def field_array_confidence(array: list[type[BaseField]]) -> float: """ Multiply all Field's confidence in the array. - :params array: Array of fields + :param array: Array of fields :return: Product as float """ product: float = 1 @@ -130,11 +129,11 @@ def field_array_confidence(array: List[Type[BaseField]]) -> float: return float(product) -def field_array_sum(array: List[Type[BaseField]]) -> float: +def field_array_sum(array: list[type[BaseField]]) -> float: """ Add all the Field values in the array. - :params array: Array of fields + :param array: Array of fields :return: Sum as `float`. """ arr_sum = 0 @@ -148,7 +147,7 @@ def field_array_sum(array: List[Type[BaseField]]) -> float: return arr_sum -def float_to_string(value: Optional[float], min_precision=2) -> str: +def float_to_string(value: float | None, min_precision=2) -> str: """Print a float with a specified minimum precision, but allowing greater precision.""" if value is None: return "" @@ -158,7 +157,7 @@ def float_to_string(value: Optional[float], min_precision=2) -> str: return f"{value:.{precision}f}" -def int_to_string(value: Optional[int]) -> str: +def int_to_string(value: int | None) -> str: """Print an integer as a string.""" if value is None: return "" @@ -166,7 +165,7 @@ def int_to_string(value: Optional[int]) -> str: return f"{value}" -def bool_to_string(value: Optional[bool]) -> str: +def bool_to_string(value: bool | None) -> str: """Print a boolean as a string.""" if value is None: return "" @@ -174,7 +173,7 @@ def bool_to_string(value: Optional[bool]) -> str: return f"{value}" -def to_opt_float(raw_prediction: StringDict, key: str) -> Optional[float]: +def to_opt_float(raw_prediction: StringDict, key: str) -> float | None: """Make sure a prediction value is either a ``float`` or ``None``.""" try: return float(raw_prediction[key]) @@ -182,7 +181,7 @@ def to_opt_float(raw_prediction: StringDict, key: str) -> Optional[float]: return None -def to_opt_int(raw_prediction: StringDict, key: str) -> Optional[int]: +def to_opt_int(raw_prediction: StringDict, key: str) -> int | None: """Make sure a prediction value is either an ``int`` or ``None``.""" try: return int(raw_prediction[key]) @@ -190,7 +189,7 @@ def to_opt_int(raw_prediction: StringDict, key: str) -> Optional[int]: return None -def to_opt_bool(raw_prediction: StringDict, key: str) -> Optional[bool]: +def to_opt_bool(raw_prediction: StringDict, key: str) -> bool | None: """Make sure a prediction value is either a ``bool`` or ``None``.""" try: return bool(raw_prediction[key]) diff --git a/mindee/v1/parsing/standard/boolean.py b/mindee/v1/parsing/standard/boolean.py index 54bbb4d5..e69804d9 100644 --- a/mindee/v1/parsing/standard/boolean.py +++ b/mindee/v1/parsing/standard/boolean.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.parsing.common import StringDict from mindee.v1.parsing.standard.base import BaseField, FieldPositionMixin @@ -7,7 +5,7 @@ class BooleanField(FieldPositionMixin, BaseField): """A field containing a boolean value.""" - value: Optional[bool] + value: bool | None """The value as it appears on the document.""" def __init__( @@ -15,15 +13,15 @@ def __init__( raw_prediction: StringDict, value_key: str = "value", reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Boolean field object. - :params raw_prediction: Amount prediction object from HTTP response - :params value_key: Key to use in the amount_prediction dict - :params reconstructed: Bool for reconstructed object (not extracted in the API) - :params page_id: Page number for multi-page document + :param raw_prediction: Amount prediction object from HTTP response + :param value_key: Key to use in the amount_prediction dict + :param reconstructed: Bool for reconstructed object (not extracted in the API) + :param page_id: Page number for multi-page document """ self.value = None super().__init__( diff --git a/mindee/v1/parsing/standard/classification.py b/mindee/v1/parsing/standard/classification.py index 5ca2011f..8921d5a3 100644 --- a/mindee/v1/parsing/standard/classification.py +++ b/mindee/v1/parsing/standard/classification.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.parsing.common import StringDict from mindee.v1.parsing.standard.base import BaseField @@ -15,15 +13,15 @@ def __init__( raw_prediction: StringDict, value_key: str = "value", reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Text field object. - :params raw_prediction: Amount prediction object from HTTP response - :params value_key: Key to use in the amount_prediction dict - :params reconstructed: Bool for reconstructed object (not extracted in the API) - :params page_id: Page number for multi-page document + :param raw_prediction: Amount prediction object from HTTP response + :param value_key: Key to use in the amount_prediction dict + :param reconstructed: Bool for reconstructed object (not extracted in the API) + :param page_id: Page number for multi-page document """ super().__init__( raw_prediction, diff --git a/mindee/v1/parsing/standard/company_registration.py b/mindee/v1/parsing/standard/company_registration.py index f242bd6b..10a913ff 100644 --- a/mindee/v1/parsing/standard/company_registration.py +++ b/mindee/v1/parsing/standard/company_registration.py @@ -1,7 +1,4 @@ -from typing import Optional - -from mindee.parsing.common import StringDict -from mindee.parsing.common import format_for_display +from mindee.parsing.common import StringDict, format_for_display from mindee.v1.parsing.standard.base import BaseField, FieldPositionMixin @@ -16,7 +13,7 @@ def __init__( raw_prediction: StringDict, value_key: str = "value", reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): super().__init__(raw_prediction, value_key, reconstructed, page_id) self.type = raw_prediction["type"] diff --git a/mindee/v1/parsing/standard/date.py b/mindee/v1/parsing/standard/date.py index 91c5a4df..5eb26bb9 100644 --- a/mindee/v1/parsing/standard/date.py +++ b/mindee/v1/parsing/standard/date.py @@ -1,5 +1,4 @@ from datetime import date, datetime -from typing import Optional import pytz @@ -13,25 +12,25 @@ class DateField(FieldPositionMixin, BaseField): """A field containing a date value.""" - date_object: Optional[date] + date_object: date | None """Date as a standard Python ``datetime.date`` object.""" - value: Optional[str] + value: str | None """The raw field value.""" - is_computed: Optional[bool] + is_computed: bool | None """Whether the field was computed or retrieved directly from the document.""" def __init__( self, raw_prediction: StringDict, reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Date field object. - :params raw_prediction: Date prediction object from HTTP response - :params reconstructed: Bool for reconstructed object (not extracted in the API) - :params page_id: Page number for multi-page document + :param raw_prediction: Date prediction object from HTTP response + :param reconstructed: Bool for reconstructed object (not extracted in the API) + :param page_id: Page number for multi-page document """ super().__init__( raw_prediction, diff --git a/mindee/v1/parsing/standard/locale.py b/mindee/v1/parsing/standard/locale.py index 75e2965c..c9f097af 100644 --- a/mindee/v1/parsing/standard/locale.py +++ b/mindee/v1/parsing/standard/locale.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.parsing.common import StringDict from mindee.v1.parsing.standard.base import BaseField @@ -7,31 +5,27 @@ class LocaleField(BaseField): """The locale detected on the document.""" - language: Optional[str] + language: str | None """The ISO 639-1 code of the language.""" - country: Optional[str] + country: str | None """The ISO 3166-1 alpha-2 code of the country.""" - currency: Optional[str] + currency: str | None """The ISO 4217 code of the currency.""" def __init__( self, raw_prediction: StringDict, reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Locale field object. - :params raw_prediction: Locale prediction object from HTTP response - :params reconstructed: Bool for reconstructed object (not extracted in the API) - :params page_id: Page number for multi-page document + :param raw_prediction: Locale prediction object from HTTP response + :param reconstructed: Bool for reconstructed object (not extracted in the API) + :param page_id: Page number for multi-page document """ - value_key = ( - "value" - if ("value" in raw_prediction and raw_prediction["value"]) - else "language" - ) + value_key = "value" if (raw_prediction.get("value")) else "language" super().__init__( raw_prediction, @@ -44,7 +38,7 @@ def __init__( self.currency = self._get_value(raw_prediction, "currency") @staticmethod - def _get_value(locale_prediction: dict, key: str) -> Optional[str]: + def _get_value(locale_prediction: dict, key: str) -> str | None: if key not in locale_prediction or locale_prediction[key] == "N/A": return None return locale_prediction[key] diff --git a/mindee/v1/parsing/standard/payment_details.py b/mindee/v1/parsing/standard/payment_details.py index 11f39dac..bc9b7b7f 100644 --- a/mindee/v1/parsing/standard/payment_details.py +++ b/mindee/v1/parsing/standard/payment_details.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.parsing.common import StringDict from mindee.v1.parsing.standard.base import BaseField, FieldPositionMixin @@ -7,13 +5,13 @@ class PaymentDetailsField(FieldPositionMixin, BaseField): """Information on a single payment.""" - account_number: Optional[str] + account_number: str | None """Account number""" - iban: Optional[str] + iban: str | None """Account IBAN""" - routing_number: Optional[str] + routing_number: str | None """Account routing number""" - swift: Optional[str] + swift: str | None """Bank's SWIFT code""" def __init__( @@ -25,21 +23,21 @@ def __init__( routing_number_key: str = "routing_number", swift_key: str = "swift", reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Payment details field object. - :params raw_prediction: Payment detail prediction object from HTTP response - :params value_key: Corresponds to iban - :params account_number_key: Key to use for getting the account number in the + :param raw_prediction: Payment detail prediction object from HTTP response + :param value_key: Corresponds to iban + :param account_number_key: Key to use for getting the account number in the payment_details_prediction dict - :params iban_key: Key to use for getting the IBAN in the payment_details_prediction dict - :params routing_number_key: Key to use for getting the Routing number in the + :param iban_key: Key to use for getting the IBAN in the payment_details_prediction dict + :param routing_number_key: Key to use for getting the Routing number in the payment_details_prediction dict - :params swift_key: Key to use for getting the SWIFT in the payment_details_prediction dict - :params reconstructed: Bool for reconstructed object (not extracted in the API) - :params page_id: Page number for multi-page document + :param swift_key: Key to use for getting the SWIFT in the payment_details_prediction dict + :param reconstructed: Bool for reconstructed object (not extracted in the API) + :param page_id: Page number for multi-page document """ super().__init__( raw_prediction, diff --git a/mindee/v1/parsing/standard/position.py b/mindee/v1/parsing/standard/position.py index 1479e41b..502322f3 100644 --- a/mindee/v1/parsing/standard/position.py +++ b/mindee/v1/parsing/standard/position.py @@ -1,6 +1,4 @@ -from typing import Optional - -from mindee.error.geometry_error import GeometryError +from mindee.error.geometry_error import MindeeGeometryError from mindee.geometry.polygon import Polygon from mindee.geometry.quadrilateral import Quadrilateral, quadrilateral_from_prediction from mindee.parsing.common import StringDict @@ -10,15 +8,15 @@ class PositionField(BaseField): """A field indicating a position or area on the document.""" - value: Optional[Polygon] + value: Polygon | None """Polygon of cropped area, identical to the ``polygon`` property.""" - polygon: Optional[Polygon] + polygon: Polygon | None """Polygon of cropped area""" - quadrangle: Optional[Quadrilateral] + quadrangle: Quadrilateral | None """Quadrangle of cropped area (does not exceed the canvas)""" - rectangle: Optional[Quadrilateral] + rectangle: Quadrilateral | None """Oriented rectangle of cropped area (may exceed the canvas)""" - bounding_box: Optional[Quadrilateral] + bounding_box: Quadrilateral | None """Straight rectangle of cropped area (does not exceed the canvas)""" def __init__( @@ -26,15 +24,15 @@ def __init__( raw_prediction: StringDict, value_key: str = "polygon", reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Position field object. - :params raw_prediction: Position prediction object from HTTP response - :params value_key: Key to use in the position_prediction dict - :params reconstructed: Bool for reconstructed object (not extracted in the API) - :params page_id: Page number for multi-page document + :param raw_prediction: Position prediction object from HTTP response + :param value_key: Key to use in the position_prediction dict + :param reconstructed: Bool for reconstructed object (not extracted in the API) + :param page_id: Page number for multi-page document """ super().__init__( raw_prediction, @@ -43,13 +41,13 @@ def __init__( page_id=page_id, ) - def get_quadrilateral(key: str) -> Optional[Quadrilateral]: + def get_quadrilateral(key: str) -> Quadrilateral | None: try: return quadrilateral_from_prediction(raw_prediction[key]) - except (KeyError, GeometryError): + except (KeyError, MindeeGeometryError): return None - def get_polygon(key: str) -> Optional[Polygon]: + def get_polygon(key: str) -> Polygon | None: try: polygon = raw_prediction[key] except KeyError: @@ -58,7 +56,7 @@ def get_polygon(key: str) -> Optional[Polygon]: return None try: return Polygon(polygon) - except GeometryError: + except MindeeGeometryError: return None self.bounding_box = get_quadrilateral("bounding_box") diff --git a/mindee/v1/parsing/standard/tax.py b/mindee/v1/parsing/standard/tax.py index afebf06c..3da6e431 100644 --- a/mindee/v1/parsing/standard/tax.py +++ b/mindee/v1/parsing/standard/tax.py @@ -1,5 +1,3 @@ -from typing import Dict, List, Optional - from mindee.parsing.common import StringDict from mindee.v1.parsing.standard.base import ( BaseField, @@ -11,13 +9,13 @@ class TaxField(FieldPositionMixin, BaseField): """Tax line information.""" - value: Optional[float] + value: float | None """The amount of the tax line.""" - rate: Optional[float] + rate: float | None """The tax rate.""" - code: Optional[str] + code: str | None "The tax code (HST, GST... for Canadian; City Tax, State tax for US, etc..)." - basis: Optional[float] + basis: float | None "The tax base." def __init__( @@ -25,15 +23,15 @@ def __init__( raw_prediction: StringDict, value_key: str = "value", reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Tax field object. - :params raw_prediction: Tax prediction object from HTTP response - :params value_key: Key to use in the tax_prediction dict - :params reconstructed: Bool for reconstructed object (not extracted in the API) - :params page_id: Page number for multi pages document + :param raw_prediction: Tax prediction object from HTTP response + :param value_key: Key to use in the tax_prediction dict + :param reconstructed: Bool for reconstructed object (not extracted in the API) + :param page_id: Page number for multi pages document """ super().__init__( raw_prediction, @@ -67,7 +65,7 @@ def __init__( self.value = None self.confidence = 0.0 - def _printable_values(self) -> Dict[str, str]: + def _printable_values(self) -> dict[str, str]: """Return values for printing.""" return { "code": self.code if self.code is not None else "", @@ -98,7 +96,7 @@ def __str__(self) -> str: ).strip() -class Taxes(List[TaxField]): +class Taxes(list[TaxField]): """List of tax lines information.""" @staticmethod @@ -110,9 +108,7 @@ def _line_separator(char: str): out_str += f"+{char * 15}" return out_str + "+" - def __init__( - self, api_prediction: List[StringDict], page_id: Optional[int] - ) -> None: + def __init__(self, api_prediction: list[StringDict], page_id: int | None) -> None: super().__init__() for entry in api_prediction: tax = TaxField(entry, page_id=page_id) diff --git a/mindee/v1/parsing/standard/text.py b/mindee/v1/parsing/standard/text.py index c30ec204..8cf58c28 100644 --- a/mindee/v1/parsing/standard/text.py +++ b/mindee/v1/parsing/standard/text.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.parsing.common import StringDict from mindee.v1.parsing.standard.base import BaseField, FieldPositionMixin @@ -7,9 +5,9 @@ class StringField(FieldPositionMixin, BaseField): """A field containing a text value.""" - value: Optional[str] + value: str | None """Value of the string.""" - raw_value: Optional[str] + raw_value: str | None """The value as it appears on the document.""" def __init__( @@ -17,15 +15,15 @@ def __init__( raw_prediction: StringDict, value_key: str = "value", reconstructed: bool = False, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Text field object. - :params raw_prediction: Amount prediction object from HTTP response - :params value_key: Key to use in the amount_prediction dict - :params reconstructed: Bool for reconstructed object (not extracted in the API) - :params page_id: Page number for multi-page document + :param raw_prediction: Amount prediction object from HTTP response + :param value_key: Key to use in the amount_prediction dict + :param reconstructed: Bool for reconstructed object (not extracted in the API) + :param page_id: Page number for multi-page document """ self.value = None super().__init__( diff --git a/mindee/v1/pdf/__init__.py b/mindee/v1/pdf/__init__.py index 35d056e4..2e4a7aa2 100644 --- a/mindee/v1/pdf/__init__.py +++ b/mindee/v1/pdf/__init__.py @@ -1,4 +1,4 @@ -from mindee.v1.pdf.pdf_extractor import PDFExtractor from mindee.v1.pdf.multi_receipts_extractor import extract_receipts +from mindee.v1.pdf.pdf_extractor import PDFExtractor __all__ = ["PDFExtractor", "extract_receipts"] diff --git a/mindee/v1/pdf/multi_receipts_extractor.py b/mindee/v1/pdf/multi_receipts_extractor.py index 4159df29..98ab8a5e 100644 --- a/mindee/v1/pdf/multi_receipts_extractor.py +++ b/mindee/v1/pdf/multi_receipts_extractor.py @@ -1,5 +1,3 @@ -from typing import List - from mindee.error.mindee_error import MindeeError from mindee.image.extracted_image import ExtractedImage from mindee.image.image_extractor import extract_multiple_images_from_source @@ -9,15 +7,15 @@ def extract_receipts( input_source: LocalInputSource, inference: Inference -) -> List[ExtractedImage]: +) -> list[ExtractedImage]: """ Extracts individual receipts from multi-receipts documents. - :params input_source: Local Input Source to extract sub-receipts from. - :params inference: Results of the inference. + :param input_source: Local Input Source to extract sub-receipts from. + :param inference: Results of the inference. :return: Individual extracted receipts as an array of ExtractedMultiReceiptsImage. """ - images: List[ExtractedImage] = [] + images: list[ExtractedImage] = [] if not inference.prediction.receipts: raise MindeeError( "No possible receipts candidates found for MultiReceipts extraction." diff --git a/mindee/v1/pdf/pdf_extractor.py b/mindee/v1/pdf/pdf_extractor.py index a622b4a3..782f9fd9 100644 --- a/mindee/v1/pdf/pdf_extractor.py +++ b/mindee/v1/pdf/pdf_extractor.py @@ -1,5 +1,3 @@ -from typing import List, Optional, Union - from mindee.error import MindeeError from mindee.pdf.extracted_pdf import ExtractedPDF from mindee.pdf.pdf_extractor import PDFExtractor as BasePDFExtractor @@ -11,15 +9,15 @@ class PDFExtractor(BasePDFExtractor): def extract_invoices( self, - page_indexes: List[Union[InvoiceSplitterV1InvoicePageGroup, List[int]]], + page_indexes: list[InvoiceSplitterV1InvoicePageGroup | list[int]], strict: bool = False, - ) -> List[ExtractedPDF]: + ) -> list[ExtractedPDF]: """ Extracts invoices as complete PDFs from the document from either a list of pages or a list of page groups. - :params page_indexes: List of sub-lists of pages to keep. - :params strict: Whether to trust confidence scores above 0.5 (included) or not. + :param page_indexes: List of sub-lists of pages to keep. + :param strict: Whether to trust confidence scores above 0.5 (included) or not. :return: A list of extracted invoices. """ @@ -31,9 +29,9 @@ def extract_invoices( if not strict: indexes_as_list = [page_index.page_indexes for page_index in page_indexes] # type: ignore return self.extract_sub_documents(indexes_as_list) - correct_page_indexes: List[List[int]] = [] - current_list: List[int] = [] - previous_confidence: Optional[float] = None + correct_page_indexes: list[list[int]] = [] + current_list: list[int] = [] + previous_confidence: float | None = None for i, page_index in enumerate(page_indexes): assert isinstance(page_index, InvoiceSplitterV1InvoicePageGroup) confidence = page_index.confidence diff --git a/mindee/v1/product/__init__.py b/mindee/v1/product/__init__.py index 69ca5f37..5e5516c2 100644 --- a/mindee/v1/product/__init__.py +++ b/mindee/v1/product/__init__.py @@ -1,5 +1,4 @@ -from mindee.v1.product import us -from mindee.v1.product import fr +from mindee.v1.product import fr, us from mindee.v1.product.barcode_reader.barcode_reader_v1 import BarcodeReaderV1 from mindee.v1.product.barcode_reader.barcode_reader_v1_document import ( BarcodeReaderV1Document, @@ -63,8 +62,6 @@ ) __all__ = [ - "fr", - "us", "BarcodeReaderV1", "BarcodeReaderV1Document", "CropperV1", @@ -81,12 +78,12 @@ "GeneratedV1Page", "InternationalIdV2", "InternationalIdV2Document", - "InvoiceV4", - "InvoiceV4Document", - "InvoiceV4LineItem", "InvoiceSplitterV1", "InvoiceSplitterV1Document", "InvoiceSplitterV1InvoicePageGroup", + "InvoiceV4", + "InvoiceV4Document", + "InvoiceV4LineItem", "MultiReceiptsDetectorV1", "MultiReceiptsDetectorV1Document", "PassportV1", @@ -94,4 +91,6 @@ "ReceiptV5", "ReceiptV5Document", "ReceiptV5LineItem", + "fr", + "us", ] diff --git a/mindee/v1/product/barcode_reader/barcode_reader_v1.py b/mindee/v1/product/barcode_reader/barcode_reader_v1.py index 8116d09a..6e8f4836 100644 --- a/mindee/v1/product/barcode_reader/barcode_reader_v1.py +++ b/mindee/v1/product/barcode_reader/barcode_reader_v1.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.barcode_reader.barcode_reader_v1_document import ( BarcodeReaderV1Document, ) @@ -13,7 +11,7 @@ class BarcodeReaderV1(Inference): prediction: BarcodeReaderV1Document """Document-level prediction.""" - pages: List[Page[BarcodeReaderV1Document]] + pages: list[Page[BarcodeReaderV1Document]] """Page-level prediction(s).""" endpoint_name = "barcode_reader" """Name of the endpoint.""" @@ -24,7 +22,7 @@ def __init__(self, raw_prediction: StringDict): """ Barcode Reader v1 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/barcode_reader/barcode_reader_v1_document.py b/mindee/v1/product/barcode_reader/barcode_reader_v1_document.py index 82971b86..986e93be 100644 --- a/mindee/v1/product/barcode_reader/barcode_reader_v1_document.py +++ b/mindee/v1/product/barcode_reader/barcode_reader_v1_document.py @@ -1,29 +1,27 @@ -from typing import List, Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.text import StringField class BarcodeReaderV1Document(Prediction): """Barcode Reader API version 1.0 document data.""" - codes_1d: List[StringField] + codes_1d: list[StringField] """List of decoded 1D barcodes.""" - codes_2d: List[StringField] + codes_2d: list[StringField] """List of decoded 2D barcodes.""" def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Barcode Reader document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.codes_1d = [ diff --git a/mindee/v1/product/cropper/cropper_v1.py b/mindee/v1/product/cropper/cropper_v1.py index 183395f6..fd7e6e0d 100644 --- a/mindee/v1/product/cropper/cropper_v1.py +++ b/mindee/v1/product/cropper/cropper_v1.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.cropper.cropper_v1_document import ( CropperV1Document, ) @@ -16,7 +14,7 @@ class CropperV1(Inference): prediction: CropperV1Document """Document-level prediction.""" - pages: List[Page[CropperV1Page]] + pages: list[Page[CropperV1Page]] """Page-level prediction(s).""" endpoint_name = "cropper" """Name of the endpoint.""" @@ -27,7 +25,7 @@ def __init__(self, raw_prediction: StringDict): """ Cropper v1 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/cropper/cropper_v1_page.py b/mindee/v1/product/cropper/cropper_v1_page.py index c68b342f..af67bfe0 100644 --- a/mindee/v1/product/cropper/cropper_v1_page.py +++ b/mindee/v1/product/cropper/cropper_v1_page.py @@ -1,5 +1,3 @@ -from typing import List, Optional - from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string from mindee.v1.parsing.standard.position import PositionField @@ -11,19 +9,19 @@ class CropperV1Page(CropperV1Document): """Cropper API version 1.1 page data.""" - cropping: List[PositionField] + cropping: list[PositionField] """List of documents found in the image.""" def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Cropper page. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction=raw_prediction, page_id=page_id) self.cropping = [ diff --git a/mindee/v1/product/custom/custom_v1.py b/mindee/v1/product/custom/custom_v1.py index ad9cdce1..3177de31 100644 --- a/mindee/v1/product/custom/custom_v1.py +++ b/mindee/v1/product/custom/custom_v1.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.custom.custom_v1_document import CustomV1Document from mindee.v1.product.custom.custom_v1_page import CustomV1Page @@ -12,7 +10,7 @@ class CustomV1(Inference): prediction: CustomV1Document """Document-level prediction.""" - pages: List[Page[CustomV1Page]] + pages: list[Page[CustomV1Page]] """Page-level prediction(s).""" endpoint_name = "custom" """Name of the endpoint (placeholder).""" @@ -23,7 +21,7 @@ def __init__(self, raw_prediction: StringDict) -> None: """ Invoice Splitter v1 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) self.prediction = CustomV1Document(raw_prediction["prediction"]) diff --git a/mindee/v1/product/custom/custom_v1_document.py b/mindee/v1/product/custom/custom_v1_document.py index 9c71db5d..5d61a117 100644 --- a/mindee/v1/product/custom/custom_v1_document.py +++ b/mindee/v1/product/custom/custom_v1_document.py @@ -1,8 +1,6 @@ -from typing import Dict, List - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.custom.classification import ClassificationField from mindee.v1.parsing.custom.line_items import CustomLine, get_line_items from mindee.v1.parsing.custom.list import ListField @@ -11,16 +9,16 @@ class CustomV1Document(Prediction): """Custom V1 document prediction results.""" - fields: Dict[str, ListField] + fields: dict[str, ListField] """Dictionary of all fields in the document""" - classifications: Dict[str, ClassificationField] + classifications: dict[str, ClassificationField] """Dictionary of all classifications in the document""" def __init__(self, raw_prediction: StringDict) -> None: """ Custom document. - :params raw_prediction: Dictionary containing the JSON document response + :param raw_prediction: Dictionary containing the JSON document response """ super().__init__(raw_prediction) self.fields = {} @@ -34,16 +32,16 @@ def __init__(self, raw_prediction: StringDict) -> None: def columns_to_line_items( self, - anchor_names: List[str], - field_names: List[str], + anchor_names: list[str], + field_names: list[str], height_tolerance: float = 0.01, - ) -> List[CustomLine]: + ) -> list[CustomLine]: """ Order column fields into line items. - :params anchor_names: list of possible anchor fields. - :params field_names: list of all column fields. - :params height_tolerance: height tolerance to apply to lines. + :param anchor_names: list of possible anchor fields. + :param field_names: list of all column fields. + :param height_tolerance: height tolerance to apply to lines. """ return get_line_items( anchor_names, diff --git a/mindee/v1/product/custom/custom_v1_page.py b/mindee/v1/product/custom/custom_v1_page.py index c58cf43f..a8e373e1 100644 --- a/mindee/v1/product/custom/custom_v1_page.py +++ b/mindee/v1/product/custom/custom_v1_page.py @@ -1,8 +1,6 @@ -from typing import Dict, List, Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.custom.line_items import CustomLine, get_line_items from mindee.v1.parsing.custom.list import ListField @@ -10,14 +8,14 @@ class CustomV1Page(Prediction): """Custom V1 page prediction results.""" - fields: Dict[str, ListField] + fields: dict[str, ListField] """Dictionary of all fields in the document""" - def __init__(self, raw_prediction: StringDict, page_id: Optional[int]) -> None: + def __init__(self, raw_prediction: StringDict, page_id: int | None) -> None: """ Custom document object. - :params raw_prediction: Dictionary containing the JSON document response + :param raw_prediction: Dictionary containing the JSON document response """ super().__init__(raw_prediction, page_id) self.fields = {} @@ -26,16 +24,16 @@ def __init__(self, raw_prediction: StringDict, page_id: Optional[int]) -> None: def columns_to_line_items( self, - anchor_names: List[str], - field_names: List[str], + anchor_names: list[str], + field_names: list[str], height_tolerance: float = 0.01, - ) -> List[CustomLine]: + ) -> list[CustomLine]: """ Order column fields into line items. - :params anchor_names: list of possible anchor fields. - :params field_names: list of all column fields. - :params height_tolerance: height tolerance to apply to lines. + :param anchor_names: list of possible anchor fields. + :param field_names: list of all column fields. + :param height_tolerance: height tolerance to apply to lines. """ return get_line_items( anchor_names, diff --git a/mindee/v1/product/financial_document/financial_document_v1.py b/mindee/v1/product/financial_document/financial_document_v1.py index 022d50e4..26a72925 100644 --- a/mindee/v1/product/financial_document/financial_document_v1.py +++ b/mindee/v1/product/financial_document/financial_document_v1.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.financial_document.financial_document_v1_document import ( FinancialDocumentV1Document, ) @@ -13,7 +11,7 @@ class FinancialDocumentV1(Inference): prediction: FinancialDocumentV1Document """Document-level prediction.""" - pages: List[Page[FinancialDocumentV1Document]] + pages: list[Page[FinancialDocumentV1Document]] """Page-level prediction(s).""" endpoint_name = "financial_document" """Name of the endpoint.""" @@ -24,7 +22,7 @@ def __init__(self, raw_prediction: StringDict): """ Financial Document v1 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/financial_document/financial_document_v1_document.py b/mindee/v1/product/financial_document/financial_document_v1_document.py index b9051b20..69924c8b 100644 --- a/mindee/v1/product/financial_document/financial_document_v1_document.py +++ b/mindee/v1/product/financial_document/financial_document_v1_document.py @@ -1,8 +1,6 @@ -from typing import List, Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.address import AddressField from mindee.v1.parsing.standard.amount import AmountField from mindee.v1.parsing.standard.classification import ClassificationField @@ -26,7 +24,7 @@ class FinancialDocumentV1Document(Prediction): """The purchase category.""" customer_address: AddressField """The address of the customer.""" - customer_company_registrations: List[CompanyRegistrationField] + customer_company_registrations: list[CompanyRegistrationField] """List of company registration numbers associated to the customer.""" customer_id: StringField """The customer account number or identifier from the supplier.""" @@ -47,7 +45,7 @@ class FinancialDocumentV1Document(Prediction): """The date on which the payment is due.""" invoice_number: StringField """The invoice number or identifier only if document is an invoice.""" - line_items: List[FinancialDocumentV1LineItem] + line_items: list[FinancialDocumentV1LineItem] """List of line item present on the document.""" locale: LocaleField """The locale of the document.""" @@ -57,7 +55,7 @@ class FinancialDocumentV1Document(Prediction): """The purchase order number, only if the document is an invoice.""" receipt_number: StringField """The receipt number or identifier only if document is a receipt.""" - reference_numbers: List[StringField] + reference_numbers: list[StringField] """List of Reference numbers, including PO number, only if the document is an invoice.""" shipping_address: AddressField """The customer's address used for shipping.""" @@ -65,13 +63,13 @@ class FinancialDocumentV1Document(Prediction): """The purchase subcategory for transport, food and shooping.""" supplier_address: AddressField """The address of the supplier or merchant.""" - supplier_company_registrations: List[CompanyRegistrationField] + supplier_company_registrations: list[CompanyRegistrationField] """List of company registration numbers associated to the supplier.""" supplier_email: StringField """The email of the supplier or merchant.""" supplier_name: StringField """The name of the supplier or merchant.""" - supplier_payment_details: List[PaymentDetailsField] + supplier_payment_details: list[PaymentDetailsField] """List of payment details associated to the supplier (only for invoices).""" supplier_phone_number: StringField """The phone number of the supplier or merchant.""" @@ -93,13 +91,13 @@ class FinancialDocumentV1Document(Prediction): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Financial Document document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.billing_address = AddressField( diff --git a/mindee/v1/product/financial_document/financial_document_v1_line_item.py b/mindee/v1/product/financial_document/financial_document_v1_line_item.py index 1c5d8b44..7239768f 100644 --- a/mindee/v1/product/financial_document/financial_document_v1_line_item.py +++ b/mindee/v1/product/financial_document/financial_document_v1_line_item.py @@ -1,5 +1,3 @@ -from typing import Dict, Optional - from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string, format_for_display from mindee.v1.parsing.standard.base import ( @@ -13,21 +11,21 @@ class FinancialDocumentV1LineItem(FieldPositionMixin, FieldConfidenceMixin): """List of line item present on the document.""" - description: Optional[str] + description: str | None """The item description.""" - product_code: Optional[str] + product_code: str | None """The product code referring to the item.""" - quantity: Optional[float] + quantity: float | None """The item quantity""" - tax_amount: Optional[float] + tax_amount: float | None """The item tax amount.""" - tax_rate: Optional[float] + tax_rate: float | None """The item tax rate in percentage.""" - total_amount: Optional[float] + total_amount: float | None """The item total amount.""" - unit_measure: Optional[str] + unit_measure: str | None """The item unit of measure.""" - unit_price: Optional[float] + unit_price: float | None """The item unit price.""" page_n: int """The document page on which the information was found.""" @@ -35,16 +33,13 @@ class FinancialDocumentV1LineItem(FieldPositionMixin, FieldConfidenceMixin): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): self._set_confidence(raw_prediction) self._set_position(raw_prediction) if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass + self.page_n = raw_prediction.get("page_id", 0) else: self.page_n = page_id @@ -57,9 +52,9 @@ def __init__( self.unit_measure = raw_prediction["unit_measure"] self.unit_price = to_opt_float(raw_prediction, "unit_price") - def _printable_values(self) -> Dict[str, str]: + def _printable_values(self) -> dict[str, str]: """Return values for printing.""" - out_dict: Dict[str, str] = {} + out_dict: dict[str, str] = {} out_dict["description"] = format_for_display(self.description) out_dict["product_code"] = format_for_display(self.product_code) out_dict["quantity"] = float_to_string(self.quantity) @@ -70,9 +65,9 @@ def _printable_values(self) -> Dict[str, str]: out_dict["unit_price"] = float_to_string(self.unit_price) return out_dict - def _table_printable_values(self) -> Dict[str, str]: + def _table_printable_values(self) -> dict[str, str]: """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} + out_dict: dict[str, str] = {} out_dict["description"] = format_for_display(self.description, 36) out_dict["product_code"] = format_for_display(self.product_code, None) out_dict["quantity"] = float_to_string(self.quantity) diff --git a/mindee/v1/product/fr/bank_account_details/bank_account_details_v1.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v1.py index 0e7a2def..da2eb8a4 100644 --- a/mindee/v1/product/fr/bank_account_details/bank_account_details_v1.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v1.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.fr.bank_account_details.bank_account_details_v1_document import ( BankAccountDetailsV1Document, ) @@ -13,7 +11,7 @@ class BankAccountDetailsV1(Inference): prediction: BankAccountDetailsV1Document """Document-level prediction.""" - pages: List[Page[BankAccountDetailsV1Document]] + pages: list[Page[BankAccountDetailsV1Document]] """Page-level prediction(s).""" endpoint_name = "bank_account_details" """Name of the endpoint.""" @@ -24,7 +22,7 @@ def __init__(self, raw_prediction: StringDict): """ Bank Account Details v1 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.py index 93db710c..2ede4f5f 100644 --- a/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v1_document.py @@ -1,8 +1,6 @@ -from typing import Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.text import StringField @@ -19,13 +17,13 @@ class BankAccountDetailsV1Document(Prediction): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Bank Account Details document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.account_holder_name = StringField( diff --git a/mindee/v1/product/fr/bank_account_details/bank_account_details_v2.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2.py index 59e80306..1604941f 100644 --- a/mindee/v1/product/fr/bank_account_details/bank_account_details_v2.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.fr.bank_account_details.bank_account_details_v2_document import ( BankAccountDetailsV2Document, ) @@ -13,7 +11,7 @@ class BankAccountDetailsV2(Inference): prediction: BankAccountDetailsV2Document """Document-level prediction.""" - pages: List[Page[BankAccountDetailsV2Document]] + pages: list[Page[BankAccountDetailsV2Document]] """Page-level prediction(s).""" endpoint_name = "bank_account_details" """Name of the endpoint.""" @@ -24,7 +22,7 @@ def __init__(self, raw_prediction: StringDict): """ Bank Account Details v2 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_bban.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_bban.py index ace363a6..54d3ef1b 100644 --- a/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_bban.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_bban.py @@ -1,5 +1,3 @@ -from typing import Dict, Optional - from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string, format_for_display from mindee.v1.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin @@ -8,13 +6,13 @@ class BankAccountDetailsV2Bban(FieldPositionMixin, FieldConfidenceMixin): """Full extraction of BBAN, including: branch code, bank code, account and key.""" - bban_bank_code: Optional[str] + bban_bank_code: str | None """The BBAN bank code outputted as a string.""" - bban_branch_code: Optional[str] + bban_branch_code: str | None """The BBAN branch code outputted as a string.""" - bban_key: Optional[str] + bban_key: str | None """The BBAN key outputted as a string.""" - bban_number: Optional[str] + bban_number: str | None """The BBAN Account number outputted as a string.""" page_n: int """The document page on which the information was found.""" @@ -22,16 +20,13 @@ class BankAccountDetailsV2Bban(FieldPositionMixin, FieldConfidenceMixin): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): self._set_confidence(raw_prediction) self._set_position(raw_prediction) if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass + self.page_n = raw_prediction.get("page_id", 0) else: self.page_n = page_id @@ -40,9 +35,9 @@ def __init__( self.bban_key = raw_prediction["bban_key"] self.bban_number = raw_prediction["bban_number"] - def _printable_values(self) -> Dict[str, str]: + def _printable_values(self) -> dict[str, str]: """Return values for printing.""" - out_dict: Dict[str, str] = {} + out_dict: dict[str, str] = {} out_dict["bban_bank_code"] = format_for_display(self.bban_bank_code) out_dict["bban_branch_code"] = format_for_display(self.bban_branch_code) out_dict["bban_key"] = format_for_display(self.bban_key) diff --git a/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.py b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.py index 9d0284ad..456b0bc6 100644 --- a/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.py +++ b/mindee/v1/product/fr/bank_account_details/bank_account_details_v2_document.py @@ -1,8 +1,6 @@ -from typing import Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.text import StringField from mindee.v1.product.fr.bank_account_details.bank_account_details_v2_bban import ( BankAccountDetailsV2Bban, @@ -24,13 +22,13 @@ class BankAccountDetailsV2Document(Prediction): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Bank Account Details document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.account_holders_names = StringField( diff --git a/mindee/v1/product/fr/carte_grise/carte_grise_v1.py b/mindee/v1/product/fr/carte_grise/carte_grise_v1.py index 85f71da5..b9e09ded 100644 --- a/mindee/v1/product/fr/carte_grise/carte_grise_v1.py +++ b/mindee/v1/product/fr/carte_grise/carte_grise_v1.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.fr.carte_grise.carte_grise_v1_document import ( CarteGriseV1Document, ) @@ -13,7 +11,7 @@ class CarteGriseV1(Inference): prediction: CarteGriseV1Document """Document-level prediction.""" - pages: List[Page[CarteGriseV1Document]] + pages: list[Page[CarteGriseV1Document]] """Page-level prediction(s).""" endpoint_name = "carte_grise" """Name of the endpoint.""" @@ -24,7 +22,7 @@ def __init__(self, raw_prediction: StringDict): """ Carte Grise v1 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/fr/carte_grise/carte_grise_v1_document.py b/mindee/v1/product/fr/carte_grise/carte_grise_v1_document.py index 1e459c50..24844dc1 100644 --- a/mindee/v1/product/fr/carte_grise/carte_grise_v1_document.py +++ b/mindee/v1/product/fr/carte_grise/carte_grise_v1_document.py @@ -1,8 +1,6 @@ -from typing import Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.date import DateField from mindee.v1.parsing.standard.text import StringField @@ -96,13 +94,13 @@ class CarteGriseV1Document(Prediction): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Carte Grise document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.a = StringField( diff --git a/mindee/v1/product/fr/id_card/id_card_v1.py b/mindee/v1/product/fr/id_card/id_card_v1.py index 05f31873..15c8b9fa 100644 --- a/mindee/v1/product/fr/id_card/id_card_v1.py +++ b/mindee/v1/product/fr/id_card/id_card_v1.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.fr.id_card.id_card_v1_document import ( IdCardV1Document, ) @@ -16,7 +14,7 @@ class IdCardV1(Inference): prediction: IdCardV1Document """Document-level prediction.""" - pages: List[Page[IdCardV1Page]] + pages: list[Page[IdCardV1Page]] """Page-level prediction(s).""" endpoint_name = "idcard_fr" """Name of the endpoint.""" @@ -27,7 +25,7 @@ def __init__(self, raw_prediction: StringDict): """ Carte Nationale d'Identité v1 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/fr/id_card/id_card_v1_document.py b/mindee/v1/product/fr/id_card/id_card_v1_document.py index cf589d6d..8895a332 100644 --- a/mindee/v1/product/fr/id_card/id_card_v1_document.py +++ b/mindee/v1/product/fr/id_card/id_card_v1_document.py @@ -1,8 +1,6 @@ -from typing import List, Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.date import DateField from mindee.v1.parsing.standard.text import StringField @@ -20,7 +18,7 @@ class IdCardV1Document(Prediction): """The expiry date of the identification card.""" gender: StringField """The gender of the card holder.""" - given_names: List[StringField] + given_names: list[StringField] """The given name(s) of the card holder.""" id_number: StringField """The identification card number.""" @@ -34,13 +32,13 @@ class IdCardV1Document(Prediction): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Carte Nationale d'Identité document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.authority = StringField( diff --git a/mindee/v1/product/fr/id_card/id_card_v1_page.py b/mindee/v1/product/fr/id_card/id_card_v1_page.py index 9431c99e..907ca43e 100644 --- a/mindee/v1/product/fr/id_card/id_card_v1_page.py +++ b/mindee/v1/product/fr/id_card/id_card_v1_page.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string from mindee.v1.parsing.standard.classification import ClassificationField @@ -17,13 +15,13 @@ class IdCardV1Page(IdCardV1Document): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Carte Nationale d'Identité page. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction=raw_prediction, page_id=page_id) self.document_side = ClassificationField( diff --git a/mindee/v1/product/fr/id_card/id_card_v2.py b/mindee/v1/product/fr/id_card/id_card_v2.py index 31179e80..e151e924 100644 --- a/mindee/v1/product/fr/id_card/id_card_v2.py +++ b/mindee/v1/product/fr/id_card/id_card_v2.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.fr.id_card.id_card_v2_document import ( IdCardV2Document, ) @@ -16,7 +14,7 @@ class IdCardV2(Inference): prediction: IdCardV2Document """Document-level prediction.""" - pages: List[Page[IdCardV2Page]] + pages: list[Page[IdCardV2Page]] """Page-level prediction(s).""" endpoint_name = "idcard_fr" """Name of the endpoint.""" @@ -27,7 +25,7 @@ def __init__(self, raw_prediction: StringDict): """ Carte Nationale d'Identité v2 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/fr/id_card/id_card_v2_document.py b/mindee/v1/product/fr/id_card/id_card_v2_document.py index 197cdc82..935b2ad8 100644 --- a/mindee/v1/product/fr/id_card/id_card_v2_document.py +++ b/mindee/v1/product/fr/id_card/id_card_v2_document.py @@ -1,8 +1,6 @@ -from typing import List, Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.date import DateField from mindee.v1.parsing.standard.text import StringField @@ -26,7 +24,7 @@ class IdCardV2Document(Prediction): """The expiry date of the identification card.""" gender: StringField """The gender of the card holder.""" - given_names: List[StringField] + given_names: list[StringField] """The given name(s) of the card holder.""" issue_date: DateField """The date of issue of the identification card.""" @@ -44,13 +42,13 @@ class IdCardV2Document(Prediction): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Carte Nationale d'Identité document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.alternate_name = StringField( diff --git a/mindee/v1/product/fr/id_card/id_card_v2_page.py b/mindee/v1/product/fr/id_card/id_card_v2_page.py index 738b3c1c..fe4ddc98 100644 --- a/mindee/v1/product/fr/id_card/id_card_v2_page.py +++ b/mindee/v1/product/fr/id_card/id_card_v2_page.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string from mindee.v1.parsing.standard.classification import ClassificationField @@ -19,13 +17,13 @@ class IdCardV2Page(IdCardV2Document): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Carte Nationale d'Identité page. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction=raw_prediction, page_id=page_id) self.document_side = ClassificationField( diff --git a/mindee/v1/product/generated/generated_v1.py b/mindee/v1/product/generated/generated_v1.py index d26e9a9d..687ed954 100644 --- a/mindee/v1/product/generated/generated_v1.py +++ b/mindee/v1/product/generated/generated_v1.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.generated.generated_v1_document import GeneratedV1Document from mindee.v1.product.generated.generated_v1_page import GeneratedV1Page @@ -12,7 +10,7 @@ class GeneratedV1(Inference): prediction: GeneratedV1Document """Document-level prediction.""" - pages: List[Page[GeneratedV1Page]] + pages: list[Page[GeneratedV1Page]] """Page-level prediction(s).""" endpoint_name = "custom" """Name of the endpoint (placeholder).""" @@ -23,7 +21,7 @@ def __init__(self, raw_prediction: StringDict) -> None: """ Invoice Splitter v1 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) self.prediction = GeneratedV1Document(raw_prediction["prediction"]) diff --git a/mindee/v1/product/generated/generated_v1_document.py b/mindee/v1/product/generated/generated_v1_document.py index 53f6b1ac..36307f0b 100644 --- a/mindee/v1/product/generated/generated_v1_document.py +++ b/mindee/v1/product/generated/generated_v1_document.py @@ -1,5 +1,3 @@ -from typing import Dict, Union - from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.generated.generated_list import GeneratedListField from mindee.v1.parsing.generated.generated_object import ( @@ -13,14 +11,14 @@ class GeneratedV1Document(GeneratedV1Prediction): """Generated V1 document prediction results.""" - fields: Dict[str, Union[GeneratedListField, StringField, GeneratedObjectField]] + fields: dict[str, GeneratedListField | StringField | GeneratedObjectField] """Dictionary of all fields in the document""" def __init__(self, raw_prediction: StringDict) -> None: """ Generated document. - :params raw_prediction: Dictionary containing the JSON document response + :param raw_prediction: Dictionary containing the JSON document response """ super().__init__(raw_prediction) for field_name, field_contents in raw_prediction.items(): diff --git a/mindee/v1/product/generated/generated_v1_page.py b/mindee/v1/product/generated/generated_v1_page.py index 665a8ad8..1f703ce7 100644 --- a/mindee/v1/product/generated/generated_v1_page.py +++ b/mindee/v1/product/generated/generated_v1_page.py @@ -1,5 +1,3 @@ -from typing import Dict, Optional, Union - from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.generated.generated_list import GeneratedListField from mindee.v1.parsing.generated.generated_object import ( @@ -13,16 +11,14 @@ class GeneratedV1Page(GeneratedV1Prediction): """Generated V1 page prediction results.""" - fields: Dict[str, Union[GeneratedListField, StringField, GeneratedObjectField]] + fields: dict[str, GeneratedListField | StringField | GeneratedObjectField] """Dictionary of all fields in the document""" - def __init__( - self, raw_prediction: StringDict, page_id: Optional[int] = None - ) -> None: + def __init__(self, raw_prediction: StringDict, page_id: int | None = None) -> None: """ Generated document object. - :params raw_prediction: Dictionary containing the JSON document response + :param raw_prediction: Dictionary containing the JSON document response """ super().__init__(raw_prediction) for field_name, field_contents in raw_prediction.items(): diff --git a/mindee/v1/product/generated/generated_v1_prediction.py b/mindee/v1/product/generated/generated_v1_prediction.py index d7199dfa..82b80c70 100644 --- a/mindee/v1/product/generated/generated_v1_prediction.py +++ b/mindee/v1/product/generated/generated_v1_prediction.py @@ -1,9 +1,8 @@ import re -from typing import Dict, List, Union -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.generated.generated_list import GeneratedListField from mindee.v1.parsing.generated.generated_object import GeneratedObjectField from mindee.v1.parsing.standard.text import StringField @@ -12,14 +11,14 @@ class GeneratedV1Prediction(Prediction): """Generated V1 document prediction results.""" - fields: Dict[str, Union[GeneratedListField, StringField, GeneratedObjectField]] + fields: dict[str, GeneratedListField | StringField | GeneratedObjectField] """Dictionary of all fields in the document""" def __init__(self, raw_prediction: StringDict) -> None: """ Generated document. - :params raw_prediction: Dictionary containing the JSON document response + :param raw_prediction: Dictionary containing the JSON document response """ super().__init__(raw_prediction) self.fields = {} @@ -50,7 +49,7 @@ def __str__(self) -> str: out_str += f":{field_name}: {str_value}\n" return clean_out_string(out_str) - def get_single_fields(self) -> Dict[str, StringField]: + def get_single_fields(self) -> dict[str, StringField]: """Returns a dictionary of all fields that aren't a collection.""" single_fields = {} for field_name, field_value in self.fields.items(): @@ -58,7 +57,7 @@ def get_single_fields(self) -> Dict[str, StringField]: single_fields[field_name] = field_value return single_fields - def get_list_fields(self) -> Dict[str, GeneratedListField]: + def get_list_fields(self) -> dict[str, GeneratedListField]: """Returns a dictionary of all list-like fields.""" list_fields = {} for field_name, field_value in self.fields.items(): @@ -66,7 +65,7 @@ def get_list_fields(self) -> Dict[str, GeneratedListField]: list_fields[field_name] = field_value return list_fields - def get_object_fields(self) -> Dict[str, GeneratedObjectField]: + def get_object_fields(self) -> dict[str, GeneratedObjectField]: """Returns a dictionary of all object-like fields.""" object_fields = {} for field_name, field_value in self.fields.items(): @@ -74,6 +73,6 @@ def get_object_fields(self) -> Dict[str, GeneratedObjectField]: object_fields[field_name] = field_value return object_fields - def list_field_names(self) -> List[str]: + def list_field_names(self) -> list[str]: """Lists names of all top-level field keys.""" return list(self.fields.keys()) diff --git a/mindee/v1/product/international_id/international_id_v2.py b/mindee/v1/product/international_id/international_id_v2.py index 6d60dd7f..ae5b91a9 100644 --- a/mindee/v1/product/international_id/international_id_v2.py +++ b/mindee/v1/product/international_id/international_id_v2.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.international_id.international_id_v2_document import ( InternationalIdV2Document, ) @@ -13,7 +11,7 @@ class InternationalIdV2(Inference): prediction: InternationalIdV2Document """Document-level prediction.""" - pages: List[Page[InternationalIdV2Document]] + pages: list[Page[InternationalIdV2Document]] """Page-level prediction(s).""" endpoint_name = "international_id" """Name of the endpoint.""" @@ -24,7 +22,7 @@ def __init__(self, raw_prediction: StringDict): """ International ID v2 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/international_id/international_id_v2_document.py b/mindee/v1/product/international_id/international_id_v2_document.py index 517c3e20..7b91c734 100644 --- a/mindee/v1/product/international_id/international_id_v2_document.py +++ b/mindee/v1/product/international_id/international_id_v2_document.py @@ -1,8 +1,6 @@ -from typing import List, Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.classification import ClassificationField from mindee.v1.parsing.standard.date import DateField from mindee.v1.parsing.standard.text import StringField @@ -25,7 +23,7 @@ class InternationalIdV2Document(Prediction): """The type of personal identification document.""" expiry_date: DateField """The date when the document becomes invalid.""" - given_names: List[StringField] + given_names: list[StringField] """The list of the document holder's given names.""" issue_date: DateField """The date when the document was issued.""" @@ -43,19 +41,19 @@ class InternationalIdV2Document(Prediction): """The biological sex of the document holder.""" state_of_issue: StringField """The state or territory where the document was issued.""" - surnames: List[StringField] + surnames: list[StringField] """The list of the document holder's family names.""" def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ International ID document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.address = StringField( diff --git a/mindee/v1/product/invoice/invoice_v4.py b/mindee/v1/product/invoice/invoice_v4.py index 648329d9..20fa9fd9 100644 --- a/mindee/v1/product/invoice/invoice_v4.py +++ b/mindee/v1/product/invoice/invoice_v4.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.invoice.invoice_v4_document import ( InvoiceV4Document, ) @@ -13,7 +11,7 @@ class InvoiceV4(Inference): prediction: InvoiceV4Document """Document-level prediction.""" - pages: List[Page[InvoiceV4Document]] + pages: list[Page[InvoiceV4Document]] """Page-level prediction(s).""" endpoint_name = "invoices" """Name of the endpoint.""" @@ -24,7 +22,7 @@ def __init__(self, raw_prediction: StringDict): """ Invoice v4 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/invoice/invoice_v4_document.py b/mindee/v1/product/invoice/invoice_v4_document.py index b5d69a5d..0620fffe 100644 --- a/mindee/v1/product/invoice/invoice_v4_document.py +++ b/mindee/v1/product/invoice/invoice_v4_document.py @@ -1,8 +1,6 @@ -from typing import List, Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.address import AddressField from mindee.v1.parsing.standard.amount import AmountField from mindee.v1.parsing.standard.classification import ClassificationField @@ -24,7 +22,7 @@ class InvoiceV4Document(Prediction): """The purchase category.""" customer_address: AddressField """The address of the customer.""" - customer_company_registrations: List[CompanyRegistrationField] + customer_company_registrations: list[CompanyRegistrationField] """List of company registration numbers associated to the customer.""" customer_id: StringField """The customer account number or identifier from the supplier.""" @@ -40,7 +38,7 @@ class InvoiceV4Document(Prediction): """The date on which the payment is due.""" invoice_number: StringField """The invoice number or identifier.""" - line_items: List[InvoiceV4LineItem] + line_items: list[InvoiceV4LineItem] """List of all the line items present on the invoice.""" locale: LocaleField """The locale of the document.""" @@ -48,7 +46,7 @@ class InvoiceV4Document(Prediction): """The date on which the payment is due / was full-filled.""" po_number: StringField """The purchase order number.""" - reference_numbers: List[StringField] + reference_numbers: list[StringField] """List of all reference numbers on the invoice, including the purchase order number.""" shipping_address: AddressField """Customer's delivery address.""" @@ -56,13 +54,13 @@ class InvoiceV4Document(Prediction): """The purchase subcategory for transport, food and shopping.""" supplier_address: AddressField """The address of the supplier or merchant.""" - supplier_company_registrations: List[CompanyRegistrationField] + supplier_company_registrations: list[CompanyRegistrationField] """List of company registration numbers associated to the supplier.""" supplier_email: StringField """The email address of the supplier or merchant.""" supplier_name: StringField """The name of the supplier or merchant.""" - supplier_payment_details: List[PaymentDetailsField] + supplier_payment_details: list[PaymentDetailsField] """List of payment details associated to the supplier of the invoice.""" supplier_phone_number: StringField """The phone number of the supplier or merchant.""" @@ -80,13 +78,13 @@ class InvoiceV4Document(Prediction): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Invoice document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.billing_address = AddressField( diff --git a/mindee/v1/product/invoice/invoice_v4_line_item.py b/mindee/v1/product/invoice/invoice_v4_line_item.py index f4a87686..3aa116b1 100644 --- a/mindee/v1/product/invoice/invoice_v4_line_item.py +++ b/mindee/v1/product/invoice/invoice_v4_line_item.py @@ -1,5 +1,3 @@ -from typing import Dict, Optional - from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string, format_for_display from mindee.v1.parsing.standard.base import ( @@ -13,21 +11,21 @@ class InvoiceV4LineItem(FieldPositionMixin, FieldConfidenceMixin): """List of all the line items present on the invoice.""" - description: Optional[str] + description: str | None """The item description.""" - product_code: Optional[str] + product_code: str | None """The product code of the item.""" - quantity: Optional[float] + quantity: float | None """The item quantity""" - tax_amount: Optional[float] + tax_amount: float | None """The item tax amount.""" - tax_rate: Optional[float] + tax_rate: float | None """The item tax rate in percentage.""" - total_amount: Optional[float] + total_amount: float | None """The item total amount.""" - unit_measure: Optional[str] + unit_measure: str | None """The item unit of measure.""" - unit_price: Optional[float] + unit_price: float | None """The item unit price.""" page_n: int """The document page on which the information was found.""" @@ -35,16 +33,13 @@ class InvoiceV4LineItem(FieldPositionMixin, FieldConfidenceMixin): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): self._set_confidence(raw_prediction) self._set_position(raw_prediction) if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass + self.page_n = raw_prediction.get("page_id", 0) else: self.page_n = page_id @@ -57,9 +52,9 @@ def __init__( self.unit_measure = raw_prediction["unit_measure"] self.unit_price = to_opt_float(raw_prediction, "unit_price") - def _printable_values(self) -> Dict[str, str]: + def _printable_values(self) -> dict[str, str]: """Return values for printing.""" - out_dict: Dict[str, str] = {} + out_dict: dict[str, str] = {} out_dict["description"] = format_for_display(self.description) out_dict["product_code"] = format_for_display(self.product_code) out_dict["quantity"] = float_to_string(self.quantity) @@ -70,9 +65,9 @@ def _printable_values(self) -> Dict[str, str]: out_dict["unit_price"] = float_to_string(self.unit_price) return out_dict - def _table_printable_values(self) -> Dict[str, str]: + def _table_printable_values(self) -> dict[str, str]: """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} + out_dict: dict[str, str] = {} out_dict["description"] = format_for_display(self.description, 36) out_dict["product_code"] = format_for_display(self.product_code, None) out_dict["quantity"] = float_to_string(self.quantity) diff --git a/mindee/v1/product/invoice_splitter/invoice_splitter_v1.py b/mindee/v1/product/invoice_splitter/invoice_splitter_v1.py index c68288e1..308e8824 100644 --- a/mindee/v1/product/invoice_splitter/invoice_splitter_v1.py +++ b/mindee/v1/product/invoice_splitter/invoice_splitter_v1.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.invoice_splitter.invoice_splitter_v1_document import ( InvoiceSplitterV1Document, ) @@ -13,7 +11,7 @@ class InvoiceSplitterV1(Inference): prediction: InvoiceSplitterV1Document """Document-level prediction.""" - pages: List[Page[InvoiceSplitterV1Document]] + pages: list[Page[InvoiceSplitterV1Document]] """Page-level prediction(s).""" endpoint_name = "invoice_splitter" """Name of the endpoint.""" @@ -24,7 +22,7 @@ def __init__(self, raw_prediction: StringDict): """ Invoice Splitter v1 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.py b/mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.py index 27dd4c42..6f52ca36 100644 --- a/mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.py +++ b/mindee/v1/product/invoice_splitter/invoice_splitter_v1_document.py @@ -1,8 +1,6 @@ -from typing import List, Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.product.invoice_splitter.invoice_splitter_v1_invoice_page_group import ( InvoiceSplitterV1InvoicePageGroup, ) @@ -11,19 +9,19 @@ class InvoiceSplitterV1Document(Prediction): """Invoice Splitter API version 1.4 document data.""" - invoice_page_groups: List[InvoiceSplitterV1InvoicePageGroup] + invoice_page_groups: list[InvoiceSplitterV1InvoicePageGroup] """List of page groups. Each group represents a single invoice within a multi-invoice document.""" def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Invoice Splitter document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.invoice_page_groups = [ diff --git a/mindee/v1/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.py b/mindee/v1/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.py index 3575efaf..41b60108 100644 --- a/mindee/v1/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.py +++ b/mindee/v1/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.py @@ -1,5 +1,3 @@ -from typing import Dict, List, Optional - from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string from mindee.v1.parsing.standard.base import FieldConfidenceMixin, FieldPositionMixin @@ -8,7 +6,7 @@ class InvoiceSplitterV1InvoicePageGroup(FieldPositionMixin, FieldConfidenceMixin): """List of page groups. Each group represents a single invoice within a multi-invoice document.""" - page_indexes: List[int] + page_indexes: list[int] """List of page indexes that belong to the same invoice (group).""" page_n: int """The document page on which the information was found.""" @@ -16,30 +14,27 @@ class InvoiceSplitterV1InvoicePageGroup(FieldPositionMixin, FieldConfidenceMixin def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): self._set_confidence(raw_prediction) self._set_position(raw_prediction) if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass + self.page_n = raw_prediction.get("page_id", 0) else: self.page_n = page_id self.page_indexes = raw_prediction["page_indexes"] - def _printable_values(self) -> Dict[str, str]: + def _printable_values(self) -> dict[str, str]: """Return values for printing.""" - out_dict: Dict[str, str] = {} + out_dict: dict[str, str] = {} out_dict["page_indexes"] = ", ".join([str(elem) for elem in self.page_indexes]) return out_dict - def _table_printable_values(self) -> Dict[str, str]: + def _table_printable_values(self) -> dict[str, str]: """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} + out_dict: dict[str, str] = {} out_dict["page_indexes"] = ", ".join([str(elem) for elem in self.page_indexes]) return out_dict diff --git a/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.py b/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.py index 1c67f5b4..5341c7c9 100644 --- a/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.py +++ b/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1_document import ( MultiReceiptsDetectorV1Document, ) @@ -13,7 +11,7 @@ class MultiReceiptsDetectorV1(Inference): prediction: MultiReceiptsDetectorV1Document """Document-level prediction.""" - pages: List[Page[MultiReceiptsDetectorV1Document]] + pages: list[Page[MultiReceiptsDetectorV1Document]] """Page-level prediction(s).""" endpoint_name = "multi_receipts_detector" """Name of the endpoint.""" @@ -24,7 +22,7 @@ def __init__(self, raw_prediction: StringDict): """ Multi Receipts Detector v1 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.py b/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.py index 2573ab17..2ae011e9 100644 --- a/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.py +++ b/mindee/v1/product/multi_receipts_detector/multi_receipts_detector_v1_document.py @@ -1,27 +1,25 @@ -from typing import List, Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.position import PositionField class MultiReceiptsDetectorV1Document(Prediction): """Multi Receipts Detector API version 1.1 document data.""" - receipts: List[PositionField] + receipts: list[PositionField] """Positions of the receipts on the document.""" def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Multi Receipts Detector document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.receipts = [ diff --git a/mindee/v1/product/passport/passport_v1.py b/mindee/v1/product/passport/passport_v1.py index 19d8ac6b..4b21ce89 100644 --- a/mindee/v1/product/passport/passport_v1.py +++ b/mindee/v1/product/passport/passport_v1.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.passport.passport_v1_document import ( PassportV1Document, ) @@ -13,7 +11,7 @@ class PassportV1(Inference): prediction: PassportV1Document """Document-level prediction.""" - pages: List[Page[PassportV1Document]] + pages: list[Page[PassportV1Document]] """Page-level prediction(s).""" endpoint_name = "passport" """Name of the endpoint.""" @@ -24,7 +22,7 @@ def __init__(self, raw_prediction: StringDict): """ Passport v1 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/passport/passport_v1_document.py b/mindee/v1/product/passport/passport_v1_document.py index 7fb0aa10..7735b272 100644 --- a/mindee/v1/product/passport/passport_v1_document.py +++ b/mindee/v1/product/passport/passport_v1_document.py @@ -1,8 +1,6 @@ -from typing import List, Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.date import DateField from mindee.v1.parsing.standard.text import StringField @@ -20,7 +18,7 @@ class PassportV1Document(Prediction): """The expiry date of the passport.""" gender: StringField """The gender of the passport holder.""" - given_names: List[StringField] + given_names: list[StringField] """The given name(s) of the passport holder.""" id_number: StringField """The passport's identification number.""" @@ -36,13 +34,13 @@ class PassportV1Document(Prediction): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Passport document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.birth_date = DateField( diff --git a/mindee/v1/product/receipt/receipt_v5.py b/mindee/v1/product/receipt/receipt_v5.py index 060daf80..1dc0e6dc 100644 --- a/mindee/v1/product/receipt/receipt_v5.py +++ b/mindee/v1/product/receipt/receipt_v5.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.receipt.receipt_v5_document import ( ReceiptV5Document, ) @@ -13,7 +11,7 @@ class ReceiptV5(Inference): prediction: ReceiptV5Document """Document-level prediction.""" - pages: List[Page[ReceiptV5Document]] + pages: list[Page[ReceiptV5Document]] """Page-level prediction(s).""" endpoint_name = "expense_receipts" """Name of the endpoint.""" @@ -24,7 +22,7 @@ def __init__(self, raw_prediction: StringDict): """ Receipt v5 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/receipt/receipt_v5_document.py b/mindee/v1/product/receipt/receipt_v5_document.py index 323bdf3b..13802317 100644 --- a/mindee/v1/product/receipt/receipt_v5_document.py +++ b/mindee/v1/product/receipt/receipt_v5_document.py @@ -1,8 +1,6 @@ -from typing import List, Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.amount import AmountField from mindee.v1.parsing.standard.classification import ClassificationField from mindee.v1.parsing.standard.company_registration import CompanyRegistrationField @@ -22,7 +20,7 @@ class ReceiptV5Document(Prediction): """The date the purchase was made.""" document_type: ClassificationField """The type of receipt: EXPENSE RECEIPT or CREDIT CARD RECEIPT.""" - line_items: List[ReceiptV5LineItem] + line_items: list[ReceiptV5LineItem] """List of all line items on the receipt.""" locale: LocaleField """The locale of the document.""" @@ -32,7 +30,7 @@ class ReceiptV5Document(Prediction): """The purchase subcategory of the receipt for transport and food.""" supplier_address: StringField """The address of the supplier or merchant.""" - supplier_company_registrations: List[CompanyRegistrationField] + supplier_company_registrations: list[CompanyRegistrationField] """List of company registration numbers associated to the supplier.""" supplier_name: StringField """The name of the supplier or merchant.""" @@ -54,13 +52,13 @@ class ReceiptV5Document(Prediction): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Receipt document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.category = ClassificationField( diff --git a/mindee/v1/product/receipt/receipt_v5_line_item.py b/mindee/v1/product/receipt/receipt_v5_line_item.py index 0b041937..8e3a7fa5 100644 --- a/mindee/v1/product/receipt/receipt_v5_line_item.py +++ b/mindee/v1/product/receipt/receipt_v5_line_item.py @@ -1,5 +1,3 @@ -from typing import Dict, Optional - from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string, format_for_display from mindee.v1.parsing.standard.base import ( @@ -13,13 +11,13 @@ class ReceiptV5LineItem(FieldPositionMixin, FieldConfidenceMixin): """List of all line items on the receipt.""" - description: Optional[str] + description: str | None """The item description.""" - quantity: Optional[float] + quantity: float | None """The item quantity.""" - total_amount: Optional[float] + total_amount: float | None """The item total amount.""" - unit_price: Optional[float] + unit_price: float | None """The item unit price.""" page_n: int """The document page on which the information was found.""" @@ -27,16 +25,13 @@ class ReceiptV5LineItem(FieldPositionMixin, FieldConfidenceMixin): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): self._set_confidence(raw_prediction) self._set_position(raw_prediction) if page_id is None: - try: - self.page_n = raw_prediction["page_id"] - except KeyError: - pass + self.page_n = raw_prediction.get("page_id", 0) else: self.page_n = page_id @@ -45,18 +40,18 @@ def __init__( self.total_amount = to_opt_float(raw_prediction, "total_amount") self.unit_price = to_opt_float(raw_prediction, "unit_price") - def _printable_values(self) -> Dict[str, str]: + def _printable_values(self) -> dict[str, str]: """Return values for printing.""" - out_dict: Dict[str, str] = {} + out_dict: dict[str, str] = {} out_dict["description"] = format_for_display(self.description) out_dict["quantity"] = float_to_string(self.quantity) out_dict["total_amount"] = float_to_string(self.total_amount) out_dict["unit_price"] = float_to_string(self.unit_price) return out_dict - def _table_printable_values(self) -> Dict[str, str]: + def _table_printable_values(self) -> dict[str, str]: """Return values for printing inside an RST table.""" - out_dict: Dict[str, str] = {} + out_dict: dict[str, str] = {} out_dict["description"] = format_for_display(self.description, 36) out_dict["quantity"] = float_to_string(self.quantity) out_dict["total_amount"] = float_to_string(self.total_amount) diff --git a/mindee/v1/product/us/bank_check/bank_check_v1.py b/mindee/v1/product/us/bank_check/bank_check_v1.py index 5bcc0f84..e1ae082f 100644 --- a/mindee/v1/product/us/bank_check/bank_check_v1.py +++ b/mindee/v1/product/us/bank_check/bank_check_v1.py @@ -1,8 +1,6 @@ -from typing import List - +from mindee.parsing.common.string_dict import StringDict from mindee.v1.parsing.common.inference import Inference from mindee.v1.parsing.common.page import Page -from mindee.parsing.common.string_dict import StringDict from mindee.v1.product.us.bank_check.bank_check_v1_document import ( BankCheckV1Document, ) @@ -16,7 +14,7 @@ class BankCheckV1(Inference): prediction: BankCheckV1Document """Document-level prediction.""" - pages: List[Page[BankCheckV1Page]] + pages: list[Page[BankCheckV1Page]] """Page-level prediction(s).""" endpoint_name = "bank_check" """Name of the endpoint.""" @@ -27,7 +25,7 @@ def __init__(self, raw_prediction: StringDict): """ Bank Check v1 inference. - :params raw_prediction: Raw prediction from the HTTP response. + :param raw_prediction: Raw prediction from the HTTP response. """ super().__init__(raw_prediction) diff --git a/mindee/v1/product/us/bank_check/bank_check_v1_document.py b/mindee/v1/product/us/bank_check/bank_check_v1_document.py index 9c84c1db..0846bc9f 100644 --- a/mindee/v1/product/us/bank_check/bank_check_v1_document.py +++ b/mindee/v1/product/us/bank_check/bank_check_v1_document.py @@ -1,8 +1,6 @@ -from typing import List, Optional - -from mindee.v1.parsing.common.prediction import Prediction from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string +from mindee.v1.parsing.common.prediction import Prediction from mindee.v1.parsing.standard.amount import AmountField from mindee.v1.parsing.standard.date import DateField from mindee.v1.parsing.standard.text import StringField @@ -19,7 +17,7 @@ class BankCheckV1Document(Prediction): """The issuer's check number.""" date: DateField """The date the check was issued.""" - payees: List[StringField] + payees: list[StringField] """List of the check's payees (recipients).""" routing_number: StringField """The check issuer's routing number.""" @@ -27,13 +25,13 @@ class BankCheckV1Document(Prediction): def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Bank Check document. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction, page_id) self.account_number = StringField( diff --git a/mindee/v1/product/us/bank_check/bank_check_v1_page.py b/mindee/v1/product/us/bank_check/bank_check_v1_page.py index 8864b09c..1c9f1da7 100644 --- a/mindee/v1/product/us/bank_check/bank_check_v1_page.py +++ b/mindee/v1/product/us/bank_check/bank_check_v1_page.py @@ -1,5 +1,3 @@ -from typing import List, Optional - from mindee.parsing.common.string_dict import StringDict from mindee.parsing.common.summary_helper import clean_out_string from mindee.v1.parsing.standard.position import PositionField @@ -13,19 +11,19 @@ class BankCheckV1Page(BankCheckV1Document): check_position: PositionField """The position of the check on the document.""" - signatures_positions: List[PositionField] + signatures_positions: list[PositionField] """List of signature positions""" def __init__( self, raw_prediction: StringDict, - page_id: Optional[int] = None, + page_id: int | None = None, ): """ Bank Check page. - :params raw_prediction: Raw prediction from HTTP response - :params page_id: Page number for multi pages pdf input + :param raw_prediction: Raw prediction from HTTP response + :param page_id: Page number for multi pages pdf input """ super().__init__(raw_prediction=raw_prediction, page_id=page_id) self.check_position = PositionField( diff --git a/mindee/v2/__init__.py b/mindee/v2/__init__.py index d16c51b3..b36f8f6d 100644 --- a/mindee/v2/__init__.py +++ b/mindee/v2/__init__.py @@ -4,37 +4,37 @@ extract_single_crop, ) from mindee.v2.file_operations.split import extract_splits -from mindee.v2.product.classification.params.classification_parameters import ( - ClassificationParameters, -) from mindee.v2.product.classification.classification_response import ( ClassificationResponse, ) -from mindee.v2.product.crop.params.crop_parameters import CropParameters +from mindee.v2.product.classification.params.classification_parameters import ( + ClassificationParameters, +) from mindee.v2.product.crop.crop_response import CropResponse +from mindee.v2.product.crop.params.crop_parameters import CropParameters +from mindee.v2.product.extraction.extraction_response import ExtractionResponse from mindee.v2.product.extraction.params.extraction_parameters import ( ExtractionParameters, ) -from mindee.v2.product.extraction.extraction_response import ExtractionResponse -from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters from mindee.v2.product.ocr.ocr_response import OCRResponse +from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters from mindee.v2.product.split.params.split_parameters import SplitParameters from mindee.v2.product.split.split_response import SplitResponse __all__ = [ - "Client", - "extract_crops", - "extract_splits", - "extract_crops", - "extract_single_crop", - "ClassificationResponse", "ClassificationParameters", - "CropResponse", + "ClassificationResponse", + "Client", "CropParameters", + "CropResponse", "ExtractionParameters", "ExtractionResponse", - "OCRResponse", "OCRParameters", - "SplitResponse", + "OCRResponse", "SplitParameters", + "SplitResponse", + "extract_crops", + "extract_crops", + "extract_single_crop", + "extract_splits", ] diff --git a/mindee/v2/client.py b/mindee/v2/client.py index 304c149b..9f261d89 100644 --- a/mindee/v2/client.py +++ b/mindee/v2/client.py @@ -1,28 +1,42 @@ -import warnings from time import sleep -from typing import Optional, Union, Type, TypeVar +from typing import TypeVar + +import requests from mindee.client_mixin import ClientMixin +from mindee.client_options.polling_options import PollingOptions from mindee.error.mindee_error import MindeeError -from mindee.v2.error.mindee_http_error_v2 import handle_error_v2 from mindee.input import URLInputSource -from mindee.v2.client_options.base_parameters import BaseParameters -from mindee.client_options.polling_options import PollingOptions from mindee.input.local_input_source import LocalInputSource from mindee.logger import logger +from mindee.parsing.common import StringDict +from mindee.parsing.common.common_response import CommonStatus +from mindee.v2.client_options.base_parameters import BaseParameters +from mindee.v2.error.mindee_http_error_v2 import ( + MindeeHTTPUnknownErrorV2, + handle_error_v2, +) from mindee.v2.mindee_http.mindee_api_v2 import MindeeAPIV2 from mindee.v2.mindee_http.response_validation_v2 import ( is_valid_get_response, is_valid_post_response, ) -from mindee.parsing.common.common_response import CommonStatus from mindee.v2.parsing.inference.base_response import BaseResponse -from mindee.v2.product.extraction.extraction_response import ExtractionResponse from mindee.v2.parsing.inference.job_response import JobResponse +from mindee.v2.product.extraction.extraction_response import ExtractionResponse TypeBaseResponse = TypeVar("TypeBaseResponse", bound=BaseResponse) +def _response_json(response: requests.Response) -> StringDict: + try: + return response.json() + except ValueError as exc: + raise MindeeHTTPUnknownErrorV2( + f"HTTP {response.status_code} response is not valid JSON: {response.text}" + ) from exc + + class Client(ClientMixin): """ Mindee API Client. @@ -30,43 +44,28 @@ class Client(ClientMixin): See: https://docs.mindee.com/ """ - api_key: Optional[str] + api_key: str | None mindee_api: MindeeAPIV2 - def __init__(self, api_key: Optional[str] = None) -> None: + def __init__(self, api_key: str | None = None) -> None: """ Mindee API Client. - :params api_key: Your API key for all endpoints + :param api_key: Your API key for all endpoints """ self.api_key = api_key self.mindee_api = MindeeAPIV2(api_key) - def enqueue_inference( - self, - input_source: Union[LocalInputSource, URLInputSource], - params: BaseParameters, - disable_redundant_warnings: bool = False, - ) -> JobResponse: - """[Deprecated] Use `enqueue` instead.""" - if not disable_redundant_warnings: - warnings.warn( - "enqueue_inference is deprecated; use enqueue instead", - DeprecationWarning, - stacklevel=2, - ) - return self.enqueue(input_source, params) - def enqueue( self, - input_source: Union[LocalInputSource, URLInputSource], + input_source: LocalInputSource | URLInputSource, params: BaseParameters, ) -> JobResponse: """ Enqueues a document to a given model. - :params input_source: The document/source file to use. Can be local or remote. - :params params: Parameters to set when sending a file. + :param input_source: The document/source file to use. Can be local or remote. + :param params: Parameters to set when sending a file. :return: A valid inference response. """ @@ -74,7 +73,7 @@ def enqueue( response = self.mindee_api.req_post_inference_enqueue( input_source=input_source, params=params, slug=params.get_enqueue_slug() ) - dict_response = response.json() + dict_response = _response_json(response) if not is_valid_post_response(response): handle_error_v2(dict_response) @@ -86,15 +85,15 @@ def get_job(self, job_id: str) -> JobResponse: Can be used for polling. - :params job_id: UUID of the job to retrieve. + :param job_id: UUID of the job to retrieve. :return: A job response. """ logger.debug("Fetching job: %s", job_id) response = self.mindee_api.req_get_job(job_id) + dict_response = _response_json(response) if not is_valid_get_response(response): - handle_error_v2(response.json()) - dict_response = response.json() + handle_error_v2(dict_response) return JobResponse(dict_response) def get_inference( @@ -106,7 +105,7 @@ def get_inference( def get_result( self, - response_type: Type[TypeBaseResponse], + response_type: type[TypeBaseResponse], inference_id: str, ) -> TypeBaseResponse: """ @@ -114,8 +113,8 @@ def get_result( The inference will only be available after it has finished processing. - :params inference_id: UUID of the inference to retrieve. - :params response_type: Class of the product to instantiate. + :param inference_id: UUID of the inference to retrieve. + :param response_type: Class of the product to instantiate. :return: An inference response. """ logger.debug("Fetching result: %s", inference_id) @@ -123,23 +122,23 @@ def get_result( response = self.mindee_api.req_get_inference( inference_id, response_type.get_result_slug() ) + dict_response = _response_json(response) if not is_valid_get_response(response): - handle_error_v2(response.json()) - dict_response = response.json() + handle_error_v2(dict_response) return response_type(dict_response) def enqueue_and_get_result( self, - response_type: Type[TypeBaseResponse], - input_source: Union[LocalInputSource, URLInputSource], + response_type: type[TypeBaseResponse], + input_source: LocalInputSource | URLInputSource, params: BaseParameters, ) -> TypeBaseResponse: """ Enqueues to an asynchronous endpoint and automatically polls for a response. - :params input_source: The document/source file to use. Can be local or remote. - :params params: Parameters to set when sending a file. - :params response_type: The product class to use for the response object. + :param input_source: The document/source file to use. Can be local or remote. + :param params: Parameters to set when sending a file. + :param response_type: The product class to use for the response object. :return: A valid inference response. """ @@ -150,7 +149,7 @@ def enqueue_and_get_result( params.polling_options.delay_sec, params.polling_options.max_retries, ) - enqueue_response = self.enqueue_inference(input_source, params, True) + enqueue_response = self.enqueue(input_source, params) logger.debug( "Successfully enqueued document with job ID: %s", enqueue_response.job.id ) diff --git a/mindee/v2/client_options/base_parameters.py b/mindee/v2/client_options/base_parameters.py index 45ce3162..8930142a 100644 --- a/mindee/v2/client_options/base_parameters.py +++ b/mindee/v2/client_options/base_parameters.py @@ -1,6 +1,5 @@ from abc import ABC from dataclasses import dataclass, field -from typing import Dict, Optional, List, Union from mindee.client_options.polling_options import PollingOptions @@ -11,11 +10,11 @@ class BaseParameters(ABC): model_id: str """ID of the model, required.""" - alias: Optional[str] = None + alias: str | None = None """Use an alias to link the file to your own DB. If empty, no alias will be used.""" - webhook_ids: Optional[List[str]] = None + webhook_ids: list[str] | None = None """IDs of webhooks to propagate the API response to.""" - polling_options: Optional[PollingOptions] = None + polling_options: PollingOptions | None = None """Options for polling. Set only if having timeout issues.""" close_file: bool = True """Whether to close the file after product.""" @@ -23,13 +22,13 @@ class BaseParameters(ABC): _slug: str = field(init=False) """Slug of the endpoint.""" - def get_form_data(self) -> Dict[str, Union[str, List[str]]]: + def get_form_data(self) -> dict[str, str | list[str]]: """ Return the parameters as a config dictionary. :return: A dict of parameters. """ - data: Dict[str, Union[str, List[str]]] = { + data: dict[str, str | list[str]] = { "model_id": self.model_id, } if self.alias is not None: diff --git a/mindee/v2/commands/cli_parser.py b/mindee/v2/commands/cli_parser.py index 550a8723..ec2aa751 100644 --- a/mindee/v2/commands/cli_parser.py +++ b/mindee/v2/commands/cli_parser.py @@ -1,20 +1,18 @@ from argparse import ArgumentParser, Namespace from dataclasses import dataclass -from typing import Optional, Type, Union from mindee import ( - ExtractionResponse, - CropResponse, - SplitResponse, - ClassificationResponse, - ExtractionParameters, ClassificationParameters, + ClassificationResponse, CropParameters, + CropResponse, + ExtractionParameters, + ExtractionResponse, SplitParameters, + SplitResponse, ) from mindee.input import PathInput, URLInputSource from mindee.v2.client import Client - from mindee.v2.client_options.base_parameters import BaseParameters from mindee.v2.parsing.inference.base_response import BaseResponse @@ -23,8 +21,8 @@ class ProductConfig: """Configuration for a command.""" - response_class: Type[BaseResponse] - params_class: Type[BaseParameters] + response_class: type[BaseResponse] + params_class: type[BaseParameters] PRODUCTS = { @@ -83,14 +81,14 @@ class MindeeParser: """Stores attributes relating to parsing.""" client: Client """Mindee client""" - input_source: Union[PathInput, URLInputSource] + input_source: PathInput | URLInputSource """Document to be parsed.""" def __init__( self, - parser: Optional[MindeeArgumentParser] = None, - parsed_args: Optional[Namespace] = None, - client: Optional[Client] = None, + parser: MindeeArgumentParser | None = None, + parsed_args: Namespace | None = None, + client: Client | None = None, ) -> None: self.parser = ( parser if parser else MindeeArgumentParser(description="Mindee_API") @@ -130,7 +128,7 @@ def _set_args(self) -> Namespace: parsed_args = self.parser.parse_args() return parsed_args - def _get_input_source(self) -> Union[PathInput, URLInputSource]: + def _get_input_source(self) -> PathInput | URLInputSource: """Loads an input document.""" if self.parsed_args.path.lower().startswith("http"): diff --git a/mindee/v2/error/mindee_http_error_v2.py b/mindee/v2/error/mindee_http_error_v2.py index a1b5c9e8..4bc97c0f 100644 --- a/mindee/v2/error/mindee_http_error_v2.py +++ b/mindee/v2/error/mindee_http_error_v2.py @@ -1,5 +1,4 @@ import json -from typing import List, Optional from mindee.parsing.common import StringDict from mindee.v2.parsing import ErrorItem, ErrorResponse @@ -12,13 +11,13 @@ def __init__(self, response: ErrorResponse) -> None: """ Base exception for HTTP calls. - :params response: + :param response: """ self.status = response.status self.title = response.title self.code = response.code self.detail = response.detail - self.errors: List[ErrorItem] = response.errors + self.errors: list[ErrorItem] = response.errors super().__init__( f"HTTP {self.status} - {self.title} :: {self.code} - {self.detail}" ) @@ -27,7 +26,7 @@ def __init__(self, response: ErrorResponse) -> None: class MindeeHTTPUnknownErrorV2(MindeeHTTPErrorV2): """HTTP error with unknown status code.""" - def __init__(self, detail: Optional[str]) -> None: + def __init__(self, detail: str | None) -> None: super().__init__( ErrorResponse( { diff --git a/mindee/v2/file_operations/__init__.py b/mindee/v2/file_operations/__init__.py index d9065e40..4be256d3 100644 --- a/mindee/v2/file_operations/__init__.py +++ b/mindee/v2/file_operations/__init__.py @@ -4,4 +4,4 @@ ) from mindee.v2.file_operations.split import extract_splits -__all__ = ["extract_crops", "extract_splits", "extract_crops", "extract_single_crop"] +__all__ = ["extract_crops", "extract_crops", "extract_single_crop", "extract_splits"] diff --git a/mindee/v2/file_operations/crop.py b/mindee/v2/file_operations/crop.py index cbcda639..67657e00 100644 --- a/mindee/v2/file_operations/crop.py +++ b/mindee/v2/file_operations/crop.py @@ -1,12 +1,10 @@ -from typing import List, Union - from mindee.error import MindeeError from mindee.geometry import Point, Polygon from mindee.image.extracted_image import ExtractedImage from mindee.image.image_extractor import extract_multiple_images_from_source from mindee.input.local_input_source import LocalInputSource -from mindee.v2.parsing.inference.field import FieldLocation from mindee.v2.file_operations.crop_files import CropFiles +from mindee.v2.parsing.inference.field import FieldLocation from mindee.v2.product.crop.crop_box import CropBox @@ -16,30 +14,30 @@ def extract_single_crop( """ Extracts a single crop as complete PDFs from the document. - :params input_source: Local Input Source to extract sub-receipts from. - :params crop: Crop to extract. + :param input_source: Local Input Source to extract sub-receipts from. + :param crop: Crop to extract. :return: ExtractedImage. """ - polygons: List[Union[Polygon, List[Point]]] = [crop.polygon] + polygons: list[Polygon | list[Point]] = [crop.polygon] return extract_multiple_images_from_source(input_source, crop.page, polygons)[0] -def extract_crops(input_source: LocalInputSource, crops: List[CropBox]) -> CropFiles: +def extract_crops(input_source: LocalInputSource, crops: list[CropBox]) -> CropFiles: """ Extracts individual receipts from multi-receipts documents. - :params input_source: Local Input Source to extract sub-receipts from. - :params crops: List of crops. + :param input_source: Local Input Source to extract sub-receipts from. + :param crops: List of crops. :return: Individual extracted receipts as an array of ExtractedImage. """ - images: List[ExtractedImage] = [] + images: list[ExtractedImage] = [] if not crops: raise MindeeError("No possible candidates found for Crop extraction.") - polygons: List[List[Union[Polygon, List[Point]]]] = [ + polygons: list[list[Polygon | list[Point]]] = [ [] for _ in range(input_source.page_count) ] - for i, crop in enumerate(crops): + for crop in crops: polygons[crop.location.page].append(crop.location.polygon) for i, polygon in enumerate(polygons): images.extend( diff --git a/mindee/v2/file_operations/crop_files.py b/mindee/v2/file_operations/crop_files.py index d658ddc6..4bb9f341 100644 --- a/mindee/v2/file_operations/crop_files.py +++ b/mindee/v2/file_operations/crop_files.py @@ -1,18 +1,17 @@ from pathlib import Path -from typing import List, Union from mindee.image.extracted_image import ExtractedImage -class CropFiles(List[ExtractedImage]): +class CropFiles(list[ExtractedImage]): """Crop files.""" - def save_all_to_disk(self, path: Union[Path, str], prefix: str = "crop"): + def save_all_to_disk(self, path: Path | str, prefix: str = "crop"): """ Save all extracted crops to disk. - :params path: Path to save the extracted splits to. - :params prefix: Prefix to add to the filename, defaults to 'crop'. + :param path: Path to save the extracted splits to. + :param prefix: Prefix to add to the filename, defaults to 'crop'. """ if isinstance(path, str): path = Path(path) diff --git a/mindee/v2/file_operations/split.py b/mindee/v2/file_operations/split.py index 4f6ef31f..f41459cf 100644 --- a/mindee/v2/file_operations/split.py +++ b/mindee/v2/file_operations/split.py @@ -1,20 +1,18 @@ -from typing import List, Union - from mindee.error import MindeeError +from mindee.input.local_input_source import LocalInputSource from mindee.pdf.extracted_pdf import ExtractedPDF from mindee.pdf.pdf_extractor import PDFExtractor -from mindee.input.local_input_source import LocalInputSource from mindee.v2.file_operations.split_files import SplitFiles def extract_single_split( - input_source: LocalInputSource, split: List[int] + input_source: LocalInputSource, split: list[int] ) -> ExtractedPDF: """ Extracts a single split as a complete PDF from the document. - :params input_source: Input source to split. - :params split: List of pages to keep. + :param input_source: Input source to split. + :param split: List of pages to keep. :return: Extracted PDF """ return extract_splits(input_source, [split])[0] @@ -22,13 +20,13 @@ def extract_single_split( def extract_splits( input_source: LocalInputSource, - splits: Union[List[List[int]]], + splits: list[list[int]], ) -> SplitFiles: """ Extracts splits as complete PDFs from the document. - :params input_source: Input source to split. - :params splits: List of sub-lists of pages to keep. + :param input_source: Input source to split. + :param splits: List of sub-lists of pages to keep. :return: A list of extracted invoices. """ pdf_extractor = PDFExtractor(input_source) diff --git a/mindee/v2/file_operations/split_files.py b/mindee/v2/file_operations/split_files.py index 29189671..8c23057b 100644 --- a/mindee/v2/file_operations/split_files.py +++ b/mindee/v2/file_operations/split_files.py @@ -1,18 +1,17 @@ from pathlib import Path -from typing import List, Union from mindee.pdf.extracted_pdf import ExtractedPDF -class SplitFiles(List[ExtractedPDF]): +class SplitFiles(list[ExtractedPDF]): """Split files.""" - def save_all_to_disk(self, path: Union[str, Path], prefix: str = "split"): + def save_all_to_disk(self, path: str | Path, prefix: str = "split"): """ Save all extracted splits to disk. - :params path: Path to save the extracted splits to. - :params prefix: Prefix to add to the filename, defaults to 'split'. + :param path: Path to save the extracted splits to. + :param prefix: Prefix to add to the filename, defaults to 'split'. """ if isinstance(path, str): path = Path(path) diff --git a/mindee/v2/mindee_http/mindee_api_v2.py b/mindee/v2/mindee_http/mindee_api_v2.py index b8a6d76b..f0805249 100644 --- a/mindee/v2/mindee_http/mindee_api_v2.py +++ b/mindee/v2/mindee_http/mindee_api_v2.py @@ -1,15 +1,14 @@ import os -from typing import Dict, Optional, Union import requests -from mindee.v2.error.mindee_api_v2_error import MindeeAPIV2Error -from mindee.v2.client_options.base_parameters import BaseParameters from mindee.input.local_input_source import LocalInputSource from mindee.input.url_input_source import URLInputSource from mindee.logger import logger -from mindee.v1.mindee_http.base_settings import USER_AGENT from mindee.mindee_http.settings_mixin import SettingsMixin +from mindee.v1.mindee_http.base_settings import USER_AGENT +from mindee.v2.client_options.base_parameters import BaseParameters +from mindee.v2.error.mindee_api_v2_error import MindeeAPIV2Error API_KEY_V2_ENV_NAME = "MINDEE_V2_API_KEY" API_KEY_V2_DEFAULT = "" @@ -26,12 +25,12 @@ class MindeeAPIV2(SettingsMixin): url_root: str """Root of the URL to use for polling.""" - api_key: Optional[str] + api_key: str | None """API Key for the client.""" def __init__( self, - api_key: Optional[str], + api_key: str | None, ): self.api_key = ( api_key @@ -43,17 +42,15 @@ def __init__( self.set_from_env() if not self.api_key: raise MindeeAPIV2Error( - ( - f"Missing API key," - " check your Client configuration.\n" - "You can set this using the " - f"'{API_KEY_V2_ENV_NAME}' environment variable." - ) + f"Missing API key," + " check your Client configuration.\n" + "You can set this using the " + f"'{API_KEY_V2_ENV_NAME}' environment variable." ) self.url_root = f"{self.base_url.rstrip('/')}" @property - def base_headers(self) -> Dict[str, str]: + def base_headers(self) -> dict[str, str]: """Base headers to send with all API requests.""" return { "Authorization": self.api_key or "", @@ -74,16 +71,16 @@ def set_from_env(self) -> None: def req_post_inference_enqueue( self, - input_source: Union[LocalInputSource, URLInputSource], + input_source: LocalInputSource | URLInputSource, params: BaseParameters, slug: str, ) -> requests.Response: """ Make an asynchronous request to POST a document for prediction on the V2 API. - :params input_source: Input object. - :params params: Options for the enqueueing of the document. - :params slug: Slug to use for the enqueueing, defaults to 'inferences'. + :param input_source: Input object. + :param params: Options for the enqueueing of the document. + :param slug: Slug to use for the enqueueing, defaults to 'inferences'. :return: requests response. """ data = params.get_form_data() @@ -114,7 +111,7 @@ def req_get_job(self, job_id: str) -> requests.Response: """ Sends a request matching a given queue_id. Returns either a Job or a Document. - :params job_id: Job ID, returned by the enqueue request. + :param job_id: Job ID, returned by the enqueue request. """ return requests.get( f"{self.url_root}/jobs/{job_id}", @@ -127,8 +124,8 @@ def req_get_inference(self, inference_id: str, slug: str) -> requests.Response: """ Sends a request matching a given queue_id. Returns either a Job or a Document. - :params inference_id: Inference ID, returned by the job request. - :params slug: Slug of the inference, defaults to nothing. + :param inference_id: Inference ID, returned by the job request. + :param slug: Slug of the inference, defaults to nothing. """ url = f"{self.url_root}/{slug}/{inference_id}" diff --git a/mindee/v2/mindee_http/response_validation_v2.py b/mindee/v2/mindee_http/response_validation_v2.py index b89ce566..f76d1407 100644 --- a/mindee/v2/mindee_http/response_validation_v2.py +++ b/mindee/v2/mindee_http/response_validation_v2.py @@ -9,7 +9,7 @@ def is_valid_post_response(response: requests.Response) -> bool: """ Checks if the POST response is valid and of the expected format. - :params response: HTTP response object. + :param response: HTTP response object. :return: True if the response is valid. """ if not is_valid_sync_response(response): @@ -17,25 +17,17 @@ def is_valid_post_response(response: requests.Response) -> bool: response_json = json.loads(response.content) if "job" not in response_json: return False - if ( - "job" in response_json - and "error" in response_json["job"] - and response_json["job"]["error"] is not None - ): - return False - return True + return "job" in response_json and not response_json["job"].get("error") def is_valid_get_response(response: requests.Response) -> bool: """ Checks if the GET response is valid and of the expected format. - :params response: HTTP response object. + :param response: HTTP response object. :return: True if the response is valid. """ if not is_valid_sync_response(response): return False response_json = json.loads(response.content) - if "inference" not in response_json and "job" not in response_json: - return False - return True + return "inference" in response_json or "job" in response_json diff --git a/mindee/v2/parsing/__init__.py b/mindee/v2/parsing/__init__.py index 12129a3e..bc8f7eae 100644 --- a/mindee/v2/parsing/__init__.py +++ b/mindee/v2/parsing/__init__.py @@ -2,24 +2,24 @@ from mindee.v2.parsing.inference.base_response import BaseResponse from mindee.v2.parsing.inference.error_item import ErrorItem from mindee.v2.parsing.inference.error_response import ErrorResponse -from mindee.v2.product.extraction.extraction_inference import ExtractionInference from mindee.v2.parsing.inference.inference_active_options import InferenceActiveOptions from mindee.v2.parsing.inference.inference_file import InferenceFile from mindee.v2.parsing.inference.inference_model import InferenceModel +from mindee.v2.parsing.inference.job_response import JobResponse +from mindee.v2.product.extraction.extraction_inference import ExtractionInference from mindee.v2.product.extraction.extraction_response import ExtractionResponse from mindee.v2.product.extraction.extraction_result import ExtractionResult -from mindee.v2.parsing.inference.job_response import JobResponse __all__ = [ "BaseInference", "BaseResponse", + "ErrorItem", + "ErrorResponse", "ExtractionInference", + "ExtractionResponse", + "ExtractionResult", "InferenceActiveOptions", "InferenceFile", "InferenceModel", - "ExtractionResponse", - "ExtractionResult", "JobResponse", - "ErrorResponse", - "ErrorItem", ] diff --git a/mindee/v2/parsing/inference/base_response.py b/mindee/v2/parsing/inference/base_response.py index 5baf73d8..865bab55 100644 --- a/mindee/v2/parsing/inference/base_response.py +++ b/mindee/v2/parsing/inference/base_response.py @@ -1,7 +1,7 @@ from abc import ABC -from mindee.v2.parsing.inference.base_inference import BaseInference from mindee.parsing.common.common_response import CommonResponse +from mindee.v2.parsing.inference.base_inference import BaseInference class BaseResponse(ABC, CommonResponse): diff --git a/mindee/v2/parsing/inference/error_item.py b/mindee/v2/parsing/inference/error_item.py index 78d9e7cf..50ec5bb1 100644 --- a/mindee/v2/parsing/inference/error_item.py +++ b/mindee/v2/parsing/inference/error_item.py @@ -1,12 +1,10 @@ -from typing import Optional - from mindee.parsing.common import StringDict class ErrorItem: """Explicit details on a problem.""" - pointer: Optional[str] + pointer: str | None """A JSON Pointer to the location of the body property.""" detail: str """Explicit information on the issue.""" diff --git a/mindee/v2/parsing/inference/error_response.py b/mindee/v2/parsing/inference/error_response.py index e9673175..9b27fb8a 100644 --- a/mindee/v2/parsing/inference/error_response.py +++ b/mindee/v2/parsing/inference/error_response.py @@ -1,5 +1,3 @@ -from typing import List - from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.error_item import ErrorItem @@ -15,7 +13,7 @@ class ErrorResponse: """A short, human-readable summary of the problem.""" code: str """A machine-readable code specific to the occurrence of the problem.""" - errors: List[ErrorItem] + errors: list[ErrorItem] """A list of explicit error details.""" def __init__(self, raw_response: StringDict): diff --git a/mindee/v2/parsing/inference/field/__init__.py b/mindee/v2/parsing/inference/field/__init__.py index 0975d6d4..c33237f4 100644 --- a/mindee/v2/parsing/inference/field/__init__.py +++ b/mindee/v2/parsing/inference/field/__init__.py @@ -10,8 +10,8 @@ "BaseField", "FieldConfidence", "FieldLocation", + "InferenceFields", "ListField", "ObjectField", "SimpleField", - "InferenceFields", ] diff --git a/mindee/v2/parsing/inference/field/base_field.py b/mindee/v2/parsing/inference/field/base_field.py index d7cea841..f79d06d2 100644 --- a/mindee/v2/parsing/inference/field/base_field.py +++ b/mindee/v2/parsing/inference/field/base_field.py @@ -1,5 +1,3 @@ -from typing import List, Optional - from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.field.dynamic_field import DynamicField, FieldType from mindee.v2.parsing.inference.field.field_confidence import FieldConfidence @@ -9,8 +7,8 @@ class BaseField(DynamicField): """Field with base information.""" - locations: List[FieldLocation] - confidence: Optional[FieldConfidence] + locations: list[FieldLocation] + confidence: FieldConfidence | None def __init__( self, field_type: FieldType, raw_response: StringDict, indent_level: int = 0 diff --git a/mindee/v2/parsing/inference/field/dynamic_field.py b/mindee/v2/parsing/inference/field/dynamic_field.py index 58aba6b1..57b9fbe5 100644 --- a/mindee/v2/parsing/inference/field/dynamic_field.py +++ b/mindee/v2/parsing/inference/field/dynamic_field.py @@ -2,12 +2,12 @@ from importlib import import_module from typing import TYPE_CHECKING, Union -from mindee.v2.error.mindee_api_v2_error import MindeeAPIV2Error from mindee.parsing.common import StringDict +from mindee.v2.error.mindee_api_v2_error import MindeeAPIV2Error if TYPE_CHECKING: - from mindee.v2.parsing.inference.field.object_field import ObjectField from mindee.v2.parsing.inference.field.list_field import ListField + from mindee.v2.parsing.inference.field.object_field import ObjectField from mindee.v2.parsing.inference.field.simple_field import SimpleField diff --git a/mindee/v2/parsing/inference/field/field_location.py b/mindee/v2/parsing/inference/field/field_location.py index acbc490a..8dae3c5f 100644 --- a/mindee/v2/parsing/inference/field/field_location.py +++ b/mindee/v2/parsing/inference/field/field_location.py @@ -14,7 +14,7 @@ def __init__(self, server_response: StringDict) -> None: """ Initialize FieldLocation from the server response. - :params server_response: Raw server response. + :param server_response: Raw server response. """ self.polygon = Polygon(server_response["polygon"]) self.page = int(server_response["page"]) diff --git a/mindee/v2/parsing/inference/field/inference_fields.py b/mindee/v2/parsing/inference/field/inference_fields.py index 652c26f6..d86b790d 100644 --- a/mindee/v2/parsing/inference/field/inference_fields.py +++ b/mindee/v2/parsing/inference/field/inference_fields.py @@ -1,5 +1,3 @@ -from typing import Dict - from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.field.dynamic_field import ( FieldType, @@ -8,7 +6,7 @@ ) -class InferenceFields(Dict[str, FieldTypeAlias]): +class InferenceFields(dict[str, FieldTypeAlias]): """Inference fields dict.""" def __init__(self, raw_response: StringDict, indent_level: int = 0) -> None: diff --git a/mindee/v2/parsing/inference/field/list_field.py b/mindee/v2/parsing/inference/field/list_field.py index 6840d5a9..f8c77214 100644 --- a/mindee/v2/parsing/inference/field/list_field.py +++ b/mindee/v2/parsing/inference/field/list_field.py @@ -1,5 +1,3 @@ -from typing import List - from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.field.base_field import BaseField from mindee.v2.parsing.inference.field.dynamic_field import ( @@ -14,7 +12,7 @@ class ListField(BaseField): """List field containing multiple fields.""" - items: List[DynamicField] + items: list[DynamicField] """Items contained in the list.""" def __init__(self, raw_response: StringDict, indent_level: int = 0): @@ -25,7 +23,7 @@ def __init__(self, raw_response: StringDict, indent_level: int = 0): self.items.append(get_field_type(item)) @property - def simple_items(self) -> List[SimpleField]: + def simple_items(self) -> list[SimpleField]: """List of items as ``SimpleField``.""" simple_items = [] for item in self.items: @@ -36,7 +34,7 @@ def simple_items(self) -> List[SimpleField]: return simple_items @property - def object_items(self) -> List[ObjectField]: + def object_items(self) -> list[ObjectField]: """List of items as ``ObjectField``.""" object_items = [] for item in self.items: diff --git a/mindee/v2/parsing/inference/field/object_field.py b/mindee/v2/parsing/inference/field/object_field.py index 9f201fbd..45524d4d 100644 --- a/mindee/v2/parsing/inference/field/object_field.py +++ b/mindee/v2/parsing/inference/field/object_field.py @@ -1,4 +1,5 @@ -from typing import TYPE_CHECKING, Dict, cast +from typing import TYPE_CHECKING, cast + from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.field.base_field import BaseField from mindee.v2.parsing.inference.field.dynamic_field import FieldType @@ -43,7 +44,7 @@ def multi_str(self) -> str: return out_str @property - def simple_fields(self) -> Dict[str, "SimpleField"]: + def simple_fields(self) -> dict[str, "SimpleField"]: """ Extract and return all SimpleField fields from the `fields` attribute. @@ -56,7 +57,7 @@ def simple_fields(self) -> Dict[str, "SimpleField"]: return simple_fields @property - def list_fields(self) -> Dict[str, "ListField"]: + def list_fields(self) -> dict[str, "ListField"]: """ Retrieves all ListField fields from the `fields` attribute. @@ -71,7 +72,7 @@ def list_fields(self) -> Dict[str, "ListField"]: return list_fields @property - def object_fields(self) -> Dict[str, "ObjectField"]: + def object_fields(self) -> dict[str, "ObjectField"]: """ Retrieves all ObjectField fields from the `fields` attribute of the instance. @@ -88,7 +89,7 @@ def get_simple_field(self, field_name: str) -> "SimpleField": """ Retrieves a SimpleField from the provided field name. - :params field_name: The name of the field to retrieve. + :param field_name: The name of the field to retrieve. :type field_name: str :return: The SimpleField object corresponding to the given field name. :raises ValueError: If the specified field is not of type SimpleField. @@ -101,7 +102,7 @@ def get_list_field(self, field_name: str) -> "ListField": """ Retrieves the ``ListField`` for the specified field name. - :params field_name: The name of the field to retrieve. + :param field_name: The name of the field to retrieve. :type field_name: str :return: The corresponding ``ListField`` for the given field name. :raises ValueError: If the field is not of type ``ListField``. @@ -114,7 +115,7 @@ def get_object_field(self, field_name: str) -> "ObjectField": """ Retrieves the `ObjectField` associated with the specified field name. - :params field_name: The name of the field to retrieve. + :param field_name: The name of the field to retrieve. :type field_name: str :return: The `ObjectField` associated with the given field name. :raises ValueError: If the field specified by `field_name` is not an `ObjectField`. diff --git a/mindee/v2/parsing/inference/field/simple_field.py b/mindee/v2/parsing/inference/field/simple_field.py index 0ad97e2a..feed804c 100644 --- a/mindee/v2/parsing/inference/field/simple_field.py +++ b/mindee/v2/parsing/inference/field/simple_field.py @@ -1,5 +1,3 @@ -from typing import Union - from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.field.base_field import BaseField from mindee.v2.parsing.inference.field.dynamic_field import FieldType @@ -8,7 +6,7 @@ class SimpleField(BaseField): """Simple field containing a single value.""" - value: Union[str, float, bool, None] + value: str | float | bool | None def __init__(self, raw_response: StringDict, indent_level: int = 0): super().__init__(FieldType.SIMPLE, raw_response, indent_level) diff --git a/mindee/v2/parsing/inference/job.py b/mindee/v2/parsing/inference/job.py index 606e96f9..e07d8722 100644 --- a/mindee/v2/parsing/inference/job.py +++ b/mindee/v2/parsing/inference/job.py @@ -1,5 +1,4 @@ from datetime import datetime -from typing import List, Optional from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.error_response import ErrorResponse @@ -11,11 +10,11 @@ class Job: id: str """Job ID.""" - error: Optional[ErrorResponse] + error: ErrorResponse | None """Error response if any.""" created_at: datetime """Date and time of the Job creation.""" - completed_at: Optional[datetime] = None + completed_at: datetime | None = None """Date and time of the Job completion. Filled once processing is finished.""" model_id: str """ID of the model.""" @@ -27,9 +26,9 @@ class Job: """Status of the job.""" polling_url: str """URL to poll for the job status.""" - result_url: Optional[str] + result_url: str | None """URL to poll for the job result, redirects to the result if available.""" - webhooks: List[JobWebhook] + webhooks: list[JobWebhook] """ID of webhooks associated with the job.""" def __init__(self, raw_response: StringDict) -> None: diff --git a/mindee/v2/parsing/inference/job_webhook.py b/mindee/v2/parsing/inference/job_webhook.py index f539e60d..f5d02f41 100644 --- a/mindee/v2/parsing/inference/job_webhook.py +++ b/mindee/v2/parsing/inference/job_webhook.py @@ -1,5 +1,4 @@ from datetime import datetime -from typing import Optional from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.error_response import ErrorResponse @@ -10,11 +9,11 @@ class JobWebhook: id: str """JobWebhook ID.""" - created_at: Optional[datetime] + created_at: datetime | None """Created at date.""" status: str """Status of the webhook.""" - error: Optional[ErrorResponse] + error: ErrorResponse | None """Error response, if any.""" def __init__(self, server_response: StringDict) -> None: @@ -28,7 +27,7 @@ def __init__(self, server_response: StringDict) -> None: ) @staticmethod - def parse_date(date_string: Optional[str]) -> Optional[datetime]: + def parse_date(date_string: str | None) -> datetime | None: """Parse the date, if present.""" if not date_string: return None diff --git a/mindee/v2/parsing/inference/rag_metadata.py b/mindee/v2/parsing/inference/rag_metadata.py index 1dd89ebd..a0c88c98 100644 --- a/mindee/v2/parsing/inference/rag_metadata.py +++ b/mindee/v2/parsing/inference/rag_metadata.py @@ -1,12 +1,10 @@ -from typing import Optional - from mindee.parsing.common import StringDict class RAGMetadata: """Metadata about the RAG operation.""" - retrieved_document_id: Optional[str] + retrieved_document_id: str | None def __init__(self, raw_response: StringDict): self.retrieved_document_id = raw_response["retrieved_document_id"] diff --git a/mindee/v2/parsing/inference/raw_text.py b/mindee/v2/parsing/inference/raw_text.py index 61dd6b26..eadb09dd 100644 --- a/mindee/v2/parsing/inference/raw_text.py +++ b/mindee/v2/parsing/inference/raw_text.py @@ -1,5 +1,3 @@ -from typing import List - from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.raw_text_page import RawTextPage @@ -7,7 +5,7 @@ class RawText: """Raw text extracted from the document.""" - pages: List[RawTextPage] + pages: list[RawTextPage] """Pages of raw text content.""" def __init__(self, raw_response: StringDict): diff --git a/mindee/v2/product/__init__.py b/mindee/v2/product/__init__.py index 80ca0d78..bb476ecc 100644 --- a/mindee/v2/product/__init__.py +++ b/mindee/v2/product/__init__.py @@ -1,23 +1,23 @@ -from mindee.v2.product.classification.params.classification_parameters import ( - ClassificationParameters, -) from mindee.v2.product.classification.classification_response import ( ClassificationResponse, ) -from mindee.v2.product.crop.params.crop_parameters import CropParameters +from mindee.v2.product.classification.params.classification_parameters import ( + ClassificationParameters, +) from mindee.v2.product.crop.crop_response import CropResponse -from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters +from mindee.v2.product.crop.params.crop_parameters import CropParameters from mindee.v2.product.ocr.ocr_response import OCRResponse +from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters from mindee.v2.product.split.params.split_parameters import SplitParameters from mindee.v2.product.split.split_response import SplitResponse __all__ = [ "ClassificationParameters", "ClassificationResponse", - "CropResponse", "CropParameters", - "OCRResponse", + "CropResponse", "OCRParameters", - "SplitResponse", + "OCRResponse", "SplitParameters", + "SplitResponse", ] diff --git a/mindee/v2/product/classification/__init__.py b/mindee/v2/product/classification/__init__.py index 7132dc06..161f5951 100644 --- a/mindee/v2/product/classification/__init__.py +++ b/mindee/v2/product/classification/__init__.py @@ -4,13 +4,13 @@ from mindee.v2.product.classification.classification_inference import ( ClassificationInference, ) -from mindee.v2.product.classification.params.classification_parameters import ( - ClassificationParameters, -) from mindee.v2.product.classification.classification_response import ( ClassificationResponse, ) from mindee.v2.product.classification.classification_result import ClassificationResult +from mindee.v2.product.classification.params.classification_parameters import ( + ClassificationParameters, +) __all__ = [ "ClassificationClassifier", diff --git a/mindee/v2/product/classification/classification_classifier.py b/mindee/v2/product/classification/classification_classifier.py index de612181..7edfe975 100644 --- a/mindee/v2/product/classification/classification_classifier.py +++ b/mindee/v2/product/classification/classification_classifier.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.parsing.common import StringDict from mindee.v2.product.extraction.extraction_response import ExtractionResponse @@ -10,7 +8,7 @@ class ClassificationClassifier: document_type: str """The document type, as identified on given classification values.""" - extraction_response: Optional[ExtractionResponse] = None + extraction_response: ExtractionResponse | None = None """The extraction response associated with the classification.""" def __init__(self, server_response: StringDict): diff --git a/mindee/v2/product/crop/__init__.py b/mindee/v2/product/crop/__init__.py index 70cabc23..936494af 100644 --- a/mindee/v2/product/crop/__init__.py +++ b/mindee/v2/product/crop/__init__.py @@ -1,14 +1,14 @@ from mindee.v2.product.crop.crop_box import CropBox from mindee.v2.product.crop.crop_inference import CropInference from mindee.v2.product.crop.crop_item import CropItem -from mindee.v2.product.crop.params.crop_parameters import CropParameters from mindee.v2.product.crop.crop_response import CropResponse from mindee.v2.product.crop.crop_result import CropResult +from mindee.v2.product.crop.params.crop_parameters import CropParameters __all__ = [ "CropBox", - "CropItem", "CropInference", + "CropItem", "CropParameters", "CropResponse", "CropResult", diff --git a/mindee/v2/product/crop/crop_box.py b/mindee/v2/product/crop/crop_box.py index 7407df41..e0332109 100644 --- a/mindee/v2/product/crop/crop_box.py +++ b/mindee/v2/product/crop/crop_box.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.image.extracted_image import ExtractedImage from mindee.image.image_extractor import extract_multiple_images_from_source from mindee.input.local_input_source import LocalInputSource @@ -17,7 +15,7 @@ class CropBox: object_type: str """Type or classification of the detected object.""" - extraction_response: Optional[ExtractionResponse] = None + extraction_response: ExtractionResponse | None = None """The extraction response associated with the crop.""" def __init__(self, server_response: StringDict): @@ -35,7 +33,7 @@ def extract_from_file(self, input_source: LocalInputSource) -> ExtractedImage: """ Apply the split range inference to a file and return a single extracted PDF. - :params input_source: Local file to apply the inference to + :param input_source: Local file to apply the inference to :return: Extracted PDF """ return extract_multiple_images_from_source( diff --git a/mindee/v2/product/crop/crop_response.py b/mindee/v2/product/crop/crop_response.py index 82656e31..29d9873b 100644 --- a/mindee/v2/product/crop/crop_response.py +++ b/mindee/v2/product/crop/crop_response.py @@ -22,7 +22,7 @@ def extract_from_file(self, input_source: LocalInputSource) -> CropFiles: """ Apply the crop inference to a file and return a list of extracted images. - :params input_source: Local file to apply the inference to + :param input_source: Local file to apply the inference to :return: List of extracted PDFs """ return CropFiles( diff --git a/mindee/v2/product/crop/crop_result.py b/mindee/v2/product/crop/crop_result.py index 5701e2da..cd09bb68 100644 --- a/mindee/v2/product/crop/crop_result.py +++ b/mindee/v2/product/crop/crop_result.py @@ -1,5 +1,3 @@ -from typing import List - from mindee.parsing.common import StringDict from mindee.v2.product.crop.crop_item import CropItem @@ -7,7 +5,7 @@ class CropResult: """Crop result info.""" - crops: List[CropItem] + crops: list[CropItem] def __init__(self, raw_response: StringDict) -> None: self.crops = [CropItem(crop) for crop in raw_response["crops"]] diff --git a/mindee/v2/product/extraction/__init__.py b/mindee/v2/product/extraction/__init__.py index dac3f171..5a7f41b2 100644 --- a/mindee/v2/product/extraction/__init__.py +++ b/mindee/v2/product/extraction/__init__.py @@ -1,21 +1,21 @@ from mindee.v2.product.extraction.extraction_inference import ExtractionInference from mindee.v2.product.extraction.extraction_response import ExtractionResponse from mindee.v2.product.extraction.extraction_result import ExtractionResult +from mindee.v2.product.extraction.params.data_schema import DataSchema +from mindee.v2.product.extraction.params.data_schema_field import DataSchemaField +from mindee.v2.product.extraction.params.data_schema_replace import DataSchemaReplace from mindee.v2.product.extraction.params.extraction_parameters import ( ExtractionParameters, ) -from mindee.v2.product.extraction.params.data_schema import DataSchema -from mindee.v2.product.extraction.params.data_schema_replace import DataSchemaReplace -from mindee.v2.product.extraction.params.data_schema_field import DataSchemaField from mindee.v2.product.extraction.params.string_data_class import StringDataClass __all__ = [ + "DataSchema", + "DataSchemaField", + "DataSchemaReplace", "ExtractionInference", "ExtractionParameters", "ExtractionResponse", "ExtractionResult", - "DataSchemaField", - "DataSchema", - "DataSchemaReplace", "StringDataClass", ] diff --git a/mindee/v2/product/extraction/extraction_result.py b/mindee/v2/product/extraction/extraction_result.py index 30c056eb..860416df 100644 --- a/mindee/v2/product/extraction/extraction_result.py +++ b/mindee/v2/product/extraction/extraction_result.py @@ -1,5 +1,3 @@ -from typing import Optional - from mindee.parsing.common import StringDict from mindee.v2.parsing.inference.field import InferenceFields from mindee.v2.parsing.inference.rag_metadata import RAGMetadata @@ -11,9 +9,9 @@ class ExtractionResult: fields: InferenceFields """Fields contained in the inference.""" - raw_text: Optional[RawText] = None + raw_text: RawText | None = None """Potential options retrieved alongside the inference.""" - rag: Optional[RAGMetadata] = None + rag: RAGMetadata | None = None """RAG metadata.""" def __init__(self, raw_response: StringDict) -> None: diff --git a/mindee/v2/product/extraction/params/__init__.py b/mindee/v2/product/extraction/params/__init__.py index 82338447..e50473e8 100644 --- a/mindee/v2/product/extraction/params/__init__.py +++ b/mindee/v2/product/extraction/params/__init__.py @@ -1,15 +1,15 @@ -from mindee.v2.product.extraction.params.data_schema_field import DataSchemaField -from mindee.v2.product.extraction.params.string_data_class import StringDataClass from mindee.v2.product.extraction.params.data_schema import DataSchema +from mindee.v2.product.extraction.params.data_schema_field import DataSchemaField from mindee.v2.product.extraction.params.data_schema_replace import DataSchemaReplace from mindee.v2.product.extraction.params.extraction_parameters import ( ExtractionParameters, ) +from mindee.v2.product.extraction.params.string_data_class import StringDataClass __all__ = [ - "ExtractionParameters", - "DataSchemaField", - "StringDataClass", "DataSchema", + "DataSchemaField", "DataSchemaReplace", + "ExtractionParameters", + "StringDataClass", ] diff --git a/mindee/v2/product/extraction/params/data_schema.py b/mindee/v2/product/extraction/params/data_schema.py index 44633891..5392f49b 100644 --- a/mindee/v2/product/extraction/params/data_schema.py +++ b/mindee/v2/product/extraction/params/data_schema.py @@ -1,6 +1,5 @@ import json from dataclasses import dataclass -from typing import Optional, Union from mindee.v2.product.extraction.params.data_schema_replace import DataSchemaReplace from mindee.v2.product.extraction.params.string_data_class import StringDataClass @@ -10,7 +9,7 @@ class DataSchema(StringDataClass): """Modify the Data Schema.""" - replace: Optional[Union[DataSchemaReplace, dict, str]] = None + replace: DataSchemaReplace | dict | str | None = None """If set, completely replaces the data schema of the model.""" def __post_init__(self) -> None: diff --git a/mindee/v2/product/extraction/params/data_schema_field.py b/mindee/v2/product/extraction/params/data_schema_field.py index 85907d4d..a986354a 100644 --- a/mindee/v2/product/extraction/params/data_schema_field.py +++ b/mindee/v2/product/extraction/params/data_schema_field.py @@ -1,5 +1,4 @@ from dataclasses import dataclass -from typing import List, Optional from mindee.v2.product.extraction.params.string_data_class import StringDataClass @@ -16,16 +15,16 @@ class DataSchemaField(StringDataClass): """Whether this field can contain multiple values.""" type: str """Data type of the field.""" - classification_values: Optional[List[str]] = None + classification_values: list[str] | None = None """Allowed values when type is `classification`. Leave empty for other types.""" - unique_values: Optional[bool] = None + unique_values: bool | None = None """ Whether to remove duplicate values in the array. Only applicable if `is_array` is True. """ - description: Optional[str] = None + description: str | None = None """Detailed description of what this field represents.""" - guidelines: Optional[str] = None + guidelines: str | None = None """Optional extraction guidelines.""" - nested_fields: Optional[dict] = None + nested_fields: dict | None = None """Subfields when type is `nested_object`. Leave empty for other types.""" diff --git a/mindee/v2/product/extraction/params/data_schema_replace.py b/mindee/v2/product/extraction/params/data_schema_replace.py index 4e3a7ccc..74620d0b 100644 --- a/mindee/v2/product/extraction/params/data_schema_replace.py +++ b/mindee/v2/product/extraction/params/data_schema_replace.py @@ -1,5 +1,4 @@ from dataclasses import dataclass -from typing import List, Union from mindee.v2.product.extraction.params.data_schema_field import DataSchemaField from mindee.v2.product.extraction.params.string_data_class import StringDataClass @@ -9,7 +8,7 @@ class DataSchemaReplace(StringDataClass): """The structure to completely replace the data schema of the model.""" - fields: List[Union[DataSchemaField, dict]] + fields: list[DataSchemaField | dict] def __post_init__(self) -> None: if not self.fields: diff --git a/mindee/v2/product/extraction/params/extraction_parameters.py b/mindee/v2/product/extraction/params/extraction_parameters.py index 1700ffde..c71f3ee7 100644 --- a/mindee/v2/product/extraction/params/extraction_parameters.py +++ b/mindee/v2/product/extraction/params/extraction_parameters.py @@ -1,6 +1,5 @@ import json from dataclasses import dataclass -from typing import Dict, List, Optional, Union from mindee.v2.client_options.base_parameters import BaseParameters from mindee.v2.product.extraction.params.data_schema import DataSchema @@ -10,23 +9,23 @@ class ExtractionParameters(BaseParameters): """Inference parameters to set when sending a file.""" - rag: Optional[bool] = None + rag: bool | None = None """Enhance extraction accuracy with Retrieval-Augmented Generation.""" - raw_text: Optional[bool] = None + raw_text: bool | None = None """Extract the full text content from the document as strings, and fill the ``raw_text`` attribute.""" - polygon: Optional[bool] = None + polygon: bool | None = None """Calculate bounding box polygons for all fields, and fill their ``locations`` attribute.""" - confidence: Optional[bool] = None + confidence: bool | None = None """ Boost the precision and accuracy of all extractions. Calculate confidence scores for all fields, and fill their ``confidence`` attribute. """ - text_context: Optional[str] = None + text_context: str | None = None """ Additional text context used by the model during inference. Not recommended, for specific use only. """ - data_schema: Optional[Union[DataSchema, str, dict]] = None + data_schema: DataSchema | str | dict | None = None """ Dynamic changes to the data schema of the model for this inference. Not recommended, for specific use only. @@ -41,7 +40,7 @@ def __post_init__(self): elif isinstance(self.data_schema, dict): self.data_schema = DataSchema(**self.data_schema) - def get_form_data(self) -> Dict[str, Union[str, List[str]]]: + def get_form_data(self) -> dict[str, str | list[str]]: """ Return the parameters as a config dictionary. diff --git a/mindee/v2/product/ocr/__init__.py b/mindee/v2/product/ocr/__init__.py index 821c6954..0b481c3e 100644 --- a/mindee/v2/product/ocr/__init__.py +++ b/mindee/v2/product/ocr/__init__.py @@ -1,9 +1,9 @@ from mindee.v2.product.ocr.ocr_inference import OCRInference from mindee.v2.product.ocr.ocr_page import OCRPage -from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters from mindee.v2.product.ocr.ocr_response import OCRResponse from mindee.v2.product.ocr.ocr_result import OCRResult from mindee.v2.product.ocr.ocr_word import OCRWord +from mindee.v2.product.ocr.params.ocr_parameters import OCRParameters __all__ = [ "OCRInference", diff --git a/mindee/v2/product/ocr/ocr_page.py b/mindee/v2/product/ocr/ocr_page.py index fa0ca010..fa1243a6 100644 --- a/mindee/v2/product/ocr/ocr_page.py +++ b/mindee/v2/product/ocr/ocr_page.py @@ -1,5 +1,3 @@ -from typing import List - from mindee.parsing.common import StringDict from mindee.v2.product.ocr.ocr_word import OCRWord @@ -7,7 +5,7 @@ class OCRPage: """OCR result for a single page.""" - words: List[OCRWord] + words: list[OCRWord] """List of words extracted from the document page.""" content: str """Full text content extracted from the document page.""" diff --git a/mindee/v2/product/ocr/ocr_result.py b/mindee/v2/product/ocr/ocr_result.py index d95a1c24..6d01c60b 100644 --- a/mindee/v2/product/ocr/ocr_result.py +++ b/mindee/v2/product/ocr/ocr_result.py @@ -1,5 +1,3 @@ -from typing import List - from mindee.parsing.common import StringDict from mindee.v2.product.ocr.ocr_page import OCRPage @@ -7,7 +5,7 @@ class OCRResult: """OCR result info.""" - pages: List[OCRPage] + pages: list[OCRPage] """List of OCR results for each page in the document.""" def __init__(self, raw_response: StringDict) -> None: diff --git a/mindee/v2/product/split/__init__.py b/mindee/v2/product/split/__init__.py index 5ab84925..3cb3ca69 100644 --- a/mindee/v2/product/split/__init__.py +++ b/mindee/v2/product/split/__init__.py @@ -1,13 +1,13 @@ -from mindee.v2.product.split.split_inference import SplitInference from mindee.v2.product.split.params.split_parameters import SplitParameters +from mindee.v2.product.split.split_inference import SplitInference +from mindee.v2.product.split.split_range import SplitRange from mindee.v2.product.split.split_response import SplitResponse from mindee.v2.product.split.split_result import SplitResult -from mindee.v2.product.split.split_range import SplitRange __all__ = [ "SplitInference", "SplitParameters", + "SplitRange", "SplitResponse", "SplitResult", - "SplitRange", ] diff --git a/mindee/v2/product/split/split_range.py b/mindee/v2/product/split/split_range.py index 15b702cb..359df0b1 100644 --- a/mindee/v2/product/split/split_range.py +++ b/mindee/v2/product/split/split_range.py @@ -1,16 +1,14 @@ -from typing import List, Optional - -from mindee.v2.product.extraction.extraction_response import ExtractionResponse -from mindee.pdf.extracted_pdf import ExtractedPDF from mindee.input.local_input_source import LocalInputSource from mindee.parsing.common import StringDict +from mindee.pdf.extracted_pdf import ExtractedPDF from mindee.v2.file_operations.split import extract_single_split +from mindee.v2.product.extraction.extraction_response import ExtractionResponse class SplitRange: """Split inference result.""" - page_range: List[int] + page_range: list[int] """ 0-based page indexes, where the first integer indicates the start page and the second integer indicates the end page. @@ -19,7 +17,7 @@ class SplitRange: document_type: str """The document type, as identified on given classification values.""" - extraction_response: Optional[ExtractionResponse] = None + extraction_response: ExtractionResponse | None = None """The extraction response associated with the split.""" def __init__(self, server_response: StringDict): @@ -38,7 +36,7 @@ def extract_from_file(self, input_source: LocalInputSource) -> ExtractedPDF: """ Apply the split range inference to a file and return a single extracted PDF. - :params input_source: Local file to apply the inference to + :param input_source: Local file to apply the inference to :return: Extracted PDF """ return extract_single_split(input_source, self.page_range) diff --git a/mindee/v2/product/split/split_response.py b/mindee/v2/product/split/split_response.py index 7f2f6073..df1822fc 100644 --- a/mindee/v2/product/split/split_response.py +++ b/mindee/v2/product/split/split_response.py @@ -1,7 +1,7 @@ from mindee.input.local_input_source import LocalInputSource from mindee.parsing.common import StringDict -from mindee.v2.parsing.inference.base_response import BaseResponse from mindee.v2.file_operations.split_files import SplitFiles +from mindee.v2.parsing.inference.base_response import BaseResponse from mindee.v2.product.split.split_inference import SplitInference @@ -22,7 +22,7 @@ def extract_from_file(self, input_source: LocalInputSource) -> SplitFiles: """ Apply the split inference to a file and return a list of extracted PDFs. - :params input_source: Local file to apply the inference to + :param input_source: Local file to apply the inference to :return: List of extracted PDFs """ return SplitFiles( diff --git a/mindee/v2/product/split/split_result.py b/mindee/v2/product/split/split_result.py index 04c8a0f6..0737cf11 100644 --- a/mindee/v2/product/split/split_result.py +++ b/mindee/v2/product/split/split_result.py @@ -1,5 +1,3 @@ -from typing import List - from mindee.parsing.common import StringDict from mindee.v2.product.split.split_range import SplitRange @@ -7,7 +5,7 @@ class SplitResult: """Split result info.""" - splits: List[SplitRange] + splits: list[SplitRange] def __init__(self, raw_response: StringDict) -> None: self.splits = [SplitRange(split) for split in raw_response["splits"]] diff --git a/pyproject.toml b/pyproject.toml index 5538115b..842edfee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta" [project] name = "mindee" authors = [ - {name = "Mindee", email = "opensource@mindee.com"}, + { name = "Mindee", email = "opensource@mindee.com" }, ] dynamic = ["version"] description = "Mindee API helper library for Python" @@ -13,25 +13,25 @@ readme = "README.md" license = "MIT" license-files = ["LICENSE"] classifiers = [ - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Operating System :: OS Independent", - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Topic :: Software Development :: Libraries", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Operating System :: OS Independent", + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "Topic :: Software Development :: Libraries", ] requires-python = ">=3.10" dependencies = [ - "pypdfium2>=4.0,<6.0", - "Pillow>=12.2.0", - "pytz>=2026.2", - "requests>=2.34.2", + "pypdfium2>=4.0,<6.0", + "Pillow>=12.2.0", + "pytz>=2026.2", + "requests>=2.34.2", ] [project.urls] @@ -43,25 +43,25 @@ Changelog = "https://github.com/mindee/mindee-api-python/blob/main/CHANGELOG.md" [project.optional-dependencies] lint = [ - "pylint==4.0.5", - "pre-commit~=4.6.0", - "types-pytz>=2026.2.0.20260518", - "types-requests>=2.33.0.20260518", - "pip-audit>=2.10.0", + "pylint==4.0.5", + "pre-commit~=4.6.0", + "types-pytz>=2026.2.0.20260518", + "types-requests>=2.33.0.20260518", + "pip-audit>=2.10.0", ] test = [ - "toml~=0.10.2", - "pytest~=9.0.3", - "pytest-cov~=7.1.0", + "toml~=0.10.2", + "pytest~=9.0.3", + "pytest-cov~=7.1.0", ] docs = [ - "sphinx~=9.1.0", - "sphinx_rtd_theme~=3.1.0", - "sphinx-autodoc-typehints~=3.10.4", + "sphinx~=9.1.0", + "sphinx_rtd_theme~=3.1.0", + "sphinx-autodoc-typehints~=3.10.4", ] build = [ - "build", - "twine", + "build", + "twine", ] [project.scripts] @@ -70,10 +70,10 @@ mindeeV2 = "mindee.v2.cli:main" [tool.setuptools.packages] -find = {} +find = { } [tool.setuptools.dynamic] -version = {attr = "mindee.versions.__version__"} +version = { attr = "mindee.versions.__version__" } [tool.setuptools.package-data] "mindee" = ["py.typed"] @@ -90,7 +90,7 @@ indent-style = "space" skip-magic-trailing-comma = false [tool.ruff.lint] -select = ["E", "F"] +select = ["E", "F", "I", "UP", "B", "SIM", "C4", "RUF", "PT"] ignore = ["E501"] [tool.mypy] @@ -110,13 +110,13 @@ ignore_missing_imports = true [tool.pylic] safe_licenses = [ - "Apache Software License", - "MIT License", - "Mozilla Public License 2.0 (MPL 2.0)", - "BSD License", - "BSD-3-Clause, Apache-2.0, PdfiumThirdParty", - "Historical Permission Notice and Disclaimer (HPND)", - "CMU License (MIT-CMU)", + "Apache Software License", + "MIT License", + "Mozilla Public License 2.0 (MPL 2.0)", + "BSD License", + "BSD-3-Clause, Apache-2.0, PdfiumThirdParty", + "Historical Permission Notice and Disclaimer (HPND)", + "CMU License (MIT-CMU)", ] @@ -125,11 +125,11 @@ addopts = "--pyargs --cov-report term:skip-covered --cov-report term-missing -m python_files = "test*.py" junit_family = "xunit2" markers = [ - "regression: marks tests as regression tests - select with '-m regression'", - "lineitems: debug line items", - "integration: integration tests that send calls to the API - select with '-m integration'", - "v2: Tests specific to version 2 of the API" + "regression: marks tests as regression tests - select with '-m regression'", + "lineitems: debug line items", + "integration: integration tests that send calls to the API - select with '-m integration'", + "v2: Tests specific to version 2 of the API" ] testpaths = [ - "tests", + "tests", ] diff --git a/tests/input/test_apply_page_options.py b/tests/input/test_apply_page_options.py index cc1f6af0..0f1c9550 100644 --- a/tests/input/test_apply_page_options.py +++ b/tests/input/test_apply_page_options.py @@ -4,7 +4,6 @@ import pytest from mindee.error.mindee_error import MindeeError -from mindee.input.page_options import KEEP_ONLY, REMOVE, PageOptions from mindee.input import ( Base64Input, BytesInput, @@ -12,6 +11,7 @@ LocalInputSource, PathInput, ) +from mindee.input.page_options import KEEP_ONLY, REMOVE, PageOptions from tests.utils import FILE_TYPES_DIR, V1_PRODUCT_DATA_DIR @@ -135,7 +135,7 @@ def test_pdf_input_from_file(): def test_pdf_input_from_base64(): - with open(V1_PRODUCT_DATA_DIR / "invoices" / "invoice_10p.txt", "rt") as fp: + with open(V1_PRODUCT_DATA_DIR / "invoices" / "invoice_10p.txt") as fp: input_source = Base64Input(fp.read(), filename="invoice_10p.pdf") assert input_source.is_pdf() is True input_source.process_pdf(behavior=KEEP_ONLY, on_min_pages=2, page_indexes=[0]) @@ -151,12 +151,12 @@ def test_pdf_input_from_bytes(): def test_pdf_blank_check(): + input_source = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") with pytest.raises(MindeeError): - input_source = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") input_source.process_pdf(behavior=KEEP_ONLY, on_min_pages=2, page_indexes=[0]) + input_source = PathInput(FILE_TYPES_DIR / "pdf" / "blank_1.pdf") with pytest.raises(MindeeError): - input_source = PathInput(FILE_TYPES_DIR / "pdf" / "blank_1.pdf") input_source.process_pdf(behavior=KEEP_ONLY, on_min_pages=2, page_indexes=[0]) input_not_blank = PathInput(FILE_TYPES_DIR / "pdf" / "not_blank_image_only.pdf") diff --git a/tests/input/test_fix_pdf.py b/tests/input/test_fix_pdf.py index 3b87d561..5025abcc 100644 --- a/tests/input/test_fix_pdf.py +++ b/tests/input/test_fix_pdf.py @@ -6,8 +6,8 @@ def test_broken_unfixable_pdf(): + input_source = PathInput(FILE_TYPES_DIR / "pdf" / "broken_unfixable.pdf") with pytest.raises(MimeTypeError): - input_source = PathInput(FILE_TYPES_DIR / "pdf" / "broken_unfixable.pdf") input_source.fix_pdf() diff --git a/tests/input/test_inputs.py b/tests/input/test_inputs.py index ece9efa3..ef74bb0d 100644 --- a/tests/input/test_inputs.py +++ b/tests/input/test_inputs.py @@ -28,11 +28,11 @@ def test_pdf_read_contents(): @pytest.mark.parametrize( ("filename", "page_count"), - ( + [ ("multipage_cut-1.pdf", 1), ("multipage_cut-3.pdf", 3), ("multipage.pdf", 12), - ), + ], ) def test_pdf_input_from_path(filename, page_count): input_source = PathInput(FILE_TYPES_DIR / "pdf" / filename) @@ -80,14 +80,14 @@ def test_image_input_from_file(filename, mimetype): @pytest.mark.parametrize(("filename", "mimetype"), TEST_IMAGES) def test_image_input_from_bytes(filename, mimetype): - file_bytes = open(FILE_TYPES_DIR / filename, "rb").read() - input_source = BytesInput(file_bytes, filename=filename) + with open(FILE_TYPES_DIR / filename, "rb") as file_bytes: + input_source = BytesInput(file_bytes.read(), filename=filename) _assert_image(input_source, mimetype) def test_image_input_from_base64(): - base64_input = open(FILE_TYPES_DIR / "receipt.txt", "r").read() - input_source = Base64Input(base64_input, filename="receipt.jpg") + with open(FILE_TYPES_DIR / "receipt.txt") as fp: + input_source = Base64Input(fp.read(), filename="receipt.jpg") _assert_image(input_source, mimetype="image/jpeg") diff --git a/tests/test_geometry.py b/tests/test_geometry.py index 38396e19..a513ca87 100644 --- a/tests/test_geometry.py +++ b/tests/test_geometry.py @@ -1,24 +1,26 @@ import pytest from mindee import geometry +from mindee.error import MindeeGeometryError +from mindee.geometry import Point, Polygon @pytest.fixture def rectangle_a(): """90° rectangle, overlaps polygon_b""" - return [(0.123, 0.53), (0.175, 0.53), (0.175, 0.546), (0.123, 0.546)] + return Polygon([(0.123, 0.53), (0.175, 0.53), (0.175, 0.546), (0.123, 0.546)]) @pytest.fixture def rectangle_b(): """90° rectangle, overlaps polygon_a""" - return [(0.124, 0.535), (0.190, 0.535), (0.190, 0.546), (0.124, 0.546)] + return Polygon([(0.124, 0.535), (0.190, 0.535), (0.190, 0.546), (0.124, 0.546)]) @pytest.fixture def quadrangle_a(): """not 90° rectangle, doesn't overlap any polygons""" - return [(0.205, 0.407), (0.379, 0.407), (0.381, 0.43), (0.207, 0.43)] + return Polygon([(0.205, 0.407), (0.379, 0.407), (0.381, 0.43), (0.207, 0.43)]) def test_bbox(rectangle_a, rectangle_b, quadrangle_a): @@ -108,12 +110,12 @@ def test_get_centroid(rectangle_a): def test_empty_polygon(): empty = geometry.Polygon() - with pytest.raises(ValueError): - empty.is_point_in_y([0.5, 0.5]) - with pytest.raises(ValueError): - empty.is_point_in_x([0.5, 0.5]) - with pytest.raises(ValueError): - empty.centroid + with pytest.raises(MindeeGeometryError): + empty.is_point_in_y(Point(0.5, 0.5)) + with pytest.raises(MindeeGeometryError): + empty.is_point_in_x(Point(0.5, 0.5)) + with pytest.raises(MindeeGeometryError): + _ = empty.centroid def test_bounding_box_several_polygons(rectangle_b, quadrangle_a): diff --git a/tests/utils.py b/tests/utils.py index ec42084c..31226686 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -41,8 +41,8 @@ def dummy_envvars(monkeypatch) -> None: def levenshtein_ratio(ref_str: str, target_str: str) -> float: """ Calculates the Levenshtein ratio between two strings. - :params ref_str: Reference string. - :params target_str: Target String. + :param ref_str: Reference string. + :param target_str: Target String. :return: Ratio between the two strings """ return SequenceMatcher(None, ref_str, target_str).ratio() diff --git a/tests/v1/api/test_async_response.py b/tests/v1/api/test_async_response.py index efd0f6ca..8e357704 100644 --- a/tests/v1/api/test_async_response.py +++ b/tests/v1/api/test_async_response.py @@ -3,9 +3,9 @@ import pytest import requests -from mindee.v1.client import Client from mindee.input.path_input import PathInput from mindee.mindee_http.response_validation import is_valid_async_response +from mindee.v1.client import Client from mindee.v1.parsing.common import RequestStatus from mindee.v1.parsing.common.async_predict_response import AsyncPredictResponse from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 @@ -53,7 +53,8 @@ def dummy_client() -> Client: def test_async_response_post_success(): - response = json.load(open(FILE_PATH_POST_SUCCESS)) + with open(FILE_PATH_POST_SUCCESS) as json_file: + response = json.load(json_file) parsed_response = AsyncPredictResponse(InvoiceSplitterV1, response) fake_response = FakeResponse(response) fake_response.set_ok_status(True) @@ -69,14 +70,16 @@ def test_async_response_post_success(): def test_async_response_post_fail(): - response = json.load(open(FILE_PATH_POST_FAIL)) + with open(FILE_PATH_POST_FAIL) as json_file: + response = json.load(json_file) fake_response = FakeResponse(response) fake_response.set_ok_status(False) assert is_valid_async_response(fake_response) is False def test_async_get_processing(): - response = json.load(open(FILE_PATH_GET_PROCESSING)) + with open(FILE_PATH_GET_PROCESSING) as json_file: + response = json.load(json_file) parsed_response = AsyncPredictResponse(InvoiceSplitterV1, response) fake_response = FakeResponse(response) fake_response.set_ok_status(True) @@ -90,7 +93,8 @@ def test_async_get_processing(): def test_async_response_get_completed(): - response = json.load(open(FILE_PATH_GET_COMPLETED)) + with open(FILE_PATH_GET_COMPLETED) as json_file: + response = json.load(json_file) parsed_response = AsyncPredictResponse(InvoiceSplitterV1, response) fake_response = FakeResponse(response) fake_response.set_ok_status(True) @@ -103,7 +107,8 @@ def test_async_response_get_completed(): def test_async_get_failed_job(): - response = json.load(open(FILE_PATH_GET_FAILED_JOB)) + with open(FILE_PATH_GET_FAILED_JOB) as json_file: + response = json.load(json_file) parsed_response = AsyncPredictResponse(InvoiceSplitterV1, response) fake_response = FakeResponse(response) fake_response.set_ok_status(False) diff --git a/tests/v1/api/test_feedback_response.py b/tests/v1/api/test_feedback_response.py index f638d88b..e9331ace 100644 --- a/tests/v1/api/test_feedback_response.py +++ b/tests/v1/api/test_feedback_response.py @@ -5,9 +5,10 @@ def test_empty_feedback_response(): - response = json.load( - open(V1_PRODUCT_DATA_DIR / "invoices" / "feedback_response" / "empty.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "invoices" / "feedback_response" / "empty.json" + ) as json_file: + response = json.load(json_file) feedback_response = FeedbackResponse(response) assert feedback_response is not None assert feedback_response.feedback["customer_address"] is None diff --git a/tests/v1/api/test_response.py b/tests/v1/api/test_response.py index 2b666fb2..6371e0a0 100644 --- a/tests/v1/api/test_response.py +++ b/tests/v1/api/test_response.py @@ -20,9 +20,10 @@ def test_invoice_receipt_v5(): - response = json.load( - open(V1_PRODUCT_DATA_DIR / "invoices" / "response_v4" / "complete.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "invoices" / "response_v4" / "complete.json" + ) as json_file: + response = json.load(json_file) parsed_response = PredictResponse(InvoiceV4, response) assert isinstance(parsed_response.document.inference, InvoiceV4) for page in parsed_response.document.inference.pages: @@ -31,9 +32,10 @@ def test_invoice_receipt_v5(): def test_response_receipt_v5(): - response = json.load( - open(V1_PRODUCT_DATA_DIR / "expense_receipts" / "response_v5" / "complete.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "expense_receipts" / "response_v5" / "complete.json" + ) as json_file: + response = json.load(json_file) parsed_response = PredictResponse(ReceiptV5, response) assert isinstance(parsed_response.document.inference, ReceiptV5) for page in parsed_response.document.inference.pages: @@ -42,14 +44,13 @@ def test_response_receipt_v5(): def test_response_financial_doc_with_receipt(): - response = json.load( - open( - V1_PRODUCT_DATA_DIR - / "financial_document" - / "response_v1" - / "complete_receipt.json" - ) - ) + with open( + V1_PRODUCT_DATA_DIR + / "financial_document" + / "response_v1" + / "complete_receipt.json" + ) as json_file: + response = json.load(json_file) parsed_response = PredictResponse(FinancialDocumentV1, response) assert isinstance(parsed_response.document.inference, FinancialDocumentV1) assert isinstance( @@ -60,9 +61,10 @@ def test_response_financial_doc_with_receipt(): def test_response_passport_v1(): - response = json.load( - open(V1_PRODUCT_DATA_DIR / "passport" / "response_v1" / "complete.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "passport" / "response_v1" / "complete.json" + ) as json_file: + response = json.load(json_file) parsed_response = PredictResponse(PassportV1, response) assert isinstance(parsed_response.document.inference, PassportV1) assert isinstance(parsed_response.document.inference.prediction, PassportV1Document) @@ -72,9 +74,10 @@ def test_response_passport_v1(): def test_response_fr_idcard_v2(): - response = json.load( - open(V1_PRODUCT_DATA_DIR / "idcard_fr" / "response_v2" / "complete.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "idcard_fr" / "response_v2" / "complete.json" + ) as json_file: + response = json.load(json_file) parsed_response = PredictResponse(IdCardV2, response) assert isinstance(parsed_response.document.inference, IdCardV2) assert isinstance(parsed_response.document.inference.prediction, IdCardV2Document) diff --git a/tests/v1/extraction/test_invoice_splitter_auto_extraction.py b/tests/v1/extraction/test_invoice_splitter_auto_extraction.py index 575cd12f..c66d6255 100644 --- a/tests/v1/extraction/test_invoice_splitter_auto_extraction.py +++ b/tests/v1/extraction/test_invoice_splitter_auto_extraction.py @@ -2,10 +2,10 @@ import pytest -from mindee.v1.client import Client -from mindee.v1.pdf.pdf_extractor import PDFExtractor from mindee.input.path_input import PathInput +from mindee.v1.client import Client from mindee.v1.parsing.common import Document +from mindee.v1.pdf.pdf_extractor import PDFExtractor from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 from tests.utils import V1_PRODUCT_DATA_DIR, levenshtein_ratio @@ -18,7 +18,7 @@ def invoice_splitter_5p_path(): def prepare_invoice_return(rst_file_path: Path, invoice_prediction: Document): - with open(rst_file_path, "r") as rst_file: + with open(rst_file_path) as rst_file: rst_content = rst_file.read() parsing_version = invoice_prediction.inference.product.version parsing_id = invoice_prediction.id diff --git a/tests/v1/extraction/test_multi_receipts_extractor.py b/tests/v1/extraction/test_multi_receipts_extractor.py index e499b970..f1f4650c 100644 --- a/tests/v1/extraction/test_multi_receipts_extractor.py +++ b/tests/v1/extraction/test_multi_receipts_extractor.py @@ -3,8 +3,8 @@ import pytest from PIL import Image -from mindee.v1.pdf.multi_receipts_extractor import extract_receipts from mindee.input.path_input import PathInput +from mindee.v1.pdf.multi_receipts_extractor import extract_receipts from mindee.v1.product.multi_receipts_detector.multi_receipts_detector_v1 import ( MultiReceiptsDetectorV1, ) diff --git a/tests/v1/extraction/test_pdf_extractor.py b/tests/v1/extraction/test_pdf_extractor.py index f93eee38..ce42cd5a 100644 --- a/tests/v1/extraction/test_pdf_extractor.py +++ b/tests/v1/extraction/test_pdf_extractor.py @@ -1,9 +1,9 @@ import pytest -from mindee.v1.client import Client -from mindee.v1.pdf.pdf_extractor import PDFExtractor from mindee.input.local_response import LocalResponse from mindee.input.path_input import PathInput +from mindee.v1.client import Client +from mindee.v1.pdf.pdf_extractor import PDFExtractor from mindee.v1.product.invoice_splitter.invoice_splitter_v1 import InvoiceSplitterV1 from mindee.v1.product.invoice_splitter.invoice_splitter_v1_document import ( InvoiceSplitterV1Document, diff --git a/tests/v1/extras/test_full_text_ocr.py b/tests/v1/extras/test_full_text_ocr.py index e2afcb72..17bd9db2 100644 --- a/tests/v1/extras/test_full_text_ocr.py +++ b/tests/v1/extras/test_full_text_ocr.py @@ -19,7 +19,7 @@ @pytest.fixture def load_document(): - with open(V1_EXTRAS_DIR / "full_text_ocr/complete.json", "r") as file: + with open(V1_EXTRAS_DIR / "full_text_ocr/complete.json") as file: prediction_data = json.load(file) return AsyncPredictResponse(InternationalIdV2, prediction_data).document diff --git a/tests/v1/input/test_local_response.py b/tests/v1/input/test_local_response.py index 2a7b8c0c..7227d57d 100644 --- a/tests/v1/input/test_local_response.py +++ b/tests/v1/input/test_local_response.py @@ -35,7 +35,7 @@ def test_valid_path_local_response(file_path): def test_valid_bytes_local_response(file_path): - with open(file_path, "r") as f: + with open(file_path) as f: str_response = f.read().replace("\r", "").replace("\n", "") file_bytes = str_response.encode("utf-8") local_response = LocalResponse(file_bytes) diff --git a/tests/v1/input/test_url_input_source_integration.py b/tests/v1/input/test_url_input_source_integration.py index 65f812a8..ae6fce62 100644 --- a/tests/v1/input/test_url_input_source_integration.py +++ b/tests/v1/input/test_url_input_source_integration.py @@ -57,8 +57,6 @@ def test_save_file_with_filename(client, reference_file_path, output_file_path): @pytest.fixture(autouse=True) -def cleanup(request): - def remove_test_files(): - cleanup_output_files(["invoice_5p.pdf", "customFileName.pdf"]) - - request.addfinalizer(remove_test_files) +def cleanup(): + yield + cleanup_output_files(["invoice_5p.pdf", "customFileName.pdf"]) diff --git a/tests/v1/mindee_http/test_error.py b/tests/v1/mindee_http/test_error.py index a78c3895..e9d12805 100644 --- a/tests/v1/mindee_http/test_error.py +++ b/tests/v1/mindee_http/test_error.py @@ -2,15 +2,15 @@ import pytest -from mindee.v1.client import Client -from mindee.v1 import product from mindee.error.mindee_http_error import ( MindeeHTTPClientError, MindeeHTTPServerError, handle_error, ) from mindee.input.path_input import PathInput -from tests.utils import FILE_TYPES_DIR, clear_envvars, dummy_envvars, V1_ERROR_DATA_DIR +from mindee.v1 import product +from mindee.v1.client import Client +from tests.utils import FILE_TYPES_DIR, V1_ERROR_DATA_DIR, clear_envvars, dummy_envvars @pytest.fixture @@ -53,21 +53,21 @@ def test_http_enqueue_and_parse_client_error( def test_http_400_error(): - error_ref = open(V1_ERROR_DATA_DIR / "error_400_no_details.json") - error_obj = json.load(error_ref) + with open(V1_ERROR_DATA_DIR / "error_400_no_details.json") as error_ref: + error_obj = json.load(error_ref) error_obj["status_code"] = 400 error_400 = handle_error("dummy-url", error_obj) with pytest.raises(MindeeHTTPClientError): - assert error_400.status_code == 400 - assert error_400.api_code == "SomeCode" - assert error_400.api_message == "Some scary message here" - assert error_400.api_details is None raise error_400 + assert error_400.status_code == 400 + assert error_400.api_code == "SomeCode" + assert error_400.api_message == "Some scary message here" + assert error_400.api_details is None def test_http_401_error(): - error_ref = open(V1_ERROR_DATA_DIR / "error_401_invalid_token.json") - error_obj = json.load(error_ref) + with open(V1_ERROR_DATA_DIR / "error_401_invalid_token.json") as error_ref: + error_obj = json.load(error_ref) error_obj["status_code"] = 401 error_401 = handle_error("dummy-url", error_obj) with pytest.raises(MindeeHTTPClientError): @@ -79,8 +79,8 @@ def test_http_401_error(): def test_http_429_error(): - error_ref = open(V1_ERROR_DATA_DIR / "error_429_too_many_requests.json") - error_obj = json.load(error_ref) + with open(V1_ERROR_DATA_DIR / "error_429_too_many_requests.json") as error_ref: + error_obj = json.load(error_ref) error_obj["status_code"] = 429 error_429 = handle_error("dummy-url", error_obj) with pytest.raises(MindeeHTTPClientError): @@ -92,8 +92,8 @@ def test_http_429_error(): def test_http_500_error(): - error_ref = open(V1_ERROR_DATA_DIR / "error_500_inference_fail.json") - error_obj = json.load(error_ref) + with open(V1_ERROR_DATA_DIR / "error_500_inference_fail.json") as error_ref: + error_obj = json.load(error_ref) error_obj["status_code"] = 500 error_500 = handle_error("dummy-url", error_obj) with pytest.raises(MindeeHTTPServerError): @@ -105,7 +105,8 @@ def test_http_500_error(): def test_http_500_html_error(): - error_ref_contents = open(V1_ERROR_DATA_DIR / "error_50x.html").read() + with open(V1_ERROR_DATA_DIR / "error_50x.html") as error_ref: + error_ref_contents = error_ref.read() error_500 = handle_error("dummy-url", error_ref_contents) with pytest.raises(MindeeHTTPServerError): raise error_500 diff --git a/tests/v1/parsing/common/test_ocr.py b/tests/v1/parsing/common/test_ocr.py index ca369aad..3e693903 100644 --- a/tests/v1/parsing/common/test_ocr.py +++ b/tests/v1/parsing/common/test_ocr.py @@ -5,7 +5,8 @@ def test_response(): - json_data = json.load(open(V1_DATA_DIR / "extras" / "ocr" / "complete.json")) + with open(V1_DATA_DIR / "extras" / "ocr" / "complete.json") as json_file: + json_data = json.load(json_file) with open(V1_DATA_DIR / "extras" / "ocr" / "ocr.txt") as file_handle: expected_text = file_handle.read() ocr = OCR(json_data["document"]["ocr"]) diff --git a/tests/v1/product/barcode_reader/test_barcode_reader_v1.py b/tests/v1/product/barcode_reader/test_barcode_reader_v1.py index 97f2c535..a326a031 100644 --- a/tests/v1/product/barcode_reader/test_barcode_reader_v1.py +++ b/tests/v1/product/barcode_reader/test_barcode_reader_v1.py @@ -21,7 +21,7 @@ @pytest.fixture def complete_doc() -> BarcodeReaderV1DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(BarcodeReaderV1, json_data["document"]) @@ -29,14 +29,14 @@ def complete_doc() -> BarcodeReaderV1DocumentType: @pytest.fixture def empty_doc() -> BarcodeReaderV1DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(BarcodeReaderV1, json_data["document"]) def test_complete_doc(complete_doc: BarcodeReaderV1DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str diff --git a/tests/v1/product/cropper/test_cropper_v1.py b/tests/v1/product/cropper/test_cropper_v1.py index 02f57062..493ab9e1 100644 --- a/tests/v1/product/cropper/test_cropper_v1.py +++ b/tests/v1/product/cropper/test_cropper_v1.py @@ -4,10 +4,10 @@ from mindee.v1.parsing.common import Document from mindee.v1.parsing.common.page import Page -from mindee.v1.product.cropper.cropper_v1 import CropperV1 from mindee.v1.product.cropper import ( CropperV1Document, ) +from mindee.v1.product.cropper.cropper_v1 import CropperV1 from mindee.v1.product.cropper.cropper_v1_page import ( CropperV1Page, ) @@ -24,7 +24,7 @@ @pytest.fixture def complete_doc() -> CropperV1DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(CropperV1, json_data["document"]) @@ -32,7 +32,7 @@ def complete_doc() -> CropperV1DocumentType: @pytest.fixture def empty_doc() -> CropperV1DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(CropperV1, json_data["document"]) @@ -40,7 +40,7 @@ def empty_doc() -> CropperV1DocumentType: @pytest.fixture def complete_page0() -> Page[CropperV1Page]: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) page0 = json_data["document"]["inference"]["pages"][0] return Page(CropperV1Page, page0) @@ -48,7 +48,7 @@ def complete_page0() -> Page[CropperV1Page]: def test_complete_doc(complete_doc: CropperV1DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str @@ -60,7 +60,7 @@ def test_empty_doc(empty_doc: CropperV1DocumentType): def test_complete_page0(complete_page0: Page[CropperV1Page]): file_path = RESPONSE_DIR / "summary_page0.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert complete_page0.id == 0 assert str(complete_page0) == reference_str diff --git a/tests/v1/product/custom/test_custom_v1.py b/tests/v1/product/custom/test_custom_v1.py index 48f236e5..4a11c9ce 100644 --- a/tests/v1/product/custom/test_custom_v1.py +++ b/tests/v1/product/custom/test_custom_v1.py @@ -5,8 +5,7 @@ from mindee.geometry.quadrilateral import Quadrilateral from mindee.v1.parsing.common import Document from mindee.v1.parsing.common.page import Page -from mindee.v1.parsing.custom import ClassificationField -from mindee.v1.parsing.custom import ListField, ListFieldValue +from mindee.v1.parsing.custom import ClassificationField, ListField, ListFieldValue from mindee.v1.product.custom.custom_v1 import CustomV1 from mindee.v1.product.custom.custom_v1_document import CustomV1Document from mindee.v1.product.custom.custom_v1_page import CustomV1Page @@ -15,35 +14,39 @@ @pytest.fixture def custom_v1_complete_doc() -> Document[CustomV1Document, Page[CustomV1Page]]: - json_data = json.load( - open(V1_PRODUCT_DATA_DIR / "custom" / "response_v1" / "complete.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "custom" / "response_v1" / "complete.json" + ) as json_file: + json_data = json.load(json_file) return Document(CustomV1, json_data["document"]) @pytest.fixture def custom_v1_empty_doc() -> Document[CustomV1Document, Page[CustomV1Page]]: - json_data = json.load( - open(V1_PRODUCT_DATA_DIR / "custom" / "response_v1" / "empty.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "custom" / "response_v1" / "empty.json" + ) as json_file: + json_data = json.load(json_file) return Document(CustomV1, json_data["document"]) @pytest.fixture def custom_v1_complete_page_0() -> Page[CustomV1Page]: - json_data = json.load( - open(V1_PRODUCT_DATA_DIR / "custom" / "response_v1" / "complete.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "custom" / "response_v1" / "complete.json" + ) as json_file: + json_data = json.load(json_file) return Page(CustomV1Page, json_data["document"]["inference"]["pages"][0]) @pytest.fixture def custom_v1_complete_page_1() -> Page[CustomV1Page]: - json_data = json.load( - open(V1_PRODUCT_DATA_DIR / "custom" / "response_v1" / "complete.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "custom" / "response_v1" / "complete.json" + ) as json_file: + json_data = json.load(json_file) return Page(CustomV1Page, json_data["document"]["inference"]["pages"][1]) @@ -65,9 +68,10 @@ def test_empty_doc(custom_v1_empty_doc) -> None: def test_complete_doc(custom_v1_complete_doc) -> None: document_prediction: CustomV1Document = custom_v1_complete_doc.inference.prediction - doc_str = open( + with open( V1_PRODUCT_DATA_DIR / "custom" / "response_v1" / "summary_full.rst" - ).read() + ) as doc: + doc_str = doc.read() for field_name, field in document_prediction.fields.items(): assert len(field_name) > 0 assert isinstance(field, ListField) @@ -91,9 +95,10 @@ def test_complete_doc(custom_v1_complete_doc) -> None: def test_complete_page_0(custom_v1_complete_page_0): page_0_prediction = custom_v1_complete_page_0.prediction - page_0_str = open( + with open( V1_PRODUCT_DATA_DIR / "custom" / "response_v1" / "summary_page0.rst" - ).read() + ) as page0: + page_0_str = page0.read() assert custom_v1_complete_page_0.orientation.value == 0 assert len(custom_v1_complete_page_0.extras.cropper.cropping) == 1 for field in page_0_prediction.fields.values(): @@ -106,9 +111,10 @@ def test_complete_page_0(custom_v1_complete_page_0): def test_complete_page_1(custom_v1_complete_page_1): page_1_prediction = custom_v1_complete_page_1.prediction - page_1_str = open( + with open( V1_PRODUCT_DATA_DIR / "custom" / "response_v1" / "summary_page1.rst" - ).read() + ) as page1: + page_1_str = page1.read() assert custom_v1_complete_page_1.orientation.value == 0 for field in page_1_prediction.fields.values(): assert isinstance(field, ListField) diff --git a/tests/v1/product/custom/test_custom_v1_line_items.py b/tests/v1/product/custom/test_custom_v1_line_items.py index 6de91978..31da6fb8 100644 --- a/tests/v1/product/custom/test_custom_v1_line_items.py +++ b/tests/v1/product/custom/test_custom_v1_line_items.py @@ -32,7 +32,8 @@ def test_single_table_01(): / "line_items" / "single_table_01.json" ) - json_data = json.load(open(json_data_path, "r")) + with open(json_data_path) as json_file: + json_data = json.load(json_file) doc = Document(CustomV1, json_data["document"]).inference.prediction page = Page(CustomV1Page, json_data["document"]["inference"]["pages"][0]) anchors = ["beneficiary_name"] @@ -57,7 +58,8 @@ def test_single_table_02(): / "line_items" / "single_table_01.json" ) - json_data = json.load(open(json_data_path, "r")) + with open(json_data_path) as json_file: + json_data = json.load(json_file) doc = Document(CustomV1, json_data["document"]).inference.prediction page = Page(CustomV1Page, json_data["document"]["inference"]["pages"][0]) anchors = ["beneficiary_name"] diff --git a/tests/v1/product/custom/test_custom_v1_v2.py b/tests/v1/product/custom/test_custom_v1_v2.py index 297cf9cd..00ee54cc 100644 --- a/tests/v1/product/custom/test_custom_v1_v2.py +++ b/tests/v1/product/custom/test_custom_v1_v2.py @@ -5,8 +5,7 @@ from mindee.geometry.quadrilateral import Quadrilateral from mindee.v1.parsing.common import Document from mindee.v1.parsing.common.page import Page -from mindee.v1.parsing.custom import ClassificationField -from mindee.v1.parsing.custom import ListField, ListFieldValue +from mindee.v1.parsing.custom import ClassificationField, ListField, ListFieldValue from mindee.v1.product.custom.custom_v1 import CustomV1 from mindee.v1.product.custom.custom_v1_document import CustomV1Document from mindee.v1.product.custom.custom_v1_page import CustomV1Page @@ -15,35 +14,39 @@ @pytest.fixture def custom_v1_complete_doc() -> Document[CustomV1Document, Page[CustomV1Page]]: - json_data = json.load( - open(V1_PRODUCT_DATA_DIR / "custom" / "response_v2" / "complete.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "custom" / "response_v2" / "complete.json" + ) as json_file: + json_data = json.load(json_file) return Document(CustomV1, json_data["document"]) @pytest.fixture def custom_v1_empty_doc() -> Document[CustomV1Document, Page[CustomV1Page]]: - json_data = json.load( - open(V1_PRODUCT_DATA_DIR / "custom" / "response_v2" / "empty.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "custom" / "response_v2" / "empty.json" + ) as json_file: + json_data = json.load(json_file) return Document(CustomV1, json_data["document"]) @pytest.fixture def custom_v1_complete_page_0() -> Page[CustomV1Page]: - json_data = json.load( - open(V1_PRODUCT_DATA_DIR / "custom" / "response_v2" / "complete.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "custom" / "response_v2" / "complete.json" + ) as json_file: + json_data = json.load(json_file) return Page(CustomV1Page, json_data["document"]["inference"]["pages"][0]) @pytest.fixture def custom_v1_complete_page_1() -> Page[CustomV1Page]: - json_data = json.load( - open(V1_PRODUCT_DATA_DIR / "custom" / "response_v2" / "complete.json") - ) + with open( + V1_PRODUCT_DATA_DIR / "custom" / "response_v2" / "complete.json" + ) as json_file: + json_data = json.load(json_file) return Page(CustomV1Page, json_data["document"]["inference"]["pages"][1]) @@ -65,9 +68,10 @@ def test_empty_doc(custom_v1_empty_doc) -> None: def test_complete_doc(custom_v1_complete_doc) -> None: document_prediction: CustomV1Document = custom_v1_complete_doc.inference.prediction - doc_str = open( + with open( V1_PRODUCT_DATA_DIR / "custom" / "response_v2" / "summary_full.rst" - ).read() + ) as doc: + doc_str = doc.read() for field_name, field in document_prediction.fields.items(): assert len(field_name) > 0 assert isinstance(field, ListField) @@ -91,9 +95,10 @@ def test_complete_doc(custom_v1_complete_doc) -> None: def test_complete_page_0(custom_v1_complete_page_0): page_0_prediction = custom_v1_complete_page_0.prediction - page_0_str = open( + with open( V1_PRODUCT_DATA_DIR / "custom" / "response_v2" / "summary_page0.rst" - ).read() + ) as page0: + page_0_str = page0.read() assert custom_v1_complete_page_0.orientation.value == 0 assert len(custom_v1_complete_page_0.extras.cropper.cropping) == 1 for field in page_0_prediction.fields.values(): @@ -106,9 +111,10 @@ def test_complete_page_0(custom_v1_complete_page_0): def test_complete_page_1(custom_v1_complete_page_1): page_1_prediction = custom_v1_complete_page_1.prediction - page_1_str = open( + with open( V1_PRODUCT_DATA_DIR / "custom" / "response_v2" / "summary_page1.rst" - ).read() + ) as page1: + page_1_str = page1.read() assert custom_v1_complete_page_1.orientation.value == 0 for field in page_1_prediction.fields.values(): assert isinstance(field, ListField) diff --git a/tests/v1/product/financial_document/test_financial_document_v1.py b/tests/v1/product/financial_document/test_financial_document_v1.py index a60b6558..aa3d33d0 100644 --- a/tests/v1/product/financial_document/test_financial_document_v1.py +++ b/tests/v1/product/financial_document/test_financial_document_v1.py @@ -23,7 +23,7 @@ @pytest.fixture def complete_doc_invoice() -> FinancialDocumentV1DocumentType: file_path = RESPONSE_DIR / "complete_invoice.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(FinancialDocumentV1, json_data["document"]) @@ -31,7 +31,7 @@ def complete_doc_invoice() -> FinancialDocumentV1DocumentType: @pytest.fixture def complete_doc_receipt() -> FinancialDocumentV1DocumentType: file_path = RESPONSE_DIR / "complete_receipt.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(FinancialDocumentV1, json_data["document"]) @@ -39,7 +39,7 @@ def complete_doc_receipt() -> FinancialDocumentV1DocumentType: @pytest.fixture def empty_doc() -> FinancialDocumentV1DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(FinancialDocumentV1, json_data["document"]) @@ -47,7 +47,7 @@ def empty_doc() -> FinancialDocumentV1DocumentType: @pytest.fixture def complete_page0_invoice() -> Page[FinancialDocumentV1Document]: file_path = RESPONSE_DIR / "complete_invoice.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) page_0 = json_data["document"]["inference"]["pages"][0] return Page(FinancialDocumentV1Document, page_0) @@ -56,7 +56,7 @@ def complete_page0_invoice() -> Page[FinancialDocumentV1Document]: @pytest.fixture def complete_page0_receipt() -> Page[FinancialDocumentV1Document]: file_path = RESPONSE_DIR / "complete_receipt.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) page_0 = json_data["document"]["inference"]["pages"][0] return Page(FinancialDocumentV1Document, page_0) @@ -64,7 +64,7 @@ def complete_page0_receipt() -> Page[FinancialDocumentV1Document]: def test_complete_invoice(complete_doc_invoice: FinancialDocumentV1DocumentType): file_path = RESPONSE_DIR / "summary_full_invoice.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc_invoice) == reference_str @@ -73,7 +73,7 @@ def test_complete_receipt( complete_doc_receipt: FinancialDocumentV1DocumentType, ): file_path = RESPONSE_DIR / "summary_full_receipt.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc_receipt) == reference_str @@ -107,7 +107,7 @@ def test_empty_doc(empty_doc: FinancialDocumentV1DocumentType): def test_page0_invoice(complete_page0_invoice: Page[FinancialDocumentV1Document]): file_path = RESPONSE_DIR / "summary_page0_invoice.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert complete_page0_invoice.id == 0 assert str(complete_page0_invoice) == reference_str @@ -115,7 +115,7 @@ def test_page0_invoice(complete_page0_invoice: Page[FinancialDocumentV1Document] def test_page0_receipt(complete_page0_receipt: Page[FinancialDocumentV1Document]): file_path = RESPONSE_DIR / "summary_page0_receipt.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert complete_page0_receipt.id == 0 assert str(complete_page0_receipt) == reference_str diff --git a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1.py b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1.py index c9fcecb6..c1511a25 100644 --- a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1.py +++ b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v1.py @@ -23,7 +23,7 @@ @pytest.fixture def complete_doc() -> BankAccountDetailsV1DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(BankAccountDetailsV1, json_data["document"]) @@ -31,14 +31,14 @@ def complete_doc() -> BankAccountDetailsV1DocumentType: @pytest.fixture def empty_doc() -> BankAccountDetailsV1DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(BankAccountDetailsV1, json_data["document"]) def test_complete_doc(complete_doc: BankAccountDetailsV1DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str diff --git a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2.py b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2.py index 2bb9678e..ccd98741 100644 --- a/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2.py +++ b/tests/v1/product/fr/bank_account_details/test_bank_account_details_v2.py @@ -23,7 +23,7 @@ @pytest.fixture def complete_doc() -> BankAccountDetailsV2DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(BankAccountDetailsV2, json_data["document"]) @@ -31,14 +31,14 @@ def complete_doc() -> BankAccountDetailsV2DocumentType: @pytest.fixture def empty_doc() -> BankAccountDetailsV2DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(BankAccountDetailsV2, json_data["document"]) def test_complete_doc(complete_doc: BankAccountDetailsV2DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str diff --git a/tests/v1/product/fr/carte_grise/test_carte_grise_v1.py b/tests/v1/product/fr/carte_grise/test_carte_grise_v1.py index 4aa556e3..d44cdc28 100644 --- a/tests/v1/product/fr/carte_grise/test_carte_grise_v1.py +++ b/tests/v1/product/fr/carte_grise/test_carte_grise_v1.py @@ -21,7 +21,7 @@ @pytest.fixture def complete_doc() -> CarteGriseV1DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(CarteGriseV1, json_data["document"]) @@ -29,14 +29,14 @@ def complete_doc() -> CarteGriseV1DocumentType: @pytest.fixture def empty_doc() -> CarteGriseV1DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(CarteGriseV1, json_data["document"]) def test_complete_doc(complete_doc: CarteGriseV1DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str diff --git a/tests/v1/product/fr/id_card/test_id_card_v1.py b/tests/v1/product/fr/id_card/test_id_card_v1.py index 7cdb57d7..4733c5d8 100644 --- a/tests/v1/product/fr/id_card/test_id_card_v1.py +++ b/tests/v1/product/fr/id_card/test_id_card_v1.py @@ -24,7 +24,7 @@ @pytest.fixture def complete_doc() -> IdCardV1DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(IdCardV1, json_data["document"]) @@ -32,7 +32,7 @@ def complete_doc() -> IdCardV1DocumentType: @pytest.fixture def empty_doc() -> IdCardV1DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(IdCardV1, json_data["document"]) @@ -40,7 +40,7 @@ def empty_doc() -> IdCardV1DocumentType: @pytest.fixture def complete_page0() -> Page[IdCardV1Page]: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) page0 = json_data["document"]["inference"]["pages"][0] return Page(IdCardV1Page, page0) @@ -48,7 +48,7 @@ def complete_page0() -> Page[IdCardV1Page]: def test_complete_doc(complete_doc: IdCardV1DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str @@ -69,7 +69,7 @@ def test_empty_doc(empty_doc: IdCardV1DocumentType): def test_complete_page0(complete_page0: Page[IdCardV1Page]): file_path = RESPONSE_DIR / "summary_page0.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert complete_page0.id == 0 assert str(complete_page0) == reference_str diff --git a/tests/v1/product/fr/id_card/test_id_card_v2.py b/tests/v1/product/fr/id_card/test_id_card_v2.py index 116ebb4d..6f1aee14 100644 --- a/tests/v1/product/fr/id_card/test_id_card_v2.py +++ b/tests/v1/product/fr/id_card/test_id_card_v2.py @@ -24,7 +24,7 @@ @pytest.fixture def complete_doc() -> IdCardV2DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(IdCardV2, json_data["document"]) @@ -32,7 +32,7 @@ def complete_doc() -> IdCardV2DocumentType: @pytest.fixture def empty_doc() -> IdCardV2DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(IdCardV2, json_data["document"]) @@ -40,7 +40,7 @@ def empty_doc() -> IdCardV2DocumentType: @pytest.fixture def complete_page0() -> Page[IdCardV2Page]: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) page0 = json_data["document"]["inference"]["pages"][0] return Page(IdCardV2Page, page0) @@ -48,7 +48,7 @@ def complete_page0() -> Page[IdCardV2Page]: def test_complete_doc(complete_doc: IdCardV2DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str @@ -74,7 +74,7 @@ def test_empty_doc(empty_doc: IdCardV2DocumentType): def test_complete_page0(complete_page0: Page[IdCardV2Page]): file_path = RESPONSE_DIR / "summary_page0.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert complete_page0.id == 0 assert str(complete_page0) == reference_str diff --git a/tests/v1/product/generated/test_generated_v1.py b/tests/v1/product/generated/test_generated_v1.py index 8aa6d332..2defdd0f 100644 --- a/tests/v1/product/generated/test_generated_v1.py +++ b/tests/v1/product/generated/test_generated_v1.py @@ -4,12 +4,10 @@ from mindee.v1.parsing.common import Document from mindee.v1.parsing.common.page import Page -from mindee.v1.parsing.generated import GeneratedListField -from mindee.v1.parsing.generated import GeneratedObjectField +from mindee.v1.parsing.generated import GeneratedListField, GeneratedObjectField from mindee.v1.parsing.standard import PositionField from mindee.v1.parsing.standard.text import StringField -from mindee.v1.product.generated import GeneratedV1 -from mindee.v1.product.generated import GeneratedV1Document +from mindee.v1.product.generated import GeneratedV1, GeneratedV1Document from mindee.v1.product.generated.generated_v1_page import GeneratedV1Page from tests.utils import V1_PRODUCT_DATA_DIR @@ -18,15 +16,14 @@ def international_id_v1_complete_doc() -> Document[ GeneratedV1Document, Page[GeneratedV1Page] ]: - json_data = json.load( - open( - V1_PRODUCT_DATA_DIR - / "generated" - / "response_v1" - / "complete_international_id_v1.json", - encoding="utf-8", - ) - ) + with open( + V1_PRODUCT_DATA_DIR + / "generated" + / "response_v1" + / "complete_international_id_v1.json", + encoding="utf-8", + ) as json_file: + json_data = json.load(json_file) return Document(GeneratedV1, json_data["document"]) @@ -34,66 +31,57 @@ def international_id_v1_complete_doc() -> Document[ def international_id_v1_empty_doc() -> Document[ GeneratedV1Document, Page[GeneratedV1Page] ]: - json_data = json.load( - open( - V1_PRODUCT_DATA_DIR - / "generated" - / "response_v1" - / "empty_international_id_v1.json", - encoding="utf-8", - ) - ) + with open( + V1_PRODUCT_DATA_DIR + / "generated" + / "response_v1" + / "empty_international_id_v1.json", + encoding="utf-8", + ) as json_file: + json_data = json.load(json_file) return Document(GeneratedV1, json_data["document"]) @pytest.fixture def invoice_v4_empty_doc() -> Document[GeneratedV1Document, Page[GeneratedV1Page]]: - json_data = json.load( - open( - V1_PRODUCT_DATA_DIR / "generated" / "response_v1" / "empty_invoice_v4.json", - encoding="utf-8", - ) - ) + with open( + V1_PRODUCT_DATA_DIR / "generated" / "response_v1" / "empty_invoice_v4.json", + encoding="utf-8", + ) as json_file: + json_data = json.load(json_file) return Document(GeneratedV1, json_data["document"]) @pytest.fixture def invoice_v4_complete_doc() -> Document[GeneratedV1Document, Page[GeneratedV1Page]]: - json_data = json.load( - open( - V1_PRODUCT_DATA_DIR - / "generated" - / "response_v1" - / "complete_invoice_v4.json", - encoding="utf-8", - ) - ) + with open( + V1_PRODUCT_DATA_DIR / "generated" / "response_v1" / "complete_invoice_v4.json", + encoding="utf-8", + ) as json_file: + json_data = json.load(json_file) return Document(GeneratedV1, json_data["document"]) @pytest.fixture def invoice_v4_page_0() -> Document[GeneratedV1Document, Page[GeneratedV1Page]]: - json_data = json.load( - open( - V1_PRODUCT_DATA_DIR - / "generated" - / "response_v1" - / "complete_invoice_v4.json", - encoding="utf-8", - ) - ) + with open( + V1_PRODUCT_DATA_DIR / "generated" / "response_v1" / "complete_invoice_v4.json", + encoding="utf-8", + ) as json_file: + json_data = json.load(json_file) return Page(GeneratedV1Page, json_data["document"]["inference"]["pages"][0]) def test_international_id_v1_empty_doc(international_id_v1_empty_doc) -> None: - doc_str = open( + with open( V1_PRODUCT_DATA_DIR / "generated" / "response_v1" / "summary_empty_international_id_v1.rst", encoding="utf-8", - ).read() + ) as doc: + doc_str = doc.read() assert isinstance( international_id_v1_empty_doc.inference.prediction.fields["document_type"], StringField, @@ -236,13 +224,14 @@ def test_international_id_v1_empty_doc(international_id_v1_empty_doc) -> None: def test_international_id_v1_complete_doc(international_id_v1_complete_doc) -> None: - doc_str = open( + with open( V1_PRODUCT_DATA_DIR / "generated" / "response_v1" / "summary_full_international_id_v1.rst", encoding="utf-8", - ).read() + ) as doc: + doc_str = doc.read() assert isinstance( international_id_v1_complete_doc.inference.prediction.fields["document_type"], StringField, @@ -403,13 +392,14 @@ def test_international_id_v1_complete_doc(international_id_v1_complete_doc) -> N def test_invoice_v4_complete_doc(invoice_v4_complete_doc) -> None: - doc_str = open( + with open( V1_PRODUCT_DATA_DIR / "generated" / "response_v1" / "summary_full_invoice_v4.rst", encoding="utf-8", - ).read() + ) as doc: + doc_str = doc.read() assert isinstance( invoice_v4_complete_doc.inference.prediction.fields["customer_address"], StringField, @@ -648,13 +638,14 @@ def test_invoice_v4_complete_doc(invoice_v4_complete_doc) -> None: def test_invoice_v4_page0(invoice_v4_page_0) -> None: - doc_str = open( + with open( V1_PRODUCT_DATA_DIR / "generated" / "response_v1" / "summary_page0_invoice_v4.rst", encoding="utf-8", - ).read() + ) as doc: + doc_str = doc.read() assert isinstance( invoice_v4_page_0.prediction.fields["customer_address"], @@ -799,13 +790,14 @@ def test_invoice_v4_page0(invoice_v4_page_0) -> None: def test_invoice_v4_empty_doc(invoice_v4_empty_doc) -> None: - doc_str = open( + with open( V1_PRODUCT_DATA_DIR / "generated" / "response_v1" / "summary_empty_invoice_v4.rst", encoding="utf-8", - ).read() + ) as doc: + doc_str = doc.read() assert isinstance( invoice_v4_empty_doc.inference.prediction.fields["customer_address"], diff --git a/tests/v1/product/international_id/test_international_id_v2.py b/tests/v1/product/international_id/test_international_id_v2.py index e334da9b..e5c71b0c 100644 --- a/tests/v1/product/international_id/test_international_id_v2.py +++ b/tests/v1/product/international_id/test_international_id_v2.py @@ -21,7 +21,7 @@ @pytest.fixture def complete_doc() -> InternationalIdV2DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(InternationalIdV2, json_data["document"]) @@ -29,14 +29,14 @@ def complete_doc() -> InternationalIdV2DocumentType: @pytest.fixture def empty_doc() -> InternationalIdV2DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(InternationalIdV2, json_data["document"]) def test_complete_doc(complete_doc: InternationalIdV2DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str diff --git a/tests/v1/product/invoice/test_invoice_v4.py b/tests/v1/product/invoice/test_invoice_v4.py index 706cc73b..49b90c9d 100644 --- a/tests/v1/product/invoice/test_invoice_v4.py +++ b/tests/v1/product/invoice/test_invoice_v4.py @@ -21,7 +21,7 @@ @pytest.fixture def complete_doc() -> InvoiceV4DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(InvoiceV4, json_data["document"]) @@ -29,14 +29,14 @@ def complete_doc() -> InvoiceV4DocumentType: @pytest.fixture def empty_doc() -> InvoiceV4DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(InvoiceV4, json_data["document"]) def test_complete_doc(complete_doc: InvoiceV4DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str diff --git a/tests/v1/product/invoice_splitter/test_invoice_splitter_v1.py b/tests/v1/product/invoice_splitter/test_invoice_splitter_v1.py index ef34e745..4e7dfa7d 100644 --- a/tests/v1/product/invoice_splitter/test_invoice_splitter_v1.py +++ b/tests/v1/product/invoice_splitter/test_invoice_splitter_v1.py @@ -21,7 +21,7 @@ @pytest.fixture def complete_doc() -> InvoiceSplitterV1DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(InvoiceSplitterV1, json_data["document"]) @@ -29,14 +29,14 @@ def complete_doc() -> InvoiceSplitterV1DocumentType: @pytest.fixture def empty_doc() -> InvoiceSplitterV1DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(InvoiceSplitterV1, json_data["document"]) def test_complete_doc(complete_doc: InvoiceSplitterV1DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str diff --git a/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1.py b/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1.py index 27d41d69..f4e9f0a2 100644 --- a/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1.py +++ b/tests/v1/product/multi_receipts_detector/test_multi_receipts_detector_v1.py @@ -23,7 +23,7 @@ @pytest.fixture def complete_doc() -> MultiReceiptsDetectorV1DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(MultiReceiptsDetectorV1, json_data["document"]) @@ -31,14 +31,14 @@ def complete_doc() -> MultiReceiptsDetectorV1DocumentType: @pytest.fixture def empty_doc() -> MultiReceiptsDetectorV1DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(MultiReceiptsDetectorV1, json_data["document"]) def test_complete_doc(complete_doc: MultiReceiptsDetectorV1DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str diff --git a/tests/v1/product/passport/test_passport_v1.py b/tests/v1/product/passport/test_passport_v1.py index a34286f4..f9857cfb 100644 --- a/tests/v1/product/passport/test_passport_v1.py +++ b/tests/v1/product/passport/test_passport_v1.py @@ -21,7 +21,7 @@ @pytest.fixture def complete_doc() -> PassportV1DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(PassportV1, json_data["document"]) @@ -29,14 +29,14 @@ def complete_doc() -> PassportV1DocumentType: @pytest.fixture def empty_doc() -> PassportV1DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(PassportV1, json_data["document"]) def test_complete_doc(complete_doc: PassportV1DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str diff --git a/tests/v1/product/receipt/test_receipt_v5.py b/tests/v1/product/receipt/test_receipt_v5.py index b24a738e..d403a204 100644 --- a/tests/v1/product/receipt/test_receipt_v5.py +++ b/tests/v1/product/receipt/test_receipt_v5.py @@ -21,7 +21,7 @@ @pytest.fixture def complete_doc() -> ReceiptV5DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(ReceiptV5, json_data["document"]) @@ -29,14 +29,14 @@ def complete_doc() -> ReceiptV5DocumentType: @pytest.fixture def empty_doc() -> ReceiptV5DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(ReceiptV5, json_data["document"]) def test_complete_doc(complete_doc: ReceiptV5DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str diff --git a/tests/v1/product/us/bank_check/test_bank_check_v1.py b/tests/v1/product/us/bank_check/test_bank_check_v1.py index 422a78eb..7789db80 100644 --- a/tests/v1/product/us/bank_check/test_bank_check_v1.py +++ b/tests/v1/product/us/bank_check/test_bank_check_v1.py @@ -4,10 +4,10 @@ from mindee.v1.parsing.common import Document from mindee.v1.parsing.common.page import Page -from mindee.v1.product.us.bank_check.bank_check_v1 import BankCheckV1 from mindee.v1.product.us.bank_check import ( BankCheckV1Document, ) +from mindee.v1.product.us.bank_check.bank_check_v1 import BankCheckV1 from mindee.v1.product.us.bank_check.bank_check_v1_page import ( BankCheckV1Page, ) @@ -24,7 +24,7 @@ @pytest.fixture def complete_doc() -> BankCheckV1DocumentType: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(BankCheckV1, json_data["document"]) @@ -32,7 +32,7 @@ def complete_doc() -> BankCheckV1DocumentType: @pytest.fixture def empty_doc() -> BankCheckV1DocumentType: file_path = RESPONSE_DIR / "empty.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return Document(BankCheckV1, json_data["document"]) @@ -40,7 +40,7 @@ def empty_doc() -> BankCheckV1DocumentType: @pytest.fixture def complete_page0() -> Page[BankCheckV1Page]: file_path = RESPONSE_DIR / "complete.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) page0 = json_data["document"]["inference"]["pages"][0] return Page(BankCheckV1Page, page0) @@ -48,7 +48,7 @@ def complete_page0() -> Page[BankCheckV1Page]: def test_complete_doc(complete_doc: BankCheckV1DocumentType): file_path = RESPONSE_DIR / "summary_full.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert str(complete_doc) == reference_str @@ -65,7 +65,7 @@ def test_empty_doc(empty_doc: BankCheckV1DocumentType): def test_complete_page0(complete_page0: Page[BankCheckV1Page]): file_path = RESPONSE_DIR / "summary_page0.rst" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: reference_str = open_file.read() assert complete_page0.id == 0 assert str(complete_page0) == reference_str diff --git a/tests/v1/test_cli.py b/tests/v1/test_cli.py index 88d636d4..9ad74c7e 100644 --- a/tests/v1/test_cli.py +++ b/tests/v1/test_cli.py @@ -3,8 +3,8 @@ import pytest -from mindee.v1.commands import MindeeParser from mindee.error.mindee_http_error import MindeeHTTPError +from mindee.v1.commands import MindeeParser from tests.utils import FILE_TYPES_DIR, V1_PRODUCT_DATA_DIR, clear_envvars @@ -122,90 +122,90 @@ def ots_doc_feedback(monkeypatch): def test_cli_custom_doc(custom_doc): + parser = MindeeParser(parsed_args=custom_doc) with pytest.raises(MindeeHTTPError): - parser = MindeeParser(parsed_args=custom_doc) parser.call_parse() def test_cli_generated_doc_sync(generated_doc_sync): + parser = MindeeParser(parsed_args=generated_doc_sync) with pytest.raises(MindeeHTTPError): - parser = MindeeParser(parsed_args=generated_doc_sync) parser.call_parse() def test_cli_generated_doc_async(generated_doc_async): + parser = MindeeParser(parsed_args=generated_doc_async) with pytest.raises(MindeeHTTPError): - parser = MindeeParser(parsed_args=generated_doc_async) parser.call_parse() def test_cli_invoice(ots_doc): ots_doc.product_name = "invoice" ots_doc.api_key = "" + parser = MindeeParser(parsed_args=ots_doc) with pytest.raises(RuntimeError): - parser = MindeeParser(parsed_args=ots_doc) parser.call_parse() ots_doc.api_key = "dummy" + parser = MindeeParser(parsed_args=ots_doc) with pytest.raises(MindeeHTTPError): - parser = MindeeParser(parsed_args=ots_doc) parser.call_parse() def test_cli_receipt(ots_doc): ots_doc.product_name = "receipt" ots_doc.api_key = "" + parser = MindeeParser(parsed_args=ots_doc) with pytest.raises(RuntimeError): - parser = MindeeParser(parsed_args=ots_doc) parser.call_parse() ots_doc.api_key = "dummy" + parser = MindeeParser(parsed_args=ots_doc) with pytest.raises(MindeeHTTPError): - parser = MindeeParser(parsed_args=ots_doc) parser.call_parse() def test_cli_financial_doc(ots_doc): ots_doc.product_name = "financial-document" ots_doc.api_key = "" + parser = MindeeParser(parsed_args=ots_doc) with pytest.raises(RuntimeError): - parser = MindeeParser(parsed_args=ots_doc) parser.call_parse() ots_doc.api_key = "dummy" + parser = MindeeParser(parsed_args=ots_doc) with pytest.raises(MindeeHTTPError): - parser = MindeeParser(parsed_args=ots_doc) parser.call_parse() def test_cli_passport(ots_doc): ots_doc.product_name = "passport" ots_doc.api_key = "" + parser = MindeeParser(parsed_args=ots_doc) with pytest.raises(RuntimeError): - parser = MindeeParser(parsed_args=ots_doc) parser.call_parse() ots_doc.api_key = "dummy" + parser = MindeeParser(parsed_args=ots_doc) with pytest.raises(MindeeHTTPError): - parser = MindeeParser(parsed_args=ots_doc) parser.call_parse() def test_cli_us_bank_check(ots_doc): ots_doc.product_name = "us-bank-check" ots_doc.api_key = "" + parser = MindeeParser(parsed_args=ots_doc) with pytest.raises(RuntimeError): - parser = MindeeParser(parsed_args=ots_doc) parser.call_parse() ots_doc.api_key = "dummy" + parser = MindeeParser(parsed_args=ots_doc) with pytest.raises(MindeeHTTPError): - parser = MindeeParser(parsed_args=ots_doc) parser.call_parse() def test_cli_invoice_splitter_enqueue(ots_doc_enqueue_and_parse): ots_doc_enqueue_and_parse.product_name = "invoice-splitter" ots_doc_enqueue_and_parse.api_key = "" + parser = MindeeParser(parsed_args=ots_doc_enqueue_and_parse) with pytest.raises(RuntimeError): - parser = MindeeParser(parsed_args=ots_doc_enqueue_and_parse) parser.call_parse() ots_doc_enqueue_and_parse.api_key = "dummy" + parser = MindeeParser(parsed_args=ots_doc_enqueue_and_parse) with pytest.raises(MindeeHTTPError): - parser = MindeeParser(parsed_args=ots_doc_enqueue_and_parse) parser.call_parse() diff --git a/tests/v1/test_client.py b/tests/v1/test_client.py index 45b35c72..f5620f91 100644 --- a/tests/v1/test_client.py +++ b/tests/v1/test_client.py @@ -1,8 +1,13 @@ import binascii +import contextlib import pytest from mindee import Base64Input, PathInput +from mindee.error.mindee_error import MindeeClientError, MindeeError +from mindee.error.mindee_http_error import MindeeHTTPError +from mindee.input.local_input_source import LocalInputSource +from mindee.input.local_response import LocalResponse from mindee.v1 import ( AsyncPredictResponse, Client, @@ -10,10 +15,6 @@ PredictResponse, product, ) -from mindee.error.mindee_error import MindeeClientError, MindeeError -from mindee.error.mindee_http_error import MindeeHTTPError -from mindee.input.local_response import LocalResponse -from mindee.input.local_input_source import LocalInputSource from mindee.v1.product import MultiReceiptsDetectorV1 from mindee.v1.product.international_id import InternationalIdV2 from mindee.v1.product.invoice.invoice_v4 import InvoiceV4 @@ -21,10 +22,10 @@ from mindee.v1.product.receipt.receipt_v5 import ReceiptV5 from tests.utils import ( FILE_TYPES_DIR, + V1_ERROR_DATA_DIR, V1_PRODUCT_DATA_DIR, clear_envvars, dummy_envvars, - V1_ERROR_DATA_DIR, ) @@ -46,14 +47,14 @@ def dummy_client() -> Client: def test_parse_path_without_token(empty_client: Client): + input_doc = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") with pytest.raises(RuntimeError): - input_doc = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") empty_client.parse(product.ReceiptV5, input_doc) def test_parse_path_with_env_token(env_client: Client): + input_doc = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") with pytest.raises(MindeeHTTPError): - input_doc = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") env_client.parse(product.ReceiptV5, input_doc) @@ -63,14 +64,17 @@ def test_parse_path_with_wrong_filetype(dummy_client: Client): def test_parse_path_with_wrong_token(dummy_client: Client): + input_doc = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") with pytest.raises(MindeeHTTPError): - input_doc = PathInput(FILE_TYPES_DIR / "pdf" / "blank.pdf") dummy_client.parse(product.ReceiptV5, input_doc) def test_request_with_wrong_type(dummy_client: Client): - with pytest.raises(FileNotFoundError): - PathInput(open("./tests/data/test.txt").read()) + with pytest.raises(FileNotFoundError), open("./tests/data/test.txt") as path_input: + PathInput(path_input.read()) + + +def test_request_with_wrong_type_b64(dummy_client: Client): with pytest.raises(binascii.Error): Base64Input("./tests/data/test.txt", "test.jpg") @@ -81,17 +85,15 @@ def test_interface_version(dummy_client: Client): account_name="dummy", version="1.1", ) + input_doc = PathInput(FILE_TYPES_DIR / "receipt.jpg") with pytest.raises(MindeeHTTPError): - input_doc = PathInput(FILE_TYPES_DIR / "receipt.jpg") dummy_client.parse(product.CustomV1, input_doc, endpoint=dummy_endpoint) def test_keep_file_open(dummy_client: Client): input_doc: LocalInputSource = PathInput(f"{FILE_TYPES_DIR}/receipt.jpg") - try: + with contextlib.suppress(MindeeHTTPError): dummy_client.parse(product.ReceiptV5, input_doc, close_file=False) - except MindeeHTTPError: - pass assert not input_doc.file_object.closed input_doc.close() assert input_doc.file_object.closed @@ -99,18 +101,14 @@ def test_keep_file_open(dummy_client: Client): def test_cut_options(dummy_client: Client): input_doc: LocalInputSource = PathInput(f"{FILE_TYPES_DIR}/pdf/multipage.pdf") - try: - # need to keep file open to count the pages after parsing + with contextlib.suppress(MindeeHTTPError): dummy_client.parse( ReceiptV5, input_doc, close_file=False, page_options=PageOptions(page_indexes=range(5)), ) - except MindeeHTTPError: - pass assert input_doc.page_count == 5 - input_doc.close() def test_async_wrong_initial_delay(dummy_client: Client): diff --git a/tests/v1/workflows/test_workflow.py b/tests/v1/workflows/test_workflow.py index ee810541..1667afdd 100644 --- a/tests/v1/workflows/test_workflow.py +++ b/tests/v1/workflows/test_workflow.py @@ -12,7 +12,7 @@ @pytest.fixture def success_workflow() -> WorkflowResponse: file_path = WORKFLOW_DIR / "success.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return WorkflowResponse(GeneratedV1, json_data) @@ -20,7 +20,7 @@ def success_workflow() -> WorkflowResponse: @pytest.fixture def success_low_priority_workflow() -> WorkflowResponse: file_path = WORKFLOW_DIR / "success_low_priority.json" - with open(file_path, "r", encoding="utf-8") as open_file: + with open(file_path, encoding="utf-8") as open_file: json_data = json.load(open_file) return WorkflowResponse(GeneratedV1, json_data) diff --git a/tests/v2/file_operations/test_crop_operation.py b/tests/v2/file_operations/test_crop_operation.py index a92380d3..6b26f288 100644 --- a/tests/v2/file_operations/test_crop_operation.py +++ b/tests/v2/file_operations/test_crop_operation.py @@ -3,8 +3,8 @@ import pytest from PIL import Image -from mindee.v2.file_operations.crop import extract_crops from mindee.input.path_input import PathInput +from mindee.v2.file_operations.crop import extract_crops from mindee.v2.product.crop.crop_response import ( CropResponse, ) diff --git a/tests/v2/file_operations/test_crop_operation_integration.py b/tests/v2/file_operations/test_crop_operation_integration.py index 72d89611..307174e7 100644 --- a/tests/v2/file_operations/test_crop_operation_integration.py +++ b/tests/v2/file_operations/test_crop_operation_integration.py @@ -4,13 +4,13 @@ import pytest from mindee import ( - ExtractionParameters, - ExtractionResponse, CropParameters, CropResponse, + ExtractionParameters, + ExtractionResponse, ) -from mindee.v2.client import Client from mindee.input.path_input import PathInput +from mindee.v2.client import Client from mindee.v2.file_operations.crop import extract_crops from tests.utils import OUTPUT_DIR, V2_PRODUCT_DATA_DIR, cleanup_output_files diff --git a/tests/v2/file_operations/test_split_operation_integration.py b/tests/v2/file_operations/test_split_operation_integration.py index dfbd5db0..47128be2 100644 --- a/tests/v2/file_operations/test_split_operation_integration.py +++ b/tests/v2/file_operations/test_split_operation_integration.py @@ -8,8 +8,8 @@ SplitParameters, SplitResponse, ) -from mindee.v2.client import Client from mindee.input.path_input import PathInput +from mindee.v2.client import Client from tests.utils import OUTPUT_DIR, V2_PRODUCT_DATA_DIR, cleanup_output_files diff --git a/tests/v2/input/test_local_response.py b/tests/v2/input/test_local_response.py index a45cc6ba..eff46b5b 100644 --- a/tests/v2/input/test_local_response.py +++ b/tests/v2/input/test_local_response.py @@ -44,7 +44,7 @@ def test_valid_path_local_response(file_path): def test_valid_bytes_local_response(file_path): - with open(file_path, "r") as f: + with open(file_path) as f: str_response = f.read().replace("\r", "").replace("\n", "") file_bytes = str_response.encode("utf-8") local_response = LocalResponse(file_bytes) diff --git a/tests/v2/product/classification/test_classification_integration.py b/tests/v2/product/classification/test_classification_integration.py index ab7aeac8..b1300a92 100644 --- a/tests/v2/product/classification/test_classification_integration.py +++ b/tests/v2/product/classification/test_classification_integration.py @@ -2,9 +2,9 @@ import pytest -from mindee.v2.client import Client from mindee.input.path_input import PathInput from mindee.v2 import ClassificationParameters, ClassificationResponse +from mindee.v2.client import Client from tests.utils import V2_PRODUCT_DATA_DIR diff --git a/tests/v2/product/classification/test_classification_response.py b/tests/v2/product/classification/test_classification_response.py index 950efde0..582dc521 100644 --- a/tests/v2/product/classification/test_classification_response.py +++ b/tests/v2/product/classification/test_classification_response.py @@ -1,10 +1,10 @@ import pytest from mindee import ExtractionResponse +from mindee.v2.product.classification import ClassificationInference from mindee.v2.product.classification.classification_classifier import ( ClassificationClassifier, ) -from mindee.v2.product.classification import ClassificationInference from mindee.v2.product.classification.classification_response import ( ClassificationResponse, ) diff --git a/tests/v2/product/crop/test_crop_integration.py b/tests/v2/product/crop/test_crop_integration.py index bdbd3ab5..227d2e22 100644 --- a/tests/v2/product/crop/test_crop_integration.py +++ b/tests/v2/product/crop/test_crop_integration.py @@ -2,9 +2,9 @@ import pytest -from mindee.v2.client import Client from mindee.input.path_input import PathInput from mindee.v2 import CropParameters, CropResponse +from mindee.v2.client import Client from tests.utils import V2_PRODUCT_DATA_DIR diff --git a/tests/v2/product/crop/test_crop_response.py b/tests/v2/product/crop/test_crop_response.py index 314e177a..b82a203d 100644 --- a/tests/v2/product/crop/test_crop_response.py +++ b/tests/v2/product/crop/test_crop_response.py @@ -1,11 +1,10 @@ import pytest from mindee import ExtractionResponse -from mindee.v2.product.crop.crop_box import CropBox from mindee.v2.product.crop import CropInference +from mindee.v2.product.crop.crop_box import CropBox from mindee.v2.product.crop.crop_response import CropResponse from mindee.v2.product.crop.crop_result import CropResult - from tests.v2.product.utils import get_product_samples diff --git a/tests/v2/product/extraction/test_extraction_response.py b/tests/v2/product/extraction/test_extraction_response.py index 745afc39..c46f7556 100644 --- a/tests/v2/product/extraction/test_extraction_response.py +++ b/tests/v2/product/extraction/test_extraction_response.py @@ -3,16 +3,18 @@ import pytest from mindee import ExtractionResponse -from mindee.v2.parsing.inference.inference_active_options import InferenceActiveOptions -from mindee.v2.parsing.inference.field import FieldConfidence -from mindee.v2.parsing.inference.field import ListField +from mindee.v2.parsing.inference.field import ( + FieldConfidence, + InferenceFields, + ListField, +) from mindee.v2.parsing.inference.field.object_field import ObjectField from mindee.v2.parsing.inference.field.simple_field import SimpleField -from mindee.v2.parsing.inference.field import InferenceFields -from mindee.v2.product.extraction.extraction_inference import ExtractionInference +from mindee.v2.parsing.inference.inference_active_options import InferenceActiveOptions from mindee.v2.parsing.inference.inference_file import InferenceFile from mindee.v2.parsing.inference.inference_model import InferenceModel from mindee.v2.parsing.inference.rag_metadata import RAGMetadata +from mindee.v2.product.extraction.extraction_inference import ExtractionInference from tests.utils import V2_PRODUCT_DATA_DIR from tests.v2.product.utils import get_product_samples @@ -307,9 +309,7 @@ def test_text_context_field_is_false() -> None: @pytest.mark.v2 def test_text_context_field_is_true() -> None: - with open( - V2_PRODUCT_DATA_DIR / "extraction" / "text_context_enabled.json", "r" - ) as file: + with open(V2_PRODUCT_DATA_DIR / "extraction" / "text_context_enabled.json") as file: json_sample = json.load(file) response = ExtractionResponse(json_sample) assert isinstance(response.inference.active_options, InferenceActiveOptions) diff --git a/tests/v2/product/ocr/test_ocr_integration.py b/tests/v2/product/ocr/test_ocr_integration.py index ebd6d208..669285db 100644 --- a/tests/v2/product/ocr/test_ocr_integration.py +++ b/tests/v2/product/ocr/test_ocr_integration.py @@ -2,9 +2,9 @@ import pytest -from mindee.v2.client import Client from mindee.input.path_input import PathInput from mindee.v2 import OCRParameters, OCRResponse +from mindee.v2.client import Client from mindee.v2.product.ocr import OCRInference, OCRResult from tests.utils import V2_PRODUCT_DATA_DIR diff --git a/tests/v2/product/ocr/test_ocr_response.py b/tests/v2/product/ocr/test_ocr_response.py index d91c5d6a..5c57c8dd 100644 --- a/tests/v2/product/ocr/test_ocr_response.py +++ b/tests/v2/product/ocr/test_ocr_response.py @@ -1,10 +1,9 @@ import pytest -from mindee.v2.product.ocr.ocr_page import OCRPage from mindee.v2.product.ocr import OCRInference +from mindee.v2.product.ocr.ocr_page import OCRPage from mindee.v2.product.ocr.ocr_response import OCRResponse from mindee.v2.product.ocr.ocr_result import OCRResult - from tests.v2.product.utils import get_product_samples diff --git a/tests/v2/product/split/test_split_integration.py b/tests/v2/product/split/test_split_integration.py index 1819249a..7e053597 100644 --- a/tests/v2/product/split/test_split_integration.py +++ b/tests/v2/product/split/test_split_integration.py @@ -2,9 +2,9 @@ import pytest -from mindee.v2.client import Client from mindee.input.path_input import PathInput from mindee.v2 import SplitParameters, SplitResponse +from mindee.v2.client import Client from tests.utils import V2_PRODUCT_DATA_DIR diff --git a/tests/v2/product/split/test_split_response.py b/tests/v2/product/split/test_split_response.py index a01c3db8..734e9022 100644 --- a/tests/v2/product/split/test_split_response.py +++ b/tests/v2/product/split/test_split_response.py @@ -1,8 +1,8 @@ import pytest from mindee import ExtractionResponse -from mindee.v2.product.split.split_range import SplitRange from mindee.v2.product.split import SplitInference +from mindee.v2.product.split.split_range import SplitRange from mindee.v2.product.split.split_response import SplitResponse from mindee.v2.product.split.split_result import SplitResult from tests.v2.product.utils import get_product_samples diff --git a/tests/v2/product/utils.py b/tests/v2/product/utils.py index 0a3a14bf..57029648 100644 --- a/tests/v2/product/utils.py +++ b/tests/v2/product/utils.py @@ -1,11 +1,10 @@ -from typing import Tuple -from pathlib import Path import json +from pathlib import Path from tests.utils import V2_PRODUCT_DATA_DIR -def get_samples(json_path: Path, rst_path: Path) -> Tuple[dict, str]: +def get_samples(json_path: Path, rst_path: Path) -> tuple[dict, str]: with json_path.open("r", encoding="utf-8") as fh: json_sample = json.load(fh) try: @@ -16,7 +15,7 @@ def get_samples(json_path: Path, rst_path: Path) -> Tuple[dict, str]: return json_sample, rst_sample -def get_product_samples(product: str, file_name: str) -> Tuple[dict, str]: +def get_product_samples(product: str, file_name: str) -> tuple[dict, str]: json_path = V2_PRODUCT_DATA_DIR / product / f"{file_name}.json" rst_path = V2_PRODUCT_DATA_DIR / product / f"{file_name}.rst" return get_samples(json_path, rst_path) diff --git a/tests/v2/test_client.py b/tests/v2/test_client.py index ded27855..a1f36c7f 100644 --- a/tests/v2/test_client.py +++ b/tests/v2/test_client.py @@ -4,17 +4,20 @@ import pytest from mindee import ExtractionParameters, ExtractionResponse, LocalResponse -from mindee.v2.client import Client from mindee.error.mindee_error import MindeeError -from mindee.v2.error.mindee_api_v2_error import MindeeAPIV2Error -from mindee.v2.error.mindee_http_error_v2 import MindeeHTTPErrorV2 from mindee.input.local_input_source import LocalInputSource from mindee.input.path_input import PathInput from mindee.v1.mindee_http.base_settings import USER_AGENT -from mindee.v2.product.extraction.extraction_inference import ExtractionInference +from mindee.v2.client import Client +from mindee.v2.error.mindee_api_v2_error import MindeeAPIV2Error +from mindee.v2.error.mindee_http_error_v2 import ( + MindeeHTTPErrorV2, + MindeeHTTPUnknownErrorV2, +) from mindee.v2.parsing.inference.job import Job from mindee.v2.parsing.inference.job_response import JobResponse -from tests.utils import FILE_TYPES_DIR, V2_PRODUCT_DATA_DIR, V2_DATA_DIR, dummy_envvars +from mindee.v2.product.extraction.extraction_inference import ExtractionInference +from tests.utils import FILE_TYPES_DIR, V2_DATA_DIR, V2_PRODUCT_DATA_DIR, dummy_envvars @pytest.fixture @@ -193,8 +196,41 @@ def test_error_handling(custom_base_url_client): ), ExtractionParameters("dummy-model"), ) - assert e.status_code == -1 - assert e.detail == "forced failure from test" + assert e.value.status == 0 + assert e.value.detail == "forced failure from test" + + +@pytest.mark.v2 +def test_error_handling_non_json_response(env_client, monkeypatch): + class _FakeHtmlRespError: + status_code = 502 + ok = False + text = "