diff --git a/mindee/client_mixin.py b/mindee/client_mixin.py index dde7fcc4..514a91ac 100644 --- a/mindee/client_mixin.py +++ b/mindee/client_mixin.py @@ -2,7 +2,11 @@ from typing import BinaryIO, Union from mindee.error import MindeeClientError -from mindee.input import Base64Input, BytesInput, FileInput, PathInput, UrlInputSource +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 class ClientMixin: diff --git a/mindee/client_v2.py b/mindee/client_v2.py index 236a3d65..68c466e0 100644 --- a/mindee/client_v2.py +++ b/mindee/client_v2.py @@ -16,7 +16,7 @@ is_valid_post_response, ) from mindee.parsing.v2.common_response import CommonStatus -from mindee.v2.parsing.inference.base_response import BaseResponse +from mindee.parsing.v2.base_response import BaseResponse from mindee.parsing.v2.inference_response import InferenceResponse from mindee.parsing.v2.job_response import JobResponse diff --git a/mindee/parsing/v2/base_inference.py b/mindee/parsing/v2/base_inference.py new file mode 100644 index 00000000..9f9e90ec --- /dev/null +++ b/mindee/parsing/v2/base_inference.py @@ -0,0 +1,29 @@ +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 new file mode 100644 index 00000000..d3aab4bf --- /dev/null +++ b/mindee/parsing/v2/base_response.py @@ -0,0 +1,21 @@ +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/inference.py b/mindee/parsing/v2/inference.py index 341f7cf6..1009c101 100644 --- a/mindee/parsing/v2/inference.py +++ b/mindee/parsing/v2/inference.py @@ -1,5 +1,5 @@ from mindee.parsing.common.string_dict import StringDict -from mindee.v2.parsing.inference import BaseInference +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 diff --git a/mindee/parsing/v2/inference_job.py b/mindee/parsing/v2/inference_job.py new file mode 100644 index 00000000..ac877545 --- /dev/null +++ b/mindee/parsing/v2/inference_job.py @@ -0,0 +1,14 @@ +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/parsing/v2/inference_response.py b/mindee/parsing/v2/inference_response.py index 32becbdf..20a20975 100644 --- a/mindee/parsing/v2/inference_response.py +++ b/mindee/parsing/v2/inference_response.py @@ -1,8 +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.v2.parsing.inference.base_response import ( - BaseResponse, -) class InferenceResponse(BaseResponse): diff --git a/mindee/v2/commands/cli_parser.py b/mindee/v2/commands/cli_parser.py index aadeb75b..305126f7 100644 --- a/mindee/v2/commands/cli_parser.py +++ b/mindee/v2/commands/cli_parser.py @@ -16,7 +16,7 @@ from mindee.input import BaseParameters from mindee.input.sources import PathInput, UrlInputSource -from mindee.v2.parsing import BaseResponse +from mindee.parsing.v2.base_response import BaseResponse @dataclass diff --git a/mindee/v2/parsing/__init__.py b/mindee/v2/parsing/__init__.py index 3ab40372..3d83d32f 100644 --- a/mindee/v2/parsing/__init__.py +++ b/mindee/v2/parsing/__init__.py @@ -1,5 +1,5 @@ -from mindee.v2.parsing.inference.base_inference import BaseInference -from mindee.v2.parsing.inference.base_response import BaseResponse +from mindee.parsing.v2.base_inference import BaseInference +from mindee.parsing.v2.base_response import BaseResponse __all__ = [ "BaseInference", diff --git a/mindee/v2/parsing/inference/__init__.py b/mindee/v2/parsing/inference/__init__.py index e59b67ae..3d83d32f 100644 --- a/mindee/v2/parsing/inference/__init__.py +++ b/mindee/v2/parsing/inference/__init__.py @@ -1,7 +1,5 @@ -from mindee.v2.parsing.inference.base_inference import BaseInference -from mindee.v2.parsing.inference.base_response import ( - BaseResponse, -) +from mindee.parsing.v2.base_inference import BaseInference +from mindee.parsing.v2.base_response import BaseResponse __all__ = [ "BaseInference", diff --git a/mindee/v2/parsing/inference/base_inference.py b/mindee/v2/parsing/inference/base_inference.py index ccde42df..215b3a1a 100644 --- a/mindee/v2/parsing/inference/base_inference.py +++ b/mindee/v2/parsing/inference/base_inference.py @@ -1,29 +1,3 @@ -from abc import ABC -from typing import TypeVar +from mindee.parsing.v2.base_inference import BaseInference, TypeBaseInference -from mindee.parsing.common.string_dict import StringDict -from mindee.parsing.v2.inference_file import InferenceFile -from mindee.parsing.v2.inference_model import InferenceModel -from mindee.v2.parsing.inference.inference_job import InferenceJob - - -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) +__all__ = ["BaseInference", "TypeBaseInference"] diff --git a/mindee/v2/parsing/inference/base_response.py b/mindee/v2/parsing/inference/base_response.py index 55b6deb6..f2917467 100644 --- a/mindee/v2/parsing/inference/base_response.py +++ b/mindee/v2/parsing/inference/base_response.py @@ -1,22 +1,3 @@ -from abc import ABC +from mindee.parsing.v2.base_response import BaseResponse -from mindee.v2.parsing.inference.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 +__all__ = ["BaseResponse"] diff --git a/mindee/v2/parsing/inference/inference_job.py b/mindee/v2/parsing/inference/inference_job.py index ac877545..3315d39c 100644 --- a/mindee/v2/parsing/inference/inference_job.py +++ b/mindee/v2/parsing/inference/inference_job.py @@ -1,14 +1,3 @@ -from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.v2.inference_job import 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}" +__all__ = ["InferenceJob"] diff --git a/mindee/v2/product/classification/classification_classifier.py b/mindee/v2/product/classification/classification_classifier.py index 9f49674f..8aa694f9 100644 --- a/mindee/v2/product/classification/classification_classifier.py +++ b/mindee/v2/product/classification/classification_classifier.py @@ -1,4 +1,5 @@ from mindee.parsing.common.string_dict import StringDict +from mindee.parsing.v2.inference_response import InferenceResponse class ClassificationClassifier: @@ -7,8 +8,15 @@ class ClassificationClassifier: document_type: str """The document type, as identified on given classification values.""" + extraction_response: InferenceResponse + """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( + server_response["extraction_response"] + ) def __str__(self) -> str: return f":Document Type: {self.document_type}" diff --git a/mindee/v2/product/classification/classification_inference.py b/mindee/v2/product/classification/classification_inference.py index 9e00ad60..274be69e 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.v2.parsing.inference.base_inference import BaseInference +from mindee.parsing.v2.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 bc2a6d35..78d7e520 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.v2.parsing.inference import BaseResponse +from mindee.parsing.v2.base_response import BaseResponse from mindee.v2.product.classification.classification_inference import ( ClassificationInference, ) diff --git a/mindee/v2/product/crop/crop_box.py b/mindee/v2/product/crop/crop_box.py index 88cea161..f93bebbb 100644 --- a/mindee/v2/product/crop/crop_box.py +++ b/mindee/v2/product/crop/crop_box.py @@ -1,3 +1,4 @@ +from mindee.parsing.v2.inference_response import InferenceResponse from mindee.extraction import ExtractedImage, extract_multiple_images_from_source from mindee.input.sources.local_input_source import LocalInputSource from mindee.parsing.common.string_dict import StringDict @@ -11,10 +12,16 @@ class CropBox: """Location which includes cropping coordinates for the detected object, within the source document.""" object_type: str """Type or classification of the detected object.""" + extraction_response: InferenceResponse + """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( + server_response["extraction_response"] + ) def __str__(self) -> str: return f"* :Location: {self.location}\n :Object Type: {self.object_type}" diff --git a/mindee/v2/product/crop/crop_inference.py b/mindee/v2/product/crop/crop_inference.py index 0b4c5c8c..5e95aa62 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.v2.parsing.inference.base_inference import BaseInference +from mindee.parsing.v2.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 3d2c35b0..f63a1fcc 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.v2.file_operations.crop_files import CropFiles -from mindee.v2.parsing.inference import BaseResponse +from mindee.parsing.v2.base_response import BaseResponse from mindee.v2.product.crop.crop_inference import CropInference diff --git a/mindee/v2/product/ocr/ocr_inference.py b/mindee/v2/product/ocr/ocr_inference.py index 60eda267..8699a2e5 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.v2.parsing.inference.base_inference import BaseInference +from mindee.parsing.v2.base_inference import BaseInference from mindee.v2.product.ocr.ocr_result import OCRResult diff --git a/mindee/v2/product/ocr/ocr_response.py b/mindee/v2/product/ocr/ocr_response.py index f7605b02..071ae0f2 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.v2.parsing.inference import BaseResponse +from mindee.parsing.v2.base_response import BaseResponse from mindee.v2.product.ocr.ocr_inference import OCRInference diff --git a/mindee/v2/product/split/split_inference.py b/mindee/v2/product/split/split_inference.py index 7b3d562c..f944187c 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.v2.parsing.inference.base_inference import BaseInference +from mindee.parsing.v2.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 2a429b36..4919f866 100644 --- a/mindee/v2/product/split/split_range.py +++ b/mindee/v2/product/split/split_range.py @@ -1,5 +1,6 @@ from typing import List +from mindee.parsing.v2.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 @@ -16,10 +17,16 @@ class SplitRange: """ document_type: str """The document type, as identified on given classification values.""" + extraction_response: InferenceResponse + """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( + server_response["extraction_response"] + ) def __str__(self) -> str: page_range = ",".join([str(page_index) for page_index in self.page_range]) diff --git a/mindee/v2/product/split/split_response.py b/mindee/v2/product/split/split_response.py index b4770902..a00b868e 100644 --- a/mindee/v2/product/split/split_response.py +++ b/mindee/v2/product/split/split_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.v2.base_response import BaseResponse from mindee.v2.file_operations.split_files import SplitFiles -from mindee.v2.parsing.inference import BaseResponse from mindee.v2.product.split.split_inference import SplitInference diff --git a/tests/data b/tests/data index 53f0efbc..13093f3a 160000 --- a/tests/data +++ b/tests/data @@ -1 +1 @@ -Subproject commit 53f0efbc08c77c2c085aadd27de9d2d6c359276e +Subproject commit 13093f3a48de212ef26889df71199c1a2a9d1478 diff --git a/tests/input/test_apply_page_options.py b/tests/input/test_apply_page_options.py index 238c49e0..6640e544 100644 --- a/tests/input/test_apply_page_options.py +++ b/tests/input/test_apply_page_options.py @@ -3,7 +3,7 @@ import pypdfium2 as pdfium import pytest -from mindee.error import MindeeError +from mindee.error.mindee_error import MindeeError from mindee.input.page_options import KEEP_ONLY, REMOVE, PageOptions from mindee.input.sources import ( Base64Input, diff --git a/tests/v2/file_operations/test_crop_operation_integration.py b/tests/v2/file_operations/test_crop_operation_integration.py index a7541a32..2c2e1dca 100644 --- a/tests/v2/file_operations/test_crop_operation_integration.py +++ b/tests/v2/file_operations/test_crop_operation_integration.py @@ -51,8 +51,8 @@ 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") == 198887 - assert os.path.getsize(OUTPUT_DIR / "crop_002.jpg") == 197443 + assert os.path.getsize(OUTPUT_DIR / "crop_001.jpg") == 187601 + assert os.path.getsize(OUTPUT_DIR / "crop_002.jpg") == 197978 @pytest.fixture(scope="module", autouse=True) diff --git a/tests/v2/product/classification/test_classification_integration.py b/tests/v2/product/classification/test_classification_integration.py index 0889f34b..a16f1269 100644 --- a/tests/v2/product/classification/test_classification_integration.py +++ b/tests/v2/product/classification/test_classification_integration.py @@ -24,7 +24,7 @@ def test_classification_default_sample( v2_client: ClientV2, classification_model_id: str ): input_source = PathInput( - V2_PRODUCT_DATA_DIR / "classification" / "default_invoice.jpg" + V2_PRODUCT_DATA_DIR / "classification" / "default_sample.jpg" ) response = v2_client.enqueue_and_get_result( ClassificationResponse, @@ -32,6 +32,6 @@ def test_classification_default_sample( ClassificationParameters(classification_model_id), ) assert response.inference is not None - assert response.inference.file.name == "default_invoice.jpg" + assert response.inference.file.name == "default_sample.jpg" assert response.inference.result.classification assert response.inference.result.classification.document_type == "invoice" diff --git a/tests/v2/product/classification/test_classification_response.py b/tests/v2/product/classification/test_classification_response.py index 68ca836f..651a0c30 100644 --- a/tests/v2/product/classification/test_classification_response.py +++ b/tests/v2/product/classification/test_classification_response.py @@ -1,5 +1,6 @@ import pytest +from mindee import InferenceResponse from mindee.v2.product.classification.classification_classifier import ( ClassificationClassifier, ) @@ -14,7 +15,7 @@ @pytest.mark.v2 def test_classification_single(): json_sample, _ = get_product_samples( - product="classification", file_name="classification_single" + product="classification", file_name="default_sample" ) response = ClassificationResponse(json_sample) assert isinstance(response.inference, ClassificationInference) @@ -24,3 +25,26 @@ def test_classification_single(): ClassificationClassifier, ) assert response.inference.result.classification.document_type == "invoice" + + +@pytest.mark.v2 +def test_classification_with_extraction_result(): + json_sample, _ = get_product_samples( + product="classification", file_name="default_sample_extraction" + ) + response = ClassificationResponse(json_sample) + assert isinstance(response.inference, ClassificationInference) + assert isinstance(response.inference.result, ClassificationResult) + assert isinstance( + response.inference.result.classification, + ClassificationClassifier, + ) + classification = response.inference.result.classification + assert classification.document_type == "invoice" + assert isinstance(classification.extraction_response, InferenceResponse) + assert ( + classification.extraction_response.inference.result.fields.get( + "customer_name" + ).value + == "Jiro Doi" + ) diff --git a/tests/v2/product/crop/test_crop_response.py b/tests/v2/product/crop/test_crop_response.py index 98832745..761951a8 100644 --- a/tests/v2/product/crop/test_crop_response.py +++ b/tests/v2/product/crop/test_crop_response.py @@ -1,5 +1,6 @@ import pytest +from mindee import InferenceResponse 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 @@ -67,3 +68,31 @@ def test_crop_multiple(): assert response.inference.result.crops[1].object_type == "receipt" assert rst_sample == str(response) + + +@pytest.mark.v2 +def test_crop_with_extraction_result(): + json_sample, _ = get_product_samples( + product="crop", file_name="default_sample_extraction" + ) + response = CropResponse(json_sample) + assert isinstance(response.inference, CropInference) + assert isinstance(response.inference.result, CropResult) + assert isinstance( + response.inference.result.crops[0], + CropBox, + ) + crops = response.inference.result.crops + assert crops[0].object_type == "receipt" + assert isinstance(crops[0].extraction_response, InferenceResponse) + 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 ( + crops[1].extraction_response.inference.result.fields.get("supplier_name").value + == "La cerise sur la pizza" + ) diff --git a/tests/v2/product/split/test_split_response.py b/tests/v2/product/split/test_split_response.py index 29381469..8b79f31b 100644 --- a/tests/v2/product/split/test_split_response.py +++ b/tests/v2/product/split/test_split_response.py @@ -1,5 +1,6 @@ import pytest +from mindee import InferenceResponse 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 @@ -43,3 +44,37 @@ def test_split_multiple(): assert response.inference.result.splits[2].page_range[0] == 4 assert response.inference.result.splits[2].page_range[1] == 4 assert response.inference.result.splits[2].document_type == "receipt" + + +@pytest.mark.v2 +def test_split_with_extraction_result(): + json_sample, _ = get_product_samples( + product="split", file_name="default_sample_extraction" + ) + response = SplitResponse(json_sample) + assert isinstance(response.inference, SplitInference) + assert isinstance(response.inference.result, SplitResult) + assert isinstance( + response.inference.result.splits[0], + SplitRange, + ) + 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 ( + split[0] + .extraction_response.inference.result.fields.get("supplier_phone_number") + .value + == "05 05 44 44 90" + ) + + assert split[1].document_type == "invoice" + assert split[1].page_range[0] == 1 + assert isinstance(split[1].extraction_response, InferenceResponse) + assert ( + split[1] + .extraction_response.inference.result.fields.get("supplier_phone_number") + .value + == "416-555-1212" + ) diff --git a/tests/v2/test_base_classes.py b/tests/v2/test_base_classes.py new file mode 100644 index 00000000..77f28911 --- /dev/null +++ b/tests/v2/test_base_classes.py @@ -0,0 +1,49 @@ +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 + + +def test_inference_job(): + job = InferenceJob({"id": "job-id"}) + + assert job.id == "job-id" + assert str(job) == "Job\n===\n:ID: job-id" + + +def test_base_inference(): + inference = BaseInference( + { + "id": "inference-id", + "job": {"id": "job-id"}, + "model": {"id": "model-id"}, + "file": { + "name": "document.pdf", + "alias": "alias", + "page_count": 2, + "mime_type": "application/pdf", + }, + } + ) + + assert inference.id == "inference-id" + assert isinstance(inference.job, InferenceJob) + assert inference.job.id == "job-id" + assert isinstance(inference.model, InferenceModel) + assert inference.model.id == "model-id" + assert isinstance(inference.file, InferenceFile) + assert inference.file.name == "document.pdf" + + +def test_base_response(): + class DummyResponse(BaseResponse): + _slug = "dummy/results" + + def __init__(self): + self.inference = "dummy inference" + + response = DummyResponse() + + assert str(response) == "dummy inference" + assert response.get_result_slug() == "dummy/results"