diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index b8dcb4a4..3815c983 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:993a058718e84a82fda04c3177e58f0a43281a996c7c395e0a56ccc4d6d210d7 + digest: sha256:7a40313731a7cb1454eef6b33d3446ebb121836738dc3ab3d2d3ded5268c35b6 diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 385f2d4d..d15994ba 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -325,31 +325,30 @@ platformdirs==2.5.2 \ --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 # via virtualenv -protobuf==3.20.1 \ - --hash=sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf \ - --hash=sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f \ - --hash=sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f \ - --hash=sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7 \ - --hash=sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996 \ - --hash=sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067 \ - --hash=sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c \ - --hash=sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7 \ - --hash=sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9 \ - --hash=sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c \ - --hash=sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739 \ - --hash=sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91 \ - --hash=sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c \ - --hash=sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153 \ - --hash=sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9 \ - --hash=sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388 \ - --hash=sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e \ - --hash=sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab \ - --hash=sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde \ - --hash=sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531 \ - --hash=sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8 \ - --hash=sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7 \ - --hash=sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20 \ - --hash=sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3 +protobuf==3.20.2 \ + --hash=sha256:03d76b7bd42ac4a6e109742a4edf81ffe26ffd87c5993126d894fe48a120396a \ + --hash=sha256:09e25909c4297d71d97612f04f41cea8fa8510096864f2835ad2f3b3df5a5559 \ + --hash=sha256:18e34a10ae10d458b027d7638a599c964b030c1739ebd035a1dfc0e22baa3bfe \ + --hash=sha256:291fb4307094bf5ccc29f424b42268640e00d5240bf0d9b86bf3079f7576474d \ + --hash=sha256:2c0b040d0b5d5d207936ca2d02f00f765906622c07d3fa19c23a16a8ca71873f \ + --hash=sha256:384164994727f274cc34b8abd41a9e7e0562801361ee77437099ff6dfedd024b \ + --hash=sha256:3cb608e5a0eb61b8e00fe641d9f0282cd0eedb603be372f91f163cbfbca0ded0 \ + --hash=sha256:5d9402bf27d11e37801d1743eada54372f986a372ec9679673bfcc5c60441151 \ + --hash=sha256:712dca319eee507a1e7df3591e639a2b112a2f4a62d40fe7832a16fd19151750 \ + --hash=sha256:7a5037af4e76c975b88c3becdf53922b5ffa3f2cddf657574a4920a3b33b80f3 \ + --hash=sha256:8228e56a865c27163d5d1d1771d94b98194aa6917bcfb6ce139cbfa8e3c27334 \ + --hash=sha256:84a1544252a933ef07bb0b5ef13afe7c36232a774affa673fc3636f7cee1db6c \ + --hash=sha256:84fe5953b18a383fd4495d375fe16e1e55e0a3afe7b4f7b4d01a3a0649fcda9d \ + --hash=sha256:9c673c8bfdf52f903081816b9e0e612186684f4eb4c17eeb729133022d6032e3 \ + --hash=sha256:9f876a69ca55aed879b43c295a328970306e8e80a263ec91cf6e9189243c613b \ + --hash=sha256:a9e5ae5a8e8985c67e8944c23035a0dff2c26b0f5070b2f55b217a1c33bbe8b1 \ + --hash=sha256:b4fdb29c5a7406e3f7ef176b2a7079baa68b5b854f364c21abe327bbeec01cdb \ + --hash=sha256:c184485e0dfba4dfd451c3bd348c2e685d6523543a0f91b9fd4ae90eb09e8422 \ + --hash=sha256:c9cdf251c582c16fd6a9f5e95836c90828d51b0069ad22f463761d27c6c19019 \ + --hash=sha256:e39cf61bb8582bda88cdfebc0db163b774e7e03364bbf9ce1ead13863e81e359 \ + --hash=sha256:e8fbc522303e09036c752a0afcc5c0603e917222d8bedc02813fd73b4b4ed804 \ + --hash=sha256:f34464ab1207114e73bba0794d1257c150a2b89b7a9faf504e00af7c9fd58978 \ + --hash=sha256:f52dabc96ca99ebd2169dadbe018824ebda08a795c7684a0b7d203a290f3adb0 # via # gcp-docuploader # gcp-releasetool diff --git a/CHANGELOG.md b/CHANGELOG.md index e56c357e..0dbe4cc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [2.0.2](https://github.com/googleapis/python-documentai/compare/v2.0.1...v2.0.2) (2022-10-03) + + +### Bug Fixes + +* **deps:** Require protobuf >= 3.20.2 ([#385](https://github.com/googleapis/python-documentai/issues/385)) ([d65a0c7](https://github.com/googleapis/python-documentai/commit/d65a0c76a60d47fb022eeee5427e4fa517d6a363)) + + +### Documentation + +* **samples:** Added Processor Version Samples ([#382](https://github.com/googleapis/python-documentai/issues/382)) ([f9ce801](https://github.com/googleapis/python-documentai/commit/f9ce801119f96b632fddb73a4d314be1bb188639)) + ## [2.0.1](https://github.com/googleapis/python-documentai/compare/v2.0.0...v2.0.1) (2022-09-13) diff --git a/samples/snippets/batch_process_documents_processor_version_sample.py b/samples/snippets/batch_process_documents_processor_version_sample.py new file mode 100644 index 00000000..7050c3ec --- /dev/null +++ b/samples/snippets/batch_process_documents_processor_version_sample.py @@ -0,0 +1,153 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# [START documentai_batch_process_documents_processor_version] +import re + +from google.api_core.client_options import ClientOptions +from google.cloud import documentai, storage + +# TODO(developer): Uncomment these variables before running the sample. +# project_id = 'YOUR_PROJECT_ID' +# location = 'YOUR_PROCESSOR_LOCATION' # Format is 'us' or 'eu' +# processor_id = 'YOUR_PROCESSOR_ID' # Example: aeb8cea219b7c272 +# processor_version_id = "YOUR_PROCESSOR_VERSION_ID" # Example: pretrained-ocr-v1.0-2020-09-23 +# gcs_input_uri = "YOUR_INPUT_URI" # Format: gs://bucket/directory/file.pdf +# input_mime_type = "application/pdf" +# gcs_output_bucket = "YOUR_OUTPUT_BUCKET_NAME" # Format: gs://bucket +# gcs_output_uri_prefix = "YOUR_OUTPUT_URI_PREFIX" # Format: directory/subdirectory/ + + +def batch_process_documents_processor_version( + project_id: str, + location: str, + processor_id: str, + processor_version_id: str, + gcs_input_uri: str, + input_mime_type: str, + gcs_output_bucket: str, + gcs_output_uri_prefix: str, + timeout: int = 300, +): + + # You must set the api_endpoint if you use a location other than 'us', e.g.: + opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com") + + client = documentai.DocumentProcessorServiceClient(client_options=opts) + + gcs_document = documentai.GcsDocument( + gcs_uri=gcs_input_uri, mime_type=input_mime_type + ) + + # Load GCS Input URI into a List of document files + gcs_documents = documentai.GcsDocuments(documents=[gcs_document]) + input_config = documentai.BatchDocumentsInputConfig(gcs_documents=gcs_documents) + + # NOTE: Alternatively, specify a GCS URI Prefix to process an entire directory + # + # gcs_input_uri = "gs://bucket/directory/" + # gcs_prefix = documentai.GcsPrefix(gcs_uri_prefix=gcs_input_uri) + # input_config = documentai.BatchDocumentsInputConfig(gcs_prefix=gcs_prefix) + # + + # Cloud Storage URI for the Output Directory + destination_uri = f"{gcs_output_bucket}/{gcs_output_uri_prefix}/" + + gcs_output_config = documentai.DocumentOutputConfig.GcsOutputConfig( + gcs_uri=destination_uri + ) + + # Where to write results + output_config = documentai.DocumentOutputConfig(gcs_output_config=gcs_output_config) + + # The full resource name of the processor version + # e.g. projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processor_version_id} + name = client.processor_version_path( + project_id, location, processor_id, processor_version_id + ) + + request = documentai.BatchProcessRequest( + name=name, + input_documents=input_config, + document_output_config=output_config, + ) + + # BatchProcess returns a Long Running Operation (LRO) + operation = client.batch_process_documents(request) + + # Continually polls the operation until it is complete. + # This could take some time for larger files + # Format: projects/PROJECT_NUMBER/locations/LOCATION/operations/OPERATION_ID + print(f"Waiting for operation {operation.operation.name} to complete...") + operation.result(timeout=timeout) + + # NOTE: Can also use callbacks for asynchronous processing + # + # def my_callback(future): + # result = future.result() + # + # operation.add_done_callback(my_callback) + + # Once the operation is complete, + # get output document information from operation metadata + metadata = documentai.BatchProcessMetadata(operation.metadata) + + if metadata.state != documentai.BatchProcessMetadata.State.SUCCEEDED: + raise ValueError(f"Batch Process Failed: {metadata.state_message}") + + storage_client = storage.Client() + + print("Output files:") + # One process per Input Document + for process in metadata.individual_process_statuses: + # output_gcs_destination format: gs://BUCKET/PREFIX/OPERATION_NUMBER/INPUT_FILE_NUMBER/ + # The Cloud Storage API requires the bucket name and URI prefix separately + matches = re.match(r"gs://(.*?)/(.*)", process.output_gcs_destination) + if not matches: + print( + "Could not parse output GCS destination:", + process.output_gcs_destination, + ) + continue + + output_bucket, output_prefix = matches.groups() + + # Get List of Document Objects from the Output Bucket + output_blobs = storage_client.list_blobs(output_bucket, prefix=output_prefix) + + # Document AI may output multiple JSON files per source file + for blob in output_blobs: + # Document AI should only output JSON files to GCS + if ".json" not in blob.name: + print( + f"Skipping non-supported file: {blob.name} - Mimetype: {blob.content_type}" + ) + continue + + # Download JSON File as bytes object and convert to Document Object + print(f"Fetching {blob.name}") + document = documentai.Document.from_json( + blob.download_as_bytes(), ignore_unknown_fields=True + ) + + # For a full list of Document object attributes, please reference this page: + # https://cloud.google.com/python/docs/reference/documentai/latest/google.cloud.documentai_v1.types.Document + + # Read the text recognition output from the processor + print("The document contains the following text:") + print(document.text) + + +# [END documentai_batch_process_documents_processor_version] diff --git a/samples/snippets/batch_process_documents_processor_version_sample_test.py b/samples/snippets/batch_process_documents_processor_version_sample_test.py new file mode 100644 index 00000000..b39c8ab2 --- /dev/null +++ b/samples/snippets/batch_process_documents_processor_version_sample_test.py @@ -0,0 +1,64 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os +from uuid import uuid4 + +from google.cloud import storage +from google.cloud.exceptions import NotFound +import pytest +from samples.snippets import batch_process_documents_processor_version_sample + +location = "us" +project_id = os.environ["GOOGLE_CLOUD_PROJECT"] +processor_id = "90484cfdedb024f6" +processor_version_id = "pretrained-form-parser-v1.0-2020-09-23" +gcs_input_uri = "gs://cloud-samples-data/documentai/invoice.pdf" +input_mime_type = "application/pdf" +gcs_output_uri_prefix = uuid4() +BUCKET_NAME = f"document-ai-python-{uuid4()}" + + +@pytest.fixture(scope="module") +def test_bucket(): + storage_client = storage.Client() + bucket = storage_client.create_bucket(BUCKET_NAME) + yield bucket.name + + try: + blobs = list(bucket.list_blobs()) + for blob in blobs: + blob.delete() + bucket.delete() + except NotFound: + print("Bucket already deleted.") + + +def test_batch_process_documents_processor_version(capsys, test_bucket): + batch_process_documents_processor_version_sample.batch_process_documents_processor_version( + project_id=project_id, + location=location, + processor_id=processor_id, + processor_version_id=processor_version_id, + gcs_input_uri=gcs_input_uri, + input_mime_type=input_mime_type, + gcs_output_bucket=f"gs://{test_bucket}", + gcs_output_uri_prefix=gcs_output_uri_prefix, + ) + out, _ = capsys.readouterr() + + assert "operation" in out + assert "Fetching" in out + assert "text:" in out diff --git a/samples/snippets/batch_process_documents_sample.py b/samples/snippets/batch_process_documents_sample.py index f3e01936..f01d8787 100644 --- a/samples/snippets/batch_process_documents_sample.py +++ b/samples/snippets/batch_process_documents_sample.py @@ -23,7 +23,6 @@ # project_id = 'YOUR_PROJECT_ID' # location = 'YOUR_PROCESSOR_LOCATION' # Format is 'us' or 'eu' # processor_id = 'YOUR_PROCESSOR_ID' # Create processor before running sample -# processor_version = "pretrained" # Optional. Processor version to use # gcs_input_uri = "YOUR_INPUT_URI" # Format: gs://bucket/directory/file.pdf # input_mime_type = "application/pdf" # gcs_output_bucket = "YOUR_OUTPUT_BUCKET_NAME" # Format: gs://bucket @@ -73,17 +72,8 @@ def batch_process_documents( # The full resource name of the processor, e.g.: # projects/project_id/locations/location/processor/processor_id - # You must create new processors in the Cloud Console first name = client.processor_path(project_id, location, processor_id) - # NOTE: Alternatively, specify the processor_version to specify a particular version of the processor to use - # projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processorVersion} - # - # name = client.processor_version_path( - # project_id, location, processor_id, processor_version - # ) - # - request = documentai.BatchProcessRequest( name=name, input_documents=input_config, diff --git a/samples/snippets/batch_process_documents_sample_bad_input_test.py b/samples/snippets/batch_process_documents_sample_bad_input_test.py index 7d2ffd75..a130f63d 100644 --- a/samples/snippets/batch_process_documents_sample_bad_input_test.py +++ b/samples/snippets/batch_process_documents_sample_bad_input_test.py @@ -44,4 +44,4 @@ def test_batch_process_documents_with_bad_input(capsys): out, _ = capsys.readouterr() assert "Failed" in out except Exception as e: - assert "Internal error" in e.message + assert "Failed" in e.message diff --git a/samples/snippets/delete_processor_version_sample.py b/samples/snippets/delete_processor_version_sample.py new file mode 100644 index 00000000..8ff8703d --- /dev/null +++ b/samples/snippets/delete_processor_version_sample.py @@ -0,0 +1,58 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# [START documentai_delete_processor_version] + +from google.api_core.client_options import ClientOptions +from google.api_core.exceptions import FailedPrecondition, InvalidArgument +from google.cloud import documentai + +# TODO(developer): Uncomment these variables before running the sample. +# project_id = 'YOUR_PROJECT_ID' +# location = 'YOUR_PROCESSOR_LOCATION' # Format is 'us' or 'eu' +# processor_id = 'YOUR_PROCESSOR_ID' # Create processor before running sample +# processor_version_id = 'YOUR_PROCESSOR_VERSION_ID' + + +def delete_processor_version_sample( + project_id: str, location: str, processor_id: str, processor_version_id: str +): + # You must set the api_endpoint if you use a location other than 'us', e.g.: + opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com") + + client = documentai.DocumentProcessorServiceClient(client_options=opts) + + # The full resource name of the processor version + # e.g.: projects/project_id/locations/location/processors/processor_id/processorVersions/processor_version_id + name = client.processor_version_path( + project_id, location, processor_id, processor_version_id + ) + + # Make DeleteProcessorVersion request + try: + operation = client.delete_processor_version(name=name) + # Print operation details + print(operation.operation.name) + # Wait for operation to complete + operation.result() + # Delete request will fail if the + # processor version doesn't exist + # or if a request is made on a pretrained processor version + # or the default processor version + except (FailedPrecondition, InvalidArgument) as e: + print(e.message) + + +# [END documentai_delete_processor_version] diff --git a/samples/snippets/delete_processor_version_sample_test.py b/samples/snippets/delete_processor_version_sample_test.py new file mode 100644 index 00000000..4104cd07 --- /dev/null +++ b/samples/snippets/delete_processor_version_sample_test.py @@ -0,0 +1,47 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os + +import mock +from samples.snippets import delete_processor_version_sample + +location = "us" +project_id = os.environ["GOOGLE_CLOUD_PROJECT"] +processor_id = "aaaaaaaaa" +processor_version_id = "xxxxxxxxxx" + + +@mock.patch( + "google.cloud.documentai.DocumentProcessorServiceClient.delete_processor_version" +) +@mock.patch("google.api_core.operation.Operation") +def test_delete_processor_version( + operation_mock, delete_processor_version_mock, capsys +): + delete_processor_version_mock.return_value = operation_mock + + delete_processor_version_sample.delete_processor_version_sample( + project_id=project_id, + location=location, + processor_id=processor_id, + processor_version_id=processor_version_id, + ) + + delete_processor_version_mock.assert_called_once() + + out, _ = capsys.readouterr() + + assert "operation" in out diff --git a/samples/snippets/deploy_processor_version_sample.py b/samples/snippets/deploy_processor_version_sample.py new file mode 100644 index 00000000..217a23b3 --- /dev/null +++ b/samples/snippets/deploy_processor_version_sample.py @@ -0,0 +1,56 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# [START documentai_deploy_processor_version] + +from google.api_core.client_options import ClientOptions +from google.api_core.exceptions import FailedPrecondition +from google.cloud import documentai + +# TODO(developer): Uncomment these variables before running the sample. +# project_id = 'YOUR_PROJECT_ID' +# location = 'YOUR_PROCESSOR_LOCATION' # Format is 'us' or 'eu' +# processor_id = 'YOUR_PROCESSOR_ID' +# processor_version_id = 'YOUR_PROCESSOR_VERSION_ID' + + +def deploy_processor_version_sample( + project_id: str, location: str, processor_id: str, processor_version_id: str +): + # You must set the api_endpoint if you use a location other than 'us', e.g.: + opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com") + + client = documentai.DocumentProcessorServiceClient(client_options=opts) + + # The full resource name of the processor version + # e.g.: projects/project_id/locations/location/processors/processor_id/processorVersions/processor_version_id + name = client.processor_version_path( + project_id, location, processor_id, processor_version_id + ) + + # Make DeployProcessorVersion request + try: + operation = client.deploy_processor_version(name=name) + # Print operation details + print(operation.operation.name) + # Wait for operation to complete + operation.result() + # Deploy request will fail if the + # processor version is already deployed + except FailedPrecondition as e: + print(e.message) + + +# [END documentai_deploy_processor_version] diff --git a/samples/snippets/deploy_processor_version_sample_test.py b/samples/snippets/deploy_processor_version_sample_test.py new file mode 100644 index 00000000..31f96925 --- /dev/null +++ b/samples/snippets/deploy_processor_version_sample_test.py @@ -0,0 +1,48 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os + +import mock +from samples.snippets import deploy_processor_version_sample + +location = "us" +project_id = os.environ["GOOGLE_CLOUD_PROJECT"] +processor_id = "aaaaaaaaa" +processor_version_id = "xxxxxxxxxx" + + +# TODO: Switch to Real Endpoint when Deployable Versions are Available +@mock.patch( + "google.cloud.documentai.DocumentProcessorServiceClient.deploy_processor_version" +) +@mock.patch("google.api_core.operation.Operation") +def test_deploy_processor_version( + operation_mock, deploy_processor_version_mock, capsys +): + deploy_processor_version_mock.return_value = operation_mock + + deploy_processor_version_sample.deploy_processor_version_sample( + project_id=project_id, + location=location, + processor_id=processor_id, + processor_version_id=processor_version_id, + ) + + deploy_processor_version_mock.assert_called_once() + + out, _ = capsys.readouterr() + + assert "operation" in out diff --git a/samples/snippets/disable_processor_sample_test.py b/samples/snippets/disable_processor_sample_test.py index 0420ee48..0a816723 100644 --- a/samples/snippets/disable_processor_sample_test.py +++ b/samples/snippets/disable_processor_sample_test.py @@ -28,9 +28,7 @@ def test_disable_processor(capsys): ) out, _ = capsys.readouterr() - assert "projects" in out - assert "locations" in out - assert "operations" in out + assert "projects" in out or "DISABLED" in out # Re-Enable Processor enable_processor_sample.enable_processor_sample( diff --git a/samples/snippets/enable_processor_sample_test.py b/samples/snippets/enable_processor_sample_test.py index 0a238cd0..a4ccc370 100644 --- a/samples/snippets/enable_processor_sample_test.py +++ b/samples/snippets/enable_processor_sample_test.py @@ -28,9 +28,7 @@ def test_enable_processor(capsys): ) out, _ = capsys.readouterr() - assert "projects" in out - assert "locations" in out - assert "operations" in out + assert "projects" in out or "ENABLED" in out # Re-Disable Processor disable_processor_sample.disable_processor_sample( diff --git a/samples/snippets/get_processor_sample_test.py b/samples/snippets/get_processor_sample_test.py index b1848422..f8a37bea 100644 --- a/samples/snippets/get_processor_sample_test.py +++ b/samples/snippets/get_processor_sample_test.py @@ -19,7 +19,7 @@ location = "us" project_id = os.environ["GOOGLE_CLOUD_PROJECT"] -processor_id = "91e072f8626a76b7" +processor_id = "52a38e080c1a7296" def test_get_processor(capsys): diff --git a/samples/snippets/get_processor_version_sample.py b/samples/snippets/get_processor_version_sample.py new file mode 100644 index 00000000..5dc0babd --- /dev/null +++ b/samples/snippets/get_processor_version_sample.py @@ -0,0 +1,51 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# [START documentai_get_processor_version] + +from google.api_core.client_options import ClientOptions +from google.cloud import documentai + +# TODO(developer): Uncomment these variables before running the sample. +# project_id = 'YOUR_PROJECT_ID' +# location = 'YOUR_PROCESSOR_LOCATION' # Format is 'us' or 'eu' +# processor_id = 'YOUR_PROCESSOR_ID' # Create processor before running sample +# processor_version_id = 'YOUR_PROCESSOR_VERSION_ID' + + +def get_processor_version_sample( + project_id: str, location: str, processor_id: str, processor_version_id: str +): + # You must set the api_endpoint if you use a location other than 'us', e.g.: + opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com") + + client = documentai.DocumentProcessorServiceClient(client_options=opts) + + # The full resource name of the processor version + # e.g.: projects/project_id/locations/location/processors/processor_id/processorVersions/processor_version_id + name = client.processor_version_path( + project_id, location, processor_id, processor_version_id + ) + + # Make GetProcessorVersion request + processor_version = client.get_processor_version(name=name) + + # Print the processor version information + print(f"Processor Version: {processor_version_id}") + print(f"Display Name: {processor_version.display_name}") + print(processor_version.state) + + +# [END documentai_get_processor_version] diff --git a/samples/snippets/get_processor_version_sample_test.py b/samples/snippets/get_processor_version_sample_test.py new file mode 100644 index 00000000..071d740a --- /dev/null +++ b/samples/snippets/get_processor_version_sample_test.py @@ -0,0 +1,37 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os + +from samples.snippets import get_processor_version_sample + +location = "us" +project_id = os.environ["GOOGLE_CLOUD_PROJECT"] +processor_id = "52a38e080c1a7296" +processor_version_id = "pretrained-ocr-v1.0-2020-09-23" + + +def test_get_processor_version(capsys): + get_processor_version_sample.get_processor_version_sample( + project_id=project_id, + location=location, + processor_id=processor_id, + processor_version_id=processor_version_id, + ) + out, _ = capsys.readouterr() + + assert "Processor Version: pretrained-ocr" in out + assert "Display Name: Google Stable" in out + assert "DEPLOYED" in out diff --git a/samples/snippets/list_processor_versions_sample.py b/samples/snippets/list_processor_versions_sample.py new file mode 100644 index 00000000..f615c1bb --- /dev/null +++ b/samples/snippets/list_processor_versions_sample.py @@ -0,0 +1,52 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# [START documentai_list_processor_versions] + +from google.api_core.client_options import ClientOptions +from google.cloud import documentai + +# TODO(developer): Uncomment these variables before running the sample. +# project_id = 'YOUR_PROJECT_ID' +# location = 'YOUR_PROCESSOR_LOCATION' # Format is 'us' or 'eu' +# processor_id = 'YOUR_PROCESSOR_ID' # Create processor before running sample + + +def list_processor_versions_sample(project_id: str, location: str, processor_id: str): + # You must set the api_endpoint if you use a location other than 'us', e.g.: + opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com") + + client = documentai.DocumentProcessorServiceClient(client_options=opts) + + # The full resource name of the processor + # e.g.: projects/project_id/locations/location/processors/processor_id + parent = client.processor_path(project_id, location, processor_id) + + # Make ListProcessorVersions request + processor_versions = client.list_processor_versions(parent=parent) + + # Print the processor version information + for processor_version in processor_versions: + processor_version_id = client.parse_processor_version_path( + processor_version.name + )["processor_version"] + + print(f"Processor Version: {processor_version_id}") + print(f"Display Name: {processor_version.display_name}") + print(processor_version.state) + print("") + + +# [END documentai_list_processor_versions] diff --git a/samples/snippets/list_processor_versions_sample_test.py b/samples/snippets/list_processor_versions_sample_test.py new file mode 100644 index 00000000..16219795 --- /dev/null +++ b/samples/snippets/list_processor_versions_sample_test.py @@ -0,0 +1,34 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os + +from samples.snippets import list_processor_versions_sample + +location = "us" +project_id = os.environ["GOOGLE_CLOUD_PROJECT"] +processor_id = "52a38e080c1a7296" + + +def test_list_processor_versions(capsys): + list_processor_versions_sample.list_processor_versions_sample( + project_id=project_id, location=location, processor_id=processor_id + ) + out, _ = capsys.readouterr() + + assert "Processor Version: pretrained-ocr" in out + assert "Display Name: Google Stable" in out + assert "Display Name: Google Release Candidate" in out + assert "DEPLOYED" in out diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index e9eb1cbf..c1715136 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -207,8 +207,10 @@ def _session_tests( session: nox.sessions.Session, post_install: Callable = None ) -> None: # check for presence of tests - test_list = glob.glob("*_test.py") + glob.glob("test_*.py") - test_list.extend(glob.glob("tests")) + test_list = glob.glob("**/*_test.py", recursive=True) + glob.glob( + "**/test_*.py", recursive=True + ) + test_list.extend(glob.glob("**/tests", recursive=True)) if len(test_list) == 0: print("No tests found, skipping directory.") diff --git a/samples/snippets/process_document_form_sample.py b/samples/snippets/process_document_form_sample.py index 7922490f..c113d6a8 100644 --- a/samples/snippets/process_document_form_sample.py +++ b/samples/snippets/process_document_form_sample.py @@ -81,7 +81,6 @@ def process_document( # The full resource name of the processor, e.g.: # projects/project_id/locations/location/processor/processor_id - # You must create new processors in the Cloud Console first name = client.processor_path(project_id, location, processor_id) # Read the file into memory diff --git a/samples/snippets/process_document_ocr_sample_test.py b/samples/snippets/process_document_ocr_sample_test.py index ba46ca17..d6cceb46 100644 --- a/samples/snippets/process_document_ocr_sample_test.py +++ b/samples/snippets/process_document_ocr_sample_test.py @@ -19,7 +19,7 @@ location = "us" project_id = os.environ["GOOGLE_CLOUD_PROJECT"] -processor_id = "91e072f8626a76b7" +processor_id = "52a38e080c1a7296" file_path = "resources/handwritten_form.pdf" mime_type = "application/pdf" diff --git a/samples/snippets/process_document_processor_version_sample.py b/samples/snippets/process_document_processor_version_sample.py new file mode 100644 index 00000000..39db461e --- /dev/null +++ b/samples/snippets/process_document_processor_version_sample.py @@ -0,0 +1,74 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# [START documentai_process_document_processor_version] + +from google.api_core.client_options import ClientOptions +from google.cloud import documentai + +# TODO(developer): Uncomment these variables before running the sample. +# project_id = 'YOUR_PROJECT_ID' +# location = 'YOUR_PROCESSOR_LOCATION' # Format is 'us' or 'eu' +# processor_id = 'YOUR_PROCESSOR_ID' # Create processor before running sample +# processor_version_id = 'YOUR_PROCESSOR_VERSION_ID' # Processor version to use +# file_path = '/path/to/local/pdf' +# mime_type = 'application/pdf' # Refer to https://cloud.google.com/document-ai/docs/file-types for supported file types +# field_mask = "text,entities,pages.pageNumber" # Optional. The fields to return in the Document object. + + +def process_document_processor_version_sample( + project_id: str, + location: str, + processor_id: str, + processor_version_id: str, + file_path: str, + mime_type: str, + field_mask: str = None, +): + # You must set the api_endpoint if you use a location other than 'us', e.g.: + opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com") + + client = documentai.DocumentProcessorServiceClient(client_options=opts) + + # The full resource name of the processor version + # e.g. projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processor_version_id} + name = client.processor_version_path( + project_id, location, processor_id, processor_version_id + ) + + # Read the file into memory + with open(file_path, "rb") as image: + image_content = image.read() + + # Load Binary Data into Document AI RawDocument Object + raw_document = documentai.RawDocument(content=image_content, mime_type=mime_type) + + # Configure the process request + request = documentai.ProcessRequest( + name=name, raw_document=raw_document, field_mask=field_mask + ) + + result = client.process_document(request=request) + + # For a full list of Document object attributes, please reference this page: + # https://cloud.google.com/python/docs/reference/documentai/latest/google.cloud.documentai_v1.types.Document + document = result.document + + # Read the text recognition output from the processor + print("The document contains the following text:") + print(document.text) + + +# [END documentai_process_document_processor_version] diff --git a/samples/snippets/process_document_processor_version_sample_test.py b/samples/snippets/process_document_processor_version_sample_test.py new file mode 100644 index 00000000..50d8bc63 --- /dev/null +++ b/samples/snippets/process_document_processor_version_sample_test.py @@ -0,0 +1,42 @@ +# # Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os + +from samples.snippets import process_document_processor_version_sample + +location = "us" +project_id = os.environ["GOOGLE_CLOUD_PROJECT"] +processor_id = "90484cfdedb024f6" +processor_version_id = "stable" +file_path = "resources/invoice.pdf" +mime_type = "application/pdf" +field_mask = "text,pages.pageNumber" + + +def test_process_document_processor_versions(capsys): + process_document_processor_version_sample.process_document_processor_version_sample( + project_id=project_id, + location=location, + processor_id=processor_id, + processor_version_id=processor_version_id, + file_path=file_path, + mime_type=mime_type, + field_mask=field_mask, + ) + out, _ = capsys.readouterr() + + assert "text:" in out + assert "Invoice" in out diff --git a/samples/snippets/process_document_quality_sample.py b/samples/snippets/process_document_quality_sample.py index 0bbca75d..79e88977 100644 --- a/samples/snippets/process_document_quality_sample.py +++ b/samples/snippets/process_document_quality_sample.py @@ -60,7 +60,6 @@ def process_document( # The full resource name of the processor, e.g.: # projects/project_id/locations/location/processor/processor_id - # You must create new processors in the Cloud Console first name = client.processor_path(project_id, location, processor_id) # Read the file into memory diff --git a/samples/snippets/process_document_sample.py b/samples/snippets/process_document_sample.py index 13d7850e..2cd93538 100644 --- a/samples/snippets/process_document_sample.py +++ b/samples/snippets/process_document_sample.py @@ -21,8 +21,7 @@ # TODO(developer): Uncomment these variables before running the sample. # project_id = 'YOUR_PROJECT_ID' # location = 'YOUR_PROCESSOR_LOCATION' # Format is 'us' or 'eu' -# processor_id = 'YOUR_PROCESSOR_ID' # Create processor before running sample -# processor_version = "pretrained" # Optional. Processor version to use +# processor_id = 'YOUR_PROCESSOR_ID' # Create processor before running sample # file_path = '/path/to/local/pdf' # mime_type = 'application/pdf' # Refer to https://cloud.google.com/document-ai/docs/file-types for supported file types # field_mask = "text,entities,pages.pageNumber" # Optional. The fields to return in the Document object. @@ -43,17 +42,8 @@ def process_document_sample( # The full resource name of the processor, e.g.: # projects/{project_id}/locations/{location}/processors/{processor_id} - # You must create new processors in the Cloud Console first name = client.processor_path(project_id, location, processor_id) - # NOTE: Alternatively, specify the processor_version to specify a particular version of the processor to use - # projects/{project_id}/locations/{location}/processors/{processor_id}/processorVersions/{processorVersion} - # - # name = client.processor_version_path( - # project_id, location, processor_id, processor_version - # ) - # - # Read the file into memory with open(file_path, "rb") as image: image_content = image.read() diff --git a/samples/snippets/process_document_sample_test.py b/samples/snippets/process_document_sample_test.py index bf7bcd63..6da4ae36 100644 --- a/samples/snippets/process_document_sample_test.py +++ b/samples/snippets/process_document_sample_test.py @@ -22,6 +22,7 @@ processor_id = "90484cfdedb024f6" file_path = "resources/invoice.pdf" mime_type = "application/pdf" +field_mask = "text,pages.pageNumber" def test_process_documents(capsys): @@ -31,6 +32,7 @@ def test_process_documents(capsys): processor_id=processor_id, file_path=file_path, mime_type=mime_type, + field_mask=field_mask, ) out, _ = capsys.readouterr() diff --git a/samples/snippets/process_document_specialized_sample.py b/samples/snippets/process_document_specialized_sample.py index c78ca704..272d8cdc 100644 --- a/samples/snippets/process_document_specialized_sample.py +++ b/samples/snippets/process_document_specialized_sample.py @@ -78,7 +78,6 @@ def process_document( # The full resource name of the processor, e.g.: # projects/project_id/locations/location/processor/processor_id - # You must create new processors in the Cloud Console first name = client.processor_path(project_id, location, processor_id) # Read the file into memory diff --git a/samples/snippets/process_document_splitter_sample.py b/samples/snippets/process_document_splitter_sample.py index b78c557c..e49e8ff1 100644 --- a/samples/snippets/process_document_splitter_sample.py +++ b/samples/snippets/process_document_splitter_sample.py @@ -67,7 +67,6 @@ def process_document( # The full resource name of the processor, e.g.: # projects/project_id/locations/location/processor/processor_id - # You must create new processors in the Cloud Console first name = client.processor_path(project_id, location, processor_id) # Read the file into memory diff --git a/samples/snippets/quickstart_sample.py b/samples/snippets/quickstart_sample.py index 23dcf084..e830acdf 100644 --- a/samples/snippets/quickstart_sample.py +++ b/samples/snippets/quickstart_sample.py @@ -38,7 +38,6 @@ def quickstart( # The full resource name of the processor, e.g.: # projects/project_id/locations/location/processor/processor_id - # You must create new processors in the Cloud Console first name = client.processor_path(project_id, location, processor_id) # Read the file into memory diff --git a/samples/snippets/requirements.txt b/samples/snippets/requirements.txt index 31caa748..e62b9a26 100644 --- a/samples/snippets/requirements.txt +++ b/samples/snippets/requirements.txt @@ -1,2 +1,2 @@ -google-cloud-documentai==2.0.0 +google-cloud-documentai==2.0.1 google-cloud-storage==2.5.0 diff --git a/samples/snippets/review_document_sample.py b/samples/snippets/review_document_sample.py index 2bfa4dcd..969cf59a 100644 --- a/samples/snippets/review_document_sample.py +++ b/samples/snippets/review_document_sample.py @@ -74,7 +74,6 @@ def process_document( # The full resource name of the processor, e.g.: # projects/project_id/locations/location/processor/processor_id - # You must create new processors in the Cloud Console first name = client.processor_path(project_id, location, processor_id) # Read the file into memory diff --git a/samples/snippets/set_default_processor_version_sample.py b/samples/snippets/set_default_processor_version_sample.py new file mode 100644 index 00000000..2c7c3797 --- /dev/null +++ b/samples/snippets/set_default_processor_version_sample.py @@ -0,0 +1,62 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# [START documentai_set_default_processor_version] + +from google.api_core.client_options import ClientOptions +from google.api_core.exceptions import NotFound +from google.cloud import documentai + +# TODO(developer): Uncomment these variables before running the sample. +# project_id = 'YOUR_PROJECT_ID' +# location = 'YOUR_PROCESSOR_LOCATION' # Format is 'us' or 'eu' +# processor_id = 'YOUR_PROCESSOR_ID' # Create processor before running sample +# processor_version_id = 'YOUR_PROCESSOR_VERSION_ID' + + +def set_default_processor_version_sample( + project_id: str, location: str, processor_id: str, processor_version_id: str +): + # You must set the api_endpoint if you use a location other than 'us', e.g.: + opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com") + + client = documentai.DocumentProcessorServiceClient(client_options=opts) + + # The full resource name of the processor + # e.g.: projects/project_id/locations/location/processors/processor_id + processor = client.processor_path(project_id, location, processor_id) + + # The full resource name of the processor version + # e.g.: projects/project_id/locations/location/processors/processor_id/processorVersions/processor_version_id + processor_version = client.processor_version_path( + project_id, location, processor_id, processor_version_id + ) + + request = documentai.SetDefaultProcessorVersionRequest( + processor=processor, default_processor_version=processor_version + ) + + # Make SetDefaultProcessorVersion request + try: + operation = client.set_default_processor_version(request) + # Print operation details + print(operation.operation.name) + # Wait for operation to complete + operation.result() + except NotFound as e: + print(e.message) + + +# [END documentai_set_default_processor_version] diff --git a/samples/snippets/set_default_processor_version_sample_test.py b/samples/snippets/set_default_processor_version_sample_test.py new file mode 100644 index 00000000..5750344d --- /dev/null +++ b/samples/snippets/set_default_processor_version_sample_test.py @@ -0,0 +1,44 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os + +from samples.snippets import set_default_processor_version_sample + +location = "us" +project_id = os.environ["GOOGLE_CLOUD_PROJECT"] +processor_id = "aeb8cea219b7c272" +current_default_processor_version = "pretrained-ocr-v1.0-2020-09-23" +new_default_processor_version = "pretrained-ocr-v1.1-2022-09-12" + + +def test_set_default_processor_version(capsys): + set_default_processor_version_sample.set_default_processor_version_sample( + project_id=project_id, + location=location, + processor_id=processor_id, + processor_version_id=new_default_processor_version, + ) + out, _ = capsys.readouterr() + + assert "operation" in out + + # Set back to previous default + set_default_processor_version_sample.set_default_processor_version_sample( + project_id=project_id, + location=location, + processor_id=processor_id, + processor_version_id=current_default_processor_version, + ) diff --git a/samples/snippets/undeploy_processor_version_sample.py b/samples/snippets/undeploy_processor_version_sample.py new file mode 100644 index 00000000..0ad19276 --- /dev/null +++ b/samples/snippets/undeploy_processor_version_sample.py @@ -0,0 +1,57 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# [START documentai_undeploy_processor_version] + +from google.api_core.client_options import ClientOptions +from google.api_core.exceptions import FailedPrecondition, InvalidArgument +from google.cloud import documentai + +# TODO(developer): Uncomment these variables before running the sample. +# project_id = 'YOUR_PROJECT_ID' +# location = 'YOUR_PROCESSOR_LOCATION' # Format is 'us' or 'eu' +# processor_id = 'YOUR_PROCESSOR_ID' # Create processor before running sample +# processor_version_id = 'YOUR_PROCESSOR_VERSION_ID' + + +def undeploy_processor_version_sample( + project_id: str, location: str, processor_id: str, processor_version_id: str +): + # You must set the api_endpoint if you use a location other than 'us', e.g.: + opts = ClientOptions(api_endpoint=f"{location}-documentai.googleapis.com") + + client = documentai.DocumentProcessorServiceClient(client_options=opts) + + # The full resource name of the processor version + # e.g.: projects/project_id/locations/location/processors/processor_id/processorVersions/processor_version_id + name = client.processor_version_path( + project_id, location, processor_id, processor_version_id + ) + + # Make UndeployProcessorVersion request + try: + operation = client.undeploy_processor_version(name=name) + # Print operation details + print(operation.operation.name) + # Wait for operation to complete + operation.result() + # Undeploy request will fail if the + # processor version is already undeployed + # or if a request is made on a pretrained processor version + except (FailedPrecondition, InvalidArgument) as e: + print(e.message) + + +# [END documentai_undeploy_processor_version] diff --git a/samples/snippets/undeploy_processor_version_sample_test.py b/samples/snippets/undeploy_processor_version_sample_test.py new file mode 100644 index 00000000..36f27438 --- /dev/null +++ b/samples/snippets/undeploy_processor_version_sample_test.py @@ -0,0 +1,48 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os + +import mock +from samples.snippets import undeploy_processor_version_sample + +location = "us" +project_id = os.environ["GOOGLE_CLOUD_PROJECT"] +processor_id = "aaaaaaaaa" +processor_version_id = "xxxxxxxxxx" + + +# TODO: Switch to Real Endpoint when Deployable Versions are Available +@mock.patch( + "google.cloud.documentai.DocumentProcessorServiceClient.undeploy_processor_version" +) +@mock.patch("google.api_core.operation.Operation") +def test_undeploy_processor_version( + operation_mock, undeploy_processor_version_mock, capsys +): + undeploy_processor_version_mock.return_value = operation_mock + + undeploy_processor_version_sample.undeploy_processor_version_sample( + project_id=project_id, + location=location, + processor_id=processor_id, + processor_version_id=processor_version_id, + ) + + undeploy_processor_version_mock.assert_called_once() + + out, _ = capsys.readouterr() + + assert "operation" in out diff --git a/setup.py b/setup.py index 11a7fe50..cdda178e 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ import setuptools # type: ignore -version = "2.0.1" +version = "2.0.2" package_root = os.path.abspath(os.path.dirname(__file__)) @@ -48,7 +48,7 @@ install_requires=( "google-api-core[grpc] >= 1.32.0, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*", "proto-plus >= 1.22.0, <2.0.0dev", - "protobuf >= 3.19.0, <5.0.0dev", + "protobuf >= 3.20.2, <5.0.0dev", ), python_requires=">=3.7", classifiers=[ diff --git a/testing/constraints-3.7.txt b/testing/constraints-3.7.txt index 51901fbc..260e08b9 100644 --- a/testing/constraints-3.7.txt +++ b/testing/constraints-3.7.txt @@ -7,4 +7,4 @@ # Then this file should have foo==1.14.0 google-api-core==1.32.0 proto-plus==1.22.0 -protobuf==3.19.0 +protobuf==3.20.2 diff --git a/tests/unit/gapic/documentai_v1/test_document_processor_service.py b/tests/unit/gapic/documentai_v1/test_document_processor_service.py index 8b0756b0..e56ceba9 100644 --- a/tests/unit/gapic/documentai_v1/test_document_processor_service.py +++ b/tests/unit/gapic/documentai_v1/test_document_processor_service.py @@ -55,6 +55,7 @@ from google.type import postal_address_pb2 # type: ignore import grpc from grpc.experimental import aio +from proto.marshal.rules import wrappers from proto.marshal.rules.dates import DurationRule, TimestampRule import pytest diff --git a/tests/unit/gapic/documentai_v1beta2/test_document_understanding_service.py b/tests/unit/gapic/documentai_v1beta2/test_document_understanding_service.py index 0b51c636..782f9b60 100644 --- a/tests/unit/gapic/documentai_v1beta2/test_document_understanding_service.py +++ b/tests/unit/gapic/documentai_v1beta2/test_document_understanding_service.py @@ -44,6 +44,7 @@ from google.rpc import status_pb2 # type: ignore import grpc from grpc.experimental import aio +from proto.marshal.rules import wrappers from proto.marshal.rules.dates import DurationRule, TimestampRule import pytest diff --git a/tests/unit/gapic/documentai_v1beta3/test_document_processor_service.py b/tests/unit/gapic/documentai_v1beta3/test_document_processor_service.py index 14821a65..559c60d8 100644 --- a/tests/unit/gapic/documentai_v1beta3/test_document_processor_service.py +++ b/tests/unit/gapic/documentai_v1beta3/test_document_processor_service.py @@ -55,6 +55,7 @@ from google.type import postal_address_pb2 # type: ignore import grpc from grpc.experimental import aio +from proto.marshal.rules import wrappers from proto.marshal.rules.dates import DurationRule, TimestampRule import pytest
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: