-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* [samples] added 'batch_translation_async' sample * [samples] added 'batch_translation_with_storage_async' sample * [samples] added remianing async samples * [samples] update file names * [samples] added self to instance methods * [samples][async] fix import textanalytics :) * [samples] fix self. when calling instance methods * [samples] fixed async check status to use AsyncItemPaged used in Async Client * [samples] async -> some async operations instead of sync ones * [samples][async] use async blob operations * [samples][async] blob download async * [samples][async] check_documents async * [samples][async] added some missing await methods * [async samples] change await time to recommended period * [samples] updated async samples to comply with new changes
- Loading branch information
Mohamed Shaban
authored
Mar 3, 2021
1 parent
b972486
commit 28aabfb
Showing
10 changed files
with
582 additions
and
7 deletions.
There are no files selected for viewing
113 changes: 113 additions & 0 deletions
113
...tion/azure-ai-documenttranslation/samples/async_samples/sample_batch_translation_async.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
# coding=utf-8 | ||
# ------------------------------------ | ||
# Copyright (c) Microsoft Corporation. | ||
# Licensed under the MIT License. | ||
# ------------------------------------ | ||
|
||
import os | ||
import asyncio | ||
|
||
|
||
class BatchTranslationSampleAsync(object): | ||
|
||
async def batch_translation_async(self): | ||
# import libraries | ||
from azure.core.credentials import AzureKeyCredential | ||
from azure.ai.documenttranslation.aio import DocumentTranslationClient | ||
from azure.ai.documenttranslation import ( | ||
BatchDocumentInput, | ||
StorageTarget | ||
) | ||
|
||
# get service secrets | ||
endpoint = os.environ["AZURE_DOCUMENT_TRANSLATION_ENDPOINT"] | ||
key = os.environ["AZURE_DOCUMENT_TRANSLATION_KEY"] | ||
source_container_url_en = os.environ["AZURE_SOURCE_CONTAINER_URL_EN"] | ||
source_container_url_de = os.environ["AZURE_SOURCE_CONTAINER_URL_DE"] | ||
target_container_url_es = os.environ["AZURE_TARGET_CONTAINER_URL_ES"] | ||
target_container_url_fr = os.environ["AZURE_TARGET_CONTAINER_URL_FR"] | ||
|
||
# create service client | ||
client = DocumentTranslationClient(endpoint, AzureKeyCredential(key)) | ||
|
||
# prepare translation job input | ||
batch = [ | ||
BatchDocumentInput( | ||
source_url=source_container_url_en, | ||
targets=[ | ||
StorageTarget( | ||
target_url=target_container_url_es, | ||
language="es" | ||
), | ||
StorageTarget( | ||
target_url=target_container_url_fr, | ||
language="fr" | ||
) | ||
] | ||
), | ||
BatchDocumentInput( | ||
source_url=source_container_url_de, | ||
targets=[ | ||
StorageTarget( | ||
target_url=target_container_url_es, | ||
language="es" | ||
), | ||
StorageTarget( | ||
target_url=target_container_url_fr, | ||
language="fr" | ||
) | ||
] | ||
) | ||
] | ||
|
||
# run translation job | ||
async with client: | ||
job_detail = await client.create_translation_job(batch) # type: JobStatusDetail | ||
|
||
print("Job initial status: {}".format(job_detail.status)) | ||
print("Number of translations on documents: {}".format(job_detail.documents_total_count)) | ||
|
||
# get job result | ||
job_result = await client.wait_until_done(job_detail.id) # type: JobStatusDetail | ||
if job_result.status == "Succeeded": | ||
print("We translated our documents!") | ||
if job_result.documents_failed_count > 0: | ||
await self.check_documents(client, job_result.id) | ||
|
||
elif job_result.status in ["Failed", "ValidationFailed"]: | ||
if job_result.error: | ||
print("Translation job failed: {}: {}".format(job_result.error.code, job_result.error.message)) | ||
await self.check_documents(client, job_result.id) | ||
exit(1) | ||
|
||
|
||
async def check_documents(self, client, job_id): | ||
from azure.core.exceptions import ResourceNotFoundError | ||
|
||
try: | ||
doc_statuses = client.list_documents_statuses(job_id) # type: AsyncItemPaged[DocumentStatusDetail] | ||
except ResourceNotFoundError as err: | ||
print("Failed to process any documents in source/target container due to insufficient permissions.") | ||
raise err | ||
|
||
docs_to_retry = [] | ||
async for document in doc_statuses: | ||
if document.status == "Failed": | ||
print("Document at {} failed to be translated to {} language".format( | ||
document.url, document.translate_to | ||
)) | ||
print("Document ID: {}, Error Code: {}, Message: {}".format( | ||
document.id, document.error.code, document.error.message | ||
)) | ||
if document.url not in docs_to_retry: | ||
docs_to_retry.append(document.url) | ||
|
||
|
||
async def main(): | ||
sample = BatchTranslationSampleAsync() | ||
await sample.batch_translation_async() | ||
|
||
|
||
if __name__ == '__main__': | ||
loop = asyncio.get_event_loop() | ||
loop.run_until_complete(main()) |
142 changes: 142 additions & 0 deletions
142
...-documenttranslation/samples/async_samples/sample_batch_translation_with_storage_async.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
# coding=utf-8 | ||
# ------------------------------------ | ||
# Copyright (c) Microsoft Corporation. | ||
# Licensed under the MIT License. | ||
# ------------------------------------ | ||
|
||
import os | ||
import asyncio | ||
|
||
|
||
class BatchTranslationWithStorageSampleAsync(object): | ||
|
||
async def batch_translation_with_storage_async(self): | ||
# import libraries | ||
from azure.core.credentials import AzureKeyCredential | ||
from azure.ai.documenttranslation.aio import DocumentTranslationClient | ||
from azure.ai.documenttranslation import ( | ||
BatchDocumentInput, | ||
StorageTarget | ||
) | ||
from azure.storage.blob.aio import ContainerClient | ||
from azure.storage.blob import ( | ||
generate_container_sas, | ||
ContainerSasPermissions | ||
) | ||
|
||
# get service secrets | ||
endpoint = os.environ["AZURE_DOCUMENT_TRANSLATION_ENDPOINT"] | ||
key = os.environ["AZURE_DOCUMENT_TRANSLATION_KEY"] | ||
source_storage_endpoint = os.environ["AZURE_STORAGE_SOURCE_ENDPOINT"] | ||
source_storage_account_name = os.environ["AZURE_STORAGE_SOURCE_ACCOUNT_NAME"] | ||
source_storage_container_name = os.environ["AZURE_STORAGE_SOURCE_CONTAINER_NAME"] | ||
source_storage_key = os.environ["AZURE_STORAGE_SOURCE_KEY"] | ||
target_storage_endpoint = os.environ["AZURE_STORAGE_TARGET_ENDPOINT"] | ||
target_storage_account_name = os.environ["AZURE_STORAGE_TARGET_ACCOUNT_NAME"] | ||
target_storage_container_name = os.environ["AZURE_STORAGE_TARGET_CONTAINER_NAME"] | ||
target_storage_key = os.environ["AZURE_STORAGE_TARGET_KEY"] | ||
|
||
# create service clients | ||
translation_client = DocumentTranslationClient( | ||
endpoint, AzureKeyCredential(key) | ||
) | ||
|
||
container_client = ContainerClient( | ||
source_storage_endpoint, | ||
container_name=source_storage_container_name, | ||
credential=source_storage_key | ||
) | ||
|
||
# upload some document for translation | ||
with open("document.txt", "rb") as doc: | ||
await container_client.upload_blob(name="document.txt", data=doc) | ||
|
||
# prepare translation job input | ||
source_container_sas = generate_container_sas( | ||
account_name=source_storage_account_name, | ||
container_name=source_storage_container_name, | ||
account_key=source_storage_key, | ||
permission=ContainerSasPermissions.from_string("rl") | ||
) | ||
|
||
target_container_sas = generate_container_sas( | ||
account_name=target_storage_account_name, | ||
container_name=target_storage_container_name, | ||
account_key=target_storage_key, | ||
permission=ContainerSasPermissions.from_string("rlwd") | ||
) | ||
|
||
source_container_url = source_storage_endpoint + "/" + source_storage_container_name + "?" + source_container_sas | ||
target_container_url = target_storage_endpoint + "/" + target_storage_container_name + "?" + target_container_sas | ||
|
||
batch = [ | ||
BatchDocumentInput( | ||
source_url=source_container_url, | ||
targets=[ | ||
StorageTarget( | ||
target_url=target_container_url, | ||
language="es" | ||
) | ||
], | ||
prefix="document" | ||
) | ||
] | ||
|
||
# run job | ||
async with translation_client: | ||
job_detail = await translation_client.create_translation_job(batch) | ||
job_result = await translation_client.wait_until_done(job_detail.id) | ||
|
||
# poll status result | ||
if job_result.status == "Succeeded": | ||
print("We translated our documents!") | ||
if job_result.documents_failed_count > 0: | ||
await self.check_documents(translation_client, job_result.id) | ||
|
||
elif job_result.status in ["Failed", "ValidationFailed"]: | ||
if job_result.error: | ||
print("Translation job failed: {}: {}".format(job_result.error.code, job_result.error.message)) | ||
await self.check_documents(translation_client, job_result.id) | ||
exit(1) | ||
|
||
# store result documents | ||
container_client = ContainerClient( | ||
target_storage_endpoint, | ||
container_name=target_storage_container_name, | ||
credential=target_storage_key | ||
) | ||
|
||
with open("translated.txt", "wb") as my_blob: | ||
download_stream = await container_client.download_blob("document.txt") | ||
my_blob.write(await download_stream.readall()) | ||
|
||
|
||
async def check_documents(self, client, job_id): | ||
from azure.core.exceptions import ResourceNotFoundError | ||
|
||
try: | ||
doc_statuses = client.list_documents_statuses(job_id) # type: AsyncItemPaged[DocumentStatusDetail] | ||
except ResourceNotFoundError as err: | ||
print("Failed to process any documents in source/target container due to insufficient permissions.") | ||
raise err | ||
|
||
docs_to_retry = [] | ||
async for document in doc_statuses: | ||
if document.status == "Failed": | ||
print("Document at {} failed to be translated to {} language".format( | ||
document.url, document.translate_to | ||
)) | ||
print("Document ID: {}, Error Code: {}, Message: {}".format( | ||
document.id, document.error.code, document.error.message | ||
)) | ||
if document.url not in docs_to_retry: | ||
docs_to_retry.append(document.url) | ||
|
||
async def main(): | ||
sample = BatchTranslationWithStorageSampleAsync() | ||
await sample.batch_translation_with_storage_async() | ||
|
||
|
||
if __name__ == '__main__': | ||
loop = asyncio.get_event_loop() | ||
loop.run_until_complete(main()) |
67 changes: 67 additions & 0 deletions
67
...azure-ai-documenttranslation/samples/async_samples/sample_cancel_translation_job_async.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
# coding=utf-8 | ||
# ------------------------------------ | ||
# Copyright (c) Microsoft Corporation. | ||
# Licensed under the MIT License. | ||
# ------------------------------------ | ||
|
||
import os | ||
import asyncio | ||
|
||
class CancelTranslationJobSampleAsync(object): | ||
|
||
async def cancel_translation_job_async(self): | ||
# import libraries | ||
from azure.core.credentials import AzureKeyCredential | ||
from azure.ai.documenttranslation.aio import DocumentTranslationClient | ||
from azure.ai.documenttranslation import ( | ||
BatchDocumentInput, | ||
StorageTarget | ||
) | ||
|
||
# get service secrets | ||
endpoint = os.environ["AZURE_DOCUMENT_TRANSLATION_ENDPOINT"] | ||
key = os.environ["AZURE_DOCUMENT_TRANSLATION_KEY"] | ||
source_container_url = os.environ["AZURE_SOURCE_CONTAINER_URL"] | ||
target_container_url_es = os.environ["AZURE_TARGET_CONTAINER_URL_ES"] | ||
|
||
# prepare translation job input | ||
batch = [ | ||
BatchDocumentInput( | ||
source_url=source_container_url, | ||
targets=[ | ||
StorageTarget( | ||
target_url=target_container_url_es, | ||
language="es" | ||
) | ||
], | ||
storage_type="file" | ||
) | ||
] | ||
|
||
# create translation client | ||
client = DocumentTranslationClient(endpoint, AzureKeyCredential(key)) | ||
|
||
# run job | ||
async with client: | ||
job_detail = await client.create_translation_job(batch) | ||
|
||
print("Job initial status: {}".format(job_detail.status)) | ||
print("Number of translations on documents: {}".format(job_detail.documents_total_count)) | ||
|
||
await client.cancel_job(job_detail.id) | ||
job_detail = await client.get_job_status(job_detail.id) # type: JobStatusDetail | ||
|
||
if job_detail.status in ["Cancelled", "Cancelling"]: | ||
print("We cancelled job with ID: {}".format(job_detail.id)) | ||
|
||
|
||
async def main(): | ||
sample = CancelTranslationJobSampleAsync() | ||
await sample.cancel_translation_job_async() | ||
|
||
|
||
if __name__ == '__main__': | ||
loop = asyncio.get_event_loop() | ||
loop.run_until_complete(main()) | ||
|
||
|
Oops, something went wrong.