diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md b/sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md index d694b8cb3a45..eacc44678913 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md +++ b/sdk/formrecognizer/azure-ai-formrecognizer/CHANGELOG.md @@ -19,6 +19,8 @@ - For recognize receipt methods, parameters have been renamed to `receipt` and `receipt_url`. - `created_on` and `last_modified` are renamed to `requested_on` and `completed_on` in the `CustomFormModel` and `CustomFormModelInfo` models. +- `models` property of `CustomFormModel` is renamed to `submodels` +- `CustomFormSubModel` is renamed to `CustomFormSubmodel` **New features** diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/README.md b/sdk/formrecognizer/azure-ai-formrecognizer/README.md index d49bf6f0e644..6f562db53da0 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/README.md +++ b/sdk/formrecognizer/azure-ai-formrecognizer/README.md @@ -66,7 +66,7 @@ az cognitiveservices account show --name "resource-name" --resource-group "resou ``` #### Types of credentials -The `credential` parameter may be provided as a [AzureKeyCredential][azure-key-credential] from [azure.core][azure_core], +The `credential` parameter may be provided as a [AzureKeyCredential][azure-key-credential] from [azure.core][azure_core], or as a credential type from Azure Active Directory. See the full details regarding [authentication][cognitive_authentication] of cognitive services. @@ -75,12 +75,12 @@ See the full details regarding [authentication][cognitive_authentication] of cog The API key can be found in the Azure Portal or by running the following Azure CLI command: ```az cognitiveservices account keys list --name "resource-name" --resource-group "resource-group-name"``` - + Use the key as the credential parameter to authenticate the client: ```python from azure.ai.formrecognizer import FormRecognizerClient from azure.core.credentials import AzureKeyCredential - + endpoint = "https://.api.cognitive.microsoft.com/" credential = AzureKeyCredential("") form_recognizer_client = FormRecognizerClient(endpoint, credential) @@ -270,7 +270,7 @@ print("Completed on: {}".format(model.completed_on)) print("Recognized fields:") # looping through the submodels, which contains the fields they were trained on -for submodel in model.models: +for submodel in model.submodels: print("The submodel with form type '{}' has recognized the following fields: {}".format( submodel.form_type, ", ".join([label for label in submodel.fields]) diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/__init__.py b/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/__init__.py index ef3321151b18..f65b9e8e92af 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/__init__.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/__init__.py @@ -32,7 +32,7 @@ FormLine, FormWord, CustomFormModel, - CustomFormSubModel, + CustomFormSubmodel, CustomFormModelField ) @@ -63,7 +63,7 @@ 'FormLine', 'FormWord', 'CustomFormModel', - 'CustomFormSubModel', + 'CustomFormSubmodel', 'CustomFormModelField' ] diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/_models.py b/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/_models.py index dd9d03c2e150..00d34f96d4d3 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/_models.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/azure/ai/formrecognizer/_models.py @@ -676,7 +676,7 @@ class CustomFormModel(object): The date and time (UTC) when model training was requested. :ivar ~datetime.datetime completed_on: Date and time (UTC) when model training completed. - :ivar list[~azure.ai.formrecognizer.CustomFormSubModel] models: + :ivar list[~azure.ai.formrecognizer.CustomFormSubmodel] submodels: A list of submodels that are part of this model, each of which can recognize and extract fields from a different type of form. :ivar list[~azure.ai.formrecognizer.FormRecognizerError] errors: @@ -690,7 +690,7 @@ def __init__(self, **kwargs): self.status = kwargs.get("status", None) self.requested_on = kwargs.get("requested_on", None) self.completed_on = kwargs.get("completed_on", None) - self.models = kwargs.get("models", None) + self.submodels = kwargs.get("submodels", None) self.errors = kwargs.get("errors", None) self.training_documents = kwargs.get("training_documents", []) @@ -701,22 +701,22 @@ def _from_generated(cls, model): status=model.model_info.status, requested_on=model.model_info.created_date_time, completed_on=model.model_info.last_updated_date_time, - models=CustomFormSubModel._from_generated_unlabeled(model) - if model.keys else CustomFormSubModel._from_generated_labeled(model), + submodels=CustomFormSubmodel._from_generated_unlabeled(model) + if model.keys else CustomFormSubmodel._from_generated_labeled(model), errors=FormRecognizerError._from_generated(model.train_result.errors) if model.train_result else None, training_documents=TrainingDocumentInfo._from_generated(model.train_result) if model.train_result else None ) def __repr__(self): - return "CustomFormModel(model_id={}, status={}, requested_on={}, completed_on={}, models={}, " \ + return "CustomFormModel(model_id={}, status={}, requested_on={}, completed_on={}, submodels={}, " \ "errors={}, training_documents={})".format( - self.model_id, self.status, self.requested_on, self.completed_on, repr(self.models), + self.model_id, self.status, self.requested_on, self.completed_on, repr(self.submodels), repr(self.errors), repr(self.training_documents) )[:1024] -class CustomFormSubModel(object): +class CustomFormSubmodel(object): """Represents a submodel that extracts fields from a specific type of form. :ivar float accuracy: The mean of the model's field accuracies. @@ -751,7 +751,7 @@ def _from_generated_labeled(cls, model): )] if model.train_result else None def __repr__(self): - return "CustomFormSubModel(accuracy={}, fields={}, form_type={})".format( + return "CustomFormSubmodel(accuracy={}, fields={}, form_type={})".format( self.accuracy, repr(self.fields), self.form_type )[:1024] diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/samples/async_samples/sample_train_model_with_labels_async.py b/sdk/formrecognizer/azure-ai-formrecognizer/samples/async_samples/sample_train_model_with_labels_async.py index ef4bceabfee1..0b16095a4f67 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/samples/async_samples/sample_train_model_with_labels_async.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/samples/async_samples/sample_train_model_with_labels_async.py @@ -55,7 +55,7 @@ async def train_model_with_labels(self): print("Recognized fields:") # looping through the submodels, which contains the fields they were trained on # The labels are based on the ones you gave the training document. - for submodel in model.models: + for submodel in model.submodels: print("...The submodel with form type {} has accuracy '{}'".format(submodel.form_type, submodel.accuracy)) for name, field in submodel.fields.items(): print("...The model found field '{}' to have name '{}' with an accuracy of {}".format( diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/samples/async_samples/sample_train_model_without_labels_async.py b/sdk/formrecognizer/azure-ai-formrecognizer/samples/async_samples/sample_train_model_without_labels_async.py index 71da402e0083..c977d079571b 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/samples/async_samples/sample_train_model_without_labels_async.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/samples/async_samples/sample_train_model_without_labels_async.py @@ -53,7 +53,7 @@ async def train_model_without_labels(self): print("Recognized fields:") # Looping through the submodels, which contains the fields they were trained on - for submodel in model.models: + for submodel in model.submodels: print("...The submodel has form type '{}'".format(submodel.form_type)) for name, field in submodel.fields.items(): print("...The model found field '{}' to have label '{}'".format( diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_train_model_with_labels.py b/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_train_model_with_labels.py index ebf395812630..7aed6c911b79 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_train_model_with_labels.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_train_model_with_labels.py @@ -52,7 +52,7 @@ def train_model_with_labels(self): print("Recognized fields:") # looping through the submodels, which contains the fields they were trained on # The labels are based on the ones you gave the training document. - for submodel in model.models: + for submodel in model.submodels: print("...The submodel with form type {} has accuracy '{}'".format(submodel.form_type, submodel.accuracy)) for name, field in submodel.fields.items(): print("...The model found field '{}' to have name '{}' with an accuracy of {}".format( diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_train_model_without_labels.py b/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_train_model_without_labels.py index e7d58cdb8e96..baaad2ac1058 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_train_model_without_labels.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/samples/sample_train_model_without_labels.py @@ -51,7 +51,7 @@ def train_model_without_labels(self): print("Recognized fields:") # Looping through the submodels, which contains the fields they were trained on - for submodel in model.models: + for submodel in model.submodels: print("...The submodel has form type '{}'".format(submodel.form_type)) for name, field in submodel.fields.items(): print("...The model found field '{}' to have label '{}'".format( diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_mgmt.py b/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_mgmt.py index 0a502f023692..efaf90c6e49b 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_mgmt.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_mgmt.py @@ -95,7 +95,7 @@ def test_mgmt_model_labeled(self, client, container_sas_url): self.assertEqual(a.errors, b.errors) self.assertEqual(a.page_count, b.page_count) self.assertEqual(a.status, b.status) - for a, b in zip(labeled_model_from_train.models, labeled_model_from_get.models): + for a, b in zip(labeled_model_from_train.submodels, labeled_model_from_get.submodels): for field1, field2 in zip(a.fields.items(), b.fields.items()): self.assertEqual(a.fields[field1[0]].name, b.fields[field2[0]].name) self.assertEqual(a.fields[field1[0]].accuracy, b.fields[field2[0]].accuracy) @@ -131,7 +131,7 @@ def test_mgmt_model_unlabeled(self, client, container_sas_url): self.assertEqual(a.errors, b.errors) self.assertEqual(a.page_count, b.page_count) self.assertEqual(a.status, b.status) - for a, b in zip(unlabeled_model_from_train.models, unlabeled_model_from_get.models): + for a, b in zip(unlabeled_model_from_train.submodels, unlabeled_model_from_get.submodels): for field1, field2 in zip(a.fields.items(), b.fields.items()): self.assertEqual(a.fields[field1[0]].label, b.fields[field2[0]].label) diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_mgmt_async.py b/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_mgmt_async.py index babc3d09e558..f0b65db830f2 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_mgmt_async.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_mgmt_async.py @@ -95,7 +95,7 @@ async def test_mgmt_model_labeled(self, client, container_sas_url): self.assertEqual(a.errors, b.errors) self.assertEqual(a.page_count, b.page_count) self.assertEqual(a.status, b.status) - for a, b in zip(labeled_model_from_train.models, labeled_model_from_get.models): + for a, b in zip(labeled_model_from_train.submodels, labeled_model_from_get.submodels): for field1, field2 in zip(a.fields.items(), b.fields.items()): self.assertEqual(a.fields[field1[0]].name, b.fields[field2[0]].name) self.assertEqual(a.fields[field1[0]].accuracy, b.fields[field2[0]].accuracy) @@ -129,7 +129,7 @@ async def test_mgmt_model_unlabeled(self, client, container_sas_url): self.assertEqual(a.errors, b.errors) self.assertEqual(a.page_count, b.page_count) self.assertEqual(a.status, b.status) - for a, b in zip(unlabeled_model_from_train.models, unlabeled_model_from_get.models): + for a, b in zip(unlabeled_model_from_train.submodels, unlabeled_model_from_get.submodels): for field1, field2 in zip(a.fields.items(), b.fields.items()): self.assertEqual(a.fields[field1[0]].label, b.fields[field2[0]].label) diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_repr.py b/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_repr.py index 646237282d82..b9d6380f91e6 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_repr.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_repr.py @@ -118,8 +118,8 @@ def custom_form_model_field(): @pytest.fixture def custom_form_sub_model(custom_form_model_field): - model = _models.CustomFormSubModel(accuracy=0.99, fields={"name": custom_form_model_field[0]}, form_type="Itemized") - model_repr = "CustomFormSubModel(accuracy=0.99, fields={{'name': {}}}, form_type=Itemized)".format(custom_form_model_field[1])[:1024] + model = _models.CustomFormSubmodel(accuracy=0.99, fields={"name": custom_form_model_field[0]}, form_type="Itemized") + model_repr = "CustomFormSubmodel(accuracy=0.99, fields={{'name': {}}}, form_type=Itemized)".format(custom_form_model_field[1])[:1024] assert repr(model) == model_repr return model, model_repr @@ -207,13 +207,13 @@ def test_custom_form_model(self, custom_form_sub_model, form_recognizer_error, t status=_models.CustomFormModelStatus.creating, requested_on=datetime.datetime(1, 1, 1), completed_on=datetime.datetime(1, 1, 1), - models=[custom_form_sub_model[0], custom_form_sub_model[0]], + submodels=[custom_form_sub_model[0], custom_form_sub_model[0]], errors=[form_recognizer_error[0]], training_documents=[training_document_info[0], training_document_info[0]] ) model_repr = "CustomFormModel(model_id=1, status=creating, requested_on=0001-01-01 00:00:00, " \ - "completed_on=0001-01-01 00:00:00, models=[{}, {}], errors=[{}], training_documents=[{}, {}])".format( + "completed_on=0001-01-01 00:00:00, submodels=[{}, {}], errors=[{}], training_documents=[{}, {}])".format( custom_form_sub_model[1], custom_form_sub_model[1], form_recognizer_error[1], training_document_info[1], training_document_info[1] )[:1024] diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_training.py b/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_training.py index d29b01ab3b02..2ee398403abf 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_training.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_training.py @@ -42,7 +42,7 @@ def test_training(self, client, container_sas_url): self.assertIsNotNone(doc.page_count) self.assertEqual(doc.status, "succeeded") self.assertEqual(doc.errors, []) - for sub in model.models: + for sub in model.submodels: self.assertIsNotNone(sub.form_type) for key, field in sub.fields.items(): self.assertIsNotNone(field.label) @@ -65,7 +65,7 @@ def test_training_multipage(self, client, container_sas_url): self.assertIsNotNone(doc.page_count) self.assertIsNotNone(doc.status) self.assertEqual(doc.errors, []) - for sub in model.models: + for sub in model.submodels: self.assertIsNotNone(sub.form_type) for key, field in sub.fields.items(): self.assertIsNotNone(field.label) @@ -126,7 +126,7 @@ def test_training_with_labels(self, client, container_sas_url): self.assertIsNotNone(doc.page_count) self.assertEqual(doc.status, "succeeded") self.assertEqual(doc.errors, []) - for sub in model.models: + for sub in model.submodels: self.assertIsNotNone(sub.form_type) self.assertIsNotNone(sub.accuracy) for key, field in sub.fields.items(): @@ -150,7 +150,7 @@ def test_training_multipage_with_labels(self, client, container_sas_url): self.assertIsNotNone(doc.page_count) self.assertIsNotNone(doc.status) self.assertEqual(doc.errors, []) - for sub in model.models: + for sub in model.submodels: self.assertIsNotNone(sub.form_type) self.assertIsNotNone(sub.accuracy) for key, field in sub.fields.items(): diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_training_async.py b/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_training_async.py index c6c8f761cdad..1507ea299c23 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_training_async.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/tests/test_training_async.py @@ -43,7 +43,7 @@ async def test_training(self, client, container_sas_url): self.assertIsNotNone(doc.page_count) self.assertEqual(doc.status, "succeeded") self.assertEqual(doc.errors, []) - for sub in model.models: + for sub in model.submodels: self.assertIsNotNone(sub.form_type) for key, field in sub.fields.items(): self.assertIsNotNone(field.label) @@ -65,7 +65,7 @@ async def test_training_multipage(self, client, container_sas_url): self.assertIsNotNone(doc.page_count) self.assertIsNotNone(doc.status) self.assertEqual(doc.errors, []) - for sub in model.models: + for sub in model.submodels: self.assertIsNotNone(sub.form_type) for key, field in sub.fields.items(): self.assertIsNotNone(field.label) @@ -126,7 +126,7 @@ async def test_training_with_labels(self, client, container_sas_url): self.assertIsNotNone(doc.page_count) self.assertEqual(doc.status, "succeeded") self.assertEqual(doc.errors, []) - for sub in model.models: + for sub in model.submodels: self.assertIsNotNone(sub.form_type) for key, field in sub.fields.items(): self.assertIsNotNone(field.accuracy) @@ -148,7 +148,7 @@ async def test_training_multipage_with_labels(self, client, container_sas_url): self.assertIsNotNone(doc.page_count) self.assertIsNotNone(doc.status) self.assertEqual(doc.errors, []) - for sub in model.models: + for sub in model.submodels: self.assertIsNotNone(sub.form_type) self.assertIsNotNone(sub.accuracy) for key, field in sub.fields.items(): diff --git a/sdk/formrecognizer/azure-ai-formrecognizer/tests/testcase.py b/sdk/formrecognizer/azure-ai-formrecognizer/tests/testcase.py index 7b4cab578c47..e5c688d47f52 100644 --- a/sdk/formrecognizer/azure-ai-formrecognizer/tests/testcase.py +++ b/sdk/formrecognizer/azure-ai-formrecognizer/tests/testcase.py @@ -117,18 +117,18 @@ def assertModelTransformCorrect(self, model, actual, unlabeled=False): if unlabeled: if actual.keys.clusters: for cluster_id, fields in actual.keys.clusters.items(): - self.assertEqual(cluster_id, model.models[int(cluster_id)].form_type[-1]) - for field_idx, model_field in model.models[int(cluster_id)].fields.items(): + self.assertEqual(cluster_id, model.submodels[int(cluster_id)].form_type[-1]) + for field_idx, model_field in model.submodels[int(cluster_id)].fields.items(): self.assertIn(model_field.label, fields) else: if actual.train_result: if actual.train_result.fields: for a in actual.train_result.fields: - self.assertEqual(model.models[0].fields[a.field_name].name, a.field_name) - self.assertEqual(model.models[0].fields[a.field_name].accuracy, a.accuracy) - self.assertEqual(model.models[0].form_type, "form-"+model.model_id) - self.assertEqual(model.models[0].accuracy, actual.train_result.average_model_accuracy) + self.assertEqual(model.submodels[0].fields[a.field_name].name, a.field_name) + self.assertEqual(model.submodels[0].fields[a.field_name].accuracy, a.accuracy) + self.assertEqual(model.submodels[0].form_type, "form-"+model.model_id) + self.assertEqual(model.submodels[0].accuracy, actual.train_result.average_model_accuracy) def assertFormPagesTransformCorrect(self, pages, actual_read, page_result=None, **kwargs): for page, actual_page in zip(pages, actual_read):