From a849c2f7269b4e92ab09b624efb368c5d890cacf Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Thu, 24 Oct 2024 21:56:32 +0000 Subject: [PATCH 1/2] feat: add multi-speaker markup, which allows generating dialogue between multiple speakers PiperOrigin-RevId: 689444598 Source-Link: https://github.com/googleapis/googleapis/commit/56f5fa4555e676869e0878bb7b4c5fca20f6e2a9 Source-Link: https://github.com/googleapis/googleapis-gen/commit/532d282912b1eaf1415817c068ece2e354f0055e Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXRleHR0b3NwZWVjaC8uT3dsQm90LnlhbWwiLCJoIjoiNTMyZDI4MjkxMmIxZWFmMTQxNTgxN2MwNjhlY2UyZTM1NGYwMDU1ZSJ9 --- .../google-cloud-texttospeech/v1/.coveragerc | 13 + .../google-cloud-texttospeech/v1/.flake8 | 33 + .../google-cloud-texttospeech/v1/MANIFEST.in | 2 + .../google-cloud-texttospeech/v1/README.rst | 49 + .../v1/docs/_static/custom.css | 3 + .../google-cloud-texttospeech/v1/docs/conf.py | 376 ++ .../v1/docs/index.rst | 7 + .../v1/docs/texttospeech_v1/services_.rst | 7 + .../docs/texttospeech_v1/text_to_speech.rst | 6 + .../text_to_speech_long_audio_synthesize.rst | 6 + .../v1/docs/texttospeech_v1/types_.rst | 6 + .../v1/google/cloud/texttospeech/__init__.py | 75 + .../cloud/texttospeech/gapic_version.py | 16 + .../v1/google/cloud/texttospeech/py.typed | 2 + .../google/cloud/texttospeech_v1/__init__.py | 76 + .../cloud/texttospeech_v1/gapic_metadata.json | 107 + .../cloud/texttospeech_v1/gapic_version.py | 16 + .../v1/google/cloud/texttospeech_v1/py.typed | 2 + .../texttospeech_v1/services/__init__.py | 15 + .../services/text_to_speech/__init__.py | 22 + .../services/text_to_speech/async_client.py | 660 ++++ .../services/text_to_speech/client.py | 1017 ++++++ .../text_to_speech/transports/README.rst | 9 + .../text_to_speech/transports/__init__.py | 38 + .../text_to_speech/transports/base.py | 211 ++ .../text_to_speech/transports/grpc.py | 361 ++ .../text_to_speech/transports/grpc_asyncio.py | 402 +++ .../text_to_speech/transports/rest.py | 599 ++++ .../text_to_speech/transports/rest_base.py | 220 ++ .../__init__.py | 22 + .../async_client.py | 454 +++ .../client.py | 813 +++++ .../transports/README.rst | 9 + .../transports/__init__.py | 38 + .../transports/base.py | 189 + .../transports/grpc.py | 325 ++ .../transports/grpc_asyncio.py | 356 ++ .../transports/rest.py | 509 +++ .../transports/rest_base.py | 188 + .../cloud/texttospeech_v1/types/__init__.py | 66 + .../cloud/texttospeech_v1/types/cloud_tts.py | 713 ++++ .../texttospeech_v1/types/cloud_tts_lrs.py | 122 + .../google-cloud-texttospeech/v1/mypy.ini | 3 + .../google-cloud-texttospeech/v1/noxfile.py | 280 ++ ...metadata_google.cloud.texttospeech.v1.json | 659 ++++ ...erated_text_to_speech_list_voices_async.py | 51 + ...nerated_text_to_speech_list_voices_sync.py | 51 + ..._synthesize_synthesize_long_audio_async.py | 68 + ...o_synthesize_synthesize_long_audio_sync.py | 68 + ...xt_to_speech_streaming_synthesize_async.py | 66 + ...ext_to_speech_streaming_synthesize_sync.py | 66 + ..._text_to_speech_synthesize_speech_async.py | 63 + ...d_text_to_speech_synthesize_speech_sync.py | 63 + .../scripts/fixup_texttospeech_v1_keywords.py | 179 + .../google-cloud-texttospeech/v1/setup.py | 98 + .../v1/testing/constraints-3.10.txt | 6 + .../v1/testing/constraints-3.11.txt | 6 + .../v1/testing/constraints-3.12.txt | 6 + .../v1/testing/constraints-3.13.txt | 6 + .../v1/testing/constraints-3.7.txt | 10 + .../v1/testing/constraints-3.8.txt | 6 + .../v1/testing/constraints-3.9.txt | 6 + .../v1/tests/__init__.py | 16 + .../v1/tests/unit/__init__.py | 16 + .../v1/tests/unit/gapic/__init__.py | 16 + .../unit/gapic/texttospeech_v1/__init__.py | 16 + .../texttospeech_v1/test_text_to_speech.py | 3141 +++++++++++++++++ ...st_text_to_speech_long_audio_synthesize.py | 2433 +++++++++++++ .../v1beta1/.coveragerc | 13 + .../google-cloud-texttospeech/v1beta1/.flake8 | 33 + .../v1beta1/MANIFEST.in | 2 + .../v1beta1/README.rst | 49 + .../v1beta1/docs/_static/custom.css | 3 + .../v1beta1/docs/conf.py | 376 ++ .../v1beta1/docs/index.rst | 7 + .../docs/texttospeech_v1beta1/services_.rst | 7 + .../texttospeech_v1beta1/text_to_speech.rst | 6 + .../text_to_speech_long_audio_synthesize.rst | 6 + .../docs/texttospeech_v1beta1/types_.rst | 6 + .../google/cloud/texttospeech/__init__.py | 79 + .../cloud/texttospeech/gapic_version.py | 16 + .../google/cloud/texttospeech/py.typed | 2 + .../cloud/texttospeech_v1beta1/__init__.py | 80 + .../texttospeech_v1beta1/gapic_metadata.json | 107 + .../texttospeech_v1beta1/gapic_version.py | 16 + .../cloud/texttospeech_v1beta1/py.typed | 2 + .../texttospeech_v1beta1/services/__init__.py | 15 + .../services/text_to_speech/__init__.py | 22 + .../services/text_to_speech/async_client.py | 660 ++++ .../services/text_to_speech/client.py | 1017 ++++++ .../text_to_speech/transports/README.rst | 9 + .../text_to_speech/transports/__init__.py | 38 + .../text_to_speech/transports/base.py | 211 ++ .../text_to_speech/transports/grpc.py | 361 ++ .../text_to_speech/transports/grpc_asyncio.py | 402 +++ .../text_to_speech/transports/rest.py | 599 ++++ .../text_to_speech/transports/rest_base.py | 220 ++ .../__init__.py | 22 + .../async_client.py | 454 +++ .../client.py | 813 +++++ .../transports/README.rst | 9 + .../transports/__init__.py | 38 + .../transports/base.py | 189 + .../transports/grpc.py | 325 ++ .../transports/grpc_asyncio.py | 356 ++ .../transports/rest.py | 509 +++ .../transports/rest_base.py | 188 + .../texttospeech_v1beta1/types/__init__.py | 70 + .../texttospeech_v1beta1/types/cloud_tts.py | 826 +++++ .../types/cloud_tts_lrs.py | 122 + .../v1beta1/mypy.ini | 3 + .../v1beta1/noxfile.py | 280 ++ ...ata_google.cloud.texttospeech.v1beta1.json | 659 ++++ ...erated_text_to_speech_list_voices_async.py | 51 + ...nerated_text_to_speech_list_voices_sync.py | 51 + ..._synthesize_synthesize_long_audio_async.py | 68 + ...o_synthesize_synthesize_long_audio_sync.py | 68 + ...xt_to_speech_streaming_synthesize_async.py | 66 + ...ext_to_speech_streaming_synthesize_sync.py | 66 + ..._text_to_speech_synthesize_speech_async.py | 63 + ...d_text_to_speech_synthesize_speech_sync.py | 63 + .../fixup_texttospeech_v1beta1_keywords.py | 179 + .../v1beta1/setup.py | 98 + .../v1beta1/testing/constraints-3.10.txt | 6 + .../v1beta1/testing/constraints-3.11.txt | 6 + .../v1beta1/testing/constraints-3.12.txt | 6 + .../v1beta1/testing/constraints-3.13.txt | 6 + .../v1beta1/testing/constraints-3.7.txt | 10 + .../v1beta1/testing/constraints-3.8.txt | 6 + .../v1beta1/testing/constraints-3.9.txt | 6 + .../v1beta1/tests/__init__.py | 16 + .../v1beta1/tests/unit/__init__.py | 16 + .../v1beta1/tests/unit/gapic/__init__.py | 16 + .../gapic/texttospeech_v1beta1/__init__.py | 16 + .../test_text_to_speech.py | 3141 +++++++++++++++++ ...st_text_to_speech_long_audio_synthesize.py | 2433 +++++++++++++ 136 files changed, 31243 insertions(+) create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/.coveragerc create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/.flake8 create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/MANIFEST.in create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/README.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/_static/custom.css create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/conf.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/index.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/services_.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech_long_audio_synthesize.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/types_.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/gapic_version.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/py.typed create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_metadata.json create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_version.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/py.typed create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/async_client.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/client.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/README.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/base.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc_asyncio.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest_base.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/async_client.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/client.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/README.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/base.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts_lrs.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/mypy.ini create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/noxfile.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_async.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_sync.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_async.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_sync.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_async.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_sync.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/scripts/fixup_texttospeech_v1_keywords.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/setup.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.10.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.11.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.12.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.13.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.7.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.8.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.9.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/tests/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech_long_audio_synthesize.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/.coveragerc create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/.flake8 create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/MANIFEST.in create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/README.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/_static/custom.css create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/conf.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/index.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/services_.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech_long_audio_synthesize.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/types_.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/gapic_version.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/py.typed create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_metadata.json create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_version.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/py.typed create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/async_client.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/client.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/README.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/base.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc_asyncio.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest_base.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/async_client.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/client.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/README.rst create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/base.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts_lrs.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/mypy.ini create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/noxfile.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_async.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_sync.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_async.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_sync.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_async.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_sync.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/scripts/fixup_texttospeech_v1beta1_keywords.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/setup.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.10.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.11.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.12.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.13.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.7.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.8.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.9.txt create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/__init__.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech.py create mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech_long_audio_synthesize.py diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/.coveragerc b/owl-bot-staging/google-cloud-texttospeech/v1/.coveragerc new file mode 100644 index 000000000000..8f3a0ab7f83b --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/.coveragerc @@ -0,0 +1,13 @@ +[run] +branch = True + +[report] +show_missing = True +omit = + google/cloud/texttospeech/__init__.py + google/cloud/texttospeech/gapic_version.py +exclude_lines = + # Re-enable the standard pragma + pragma: NO COVER + # Ignore debug-only repr + def __repr__ diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/.flake8 b/owl-bot-staging/google-cloud-texttospeech/v1/.flake8 new file mode 100644 index 000000000000..29227d4cf419 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/.flake8 @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# +# 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 +# +# https://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. + +# Generated by synthtool. DO NOT EDIT! +[flake8] +ignore = E203, E266, E501, W503 +exclude = + # Exclude generated code. + **/proto/** + **/gapic/** + **/services/** + **/types/** + *_pb2.py + + # Standard linting exemptions. + **/.nox/** + __pycache__, + .git, + *.pyc, + conf.py diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/MANIFEST.in b/owl-bot-staging/google-cloud-texttospeech/v1/MANIFEST.in new file mode 100644 index 000000000000..1e41d1d9a919 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/MANIFEST.in @@ -0,0 +1,2 @@ +recursive-include google/cloud/texttospeech *.py +recursive-include google/cloud/texttospeech_v1 *.py diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/README.rst b/owl-bot-staging/google-cloud-texttospeech/v1/README.rst new file mode 100644 index 000000000000..25f53907ce0c --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/README.rst @@ -0,0 +1,49 @@ +Python Client for Google Cloud Texttospeech API +================================================= + +Quick Start +----------- + +In order to use this library, you first need to go through the following steps: + +1. `Select or create a Cloud Platform project.`_ +2. `Enable billing for your project.`_ +3. Enable the Google Cloud Texttospeech API. +4. `Setup Authentication.`_ + +.. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project +.. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project +.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html + +Installation +~~~~~~~~~~~~ + +Install this library in a `virtualenv`_ using pip. `virtualenv`_ is a tool to +create isolated Python environments. The basic problem it addresses is one of +dependencies and versions, and indirectly permissions. + +With `virtualenv`_, it's possible to install this library without needing system +install permissions, and without clashing with the installed system +dependencies. + +.. _`virtualenv`: https://virtualenv.pypa.io/en/latest/ + + +Mac/Linux +^^^^^^^^^ + +.. code-block:: console + + python3 -m venv + source /bin/activate + /bin/pip install /path/to/library + + +Windows +^^^^^^^ + +.. code-block:: console + + python3 -m venv + \Scripts\activate + \Scripts\pip.exe install \path\to\library diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/_static/custom.css b/owl-bot-staging/google-cloud-texttospeech/v1/docs/_static/custom.css new file mode 100644 index 000000000000..06423be0b592 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/docs/_static/custom.css @@ -0,0 +1,3 @@ +dl.field-list > dt { + min-width: 100px +} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/conf.py b/owl-bot-staging/google-cloud-texttospeech/v1/docs/conf.py new file mode 100644 index 000000000000..4e7d47829ddb --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/docs/conf.py @@ -0,0 +1,376 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# +# google-cloud-texttospeech documentation build configuration file +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os +import shlex + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +sys.path.insert(0, os.path.abspath("..")) + +__version__ = "0.1.0" + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +needs_sphinx = "4.0.1" + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "sphinx.ext.intersphinx", + "sphinx.ext.coverage", + "sphinx.ext.napoleon", + "sphinx.ext.todo", + "sphinx.ext.viewcode", +] + +# autodoc/autosummary flags +autoclass_content = "both" +autodoc_default_flags = ["members"] +autosummary_generate = True + + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# Allow markdown includes (so releases.md can include CHANGLEOG.md) +# http://www.sphinx-doc.org/en/master/markdown.html +source_parsers = {".md": "recommonmark.parser.CommonMarkParser"} + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +source_suffix = [".rst", ".md"] + +# The encoding of source files. +# source_encoding = 'utf-8-sig' + +# The root toctree document. +root_doc = "index" + +# General information about the project. +project = u"google-cloud-texttospeech" +copyright = u"2023, Google, LLC" +author = u"Google APIs" # TODO: autogenerate this bit + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The full version, including alpha/beta/rc tags. +release = __version__ +# The short X.Y version. +version = ".".join(release.split(".")[0:2]) + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'en' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# today = '' +# Else, today_fmt is used as the format for a strftime call. +# today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ["_build"] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +# default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +# add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = "sphinx" + +# A list of ignored prefixes for module index sorting. +# modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +# keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = True + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = "alabaster" + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +html_theme_options = { + "description": "Google Cloud Client Libraries for Python", + "github_user": "googleapis", + "github_repo": "google-cloud-python", + "github_banner": True, + "font_family": "'Roboto', Georgia, sans", + "head_font_family": "'Roboto', Georgia, serif", + "code_font_family": "'Roboto Mono', 'Consolas', monospace", +} + +# Add any paths that contain custom themes here, relative to this directory. +# html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +# html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +# html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +# html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# html_additional_pages = {} + +# If false, no module index is generated. +# html_domain_indices = True + +# If false, no index is generated. +# html_use_index = True + +# If true, the index is split into individual pages for each letter. +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +# html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +# html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +# html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' +# html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +# html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +# html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = "google-cloud-texttospeech-doc" + +# -- Options for warnings ------------------------------------------------------ + + +suppress_warnings = [ + # Temporarily suppress this to avoid "more than one target found for + # cross-reference" warning, which are intractable for us to avoid while in + # a mono-repo. + # See https://github.com/sphinx-doc/sphinx/blob + # /2a65ffeef5c107c19084fabdd706cdff3f52d93c/sphinx/domains/python.py#L843 + "ref.python" +] + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # 'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + # 'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + # 'preamble': '', + # Latex figure (float) alignment + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ( + root_doc, + "google-cloud-texttospeech.tex", + u"google-cloud-texttospeech Documentation", + author, + "manual", + ) +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# latex_use_parts = False + +# If true, show page references after internal links. +# latex_show_pagerefs = False + +# If true, show URL addresses after external links. +# latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# latex_appendices = [] + +# If false, no module index is generated. +# latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ( + root_doc, + "google-cloud-texttospeech", + u"Google Cloud Texttospeech Documentation", + [author], + 1, + ) +] + +# If true, show URL addresses after external links. +# man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ( + root_doc, + "google-cloud-texttospeech", + u"google-cloud-texttospeech Documentation", + author, + "google-cloud-texttospeech", + "GAPIC library for Google Cloud Texttospeech API", + "APIs", + ) +] + +# Documents to append as an appendix to all manuals. +# texinfo_appendices = [] + +# If false, no module index is generated. +# texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +# texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +# texinfo_no_detailmenu = False + + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = { + "python": ("http://python.readthedocs.org/en/latest/", None), + "gax": ("https://gax-python.readthedocs.org/en/latest/", None), + "google-auth": ("https://google-auth.readthedocs.io/en/stable", None), + "google-gax": ("https://gax-python.readthedocs.io/en/latest/", None), + "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None), + "grpc": ("https://grpc.io/grpc/python/", None), + "requests": ("http://requests.kennethreitz.org/en/stable/", None), + "proto": ("https://proto-plus-python.readthedocs.io/en/stable", None), + "protobuf": ("https://googleapis.dev/python/protobuf/latest/", None), +} + + +# Napoleon settings +napoleon_google_docstring = True +napoleon_numpy_docstring = True +napoleon_include_private_with_doc = False +napoleon_include_special_with_doc = True +napoleon_use_admonition_for_examples = False +napoleon_use_admonition_for_notes = False +napoleon_use_admonition_for_references = False +napoleon_use_ivar = False +napoleon_use_param = True +napoleon_use_rtype = True diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/index.rst b/owl-bot-staging/google-cloud-texttospeech/v1/docs/index.rst new file mode 100644 index 000000000000..7b4717a9c7d1 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/docs/index.rst @@ -0,0 +1,7 @@ +API Reference +------------- +.. toctree:: + :maxdepth: 2 + + texttospeech_v1/services_ + texttospeech_v1/types_ diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/services_.rst b/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/services_.rst new file mode 100644 index 000000000000..71958842bafc --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/services_.rst @@ -0,0 +1,7 @@ +Services for Google Cloud Texttospeech v1 API +============================================= +.. toctree:: + :maxdepth: 2 + + text_to_speech + text_to_speech_long_audio_synthesize diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech.rst b/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech.rst new file mode 100644 index 000000000000..2ad3a8e92df5 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech.rst @@ -0,0 +1,6 @@ +TextToSpeech +------------------------------ + +.. automodule:: google.cloud.texttospeech_v1.services.text_to_speech + :members: + :inherited-members: diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech_long_audio_synthesize.rst b/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech_long_audio_synthesize.rst new file mode 100644 index 000000000000..2a202504277c --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech_long_audio_synthesize.rst @@ -0,0 +1,6 @@ +TextToSpeechLongAudioSynthesize +------------------------------------------------- + +.. automodule:: google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize + :members: + :inherited-members: diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/types_.rst b/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/types_.rst new file mode 100644 index 000000000000..bfe321928736 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/types_.rst @@ -0,0 +1,6 @@ +Types for Google Cloud Texttospeech v1 API +========================================== + +.. automodule:: google.cloud.texttospeech_v1.types + :members: + :show-inheritance: diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/__init__.py new file mode 100644 index 000000000000..f127771c97b0 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/__init__.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from google.cloud.texttospeech import gapic_version as package_version + +__version__ = package_version.__version__ + + +from google.cloud.texttospeech_v1.services.text_to_speech.client import TextToSpeechClient +from google.cloud.texttospeech_v1.services.text_to_speech.async_client import TextToSpeechAsyncClient +from google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize.client import TextToSpeechLongAudioSynthesizeClient +from google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize.async_client import TextToSpeechLongAudioSynthesizeAsyncClient + +from google.cloud.texttospeech_v1.types.cloud_tts import AdvancedVoiceOptions +from google.cloud.texttospeech_v1.types.cloud_tts import AudioConfig +from google.cloud.texttospeech_v1.types.cloud_tts import CustomPronunciationParams +from google.cloud.texttospeech_v1.types.cloud_tts import CustomPronunciations +from google.cloud.texttospeech_v1.types.cloud_tts import CustomVoiceParams +from google.cloud.texttospeech_v1.types.cloud_tts import ListVoicesRequest +from google.cloud.texttospeech_v1.types.cloud_tts import ListVoicesResponse +from google.cloud.texttospeech_v1.types.cloud_tts import StreamingSynthesisInput +from google.cloud.texttospeech_v1.types.cloud_tts import StreamingSynthesizeConfig +from google.cloud.texttospeech_v1.types.cloud_tts import StreamingSynthesizeRequest +from google.cloud.texttospeech_v1.types.cloud_tts import StreamingSynthesizeResponse +from google.cloud.texttospeech_v1.types.cloud_tts import SynthesisInput +from google.cloud.texttospeech_v1.types.cloud_tts import SynthesizeSpeechRequest +from google.cloud.texttospeech_v1.types.cloud_tts import SynthesizeSpeechResponse +from google.cloud.texttospeech_v1.types.cloud_tts import Voice +from google.cloud.texttospeech_v1.types.cloud_tts import VoiceCloneParams +from google.cloud.texttospeech_v1.types.cloud_tts import VoiceSelectionParams +from google.cloud.texttospeech_v1.types.cloud_tts import AudioEncoding +from google.cloud.texttospeech_v1.types.cloud_tts import SsmlVoiceGender +from google.cloud.texttospeech_v1.types.cloud_tts_lrs import SynthesizeLongAudioMetadata +from google.cloud.texttospeech_v1.types.cloud_tts_lrs import SynthesizeLongAudioRequest +from google.cloud.texttospeech_v1.types.cloud_tts_lrs import SynthesizeLongAudioResponse + +__all__ = ('TextToSpeechClient', + 'TextToSpeechAsyncClient', + 'TextToSpeechLongAudioSynthesizeClient', + 'TextToSpeechLongAudioSynthesizeAsyncClient', + 'AdvancedVoiceOptions', + 'AudioConfig', + 'CustomPronunciationParams', + 'CustomPronunciations', + 'CustomVoiceParams', + 'ListVoicesRequest', + 'ListVoicesResponse', + 'StreamingSynthesisInput', + 'StreamingSynthesizeConfig', + 'StreamingSynthesizeRequest', + 'StreamingSynthesizeResponse', + 'SynthesisInput', + 'SynthesizeSpeechRequest', + 'SynthesizeSpeechResponse', + 'Voice', + 'VoiceCloneParams', + 'VoiceSelectionParams', + 'AudioEncoding', + 'SsmlVoiceGender', + 'SynthesizeLongAudioMetadata', + 'SynthesizeLongAudioRequest', + 'SynthesizeLongAudioResponse', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/gapic_version.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/gapic_version.py new file mode 100644 index 000000000000..558c8aab67c5 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/gapic_version.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +__version__ = "0.0.0" # {x-release-please-version} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/py.typed b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/py.typed new file mode 100644 index 000000000000..9b87c1e1cbf9 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# The google-cloud-texttospeech package uses inline types. diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/__init__.py new file mode 100644 index 000000000000..8e98d41f6a93 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/__init__.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from google.cloud.texttospeech_v1 import gapic_version as package_version + +__version__ = package_version.__version__ + + +from .services.text_to_speech import TextToSpeechClient +from .services.text_to_speech import TextToSpeechAsyncClient +from .services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeClient +from .services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeAsyncClient + +from .types.cloud_tts import AdvancedVoiceOptions +from .types.cloud_tts import AudioConfig +from .types.cloud_tts import CustomPronunciationParams +from .types.cloud_tts import CustomPronunciations +from .types.cloud_tts import CustomVoiceParams +from .types.cloud_tts import ListVoicesRequest +from .types.cloud_tts import ListVoicesResponse +from .types.cloud_tts import StreamingSynthesisInput +from .types.cloud_tts import StreamingSynthesizeConfig +from .types.cloud_tts import StreamingSynthesizeRequest +from .types.cloud_tts import StreamingSynthesizeResponse +from .types.cloud_tts import SynthesisInput +from .types.cloud_tts import SynthesizeSpeechRequest +from .types.cloud_tts import SynthesizeSpeechResponse +from .types.cloud_tts import Voice +from .types.cloud_tts import VoiceCloneParams +from .types.cloud_tts import VoiceSelectionParams +from .types.cloud_tts import AudioEncoding +from .types.cloud_tts import SsmlVoiceGender +from .types.cloud_tts_lrs import SynthesizeLongAudioMetadata +from .types.cloud_tts_lrs import SynthesizeLongAudioRequest +from .types.cloud_tts_lrs import SynthesizeLongAudioResponse + +__all__ = ( + 'TextToSpeechAsyncClient', + 'TextToSpeechLongAudioSynthesizeAsyncClient', +'AdvancedVoiceOptions', +'AudioConfig', +'AudioEncoding', +'CustomPronunciationParams', +'CustomPronunciations', +'CustomVoiceParams', +'ListVoicesRequest', +'ListVoicesResponse', +'SsmlVoiceGender', +'StreamingSynthesisInput', +'StreamingSynthesizeConfig', +'StreamingSynthesizeRequest', +'StreamingSynthesizeResponse', +'SynthesisInput', +'SynthesizeLongAudioMetadata', +'SynthesizeLongAudioRequest', +'SynthesizeLongAudioResponse', +'SynthesizeSpeechRequest', +'SynthesizeSpeechResponse', +'TextToSpeechClient', +'TextToSpeechLongAudioSynthesizeClient', +'Voice', +'VoiceCloneParams', +'VoiceSelectionParams', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_metadata.json b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_metadata.json new file mode 100644 index 000000000000..9c20cbce6b46 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_metadata.json @@ -0,0 +1,107 @@ + { + "comment": "This file maps proto services/RPCs to the corresponding library clients/methods", + "language": "python", + "libraryPackage": "google.cloud.texttospeech_v1", + "protoPackage": "google.cloud.texttospeech.v1", + "schema": "1.0", + "services": { + "TextToSpeech": { + "clients": { + "grpc": { + "libraryClient": "TextToSpeechClient", + "rpcs": { + "ListVoices": { + "methods": [ + "list_voices" + ] + }, + "StreamingSynthesize": { + "methods": [ + "streaming_synthesize" + ] + }, + "SynthesizeSpeech": { + "methods": [ + "synthesize_speech" + ] + } + } + }, + "grpc-async": { + "libraryClient": "TextToSpeechAsyncClient", + "rpcs": { + "ListVoices": { + "methods": [ + "list_voices" + ] + }, + "StreamingSynthesize": { + "methods": [ + "streaming_synthesize" + ] + }, + "SynthesizeSpeech": { + "methods": [ + "synthesize_speech" + ] + } + } + }, + "rest": { + "libraryClient": "TextToSpeechClient", + "rpcs": { + "ListVoices": { + "methods": [ + "list_voices" + ] + }, + "StreamingSynthesize": { + "methods": [ + "streaming_synthesize" + ] + }, + "SynthesizeSpeech": { + "methods": [ + "synthesize_speech" + ] + } + } + } + } + }, + "TextToSpeechLongAudioSynthesize": { + "clients": { + "grpc": { + "libraryClient": "TextToSpeechLongAudioSynthesizeClient", + "rpcs": { + "SynthesizeLongAudio": { + "methods": [ + "synthesize_long_audio" + ] + } + } + }, + "grpc-async": { + "libraryClient": "TextToSpeechLongAudioSynthesizeAsyncClient", + "rpcs": { + "SynthesizeLongAudio": { + "methods": [ + "synthesize_long_audio" + ] + } + } + }, + "rest": { + "libraryClient": "TextToSpeechLongAudioSynthesizeClient", + "rpcs": { + "SynthesizeLongAudio": { + "methods": [ + "synthesize_long_audio" + ] + } + } + } + } + } + } +} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_version.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_version.py new file mode 100644 index 000000000000..558c8aab67c5 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_version.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +__version__ = "0.0.0" # {x-release-please-version} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/py.typed b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/py.typed new file mode 100644 index 000000000000..9b87c1e1cbf9 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# The google-cloud-texttospeech package uses inline types. diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/__init__.py new file mode 100644 index 000000000000..8f6cf068242c --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/__init__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/__init__.py new file mode 100644 index 000000000000..fa16c00b5f6f --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from .client import TextToSpeechClient +from .async_client import TextToSpeechAsyncClient + +__all__ = ( + 'TextToSpeechClient', + 'TextToSpeechAsyncClient', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/async_client.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/async_client.py new file mode 100644 index 000000000000..02f335b962fd --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/async_client.py @@ -0,0 +1,660 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from collections import OrderedDict +import re +from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, AsyncIterable, Awaitable, AsyncIterator, Sequence, Tuple, Type, Union + +from google.cloud.texttospeech_v1 import gapic_version as package_version + +from google.api_core.client_options import ClientOptions +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry_async as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.oauth2 import service_account # type: ignore + + +try: + OptionalRetry = Union[retries.AsyncRetry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.AsyncRetry, object, None] # type: ignore + +from google.cloud.texttospeech_v1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore +from .transports.base import TextToSpeechTransport, DEFAULT_CLIENT_INFO +from .transports.grpc_asyncio import TextToSpeechGrpcAsyncIOTransport +from .client import TextToSpeechClient + + +class TextToSpeechAsyncClient: + """Service that implements Google Cloud Text-to-Speech API.""" + + _client: TextToSpeechClient + + # Copy defaults from the synchronous client for use here. + # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. + DEFAULT_ENDPOINT = TextToSpeechClient.DEFAULT_ENDPOINT + DEFAULT_MTLS_ENDPOINT = TextToSpeechClient.DEFAULT_MTLS_ENDPOINT + _DEFAULT_ENDPOINT_TEMPLATE = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE + _DEFAULT_UNIVERSE = TextToSpeechClient._DEFAULT_UNIVERSE + + model_path = staticmethod(TextToSpeechClient.model_path) + parse_model_path = staticmethod(TextToSpeechClient.parse_model_path) + common_billing_account_path = staticmethod(TextToSpeechClient.common_billing_account_path) + parse_common_billing_account_path = staticmethod(TextToSpeechClient.parse_common_billing_account_path) + common_folder_path = staticmethod(TextToSpeechClient.common_folder_path) + parse_common_folder_path = staticmethod(TextToSpeechClient.parse_common_folder_path) + common_organization_path = staticmethod(TextToSpeechClient.common_organization_path) + parse_common_organization_path = staticmethod(TextToSpeechClient.parse_common_organization_path) + common_project_path = staticmethod(TextToSpeechClient.common_project_path) + parse_common_project_path = staticmethod(TextToSpeechClient.parse_common_project_path) + common_location_path = staticmethod(TextToSpeechClient.common_location_path) + parse_common_location_path = staticmethod(TextToSpeechClient.parse_common_location_path) + + @classmethod + def from_service_account_info(cls, info: dict, *args, **kwargs): + """Creates an instance of this client using the provided credentials + info. + + Args: + info (dict): The service account private key info. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechAsyncClient: The constructed client. + """ + return TextToSpeechClient.from_service_account_info.__func__(TextToSpeechAsyncClient, info, *args, **kwargs) # type: ignore + + @classmethod + def from_service_account_file(cls, filename: str, *args, **kwargs): + """Creates an instance of this client using the provided credentials + file. + + Args: + filename (str): The path to the service account private key json + file. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechAsyncClient: The constructed client. + """ + return TextToSpeechClient.from_service_account_file.__func__(TextToSpeechAsyncClient, filename, *args, **kwargs) # type: ignore + + from_service_account_json = from_service_account_file + + @classmethod + def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[ClientOptions] = None): + """Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variable is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + return TextToSpeechClient.get_mtls_endpoint_and_cert_source(client_options) # type: ignore + + @property + def transport(self) -> TextToSpeechTransport: + """Returns the transport used by the client instance. + + Returns: + TextToSpeechTransport: The transport used by the client instance. + """ + return self._client.transport + + @property + def api_endpoint(self): + """Return the API endpoint used by the client instance. + + Returns: + str: The API endpoint used by the client instance. + """ + return self._client._api_endpoint + + @property + def universe_domain(self) -> str: + """Return the universe domain used by the client instance. + + Returns: + str: The universe domain used + by the client instance. + """ + return self._client._universe_domain + + get_transport_class = TextToSpeechClient.get_transport_class + + def __init__(self, *, + credentials: Optional[ga_credentials.Credentials] = None, + transport: Optional[Union[str, TextToSpeechTransport, Callable[..., TextToSpeechTransport]]] = "grpc_asyncio", + client_options: Optional[ClientOptions] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + ) -> None: + """Instantiates the text to speech async client. + + Args: + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + transport (Optional[Union[str,TextToSpeechTransport,Callable[..., TextToSpeechTransport]]]): + The transport to use, or a Callable that constructs and returns a new transport to use. + If a Callable is given, it will be called with the same set of initialization + arguments as used in the TextToSpeechTransport constructor. + If set to None, a transport is chosen automatically. + NOTE: "rest" transport functionality is currently in a + beta state (preview). We welcome your feedback via an + issue in this library's source repository. + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): + Custom options for the client. + + 1. The ``api_endpoint`` property can be used to override the + default endpoint provided by the client when ``transport`` is + not explicitly provided. Only if this property is not set and + ``transport`` was not explicitly provided, the endpoint is + determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment + variable, which have one of the following values: + "always" (always use the default mTLS endpoint), "never" (always + use the default regular endpoint) and "auto" (auto-switch to the + default mTLS endpoint if client certificate is present; this is + the default value). + + 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable + is "true", then the ``client_cert_source`` property can be used + to provide a client certificate for mTLS transport. If + not provided, the default SSL client certificate will be used if + present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not + set, no client certificate will be used. + + 3. The ``universe_domain`` property can be used to override the + default "googleapis.com" universe. Note that ``api_endpoint`` + property still takes precedence; and ``universe_domain`` is + currently not supported for mTLS. + + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + + Raises: + google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport + creation failed for any reason. + """ + self._client = TextToSpeechClient( + credentials=credentials, + transport=transport, + client_options=client_options, + client_info=client_info, + + ) + + async def list_voices(self, + request: Optional[Union[cloud_tts.ListVoicesRequest, dict]] = None, + *, + language_code: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> cloud_tts.ListVoicesResponse: + r"""Returns a list of Voice supported for synthesis. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1 + + async def sample_list_voices(): + # Create a client + client = texttospeech_v1.TextToSpeechAsyncClient() + + # Initialize request argument(s) + request = texttospeech_v1.ListVoicesRequest( + ) + + # Make the request + response = await client.list_voices(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.texttospeech_v1.types.ListVoicesRequest, dict]]): + The request object. The top-level message sent by the client for the + ``ListVoices`` method. + language_code (:class:`str`): + Optional. Recommended. + `BCP-47 `__ + language tag. If not specified, the API will return all + supported voices. If specified, the ListVoices call will + only return voices that can be used to synthesize this + language_code. For example, if you specify ``"en-NZ"``, + all ``"en-NZ"`` voices will be returned. If you specify + ``"no"``, both ``"no-\*"`` (Norwegian) and ``"nb-\*"`` + (Norwegian Bokmal) voices will be returned. + + This corresponds to the ``language_code`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.cloud.texttospeech_v1.types.ListVoicesResponse: + The message returned to the client by the ListVoices + method. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([language_code]) + if request is not None and has_flattened_params: + raise ValueError("If the `request` argument is set, then none of " + "the individual field arguments should be set.") + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, cloud_tts.ListVoicesRequest): + request = cloud_tts.ListVoicesRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if language_code is not None: + request.language_code = language_code + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[self._client._transport.list_voices] + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def synthesize_speech(self, + request: Optional[Union[cloud_tts.SynthesizeSpeechRequest, dict]] = None, + *, + input: Optional[cloud_tts.SynthesisInput] = None, + voice: Optional[cloud_tts.VoiceSelectionParams] = None, + audio_config: Optional[cloud_tts.AudioConfig] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> cloud_tts.SynthesizeSpeechResponse: + r"""Synthesizes speech synchronously: receive results + after all text input has been processed. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1 + + async def sample_synthesize_speech(): + # Create a client + client = texttospeech_v1.TextToSpeechAsyncClient() + + # Initialize request argument(s) + input = texttospeech_v1.SynthesisInput() + input.text = "text_value" + + voice = texttospeech_v1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + audio_config = texttospeech_v1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + request = texttospeech_v1.SynthesizeSpeechRequest( + input=input, + voice=voice, + audio_config=audio_config, + ) + + # Make the request + response = await client.synthesize_speech(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.texttospeech_v1.types.SynthesizeSpeechRequest, dict]]): + The request object. The top-level message sent by the client for the + ``SynthesizeSpeech`` method. + input (:class:`google.cloud.texttospeech_v1.types.SynthesisInput`): + Required. The Synthesizer requires + either plain text or SSML as input. + + This corresponds to the ``input`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + voice (:class:`google.cloud.texttospeech_v1.types.VoiceSelectionParams`): + Required. The desired voice of the + synthesized audio. + + This corresponds to the ``voice`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + audio_config (:class:`google.cloud.texttospeech_v1.types.AudioConfig`): + Required. The configuration of the + synthesized audio. + + This corresponds to the ``audio_config`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.cloud.texttospeech_v1.types.SynthesizeSpeechResponse: + The message returned to the client by the + SynthesizeSpeech method. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([input, voice, audio_config]) + if request is not None and has_flattened_params: + raise ValueError("If the `request` argument is set, then none of " + "the individual field arguments should be set.") + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, cloud_tts.SynthesizeSpeechRequest): + request = cloud_tts.SynthesizeSpeechRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if input is not None: + request.input = input + if voice is not None: + request.voice = voice + if audio_config is not None: + request.audio_config = audio_config + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[self._client._transport.synthesize_speech] + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def streaming_synthesize(self, + requests: Optional[AsyncIterator[cloud_tts.StreamingSynthesizeRequest]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> Awaitable[AsyncIterable[cloud_tts.StreamingSynthesizeResponse]]: + r"""Performs bidirectional streaming speech synthesis: + receive audio while sending text. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1 + + async def sample_streaming_synthesize(): + # Create a client + client = texttospeech_v1.TextToSpeechAsyncClient() + + # Initialize request argument(s) + streaming_config = texttospeech_v1.StreamingSynthesizeConfig() + streaming_config.voice.language_code = "language_code_value" + + request = texttospeech_v1.StreamingSynthesizeRequest( + streaming_config=streaming_config, + ) + + # This method expects an iterator which contains + # 'texttospeech_v1.StreamingSynthesizeRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = await client.streaming_synthesize(requests=request_generator()) + + # Handle the response + async for response in stream: + print(response) + + Args: + requests (AsyncIterator[`google.cloud.texttospeech_v1.types.StreamingSynthesizeRequest`]): + The request object AsyncIterator. Request message for the ``StreamingSynthesize`` method. + Multiple ``StreamingSynthesizeRequest`` messages are + sent in one call. The first message must contain a + ``streaming_config`` that fully specifies the request + configuration and must not contain ``input``. All + subsequent messages must only have ``input`` set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + AsyncIterable[google.cloud.texttospeech_v1.types.StreamingSynthesizeResponse]: + StreamingSynthesizeResponse is the only message returned to the + client by StreamingSynthesize method. A series of + zero or more StreamingSynthesizeResponse messages are + streamed back to the client. + + """ + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[self._client._transport.streaming_synthesize] + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = rpc( + requests, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def list_operations( + self, + request: Optional[operations_pb2.ListOperationsRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.ListOperationsResponse: + r"""Lists operations that match the specified filter in the request. + + Args: + request (:class:`~.operations_pb2.ListOperationsRequest`): + The request object. Request message for + `ListOperations` method. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.ListOperationsResponse: + Response message for ``ListOperations`` method. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.ListOperationsRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self.transport._wrapped_methods[self._client._transport.list_operations] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + async def get_operation( + self, + request: Optional[operations_pb2.GetOperationRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.Operation: + r"""Gets the latest state of a long-running operation. + + Args: + request (:class:`~.operations_pb2.GetOperationRequest`): + The request object. Request message for + `GetOperation` method. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.Operation: + An ``Operation`` object. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.GetOperationRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self.transport._wrapped_methods[self._client._transport.get_operation] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + async def __aenter__(self) -> "TextToSpeechAsyncClient": + return self + + async def __aexit__(self, exc_type, exc, tb): + await self.transport.close() + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) + + +__all__ = ( + "TextToSpeechAsyncClient", +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/client.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/client.py new file mode 100644 index 000000000000..287906098e25 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/client.py @@ -0,0 +1,1017 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from collections import OrderedDict +import os +import re +from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Iterable, Iterator, Sequence, Tuple, Type, Union, cast +import warnings + +from google.cloud.texttospeech_v1 import gapic_version as package_version + +from google.api_core import client_options as client_options_lib +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport import mtls # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore +from google.auth.exceptions import MutualTLSChannelError # type: ignore +from google.oauth2 import service_account # type: ignore + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object, None] # type: ignore + +from google.cloud.texttospeech_v1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore +from .transports.base import TextToSpeechTransport, DEFAULT_CLIENT_INFO +from .transports.grpc import TextToSpeechGrpcTransport +from .transports.grpc_asyncio import TextToSpeechGrpcAsyncIOTransport +from .transports.rest import TextToSpeechRestTransport + + +class TextToSpeechClientMeta(type): + """Metaclass for the TextToSpeech client. + + This provides class-level methods for building and retrieving + support objects (e.g. transport) without polluting the client instance + objects. + """ + _transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechTransport]] + _transport_registry["grpc"] = TextToSpeechGrpcTransport + _transport_registry["grpc_asyncio"] = TextToSpeechGrpcAsyncIOTransport + _transport_registry["rest"] = TextToSpeechRestTransport + + def get_transport_class(cls, + label: Optional[str] = None, + ) -> Type[TextToSpeechTransport]: + """Returns an appropriate transport class. + + Args: + label: The name of the desired transport. If none is + provided, then the first transport in the registry is used. + + Returns: + The transport class to use. + """ + # If a specific transport is requested, return that one. + if label: + return cls._transport_registry[label] + + # No transport is requested; return the default (that is, the first one + # in the dictionary). + return next(iter(cls._transport_registry.values())) + + +class TextToSpeechClient(metaclass=TextToSpeechClientMeta): + """Service that implements Google Cloud Text-to-Speech API.""" + + @staticmethod + def _get_default_mtls_endpoint(api_endpoint): + """Converts api endpoint to mTLS endpoint. + + Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to + "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively. + Args: + api_endpoint (Optional[str]): the api endpoint to convert. + Returns: + str: converted mTLS api endpoint. + """ + if not api_endpoint: + return api_endpoint + + mtls_endpoint_re = re.compile( + r"(?P[^.]+)(?P\.mtls)?(?P\.sandbox)?(?P\.googleapis\.com)?" + ) + + m = mtls_endpoint_re.match(api_endpoint) + name, mtls, sandbox, googledomain = m.groups() + if mtls or not googledomain: + return api_endpoint + + if sandbox: + return api_endpoint.replace( + "sandbox.googleapis.com", "mtls.sandbox.googleapis.com" + ) + + return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com") + + # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. + DEFAULT_ENDPOINT = "texttospeech.googleapis.com" + DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore + DEFAULT_ENDPOINT + ) + + _DEFAULT_ENDPOINT_TEMPLATE = "texttospeech.{UNIVERSE_DOMAIN}" + _DEFAULT_UNIVERSE = "googleapis.com" + + @classmethod + def from_service_account_info(cls, info: dict, *args, **kwargs): + """Creates an instance of this client using the provided credentials + info. + + Args: + info (dict): The service account private key info. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechClient: The constructed client. + """ + credentials = service_account.Credentials.from_service_account_info(info) + kwargs["credentials"] = credentials + return cls(*args, **kwargs) + + @classmethod + def from_service_account_file(cls, filename: str, *args, **kwargs): + """Creates an instance of this client using the provided credentials + file. + + Args: + filename (str): The path to the service account private key json + file. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechClient: The constructed client. + """ + credentials = service_account.Credentials.from_service_account_file( + filename) + kwargs["credentials"] = credentials + return cls(*args, **kwargs) + + from_service_account_json = from_service_account_file + + @property + def transport(self) -> TextToSpeechTransport: + """Returns the transport used by the client instance. + + Returns: + TextToSpeechTransport: The transport used by the client + instance. + """ + return self._transport + + @staticmethod + def model_path(project: str,location: str,model: str,) -> str: + """Returns a fully-qualified model string.""" + return "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) + + @staticmethod + def parse_model_path(path: str) -> Dict[str,str]: + """Parses a model path into its component segments.""" + m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)/models/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_billing_account_path(billing_account: str, ) -> str: + """Returns a fully-qualified billing_account string.""" + return "billingAccounts/{billing_account}".format(billing_account=billing_account, ) + + @staticmethod + def parse_common_billing_account_path(path: str) -> Dict[str,str]: + """Parse a billing_account path into its component segments.""" + m = re.match(r"^billingAccounts/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_folder_path(folder: str, ) -> str: + """Returns a fully-qualified folder string.""" + return "folders/{folder}".format(folder=folder, ) + + @staticmethod + def parse_common_folder_path(path: str) -> Dict[str,str]: + """Parse a folder path into its component segments.""" + m = re.match(r"^folders/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_organization_path(organization: str, ) -> str: + """Returns a fully-qualified organization string.""" + return "organizations/{organization}".format(organization=organization, ) + + @staticmethod + def parse_common_organization_path(path: str) -> Dict[str,str]: + """Parse a organization path into its component segments.""" + m = re.match(r"^organizations/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_project_path(project: str, ) -> str: + """Returns a fully-qualified project string.""" + return "projects/{project}".format(project=project, ) + + @staticmethod + def parse_common_project_path(path: str) -> Dict[str,str]: + """Parse a project path into its component segments.""" + m = re.match(r"^projects/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_location_path(project: str, location: str, ) -> str: + """Returns a fully-qualified location string.""" + return "projects/{project}/locations/{location}".format(project=project, location=location, ) + + @staticmethod + def parse_common_location_path(path: str) -> Dict[str,str]: + """Parse a location path into its component segments.""" + m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path) + return m.groupdict() if m else {} + + @classmethod + def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[client_options_lib.ClientOptions] = None): + """Deprecated. Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variable is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + + warnings.warn("get_mtls_endpoint_and_cert_source is deprecated. Use the api_endpoint property instead.", + DeprecationWarning) + if client_options is None: + client_options = client_options_lib.ClientOptions() + use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") + use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") + if use_client_cert not in ("true", "false"): + raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") + if use_mtls_endpoint not in ("auto", "never", "always"): + raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") + + # Figure out the client cert source to use. + client_cert_source = None + if use_client_cert == "true": + if client_options.client_cert_source: + client_cert_source = client_options.client_cert_source + elif mtls.has_default_client_cert_source(): + client_cert_source = mtls.default_client_cert_source() + + # Figure out which api endpoint to use. + if client_options.api_endpoint is not None: + api_endpoint = client_options.api_endpoint + elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): + api_endpoint = cls.DEFAULT_MTLS_ENDPOINT + else: + api_endpoint = cls.DEFAULT_ENDPOINT + + return api_endpoint, client_cert_source + + @staticmethod + def _read_environment_variables(): + """Returns the environment variables used by the client. + + Returns: + Tuple[bool, str, str]: returns the GOOGLE_API_USE_CLIENT_CERTIFICATE, + GOOGLE_API_USE_MTLS_ENDPOINT, and GOOGLE_CLOUD_UNIVERSE_DOMAIN environment variables. + + Raises: + ValueError: If GOOGLE_API_USE_CLIENT_CERTIFICATE is not + any of ["true", "false"]. + google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT + is not any of ["auto", "never", "always"]. + """ + use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false").lower() + use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower() + universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN") + if use_client_cert not in ("true", "false"): + raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") + if use_mtls_endpoint not in ("auto", "never", "always"): + raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") + return use_client_cert == "true", use_mtls_endpoint, universe_domain_env + + @staticmethod + def _get_client_cert_source(provided_cert_source, use_cert_flag): + """Return the client cert source to be used by the client. + + Args: + provided_cert_source (bytes): The client certificate source provided. + use_cert_flag (bool): A flag indicating whether to use the client certificate. + + Returns: + bytes or None: The client cert source to be used by the client. + """ + client_cert_source = None + if use_cert_flag: + if provided_cert_source: + client_cert_source = provided_cert_source + elif mtls.has_default_client_cert_source(): + client_cert_source = mtls.default_client_cert_source() + return client_cert_source + + @staticmethod + def _get_api_endpoint(api_override, client_cert_source, universe_domain, use_mtls_endpoint): + """Return the API endpoint used by the client. + + Args: + api_override (str): The API endpoint override. If specified, this is always + the return value of this function and the other arguments are not used. + client_cert_source (bytes): The client certificate source used by the client. + universe_domain (str): The universe domain used by the client. + use_mtls_endpoint (str): How to use the mTLS endpoint, which depends also on the other parameters. + Possible values are "always", "auto", or "never". + + Returns: + str: The API endpoint to be used by the client. + """ + if api_override is not None: + api_endpoint = api_override + elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): + _default_universe = TextToSpeechClient._DEFAULT_UNIVERSE + if universe_domain != _default_universe: + raise MutualTLSChannelError(f"mTLS is not supported in any universe other than {_default_universe}.") + api_endpoint = TextToSpeechClient.DEFAULT_MTLS_ENDPOINT + else: + api_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=universe_domain) + return api_endpoint + + @staticmethod + def _get_universe_domain(client_universe_domain: Optional[str], universe_domain_env: Optional[str]) -> str: + """Return the universe domain used by the client. + + Args: + client_universe_domain (Optional[str]): The universe domain configured via the client options. + universe_domain_env (Optional[str]): The universe domain configured via the "GOOGLE_CLOUD_UNIVERSE_DOMAIN" environment variable. + + Returns: + str: The universe domain to be used by the client. + + Raises: + ValueError: If the universe domain is an empty string. + """ + universe_domain = TextToSpeechClient._DEFAULT_UNIVERSE + if client_universe_domain is not None: + universe_domain = client_universe_domain + elif universe_domain_env is not None: + universe_domain = universe_domain_env + if len(universe_domain.strip()) == 0: + raise ValueError("Universe Domain cannot be an empty string.") + return universe_domain + + @staticmethod + def _compare_universes(client_universe: str, + credentials: ga_credentials.Credentials) -> bool: + """Returns True iff the universe domains used by the client and credentials match. + + Args: + client_universe (str): The universe domain configured via the client options. + credentials (ga_credentials.Credentials): The credentials being used in the client. + + Returns: + bool: True iff client_universe matches the universe in credentials. + + Raises: + ValueError: when client_universe does not match the universe in credentials. + """ + + default_universe = TextToSpeechClient._DEFAULT_UNIVERSE + credentials_universe = getattr(credentials, "universe_domain", default_universe) + + if client_universe != credentials_universe: + raise ValueError("The configured universe domain " + f"({client_universe}) does not match the universe domain " + f"found in the credentials ({credentials_universe}). " + "If you haven't configured the universe domain explicitly, " + f"`{default_universe}` is the default.") + return True + + def _validate_universe_domain(self): + """Validates client's and credentials' universe domains are consistent. + + Returns: + bool: True iff the configured universe domain is valid. + + Raises: + ValueError: If the configured universe domain is not valid. + """ + self._is_universe_domain_valid = (self._is_universe_domain_valid or + TextToSpeechClient._compare_universes(self.universe_domain, self.transport._credentials)) + return self._is_universe_domain_valid + + @property + def api_endpoint(self): + """Return the API endpoint used by the client instance. + + Returns: + str: The API endpoint used by the client instance. + """ + return self._api_endpoint + + @property + def universe_domain(self) -> str: + """Return the universe domain used by the client instance. + + Returns: + str: The universe domain used by the client instance. + """ + return self._universe_domain + + def __init__(self, *, + credentials: Optional[ga_credentials.Credentials] = None, + transport: Optional[Union[str, TextToSpeechTransport, Callable[..., TextToSpeechTransport]]] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + ) -> None: + """Instantiates the text to speech client. + + Args: + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + transport (Optional[Union[str,TextToSpeechTransport,Callable[..., TextToSpeechTransport]]]): + The transport to use, or a Callable that constructs and returns a new transport. + If a Callable is given, it will be called with the same set of initialization + arguments as used in the TextToSpeechTransport constructor. + If set to None, a transport is chosen automatically. + NOTE: "rest" transport functionality is currently in a + beta state (preview). We welcome your feedback via an + issue in this library's source repository. + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): + Custom options for the client. + + 1. The ``api_endpoint`` property can be used to override the + default endpoint provided by the client when ``transport`` is + not explicitly provided. Only if this property is not set and + ``transport`` was not explicitly provided, the endpoint is + determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment + variable, which have one of the following values: + "always" (always use the default mTLS endpoint), "never" (always + use the default regular endpoint) and "auto" (auto-switch to the + default mTLS endpoint if client certificate is present; this is + the default value). + + 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable + is "true", then the ``client_cert_source`` property can be used + to provide a client certificate for mTLS transport. If + not provided, the default SSL client certificate will be used if + present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not + set, no client certificate will be used. + + 3. The ``universe_domain`` property can be used to override the + default "googleapis.com" universe. Note that the ``api_endpoint`` + property still takes precedence; and ``universe_domain`` is + currently not supported for mTLS. + + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport + creation failed for any reason. + """ + self._client_options = client_options + if isinstance(self._client_options, dict): + self._client_options = client_options_lib.from_dict(self._client_options) + if self._client_options is None: + self._client_options = client_options_lib.ClientOptions() + self._client_options = cast(client_options_lib.ClientOptions, self._client_options) + + universe_domain_opt = getattr(self._client_options, 'universe_domain', None) + + self._use_client_cert, self._use_mtls_endpoint, self._universe_domain_env = TextToSpeechClient._read_environment_variables() + self._client_cert_source = TextToSpeechClient._get_client_cert_source(self._client_options.client_cert_source, self._use_client_cert) + self._universe_domain = TextToSpeechClient._get_universe_domain(universe_domain_opt, self._universe_domain_env) + self._api_endpoint = None # updated below, depending on `transport` + + # Initialize the universe domain validation. + self._is_universe_domain_valid = False + + api_key_value = getattr(self._client_options, "api_key", None) + if api_key_value and credentials: + raise ValueError("client_options.api_key and credentials are mutually exclusive") + + # Save or instantiate the transport. + # Ordinarily, we provide the transport, but allowing a custom transport + # instance provides an extensibility point for unusual situations. + transport_provided = isinstance(transport, TextToSpeechTransport) + if transport_provided: + # transport is a TextToSpeechTransport instance. + if credentials or self._client_options.credentials_file or api_key_value: + raise ValueError("When providing a transport instance, " + "provide its credentials directly.") + if self._client_options.scopes: + raise ValueError( + "When providing a transport instance, provide its scopes " + "directly." + ) + self._transport = cast(TextToSpeechTransport, transport) + self._api_endpoint = self._transport.host + + self._api_endpoint = (self._api_endpoint or + TextToSpeechClient._get_api_endpoint( + self._client_options.api_endpoint, + self._client_cert_source, + self._universe_domain, + self._use_mtls_endpoint)) + + if not transport_provided: + import google.auth._default # type: ignore + + if api_key_value and hasattr(google.auth._default, "get_api_key_credentials"): + credentials = google.auth._default.get_api_key_credentials(api_key_value) + + transport_init: Union[Type[TextToSpeechTransport], Callable[..., TextToSpeechTransport]] = ( + TextToSpeechClient.get_transport_class(transport) + if isinstance(transport, str) or transport is None + else cast(Callable[..., TextToSpeechTransport], transport) + ) + # initialize with the provided callable or the passed in class + self._transport = transport_init( + credentials=credentials, + credentials_file=self._client_options.credentials_file, + host=self._api_endpoint, + scopes=self._client_options.scopes, + client_cert_source_for_mtls=self._client_cert_source, + quota_project_id=self._client_options.quota_project_id, + client_info=client_info, + always_use_jwt_access=True, + api_audience=self._client_options.api_audience, + ) + + def list_voices(self, + request: Optional[Union[cloud_tts.ListVoicesRequest, dict]] = None, + *, + language_code: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> cloud_tts.ListVoicesResponse: + r"""Returns a list of Voice supported for synthesis. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1 + + def sample_list_voices(): + # Create a client + client = texttospeech_v1.TextToSpeechClient() + + # Initialize request argument(s) + request = texttospeech_v1.ListVoicesRequest( + ) + + # Make the request + response = client.list_voices(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.texttospeech_v1.types.ListVoicesRequest, dict]): + The request object. The top-level message sent by the client for the + ``ListVoices`` method. + language_code (str): + Optional. Recommended. + `BCP-47 `__ + language tag. If not specified, the API will return all + supported voices. If specified, the ListVoices call will + only return voices that can be used to synthesize this + language_code. For example, if you specify ``"en-NZ"``, + all ``"en-NZ"`` voices will be returned. If you specify + ``"no"``, both ``"no-\*"`` (Norwegian) and ``"nb-\*"`` + (Norwegian Bokmal) voices will be returned. + + This corresponds to the ``language_code`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.cloud.texttospeech_v1.types.ListVoicesResponse: + The message returned to the client by the ListVoices + method. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([language_code]) + if request is not None and has_flattened_params: + raise ValueError('If the `request` argument is set, then none of ' + 'the individual field arguments should be set.') + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, cloud_tts.ListVoicesRequest): + request = cloud_tts.ListVoicesRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if language_code is not None: + request.language_code = language_code + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.list_voices] + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def synthesize_speech(self, + request: Optional[Union[cloud_tts.SynthesizeSpeechRequest, dict]] = None, + *, + input: Optional[cloud_tts.SynthesisInput] = None, + voice: Optional[cloud_tts.VoiceSelectionParams] = None, + audio_config: Optional[cloud_tts.AudioConfig] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> cloud_tts.SynthesizeSpeechResponse: + r"""Synthesizes speech synchronously: receive results + after all text input has been processed. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1 + + def sample_synthesize_speech(): + # Create a client + client = texttospeech_v1.TextToSpeechClient() + + # Initialize request argument(s) + input = texttospeech_v1.SynthesisInput() + input.text = "text_value" + + voice = texttospeech_v1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + audio_config = texttospeech_v1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + request = texttospeech_v1.SynthesizeSpeechRequest( + input=input, + voice=voice, + audio_config=audio_config, + ) + + # Make the request + response = client.synthesize_speech(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.texttospeech_v1.types.SynthesizeSpeechRequest, dict]): + The request object. The top-level message sent by the client for the + ``SynthesizeSpeech`` method. + input (google.cloud.texttospeech_v1.types.SynthesisInput): + Required. The Synthesizer requires + either plain text or SSML as input. + + This corresponds to the ``input`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + voice (google.cloud.texttospeech_v1.types.VoiceSelectionParams): + Required. The desired voice of the + synthesized audio. + + This corresponds to the ``voice`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + audio_config (google.cloud.texttospeech_v1.types.AudioConfig): + Required. The configuration of the + synthesized audio. + + This corresponds to the ``audio_config`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.cloud.texttospeech_v1.types.SynthesizeSpeechResponse: + The message returned to the client by the + SynthesizeSpeech method. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([input, voice, audio_config]) + if request is not None and has_flattened_params: + raise ValueError('If the `request` argument is set, then none of ' + 'the individual field arguments should be set.') + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, cloud_tts.SynthesizeSpeechRequest): + request = cloud_tts.SynthesizeSpeechRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if input is not None: + request.input = input + if voice is not None: + request.voice = voice + if audio_config is not None: + request.audio_config = audio_config + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.synthesize_speech] + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def streaming_synthesize(self, + requests: Optional[Iterator[cloud_tts.StreamingSynthesizeRequest]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> Iterable[cloud_tts.StreamingSynthesizeResponse]: + r"""Performs bidirectional streaming speech synthesis: + receive audio while sending text. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1 + + def sample_streaming_synthesize(): + # Create a client + client = texttospeech_v1.TextToSpeechClient() + + # Initialize request argument(s) + streaming_config = texttospeech_v1.StreamingSynthesizeConfig() + streaming_config.voice.language_code = "language_code_value" + + request = texttospeech_v1.StreamingSynthesizeRequest( + streaming_config=streaming_config, + ) + + # This method expects an iterator which contains + # 'texttospeech_v1.StreamingSynthesizeRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = client.streaming_synthesize(requests=request_generator()) + + # Handle the response + for response in stream: + print(response) + + Args: + requests (Iterator[google.cloud.texttospeech_v1.types.StreamingSynthesizeRequest]): + The request object iterator. Request message for the ``StreamingSynthesize`` method. + Multiple ``StreamingSynthesizeRequest`` messages are + sent in one call. The first message must contain a + ``streaming_config`` that fully specifies the request + configuration and must not contain ``input``. All + subsequent messages must only have ``input`` set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + Iterable[google.cloud.texttospeech_v1.types.StreamingSynthesizeResponse]: + StreamingSynthesizeResponse is the only message returned to the + client by StreamingSynthesize method. A series of + zero or more StreamingSynthesizeResponse messages are + streamed back to the client. + + """ + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.streaming_synthesize] + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + requests, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def __enter__(self) -> "TextToSpeechClient": + return self + + def __exit__(self, type, value, traceback): + """Releases underlying transport's resources. + + .. warning:: + ONLY use as a context manager if the transport is NOT shared + with other clients! Exiting the with block will CLOSE the transport + and may cause errors in other clients! + """ + self.transport.close() + + def list_operations( + self, + request: Optional[operations_pb2.ListOperationsRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.ListOperationsResponse: + r"""Lists operations that match the specified filter in the request. + + Args: + request (:class:`~.operations_pb2.ListOperationsRequest`): + The request object. Request message for + `ListOperations` method. + retry (google.api_core.retry.Retry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.ListOperationsResponse: + Response message for ``ListOperations`` method. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.ListOperationsRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.list_operations] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + def get_operation( + self, + request: Optional[operations_pb2.GetOperationRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.Operation: + r"""Gets the latest state of a long-running operation. + + Args: + request (:class:`~.operations_pb2.GetOperationRequest`): + The request object. Request message for + `GetOperation` method. + retry (google.api_core.retry.Retry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.Operation: + An ``Operation`` object. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.GetOperationRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.get_operation] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + + + + + + + + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) + + +__all__ = ( + "TextToSpeechClient", +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/README.rst b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/README.rst new file mode 100644 index 000000000000..37ce873b979b --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/README.rst @@ -0,0 +1,9 @@ + +transport inheritance structure +_______________________________ + +`TextToSpeechTransport` is the ABC for all transports. +- public child `TextToSpeechGrpcTransport` for sync gRPC transport (defined in `grpc.py`). +- public child `TextToSpeechGrpcAsyncIOTransport` for async gRPC transport (defined in `grpc_asyncio.py`). +- private child `_BaseTextToSpeechRestTransport` for base REST transport with inner classes `_BaseMETHOD` (defined in `rest_base.py`). +- public child `TextToSpeechRestTransport` for sync REST transport with inner classes `METHOD` derived from the parent's corresponding `_BaseMETHOD` classes (defined in `rest.py`). diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/__init__.py new file mode 100644 index 000000000000..84d107252aae --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/__init__.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from collections import OrderedDict +from typing import Dict, Type + +from .base import TextToSpeechTransport +from .grpc import TextToSpeechGrpcTransport +from .grpc_asyncio import TextToSpeechGrpcAsyncIOTransport +from .rest import TextToSpeechRestTransport +from .rest import TextToSpeechRestInterceptor + + +# Compile a registry of transports. +_transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechTransport]] +_transport_registry['grpc'] = TextToSpeechGrpcTransport +_transport_registry['grpc_asyncio'] = TextToSpeechGrpcAsyncIOTransport +_transport_registry['rest'] = TextToSpeechRestTransport + +__all__ = ( + 'TextToSpeechTransport', + 'TextToSpeechGrpcTransport', + 'TextToSpeechGrpcAsyncIOTransport', + 'TextToSpeechRestTransport', + 'TextToSpeechRestInterceptor', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/base.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/base.py new file mode 100644 index 000000000000..f9387a118e4d --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/base.py @@ -0,0 +1,211 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 abc +from typing import Awaitable, Callable, Dict, Optional, Sequence, Union + +from google.cloud.texttospeech_v1 import gapic_version as package_version + +import google.auth # type: ignore +import google.api_core +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.oauth2 import service_account # type: ignore + +from google.cloud.texttospeech_v1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) + + +class TextToSpeechTransport(abc.ABC): + """Abstract transport class for TextToSpeech.""" + + AUTH_SCOPES = ( + 'https://www.googleapis.com/auth/cloud-platform', + ) + + DEFAULT_HOST: str = 'texttospeech.googleapis.com' + def __init__( + self, *, + host: str = DEFAULT_HOST, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + **kwargs, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is mutually exclusive with credentials. + scopes (Optional[Sequence[str]]): A list of scopes. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + """ + + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} + + # Save the scopes. + self._scopes = scopes + if not hasattr(self, "_ignore_credentials"): + self._ignore_credentials: bool = False + + # If no credentials are provided, then determine the appropriate + # defaults. + if credentials and credentials_file: + raise core_exceptions.DuplicateCredentialArgs("'credentials_file' and 'credentials' are mutually exclusive") + + if credentials_file is not None: + credentials, _ = google.auth.load_credentials_from_file( + credentials_file, + **scopes_kwargs, + quota_project_id=quota_project_id + ) + elif credentials is None and not self._ignore_credentials: + credentials, _ = google.auth.default(**scopes_kwargs, quota_project_id=quota_project_id) + # Don't apply audience if the credentials file passed from user. + if hasattr(credentials, "with_gdch_audience"): + credentials = credentials.with_gdch_audience(api_audience if api_audience else host) + + # If the credentials are service account credentials, then always try to use self signed JWT. + if always_use_jwt_access and isinstance(credentials, service_account.Credentials) and hasattr(service_account.Credentials, "with_always_use_jwt_access"): + credentials = credentials.with_always_use_jwt_access(True) + + # Save the credentials. + self._credentials = credentials + + # Save the hostname. Default to port 443 (HTTPS) if none is specified. + if ':' not in host: + host += ':443' + self._host = host + + @property + def host(self): + return self._host + + def _prep_wrapped_messages(self, client_info): + # Precompute the wrapped methods. + self._wrapped_methods = { + self.list_voices: gapic_v1.method.wrap_method( + self.list_voices, + default_timeout=None, + client_info=client_info, + ), + self.synthesize_speech: gapic_v1.method.wrap_method( + self.synthesize_speech, + default_timeout=None, + client_info=client_info, + ), + self.streaming_synthesize: gapic_v1.method.wrap_method( + self.streaming_synthesize, + default_timeout=None, + client_info=client_info, + ), + self.get_operation: gapic_v1.method.wrap_method( + self.get_operation, + default_timeout=None, + client_info=client_info, + ), + self.list_operations: gapic_v1.method.wrap_method( + self.list_operations, + default_timeout=None, + client_info=client_info, + ), + } + + def close(self): + """Closes resources associated with the transport. + + .. warning:: + Only call this method if the transport is NOT shared + with other clients - this may cause errors in other clients! + """ + raise NotImplementedError() + + @property + def list_voices(self) -> Callable[ + [cloud_tts.ListVoicesRequest], + Union[ + cloud_tts.ListVoicesResponse, + Awaitable[cloud_tts.ListVoicesResponse] + ]]: + raise NotImplementedError() + + @property + def synthesize_speech(self) -> Callable[ + [cloud_tts.SynthesizeSpeechRequest], + Union[ + cloud_tts.SynthesizeSpeechResponse, + Awaitable[cloud_tts.SynthesizeSpeechResponse] + ]]: + raise NotImplementedError() + + @property + def streaming_synthesize(self) -> Callable[ + [cloud_tts.StreamingSynthesizeRequest], + Union[ + cloud_tts.StreamingSynthesizeResponse, + Awaitable[cloud_tts.StreamingSynthesizeResponse] + ]]: + raise NotImplementedError() + + @property + def list_operations( + self, + ) -> Callable[ + [operations_pb2.ListOperationsRequest], + Union[operations_pb2.ListOperationsResponse, Awaitable[operations_pb2.ListOperationsResponse]], + ]: + raise NotImplementedError() + + @property + def get_operation( + self, + ) -> Callable[ + [operations_pb2.GetOperationRequest], + Union[operations_pb2.Operation, Awaitable[operations_pb2.Operation]], + ]: + raise NotImplementedError() + + @property + def kind(self) -> str: + raise NotImplementedError() + + +__all__ = ( + 'TextToSpeechTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc.py new file mode 100644 index 000000000000..125165f8ff9a --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc.py @@ -0,0 +1,361 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 warnings +from typing import Callable, Dict, Optional, Sequence, Tuple, Union + +from google.api_core import grpc_helpers +from google.api_core import gapic_v1 +import google.auth # type: ignore +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore + +import grpc # type: ignore + +from google.cloud.texttospeech_v1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore +from .base import TextToSpeechTransport, DEFAULT_CLIENT_INFO + + +class TextToSpeechGrpcTransport(TextToSpeechTransport): + """gRPC backend transport for TextToSpeech. + + Service that implements Google Cloud Text-to-Speech API. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends protocol buffers over the wire using gRPC (which is built on + top of HTTP/2); the ``grpcio`` package must be installed. + """ + _stubs: Dict[str, Callable] + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + This argument is ignored if a ``channel`` instance is provided. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if a ``channel`` instance is provided. + scopes (Optional(Sequence[str])): A list of scopes. This argument is + ignored if a ``channel`` instance is provided. + channel (Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]]): + A ``Channel`` instance through which to make calls, or a Callable + that constructs and returns one. If set to None, ``self.create_channel`` + is used to create the channel. If a Callable is given, it will be called + with the same arguments as used in ``self.create_channel``. + api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. + If provided, it overrides the ``host`` argument and tries to create + a mutual TLS channel with client SSL credentials from + ``client_cert_source`` or application default SSL credentials. + client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): + Deprecated. A callback to provide client SSL certificate bytes and + private key bytes, both in PEM format. It is ignored if + ``api_mtls_endpoint`` is None. + ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials + for the grpc channel. It is ignored if a ``channel`` instance is provided. + client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): + A callback to provide client certificate bytes and private key bytes, + both in PEM format. It is used to configure a mutual TLS channel. It is + ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport + creation failed for any reason. + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + self._grpc_channel = None + self._ssl_channel_credentials = ssl_channel_credentials + self._stubs: Dict[str, Callable] = {} + + if api_mtls_endpoint: + warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) + if client_cert_source: + warnings.warn("client_cert_source is deprecated", DeprecationWarning) + + if isinstance(channel, grpc.Channel): + # Ignore credentials if a channel was passed. + credentials = None + self._ignore_credentials = True + # If a channel was explicitly provided, set it. + self._grpc_channel = channel + self._ssl_channel_credentials = None + + else: + if api_mtls_endpoint: + host = api_mtls_endpoint + + # Create SSL credentials with client_cert_source or application + # default SSL credentials. + if client_cert_source: + cert, key = client_cert_source() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + else: + self._ssl_channel_credentials = SslCredentials().ssl_credentials + + else: + if client_cert_source_for_mtls and not ssl_channel_credentials: + cert, key = client_cert_source_for_mtls() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + + # The base transport sets the host, credentials and scopes + super().__init__( + host=host, + credentials=credentials, + credentials_file=credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + + if not self._grpc_channel: + # initialize with the provided callable or the default channel + channel_init = channel or type(self).create_channel + self._grpc_channel = channel_init( + self._host, + # use the credentials which are saved + credentials=self._credentials, + # Set ``credentials_file`` to ``None`` here as + # the credentials that we saved earlier should be used. + credentials_file=None, + scopes=self._scopes, + ssl_credentials=self._ssl_channel_credentials, + quota_project_id=quota_project_id, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Wrap messages. This must be done after self._grpc_channel exists + self._prep_wrapped_messages(client_info) + + @classmethod + def create_channel(cls, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + **kwargs) -> grpc.Channel: + """Create and return a gRPC channel object. + Args: + host (Optional[str]): The host for the channel to use. + credentials (Optional[~.Credentials]): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If + none are specified, the client will attempt to ascertain + the credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is mutually exclusive with credentials. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + kwargs (Optional[dict]): Keyword arguments, which are passed to the + channel creation. + Returns: + grpc.Channel: A gRPC channel object. + + Raises: + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + + return grpc_helpers.create_channel( + host, + credentials=credentials, + credentials_file=credentials_file, + quota_project_id=quota_project_id, + default_scopes=cls.AUTH_SCOPES, + scopes=scopes, + default_host=cls.DEFAULT_HOST, + **kwargs + ) + + @property + def grpc_channel(self) -> grpc.Channel: + """Return the channel designed to connect to this service. + """ + return self._grpc_channel + + @property + def list_voices(self) -> Callable[ + [cloud_tts.ListVoicesRequest], + cloud_tts.ListVoicesResponse]: + r"""Return a callable for the list voices method over gRPC. + + Returns a list of Voice supported for synthesis. + + Returns: + Callable[[~.ListVoicesRequest], + ~.ListVoicesResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'list_voices' not in self._stubs: + self._stubs['list_voices'] = self.grpc_channel.unary_unary( + '/google.cloud.texttospeech.v1.TextToSpeech/ListVoices', + request_serializer=cloud_tts.ListVoicesRequest.serialize, + response_deserializer=cloud_tts.ListVoicesResponse.deserialize, + ) + return self._stubs['list_voices'] + + @property + def synthesize_speech(self) -> Callable[ + [cloud_tts.SynthesizeSpeechRequest], + cloud_tts.SynthesizeSpeechResponse]: + r"""Return a callable for the synthesize speech method over gRPC. + + Synthesizes speech synchronously: receive results + after all text input has been processed. + + Returns: + Callable[[~.SynthesizeSpeechRequest], + ~.SynthesizeSpeechResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'synthesize_speech' not in self._stubs: + self._stubs['synthesize_speech'] = self.grpc_channel.unary_unary( + '/google.cloud.texttospeech.v1.TextToSpeech/SynthesizeSpeech', + request_serializer=cloud_tts.SynthesizeSpeechRequest.serialize, + response_deserializer=cloud_tts.SynthesizeSpeechResponse.deserialize, + ) + return self._stubs['synthesize_speech'] + + @property + def streaming_synthesize(self) -> Callable[ + [cloud_tts.StreamingSynthesizeRequest], + cloud_tts.StreamingSynthesizeResponse]: + r"""Return a callable for the streaming synthesize method over gRPC. + + Performs bidirectional streaming speech synthesis: + receive audio while sending text. + + Returns: + Callable[[~.StreamingSynthesizeRequest], + ~.StreamingSynthesizeResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'streaming_synthesize' not in self._stubs: + self._stubs['streaming_synthesize'] = self.grpc_channel.stream_stream( + '/google.cloud.texttospeech.v1.TextToSpeech/StreamingSynthesize', + request_serializer=cloud_tts.StreamingSynthesizeRequest.serialize, + response_deserializer=cloud_tts.StreamingSynthesizeResponse.deserialize, + ) + return self._stubs['streaming_synthesize'] + + def close(self): + self.grpc_channel.close() + + @property + def get_operation( + self, + ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: + r"""Return a callable for the get_operation method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_operation" not in self._stubs: + self._stubs["get_operation"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/GetOperation", + request_serializer=operations_pb2.GetOperationRequest.SerializeToString, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs["get_operation"] + + @property + def list_operations( + self, + ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: + r"""Return a callable for the list_operations method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "list_operations" not in self._stubs: + self._stubs["list_operations"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/ListOperations", + request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, + response_deserializer=operations_pb2.ListOperationsResponse.FromString, + ) + return self._stubs["list_operations"] + + @property + def kind(self) -> str: + return "grpc" + + +__all__ = ( + 'TextToSpeechGrpcTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc_asyncio.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc_asyncio.py new file mode 100644 index 000000000000..86d190bff1a2 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc_asyncio.py @@ -0,0 +1,402 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 inspect +import warnings +from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union + +from google.api_core import gapic_v1 +from google.api_core import grpc_helpers_async +from google.api_core import exceptions as core_exceptions +from google.api_core import retry_async as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore + +import grpc # type: ignore +from grpc.experimental import aio # type: ignore + +from google.cloud.texttospeech_v1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore +from .base import TextToSpeechTransport, DEFAULT_CLIENT_INFO +from .grpc import TextToSpeechGrpcTransport + + +class TextToSpeechGrpcAsyncIOTransport(TextToSpeechTransport): + """gRPC AsyncIO backend transport for TextToSpeech. + + Service that implements Google Cloud Text-to-Speech API. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends protocol buffers over the wire using gRPC (which is built on + top of HTTP/2); the ``grpcio`` package must be installed. + """ + + _grpc_channel: aio.Channel + _stubs: Dict[str, Callable] = {} + + @classmethod + def create_channel(cls, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + **kwargs) -> aio.Channel: + """Create and return a gRPC AsyncIO channel object. + Args: + host (Optional[str]): The host for the channel to use. + credentials (Optional[~.Credentials]): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If + none are specified, the client will attempt to ascertain + the credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + kwargs (Optional[dict]): Keyword arguments, which are passed to the + channel creation. + Returns: + aio.Channel: A gRPC AsyncIO channel object. + """ + + return grpc_helpers_async.create_channel( + host, + credentials=credentials, + credentials_file=credentials_file, + quota_project_id=quota_project_id, + default_scopes=cls.AUTH_SCOPES, + scopes=scopes, + default_host=cls.DEFAULT_HOST, + **kwargs + ) + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[Union[aio.Channel, Callable[..., aio.Channel]]] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + This argument is ignored if a ``channel`` instance is provided. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if a ``channel`` instance is provided. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + channel (Optional[Union[aio.Channel, Callable[..., aio.Channel]]]): + A ``Channel`` instance through which to make calls, or a Callable + that constructs and returns one. If set to None, ``self.create_channel`` + is used to create the channel. If a Callable is given, it will be called + with the same arguments as used in ``self.create_channel``. + api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. + If provided, it overrides the ``host`` argument and tries to create + a mutual TLS channel with client SSL credentials from + ``client_cert_source`` or application default SSL credentials. + client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): + Deprecated. A callback to provide client SSL certificate bytes and + private key bytes, both in PEM format. It is ignored if + ``api_mtls_endpoint`` is None. + ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials + for the grpc channel. It is ignored if a ``channel`` instance is provided. + client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): + A callback to provide client certificate bytes and private key bytes, + both in PEM format. It is used to configure a mutual TLS channel. It is + ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + + Raises: + google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport + creation failed for any reason. + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + self._grpc_channel = None + self._ssl_channel_credentials = ssl_channel_credentials + self._stubs: Dict[str, Callable] = {} + + if api_mtls_endpoint: + warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) + if client_cert_source: + warnings.warn("client_cert_source is deprecated", DeprecationWarning) + + if isinstance(channel, aio.Channel): + # Ignore credentials if a channel was passed. + credentials = None + self._ignore_credentials = True + # If a channel was explicitly provided, set it. + self._grpc_channel = channel + self._ssl_channel_credentials = None + else: + if api_mtls_endpoint: + host = api_mtls_endpoint + + # Create SSL credentials with client_cert_source or application + # default SSL credentials. + if client_cert_source: + cert, key = client_cert_source() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + else: + self._ssl_channel_credentials = SslCredentials().ssl_credentials + + else: + if client_cert_source_for_mtls and not ssl_channel_credentials: + cert, key = client_cert_source_for_mtls() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + + # The base transport sets the host, credentials and scopes + super().__init__( + host=host, + credentials=credentials, + credentials_file=credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + + if not self._grpc_channel: + # initialize with the provided callable or the default channel + channel_init = channel or type(self).create_channel + self._grpc_channel = channel_init( + self._host, + # use the credentials which are saved + credentials=self._credentials, + # Set ``credentials_file`` to ``None`` here as + # the credentials that we saved earlier should be used. + credentials_file=None, + scopes=self._scopes, + ssl_credentials=self._ssl_channel_credentials, + quota_project_id=quota_project_id, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Wrap messages. This must be done after self._grpc_channel exists + self._wrap_with_kind = "kind" in inspect.signature(gapic_v1.method_async.wrap_method).parameters + self._prep_wrapped_messages(client_info) + + @property + def grpc_channel(self) -> aio.Channel: + """Create the channel designed to connect to this service. + + This property caches on the instance; repeated calls return + the same channel. + """ + # Return the channel from cache. + return self._grpc_channel + + @property + def list_voices(self) -> Callable[ + [cloud_tts.ListVoicesRequest], + Awaitable[cloud_tts.ListVoicesResponse]]: + r"""Return a callable for the list voices method over gRPC. + + Returns a list of Voice supported for synthesis. + + Returns: + Callable[[~.ListVoicesRequest], + Awaitable[~.ListVoicesResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'list_voices' not in self._stubs: + self._stubs['list_voices'] = self.grpc_channel.unary_unary( + '/google.cloud.texttospeech.v1.TextToSpeech/ListVoices', + request_serializer=cloud_tts.ListVoicesRequest.serialize, + response_deserializer=cloud_tts.ListVoicesResponse.deserialize, + ) + return self._stubs['list_voices'] + + @property + def synthesize_speech(self) -> Callable[ + [cloud_tts.SynthesizeSpeechRequest], + Awaitable[cloud_tts.SynthesizeSpeechResponse]]: + r"""Return a callable for the synthesize speech method over gRPC. + + Synthesizes speech synchronously: receive results + after all text input has been processed. + + Returns: + Callable[[~.SynthesizeSpeechRequest], + Awaitable[~.SynthesizeSpeechResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'synthesize_speech' not in self._stubs: + self._stubs['synthesize_speech'] = self.grpc_channel.unary_unary( + '/google.cloud.texttospeech.v1.TextToSpeech/SynthesizeSpeech', + request_serializer=cloud_tts.SynthesizeSpeechRequest.serialize, + response_deserializer=cloud_tts.SynthesizeSpeechResponse.deserialize, + ) + return self._stubs['synthesize_speech'] + + @property + def streaming_synthesize(self) -> Callable[ + [cloud_tts.StreamingSynthesizeRequest], + Awaitable[cloud_tts.StreamingSynthesizeResponse]]: + r"""Return a callable for the streaming synthesize method over gRPC. + + Performs bidirectional streaming speech synthesis: + receive audio while sending text. + + Returns: + Callable[[~.StreamingSynthesizeRequest], + Awaitable[~.StreamingSynthesizeResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'streaming_synthesize' not in self._stubs: + self._stubs['streaming_synthesize'] = self.grpc_channel.stream_stream( + '/google.cloud.texttospeech.v1.TextToSpeech/StreamingSynthesize', + request_serializer=cloud_tts.StreamingSynthesizeRequest.serialize, + response_deserializer=cloud_tts.StreamingSynthesizeResponse.deserialize, + ) + return self._stubs['streaming_synthesize'] + + def _prep_wrapped_messages(self, client_info): + """ Precompute the wrapped methods, overriding the base class method to use async wrappers.""" + self._wrapped_methods = { + self.list_voices: self._wrap_method( + self.list_voices, + default_timeout=None, + client_info=client_info, + ), + self.synthesize_speech: self._wrap_method( + self.synthesize_speech, + default_timeout=None, + client_info=client_info, + ), + self.streaming_synthesize: self._wrap_method( + self.streaming_synthesize, + default_timeout=None, + client_info=client_info, + ), + self.get_operation: self._wrap_method( + self.get_operation, + default_timeout=None, + client_info=client_info, + ), + self.list_operations: self._wrap_method( + self.list_operations, + default_timeout=None, + client_info=client_info, + ), + } + + def _wrap_method(self, func, *args, **kwargs): + if self._wrap_with_kind: # pragma: NO COVER + kwargs["kind"] = self.kind + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) + + def close(self): + return self.grpc_channel.close() + + @property + def kind(self) -> str: + return "grpc_asyncio" + + @property + def get_operation( + self, + ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: + r"""Return a callable for the get_operation method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_operation" not in self._stubs: + self._stubs["get_operation"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/GetOperation", + request_serializer=operations_pb2.GetOperationRequest.SerializeToString, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs["get_operation"] + + @property + def list_operations( + self, + ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: + r"""Return a callable for the list_operations method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "list_operations" not in self._stubs: + self._stubs["list_operations"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/ListOperations", + request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, + response_deserializer=operations_pb2.ListOperationsResponse.FromString, + ) + return self._stubs["list_operations"] + + +__all__ = ( + 'TextToSpeechGrpcAsyncIOTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py new file mode 100644 index 000000000000..102259de19e3 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py @@ -0,0 +1,599 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# + +from google.auth.transport.requests import AuthorizedSession # type: ignore +import json # type: ignore +from google.auth import credentials as ga_credentials # type: ignore +from google.api_core import exceptions as core_exceptions +from google.api_core import retry as retries +from google.api_core import rest_helpers +from google.api_core import rest_streaming +from google.api_core import gapic_v1 + +from google.protobuf import json_format + +from requests import __version__ as requests_version +import dataclasses +from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union +import warnings + + +from google.cloud.texttospeech_v1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore + + +from .rest_base import _BaseTextToSpeechRestTransport +from .base import DEFAULT_CLIENT_INFO as BASE_DEFAULT_CLIENT_INFO + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object, None] # type: ignore + + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, + grpc_version=None, + rest_version=f"requests@{requests_version}", +) + + +class TextToSpeechRestInterceptor: + """Interceptor for TextToSpeech. + + Interceptors are used to manipulate requests, request metadata, and responses + in arbitrary ways. + Example use cases include: + * Logging + * Verifying requests according to service or custom semantics + * Stripping extraneous information from responses + + These use cases and more can be enabled by injecting an + instance of a custom subclass when constructing the TextToSpeechRestTransport. + + .. code-block:: python + class MyCustomTextToSpeechInterceptor(TextToSpeechRestInterceptor): + def pre_list_voices(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_list_voices(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_synthesize_speech(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_synthesize_speech(self, response): + logging.log(f"Received response: {response}") + return response + + transport = TextToSpeechRestTransport(interceptor=MyCustomTextToSpeechInterceptor()) + client = TextToSpeechClient(transport=transport) + + + """ + def pre_list_voices(self, request: cloud_tts.ListVoicesRequest, metadata: Sequence[Tuple[str, str]]) -> Tuple[cloud_tts.ListVoicesRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for list_voices + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeech server. + """ + return request, metadata + + def post_list_voices(self, response: cloud_tts.ListVoicesResponse) -> cloud_tts.ListVoicesResponse: + """Post-rpc interceptor for list_voices + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeech server but before + it is returned to user code. + """ + return response + + def pre_synthesize_speech(self, request: cloud_tts.SynthesizeSpeechRequest, metadata: Sequence[Tuple[str, str]]) -> Tuple[cloud_tts.SynthesizeSpeechRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for synthesize_speech + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeech server. + """ + return request, metadata + + def post_synthesize_speech(self, response: cloud_tts.SynthesizeSpeechResponse) -> cloud_tts.SynthesizeSpeechResponse: + """Post-rpc interceptor for synthesize_speech + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeech server but before + it is returned to user code. + """ + return response + + def pre_get_operation( + self, request: operations_pb2.GetOperationRequest, metadata: Sequence[Tuple[str, str]] + ) -> Tuple[operations_pb2.GetOperationRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for get_operation + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeech server. + """ + return request, metadata + + def post_get_operation( + self, response: operations_pb2.Operation + ) -> operations_pb2.Operation: + """Post-rpc interceptor for get_operation + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeech server but before + it is returned to user code. + """ + return response + + def pre_list_operations( + self, request: operations_pb2.ListOperationsRequest, metadata: Sequence[Tuple[str, str]] + ) -> Tuple[operations_pb2.ListOperationsRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for list_operations + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeech server. + """ + return request, metadata + + def post_list_operations( + self, response: operations_pb2.ListOperationsResponse + ) -> operations_pb2.ListOperationsResponse: + """Post-rpc interceptor for list_operations + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeech server but before + it is returned to user code. + """ + return response + + +@dataclasses.dataclass +class TextToSpeechRestStub: + _session: AuthorizedSession + _host: str + _interceptor: TextToSpeechRestInterceptor + + +class TextToSpeechRestTransport(_BaseTextToSpeechRestTransport): + """REST backend synchronous transport for TextToSpeech. + + Service that implements Google Cloud Text-to-Speech API. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends JSON representations of protocol buffers over HTTP/1.1 + """ + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + client_cert_source_for_mtls: Optional[Callable[[ + ], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + url_scheme: str = 'https', + interceptor: Optional[TextToSpeechRestInterceptor] = None, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + NOTE: This REST transport functionality is currently in a beta + state (preview). We welcome your feedback via a GitHub issue in + this library's repository. Thank you! + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if ``channel`` is provided. + scopes (Optional(Sequence[str])): A list of scopes. This argument is + ignored if ``channel`` is provided. + client_cert_source_for_mtls (Callable[[], Tuple[bytes, bytes]]): Client + certificate to configure mutual TLS HTTP channel. It is ignored + if ``channel`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you are developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + url_scheme: the protocol scheme for the API endpoint. Normally + "https", but for testing or local servers, + "http" can be specified. + """ + # Run the base constructor + # TODO(yon-mg): resolve other ctor params i.e. scopes, quota, etc. + # TODO: When custom host (api_endpoint) is set, `scopes` must *also* be set on the + # credentials object + super().__init__( + host=host, + credentials=credentials, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + url_scheme=url_scheme, + api_audience=api_audience + ) + self._session = AuthorizedSession( + self._credentials, default_host=self.DEFAULT_HOST) + if client_cert_source_for_mtls: + self._session.configure_mtls_channel(client_cert_source_for_mtls) + self._interceptor = interceptor or TextToSpeechRestInterceptor() + self._prep_wrapped_messages(client_info) + + class _ListVoices(_BaseTextToSpeechRestTransport._BaseListVoices, TextToSpeechRestStub): + def __hash__(self): + return hash("TextToSpeechRestTransport.ListVoices") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + return response + + def __call__(self, + request: cloud_tts.ListVoicesRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> cloud_tts.ListVoicesResponse: + r"""Call the list voices method over HTTP. + + Args: + request (~.cloud_tts.ListVoicesRequest): + The request object. The top-level message sent by the client for the + ``ListVoices`` method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.cloud_tts.ListVoicesResponse: + The message returned to the client by the ``ListVoices`` + method. + + """ + + http_options = _BaseTextToSpeechRestTransport._BaseListVoices._get_http_options() + request, metadata = self._interceptor.pre_list_voices(request, metadata) + transcoded_request = _BaseTextToSpeechRestTransport._BaseListVoices._get_transcoded_request(http_options, request) + + # Jsonify the query params + query_params = _BaseTextToSpeechRestTransport._BaseListVoices._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechRestTransport._ListVoices._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = cloud_tts.ListVoicesResponse() + pb_resp = cloud_tts.ListVoicesResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_list_voices(resp) + return resp + + class _StreamingSynthesize(_BaseTextToSpeechRestTransport._BaseStreamingSynthesize, TextToSpeechRestStub): + def __hash__(self): + return hash("TextToSpeechRestTransport.StreamingSynthesize") + + def __call__(self, + request: cloud_tts.StreamingSynthesizeRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> rest_streaming.ResponseIterator: + raise NotImplementedError( + "Method StreamingSynthesize is not available over REST transport" + ) + class _SynthesizeSpeech(_BaseTextToSpeechRestTransport._BaseSynthesizeSpeech, TextToSpeechRestStub): + def __hash__(self): + return hash("TextToSpeechRestTransport.SynthesizeSpeech") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + return response + + def __call__(self, + request: cloud_tts.SynthesizeSpeechRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> cloud_tts.SynthesizeSpeechResponse: + r"""Call the synthesize speech method over HTTP. + + Args: + request (~.cloud_tts.SynthesizeSpeechRequest): + The request object. The top-level message sent by the client for the + ``SynthesizeSpeech`` method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.cloud_tts.SynthesizeSpeechResponse: + The message returned to the client by the + ``SynthesizeSpeech`` method. + + """ + + http_options = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_http_options() + request, metadata = self._interceptor.pre_synthesize_speech(request, metadata) + transcoded_request = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_transcoded_request(http_options, request) + + body = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_request_body_json(transcoded_request) + + # Jsonify the query params + query_params = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechRestTransport._SynthesizeSpeech._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request, body) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = cloud_tts.SynthesizeSpeechResponse() + pb_resp = cloud_tts.SynthesizeSpeechResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_synthesize_speech(resp) + return resp + + @property + def list_voices(self) -> Callable[ + [cloud_tts.ListVoicesRequest], + cloud_tts.ListVoicesResponse]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._ListVoices(self._session, self._host, self._interceptor) # type: ignore + + @property + def streaming_synthesize(self) -> Callable[ + [cloud_tts.StreamingSynthesizeRequest], + cloud_tts.StreamingSynthesizeResponse]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._StreamingSynthesize(self._session, self._host, self._interceptor) # type: ignore + + @property + def synthesize_speech(self) -> Callable[ + [cloud_tts.SynthesizeSpeechRequest], + cloud_tts.SynthesizeSpeechResponse]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._SynthesizeSpeech(self._session, self._host, self._interceptor) # type: ignore + + @property + def get_operation(self): + return self._GetOperation(self._session, self._host, self._interceptor) # type: ignore + + class _GetOperation(_BaseTextToSpeechRestTransport._BaseGetOperation, TextToSpeechRestStub): + def __hash__(self): + return hash("TextToSpeechRestTransport.GetOperation") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + return response + + def __call__(self, + request: operations_pb2.GetOperationRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> operations_pb2.Operation: + + r"""Call the get operation method over HTTP. + + Args: + request (operations_pb2.GetOperationRequest): + The request object for GetOperation method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + operations_pb2.Operation: Response from GetOperation method. + """ + + http_options = _BaseTextToSpeechRestTransport._BaseGetOperation._get_http_options() + request, metadata = self._interceptor.pre_get_operation(request, metadata) + transcoded_request = _BaseTextToSpeechRestTransport._BaseGetOperation._get_transcoded_request(http_options, request) + + # Jsonify the query params + query_params = _BaseTextToSpeechRestTransport._BaseGetOperation._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechRestTransport._GetOperation._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + content = response.content.decode("utf-8") + resp = operations_pb2.Operation() + resp = json_format.Parse(content, resp) + resp = self._interceptor.post_get_operation(resp) + return resp + + @property + def list_operations(self): + return self._ListOperations(self._session, self._host, self._interceptor) # type: ignore + + class _ListOperations(_BaseTextToSpeechRestTransport._BaseListOperations, TextToSpeechRestStub): + def __hash__(self): + return hash("TextToSpeechRestTransport.ListOperations") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + return response + + def __call__(self, + request: operations_pb2.ListOperationsRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> operations_pb2.ListOperationsResponse: + + r"""Call the list operations method over HTTP. + + Args: + request (operations_pb2.ListOperationsRequest): + The request object for ListOperations method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + operations_pb2.ListOperationsResponse: Response from ListOperations method. + """ + + http_options = _BaseTextToSpeechRestTransport._BaseListOperations._get_http_options() + request, metadata = self._interceptor.pre_list_operations(request, metadata) + transcoded_request = _BaseTextToSpeechRestTransport._BaseListOperations._get_transcoded_request(http_options, request) + + # Jsonify the query params + query_params = _BaseTextToSpeechRestTransport._BaseListOperations._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechRestTransport._ListOperations._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + content = response.content.decode("utf-8") + resp = operations_pb2.ListOperationsResponse() + resp = json_format.Parse(content, resp) + resp = self._interceptor.post_list_operations(resp) + return resp + + @property + def kind(self) -> str: + return "rest" + + def close(self): + self._session.close() + + +__all__=( + 'TextToSpeechRestTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest_base.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest_base.py new file mode 100644 index 000000000000..60910d87e1cc --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest_base.py @@ -0,0 +1,220 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 json # type: ignore +from google.api_core import path_template +from google.api_core import gapic_v1 + +from google.protobuf import json_format +from .base import TextToSpeechTransport, DEFAULT_CLIENT_INFO + +import re +from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union + + +from google.cloud.texttospeech_v1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore + + +class _BaseTextToSpeechRestTransport(TextToSpeechTransport): + """Base REST backend transport for TextToSpeech. + + Note: This class is not meant to be used directly. Use its sync and + async sub-classes instead. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends JSON representations of protocol buffers over HTTP/1.1 + """ + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[Any] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + url_scheme: str = 'https', + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[Any]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you are developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + url_scheme: the protocol scheme for the API endpoint. Normally + "https", but for testing or local servers, + "http" can be specified. + """ + # Run the base constructor + maybe_url_match = re.match("^(?Phttp(?:s)?://)?(?P.*)$", host) + if maybe_url_match is None: + raise ValueError(f"Unexpected hostname structure: {host}") # pragma: NO COVER + + url_match_items = maybe_url_match.groupdict() + + host = f"{url_scheme}://{host}" if not url_match_items["scheme"] else host + + super().__init__( + host=host, + credentials=credentials, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience + ) + + class _BaseListVoices: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'get', + 'uri': '/v1/voices', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = cloud_tts.ListVoicesRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json_format.MessageToJson( + transcoded_request['query_params'], + use_integers_for_enums=False, + )) + + return query_params + + class _BaseStreamingSynthesize: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + class _BaseSynthesizeSpeech: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = { + } + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return {k: v for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() if k not in message_dict} + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'post', + 'uri': '/v1/text:synthesize', + 'body': '*', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = cloud_tts.SynthesizeSpeechRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_request_body_json(transcoded_request): + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request['body'], + use_integers_for_enums=False + ) + return body + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json_format.MessageToJson( + transcoded_request['query_params'], + use_integers_for_enums=False, + )) + query_params.update(_BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_unset_required_fields(query_params)) + + return query_params + + class _BaseGetOperation: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'get', + 'uri': '/v1/{name=projects/*/locations/*/operations/*}', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + request_kwargs = json_format.MessageToDict(request) + transcoded_request = path_template.transcode( + http_options, **request_kwargs) + return transcoded_request + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json.dumps(transcoded_request['query_params'])) + return query_params + + class _BaseListOperations: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'get', + 'uri': '/v1/{name=projects/*/locations/*}/operations', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + request_kwargs = json_format.MessageToDict(request) + transcoded_request = path_template.transcode( + http_options, **request_kwargs) + return transcoded_request + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json.dumps(transcoded_request['query_params'])) + return query_params + + +__all__=( + '_BaseTextToSpeechRestTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/__init__.py new file mode 100644 index 000000000000..9a4b4f08eb08 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from .client import TextToSpeechLongAudioSynthesizeClient +from .async_client import TextToSpeechLongAudioSynthesizeAsyncClient + +__all__ = ( + 'TextToSpeechLongAudioSynthesizeClient', + 'TextToSpeechLongAudioSynthesizeAsyncClient', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/async_client.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/async_client.py new file mode 100644 index 000000000000..5da410f8e638 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/async_client.py @@ -0,0 +1,454 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from collections import OrderedDict +import re +from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union + +from google.cloud.texttospeech_v1 import gapic_version as package_version + +from google.api_core.client_options import ClientOptions +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry_async as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.oauth2 import service_account # type: ignore + + +try: + OptionalRetry = Union[retries.AsyncRetry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.AsyncRetry, object, None] # type: ignore + +from google.api_core import operation # type: ignore +from google.api_core import operation_async # type: ignore +from google.cloud.texttospeech_v1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore +from .transports.base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO +from .transports.grpc_asyncio import TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport +from .client import TextToSpeechLongAudioSynthesizeClient + + +class TextToSpeechLongAudioSynthesizeAsyncClient: + """Service that implements Google Cloud Text-to-Speech API.""" + + _client: TextToSpeechLongAudioSynthesizeClient + + # Copy defaults from the synchronous client for use here. + # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. + DEFAULT_ENDPOINT = TextToSpeechLongAudioSynthesizeClient.DEFAULT_ENDPOINT + DEFAULT_MTLS_ENDPOINT = TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT + _DEFAULT_ENDPOINT_TEMPLATE = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE + _DEFAULT_UNIVERSE = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + + model_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.model_path) + parse_model_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_model_path) + common_billing_account_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_billing_account_path) + parse_common_billing_account_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_billing_account_path) + common_folder_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_folder_path) + parse_common_folder_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_folder_path) + common_organization_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_organization_path) + parse_common_organization_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_organization_path) + common_project_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_project_path) + parse_common_project_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_project_path) + common_location_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_location_path) + parse_common_location_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_location_path) + + @classmethod + def from_service_account_info(cls, info: dict, *args, **kwargs): + """Creates an instance of this client using the provided credentials + info. + + Args: + info (dict): The service account private key info. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechLongAudioSynthesizeAsyncClient: The constructed client. + """ + return TextToSpeechLongAudioSynthesizeClient.from_service_account_info.__func__(TextToSpeechLongAudioSynthesizeAsyncClient, info, *args, **kwargs) # type: ignore + + @classmethod + def from_service_account_file(cls, filename: str, *args, **kwargs): + """Creates an instance of this client using the provided credentials + file. + + Args: + filename (str): The path to the service account private key json + file. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechLongAudioSynthesizeAsyncClient: The constructed client. + """ + return TextToSpeechLongAudioSynthesizeClient.from_service_account_file.__func__(TextToSpeechLongAudioSynthesizeAsyncClient, filename, *args, **kwargs) # type: ignore + + from_service_account_json = from_service_account_file + + @classmethod + def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[ClientOptions] = None): + """Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variable is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + return TextToSpeechLongAudioSynthesizeClient.get_mtls_endpoint_and_cert_source(client_options) # type: ignore + + @property + def transport(self) -> TextToSpeechLongAudioSynthesizeTransport: + """Returns the transport used by the client instance. + + Returns: + TextToSpeechLongAudioSynthesizeTransport: The transport used by the client instance. + """ + return self._client.transport + + @property + def api_endpoint(self): + """Return the API endpoint used by the client instance. + + Returns: + str: The API endpoint used by the client instance. + """ + return self._client._api_endpoint + + @property + def universe_domain(self) -> str: + """Return the universe domain used by the client instance. + + Returns: + str: The universe domain used + by the client instance. + """ + return self._client._universe_domain + + get_transport_class = TextToSpeechLongAudioSynthesizeClient.get_transport_class + + def __init__(self, *, + credentials: Optional[ga_credentials.Credentials] = None, + transport: Optional[Union[str, TextToSpeechLongAudioSynthesizeTransport, Callable[..., TextToSpeechLongAudioSynthesizeTransport]]] = "grpc_asyncio", + client_options: Optional[ClientOptions] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + ) -> None: + """Instantiates the text to speech long audio synthesize async client. + + Args: + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + transport (Optional[Union[str,TextToSpeechLongAudioSynthesizeTransport,Callable[..., TextToSpeechLongAudioSynthesizeTransport]]]): + The transport to use, or a Callable that constructs and returns a new transport to use. + If a Callable is given, it will be called with the same set of initialization + arguments as used in the TextToSpeechLongAudioSynthesizeTransport constructor. + If set to None, a transport is chosen automatically. + NOTE: "rest" transport functionality is currently in a + beta state (preview). We welcome your feedback via an + issue in this library's source repository. + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): + Custom options for the client. + + 1. The ``api_endpoint`` property can be used to override the + default endpoint provided by the client when ``transport`` is + not explicitly provided. Only if this property is not set and + ``transport`` was not explicitly provided, the endpoint is + determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment + variable, which have one of the following values: + "always" (always use the default mTLS endpoint), "never" (always + use the default regular endpoint) and "auto" (auto-switch to the + default mTLS endpoint if client certificate is present; this is + the default value). + + 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable + is "true", then the ``client_cert_source`` property can be used + to provide a client certificate for mTLS transport. If + not provided, the default SSL client certificate will be used if + present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not + set, no client certificate will be used. + + 3. The ``universe_domain`` property can be used to override the + default "googleapis.com" universe. Note that ``api_endpoint`` + property still takes precedence; and ``universe_domain`` is + currently not supported for mTLS. + + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + + Raises: + google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport + creation failed for any reason. + """ + self._client = TextToSpeechLongAudioSynthesizeClient( + credentials=credentials, + transport=transport, + client_options=client_options, + client_info=client_info, + + ) + + async def synthesize_long_audio(self, + request: Optional[Union[cloud_tts_lrs.SynthesizeLongAudioRequest, dict]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operation_async.AsyncOperation: + r"""Synthesizes long form text asynchronously. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1 + + async def sample_synthesize_long_audio(): + # Create a client + client = texttospeech_v1.TextToSpeechLongAudioSynthesizeAsyncClient() + + # Initialize request argument(s) + input = texttospeech_v1.SynthesisInput() + input.text = "text_value" + + audio_config = texttospeech_v1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + voice = texttospeech_v1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + request = texttospeech_v1.SynthesizeLongAudioRequest( + input=input, + audio_config=audio_config, + output_gcs_uri="output_gcs_uri_value", + voice=voice, + ) + + # Make the request + operation = client.synthesize_long_audio(request=request) + + print("Waiting for operation to complete...") + + response = (await operation).result() + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.texttospeech_v1.types.SynthesizeLongAudioRequest, dict]]): + The request object. The top-level message sent by the client for the + ``SynthesizeLongAudio`` method. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.api_core.operation_async.AsyncOperation: + An object representing a long-running operation. + + The result type for the operation will be + :class:`google.cloud.texttospeech_v1.types.SynthesizeLongAudioResponse` + The message returned to the client by the + SynthesizeLongAudio method. + + """ + # Create or coerce a protobuf request object. + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, cloud_tts_lrs.SynthesizeLongAudioRequest): + request = cloud_tts_lrs.SynthesizeLongAudioRequest(request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[self._client._transport.synthesize_long_audio] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(( + ("parent", request.parent), + )), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Wrap the response in an operation future. + response = operation_async.from_gapic( + response, + self._client._transport.operations_client, + cloud_tts_lrs.SynthesizeLongAudioResponse, + metadata_type=cloud_tts_lrs.SynthesizeLongAudioMetadata, + ) + + # Done; return the response. + return response + + async def list_operations( + self, + request: Optional[operations_pb2.ListOperationsRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.ListOperationsResponse: + r"""Lists operations that match the specified filter in the request. + + Args: + request (:class:`~.operations_pb2.ListOperationsRequest`): + The request object. Request message for + `ListOperations` method. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.ListOperationsResponse: + Response message for ``ListOperations`` method. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.ListOperationsRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self.transport._wrapped_methods[self._client._transport.list_operations] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + async def get_operation( + self, + request: Optional[operations_pb2.GetOperationRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.Operation: + r"""Gets the latest state of a long-running operation. + + Args: + request (:class:`~.operations_pb2.GetOperationRequest`): + The request object. Request message for + `GetOperation` method. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.Operation: + An ``Operation`` object. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.GetOperationRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self.transport._wrapped_methods[self._client._transport.get_operation] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + async def __aenter__(self) -> "TextToSpeechLongAudioSynthesizeAsyncClient": + return self + + async def __aexit__(self, exc_type, exc, tb): + await self.transport.close() + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) + + +__all__ = ( + "TextToSpeechLongAudioSynthesizeAsyncClient", +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/client.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/client.py new file mode 100644 index 000000000000..4306be692472 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/client.py @@ -0,0 +1,813 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from collections import OrderedDict +import os +import re +from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union, cast +import warnings + +from google.cloud.texttospeech_v1 import gapic_version as package_version + +from google.api_core import client_options as client_options_lib +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport import mtls # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore +from google.auth.exceptions import MutualTLSChannelError # type: ignore +from google.oauth2 import service_account # type: ignore + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object, None] # type: ignore + +from google.api_core import operation # type: ignore +from google.api_core import operation_async # type: ignore +from google.cloud.texttospeech_v1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore +from .transports.base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO +from .transports.grpc import TextToSpeechLongAudioSynthesizeGrpcTransport +from .transports.grpc_asyncio import TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport +from .transports.rest import TextToSpeechLongAudioSynthesizeRestTransport + + +class TextToSpeechLongAudioSynthesizeClientMeta(type): + """Metaclass for the TextToSpeechLongAudioSynthesize client. + + This provides class-level methods for building and retrieving + support objects (e.g. transport) without polluting the client instance + objects. + """ + _transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechLongAudioSynthesizeTransport]] + _transport_registry["grpc"] = TextToSpeechLongAudioSynthesizeGrpcTransport + _transport_registry["grpc_asyncio"] = TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport + _transport_registry["rest"] = TextToSpeechLongAudioSynthesizeRestTransport + + def get_transport_class(cls, + label: Optional[str] = None, + ) -> Type[TextToSpeechLongAudioSynthesizeTransport]: + """Returns an appropriate transport class. + + Args: + label: The name of the desired transport. If none is + provided, then the first transport in the registry is used. + + Returns: + The transport class to use. + """ + # If a specific transport is requested, return that one. + if label: + return cls._transport_registry[label] + + # No transport is requested; return the default (that is, the first one + # in the dictionary). + return next(iter(cls._transport_registry.values())) + + +class TextToSpeechLongAudioSynthesizeClient(metaclass=TextToSpeechLongAudioSynthesizeClientMeta): + """Service that implements Google Cloud Text-to-Speech API.""" + + @staticmethod + def _get_default_mtls_endpoint(api_endpoint): + """Converts api endpoint to mTLS endpoint. + + Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to + "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively. + Args: + api_endpoint (Optional[str]): the api endpoint to convert. + Returns: + str: converted mTLS api endpoint. + """ + if not api_endpoint: + return api_endpoint + + mtls_endpoint_re = re.compile( + r"(?P[^.]+)(?P\.mtls)?(?P\.sandbox)?(?P\.googleapis\.com)?" + ) + + m = mtls_endpoint_re.match(api_endpoint) + name, mtls, sandbox, googledomain = m.groups() + if mtls or not googledomain: + return api_endpoint + + if sandbox: + return api_endpoint.replace( + "sandbox.googleapis.com", "mtls.sandbox.googleapis.com" + ) + + return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com") + + # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. + DEFAULT_ENDPOINT = "texttospeech.googleapis.com" + DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore + DEFAULT_ENDPOINT + ) + + _DEFAULT_ENDPOINT_TEMPLATE = "texttospeech.{UNIVERSE_DOMAIN}" + _DEFAULT_UNIVERSE = "googleapis.com" + + @classmethod + def from_service_account_info(cls, info: dict, *args, **kwargs): + """Creates an instance of this client using the provided credentials + info. + + Args: + info (dict): The service account private key info. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechLongAudioSynthesizeClient: The constructed client. + """ + credentials = service_account.Credentials.from_service_account_info(info) + kwargs["credentials"] = credentials + return cls(*args, **kwargs) + + @classmethod + def from_service_account_file(cls, filename: str, *args, **kwargs): + """Creates an instance of this client using the provided credentials + file. + + Args: + filename (str): The path to the service account private key json + file. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechLongAudioSynthesizeClient: The constructed client. + """ + credentials = service_account.Credentials.from_service_account_file( + filename) + kwargs["credentials"] = credentials + return cls(*args, **kwargs) + + from_service_account_json = from_service_account_file + + @property + def transport(self) -> TextToSpeechLongAudioSynthesizeTransport: + """Returns the transport used by the client instance. + + Returns: + TextToSpeechLongAudioSynthesizeTransport: The transport used by the client + instance. + """ + return self._transport + + @staticmethod + def model_path(project: str,location: str,model: str,) -> str: + """Returns a fully-qualified model string.""" + return "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) + + @staticmethod + def parse_model_path(path: str) -> Dict[str,str]: + """Parses a model path into its component segments.""" + m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)/models/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_billing_account_path(billing_account: str, ) -> str: + """Returns a fully-qualified billing_account string.""" + return "billingAccounts/{billing_account}".format(billing_account=billing_account, ) + + @staticmethod + def parse_common_billing_account_path(path: str) -> Dict[str,str]: + """Parse a billing_account path into its component segments.""" + m = re.match(r"^billingAccounts/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_folder_path(folder: str, ) -> str: + """Returns a fully-qualified folder string.""" + return "folders/{folder}".format(folder=folder, ) + + @staticmethod + def parse_common_folder_path(path: str) -> Dict[str,str]: + """Parse a folder path into its component segments.""" + m = re.match(r"^folders/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_organization_path(organization: str, ) -> str: + """Returns a fully-qualified organization string.""" + return "organizations/{organization}".format(organization=organization, ) + + @staticmethod + def parse_common_organization_path(path: str) -> Dict[str,str]: + """Parse a organization path into its component segments.""" + m = re.match(r"^organizations/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_project_path(project: str, ) -> str: + """Returns a fully-qualified project string.""" + return "projects/{project}".format(project=project, ) + + @staticmethod + def parse_common_project_path(path: str) -> Dict[str,str]: + """Parse a project path into its component segments.""" + m = re.match(r"^projects/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_location_path(project: str, location: str, ) -> str: + """Returns a fully-qualified location string.""" + return "projects/{project}/locations/{location}".format(project=project, location=location, ) + + @staticmethod + def parse_common_location_path(path: str) -> Dict[str,str]: + """Parse a location path into its component segments.""" + m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path) + return m.groupdict() if m else {} + + @classmethod + def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[client_options_lib.ClientOptions] = None): + """Deprecated. Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variable is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + + warnings.warn("get_mtls_endpoint_and_cert_source is deprecated. Use the api_endpoint property instead.", + DeprecationWarning) + if client_options is None: + client_options = client_options_lib.ClientOptions() + use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") + use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") + if use_client_cert not in ("true", "false"): + raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") + if use_mtls_endpoint not in ("auto", "never", "always"): + raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") + + # Figure out the client cert source to use. + client_cert_source = None + if use_client_cert == "true": + if client_options.client_cert_source: + client_cert_source = client_options.client_cert_source + elif mtls.has_default_client_cert_source(): + client_cert_source = mtls.default_client_cert_source() + + # Figure out which api endpoint to use. + if client_options.api_endpoint is not None: + api_endpoint = client_options.api_endpoint + elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): + api_endpoint = cls.DEFAULT_MTLS_ENDPOINT + else: + api_endpoint = cls.DEFAULT_ENDPOINT + + return api_endpoint, client_cert_source + + @staticmethod + def _read_environment_variables(): + """Returns the environment variables used by the client. + + Returns: + Tuple[bool, str, str]: returns the GOOGLE_API_USE_CLIENT_CERTIFICATE, + GOOGLE_API_USE_MTLS_ENDPOINT, and GOOGLE_CLOUD_UNIVERSE_DOMAIN environment variables. + + Raises: + ValueError: If GOOGLE_API_USE_CLIENT_CERTIFICATE is not + any of ["true", "false"]. + google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT + is not any of ["auto", "never", "always"]. + """ + use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false").lower() + use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower() + universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN") + if use_client_cert not in ("true", "false"): + raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") + if use_mtls_endpoint not in ("auto", "never", "always"): + raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") + return use_client_cert == "true", use_mtls_endpoint, universe_domain_env + + @staticmethod + def _get_client_cert_source(provided_cert_source, use_cert_flag): + """Return the client cert source to be used by the client. + + Args: + provided_cert_source (bytes): The client certificate source provided. + use_cert_flag (bool): A flag indicating whether to use the client certificate. + + Returns: + bytes or None: The client cert source to be used by the client. + """ + client_cert_source = None + if use_cert_flag: + if provided_cert_source: + client_cert_source = provided_cert_source + elif mtls.has_default_client_cert_source(): + client_cert_source = mtls.default_client_cert_source() + return client_cert_source + + @staticmethod + def _get_api_endpoint(api_override, client_cert_source, universe_domain, use_mtls_endpoint): + """Return the API endpoint used by the client. + + Args: + api_override (str): The API endpoint override. If specified, this is always + the return value of this function and the other arguments are not used. + client_cert_source (bytes): The client certificate source used by the client. + universe_domain (str): The universe domain used by the client. + use_mtls_endpoint (str): How to use the mTLS endpoint, which depends also on the other parameters. + Possible values are "always", "auto", or "never". + + Returns: + str: The API endpoint to be used by the client. + """ + if api_override is not None: + api_endpoint = api_override + elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): + _default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + if universe_domain != _default_universe: + raise MutualTLSChannelError(f"mTLS is not supported in any universe other than {_default_universe}.") + api_endpoint = TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT + else: + api_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=universe_domain) + return api_endpoint + + @staticmethod + def _get_universe_domain(client_universe_domain: Optional[str], universe_domain_env: Optional[str]) -> str: + """Return the universe domain used by the client. + + Args: + client_universe_domain (Optional[str]): The universe domain configured via the client options. + universe_domain_env (Optional[str]): The universe domain configured via the "GOOGLE_CLOUD_UNIVERSE_DOMAIN" environment variable. + + Returns: + str: The universe domain to be used by the client. + + Raises: + ValueError: If the universe domain is an empty string. + """ + universe_domain = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + if client_universe_domain is not None: + universe_domain = client_universe_domain + elif universe_domain_env is not None: + universe_domain = universe_domain_env + if len(universe_domain.strip()) == 0: + raise ValueError("Universe Domain cannot be an empty string.") + return universe_domain + + @staticmethod + def _compare_universes(client_universe: str, + credentials: ga_credentials.Credentials) -> bool: + """Returns True iff the universe domains used by the client and credentials match. + + Args: + client_universe (str): The universe domain configured via the client options. + credentials (ga_credentials.Credentials): The credentials being used in the client. + + Returns: + bool: True iff client_universe matches the universe in credentials. + + Raises: + ValueError: when client_universe does not match the universe in credentials. + """ + + default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + credentials_universe = getattr(credentials, "universe_domain", default_universe) + + if client_universe != credentials_universe: + raise ValueError("The configured universe domain " + f"({client_universe}) does not match the universe domain " + f"found in the credentials ({credentials_universe}). " + "If you haven't configured the universe domain explicitly, " + f"`{default_universe}` is the default.") + return True + + def _validate_universe_domain(self): + """Validates client's and credentials' universe domains are consistent. + + Returns: + bool: True iff the configured universe domain is valid. + + Raises: + ValueError: If the configured universe domain is not valid. + """ + self._is_universe_domain_valid = (self._is_universe_domain_valid or + TextToSpeechLongAudioSynthesizeClient._compare_universes(self.universe_domain, self.transport._credentials)) + return self._is_universe_domain_valid + + @property + def api_endpoint(self): + """Return the API endpoint used by the client instance. + + Returns: + str: The API endpoint used by the client instance. + """ + return self._api_endpoint + + @property + def universe_domain(self) -> str: + """Return the universe domain used by the client instance. + + Returns: + str: The universe domain used by the client instance. + """ + return self._universe_domain + + def __init__(self, *, + credentials: Optional[ga_credentials.Credentials] = None, + transport: Optional[Union[str, TextToSpeechLongAudioSynthesizeTransport, Callable[..., TextToSpeechLongAudioSynthesizeTransport]]] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + ) -> None: + """Instantiates the text to speech long audio synthesize client. + + Args: + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + transport (Optional[Union[str,TextToSpeechLongAudioSynthesizeTransport,Callable[..., TextToSpeechLongAudioSynthesizeTransport]]]): + The transport to use, or a Callable that constructs and returns a new transport. + If a Callable is given, it will be called with the same set of initialization + arguments as used in the TextToSpeechLongAudioSynthesizeTransport constructor. + If set to None, a transport is chosen automatically. + NOTE: "rest" transport functionality is currently in a + beta state (preview). We welcome your feedback via an + issue in this library's source repository. + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): + Custom options for the client. + + 1. The ``api_endpoint`` property can be used to override the + default endpoint provided by the client when ``transport`` is + not explicitly provided. Only if this property is not set and + ``transport`` was not explicitly provided, the endpoint is + determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment + variable, which have one of the following values: + "always" (always use the default mTLS endpoint), "never" (always + use the default regular endpoint) and "auto" (auto-switch to the + default mTLS endpoint if client certificate is present; this is + the default value). + + 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable + is "true", then the ``client_cert_source`` property can be used + to provide a client certificate for mTLS transport. If + not provided, the default SSL client certificate will be used if + present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not + set, no client certificate will be used. + + 3. The ``universe_domain`` property can be used to override the + default "googleapis.com" universe. Note that the ``api_endpoint`` + property still takes precedence; and ``universe_domain`` is + currently not supported for mTLS. + + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport + creation failed for any reason. + """ + self._client_options = client_options + if isinstance(self._client_options, dict): + self._client_options = client_options_lib.from_dict(self._client_options) + if self._client_options is None: + self._client_options = client_options_lib.ClientOptions() + self._client_options = cast(client_options_lib.ClientOptions, self._client_options) + + universe_domain_opt = getattr(self._client_options, 'universe_domain', None) + + self._use_client_cert, self._use_mtls_endpoint, self._universe_domain_env = TextToSpeechLongAudioSynthesizeClient._read_environment_variables() + self._client_cert_source = TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(self._client_options.client_cert_source, self._use_client_cert) + self._universe_domain = TextToSpeechLongAudioSynthesizeClient._get_universe_domain(universe_domain_opt, self._universe_domain_env) + self._api_endpoint = None # updated below, depending on `transport` + + # Initialize the universe domain validation. + self._is_universe_domain_valid = False + + api_key_value = getattr(self._client_options, "api_key", None) + if api_key_value and credentials: + raise ValueError("client_options.api_key and credentials are mutually exclusive") + + # Save or instantiate the transport. + # Ordinarily, we provide the transport, but allowing a custom transport + # instance provides an extensibility point for unusual situations. + transport_provided = isinstance(transport, TextToSpeechLongAudioSynthesizeTransport) + if transport_provided: + # transport is a TextToSpeechLongAudioSynthesizeTransport instance. + if credentials or self._client_options.credentials_file or api_key_value: + raise ValueError("When providing a transport instance, " + "provide its credentials directly.") + if self._client_options.scopes: + raise ValueError( + "When providing a transport instance, provide its scopes " + "directly." + ) + self._transport = cast(TextToSpeechLongAudioSynthesizeTransport, transport) + self._api_endpoint = self._transport.host + + self._api_endpoint = (self._api_endpoint or + TextToSpeechLongAudioSynthesizeClient._get_api_endpoint( + self._client_options.api_endpoint, + self._client_cert_source, + self._universe_domain, + self._use_mtls_endpoint)) + + if not transport_provided: + import google.auth._default # type: ignore + + if api_key_value and hasattr(google.auth._default, "get_api_key_credentials"): + credentials = google.auth._default.get_api_key_credentials(api_key_value) + + transport_init: Union[Type[TextToSpeechLongAudioSynthesizeTransport], Callable[..., TextToSpeechLongAudioSynthesizeTransport]] = ( + TextToSpeechLongAudioSynthesizeClient.get_transport_class(transport) + if isinstance(transport, str) or transport is None + else cast(Callable[..., TextToSpeechLongAudioSynthesizeTransport], transport) + ) + # initialize with the provided callable or the passed in class + self._transport = transport_init( + credentials=credentials, + credentials_file=self._client_options.credentials_file, + host=self._api_endpoint, + scopes=self._client_options.scopes, + client_cert_source_for_mtls=self._client_cert_source, + quota_project_id=self._client_options.quota_project_id, + client_info=client_info, + always_use_jwt_access=True, + api_audience=self._client_options.api_audience, + ) + + def synthesize_long_audio(self, + request: Optional[Union[cloud_tts_lrs.SynthesizeLongAudioRequest, dict]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operation.Operation: + r"""Synthesizes long form text asynchronously. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1 + + def sample_synthesize_long_audio(): + # Create a client + client = texttospeech_v1.TextToSpeechLongAudioSynthesizeClient() + + # Initialize request argument(s) + input = texttospeech_v1.SynthesisInput() + input.text = "text_value" + + audio_config = texttospeech_v1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + voice = texttospeech_v1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + request = texttospeech_v1.SynthesizeLongAudioRequest( + input=input, + audio_config=audio_config, + output_gcs_uri="output_gcs_uri_value", + voice=voice, + ) + + # Make the request + operation = client.synthesize_long_audio(request=request) + + print("Waiting for operation to complete...") + + response = operation.result() + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.texttospeech_v1.types.SynthesizeLongAudioRequest, dict]): + The request object. The top-level message sent by the client for the + ``SynthesizeLongAudio`` method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.api_core.operation.Operation: + An object representing a long-running operation. + + The result type for the operation will be + :class:`google.cloud.texttospeech_v1.types.SynthesizeLongAudioResponse` + The message returned to the client by the + SynthesizeLongAudio method. + + """ + # Create or coerce a protobuf request object. + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, cloud_tts_lrs.SynthesizeLongAudioRequest): + request = cloud_tts_lrs.SynthesizeLongAudioRequest(request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.synthesize_long_audio] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(( + ("parent", request.parent), + )), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Wrap the response in an operation future. + response = operation.from_gapic( + response, + self._transport.operations_client, + cloud_tts_lrs.SynthesizeLongAudioResponse, + metadata_type=cloud_tts_lrs.SynthesizeLongAudioMetadata, + ) + + # Done; return the response. + return response + + def __enter__(self) -> "TextToSpeechLongAudioSynthesizeClient": + return self + + def __exit__(self, type, value, traceback): + """Releases underlying transport's resources. + + .. warning:: + ONLY use as a context manager if the transport is NOT shared + with other clients! Exiting the with block will CLOSE the transport + and may cause errors in other clients! + """ + self.transport.close() + + def list_operations( + self, + request: Optional[operations_pb2.ListOperationsRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.ListOperationsResponse: + r"""Lists operations that match the specified filter in the request. + + Args: + request (:class:`~.operations_pb2.ListOperationsRequest`): + The request object. Request message for + `ListOperations` method. + retry (google.api_core.retry.Retry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.ListOperationsResponse: + Response message for ``ListOperations`` method. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.ListOperationsRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.list_operations] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + def get_operation( + self, + request: Optional[operations_pb2.GetOperationRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.Operation: + r"""Gets the latest state of a long-running operation. + + Args: + request (:class:`~.operations_pb2.GetOperationRequest`): + The request object. Request message for + `GetOperation` method. + retry (google.api_core.retry.Retry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.Operation: + An ``Operation`` object. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.GetOperationRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.get_operation] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + + + + + + + + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) + + +__all__ = ( + "TextToSpeechLongAudioSynthesizeClient", +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/README.rst b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/README.rst new file mode 100644 index 000000000000..44ada032f342 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/README.rst @@ -0,0 +1,9 @@ + +transport inheritance structure +_______________________________ + +`TextToSpeechLongAudioSynthesizeTransport` is the ABC for all transports. +- public child `TextToSpeechLongAudioSynthesizeGrpcTransport` for sync gRPC transport (defined in `grpc.py`). +- public child `TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport` for async gRPC transport (defined in `grpc_asyncio.py`). +- private child `_BaseTextToSpeechLongAudioSynthesizeRestTransport` for base REST transport with inner classes `_BaseMETHOD` (defined in `rest_base.py`). +- public child `TextToSpeechLongAudioSynthesizeRestTransport` for sync REST transport with inner classes `METHOD` derived from the parent's corresponding `_BaseMETHOD` classes (defined in `rest.py`). diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/__init__.py new file mode 100644 index 000000000000..b9316b7eeac3 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/__init__.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from collections import OrderedDict +from typing import Dict, Type + +from .base import TextToSpeechLongAudioSynthesizeTransport +from .grpc import TextToSpeechLongAudioSynthesizeGrpcTransport +from .grpc_asyncio import TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport +from .rest import TextToSpeechLongAudioSynthesizeRestTransport +from .rest import TextToSpeechLongAudioSynthesizeRestInterceptor + + +# Compile a registry of transports. +_transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechLongAudioSynthesizeTransport]] +_transport_registry['grpc'] = TextToSpeechLongAudioSynthesizeGrpcTransport +_transport_registry['grpc_asyncio'] = TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport +_transport_registry['rest'] = TextToSpeechLongAudioSynthesizeRestTransport + +__all__ = ( + 'TextToSpeechLongAudioSynthesizeTransport', + 'TextToSpeechLongAudioSynthesizeGrpcTransport', + 'TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport', + 'TextToSpeechLongAudioSynthesizeRestTransport', + 'TextToSpeechLongAudioSynthesizeRestInterceptor', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/base.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/base.py new file mode 100644 index 000000000000..b3776f9c7d09 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/base.py @@ -0,0 +1,189 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 abc +from typing import Awaitable, Callable, Dict, Optional, Sequence, Union + +from google.cloud.texttospeech_v1 import gapic_version as package_version + +import google.auth # type: ignore +import google.api_core +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.api_core import operations_v1 +from google.auth import credentials as ga_credentials # type: ignore +from google.oauth2 import service_account # type: ignore + +from google.cloud.texttospeech_v1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) + + +class TextToSpeechLongAudioSynthesizeTransport(abc.ABC): + """Abstract transport class for TextToSpeechLongAudioSynthesize.""" + + AUTH_SCOPES = ( + 'https://www.googleapis.com/auth/cloud-platform', + ) + + DEFAULT_HOST: str = 'texttospeech.googleapis.com' + def __init__( + self, *, + host: str = DEFAULT_HOST, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + **kwargs, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is mutually exclusive with credentials. + scopes (Optional[Sequence[str]]): A list of scopes. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + """ + + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} + + # Save the scopes. + self._scopes = scopes + if not hasattr(self, "_ignore_credentials"): + self._ignore_credentials: bool = False + + # If no credentials are provided, then determine the appropriate + # defaults. + if credentials and credentials_file: + raise core_exceptions.DuplicateCredentialArgs("'credentials_file' and 'credentials' are mutually exclusive") + + if credentials_file is not None: + credentials, _ = google.auth.load_credentials_from_file( + credentials_file, + **scopes_kwargs, + quota_project_id=quota_project_id + ) + elif credentials is None and not self._ignore_credentials: + credentials, _ = google.auth.default(**scopes_kwargs, quota_project_id=quota_project_id) + # Don't apply audience if the credentials file passed from user. + if hasattr(credentials, "with_gdch_audience"): + credentials = credentials.with_gdch_audience(api_audience if api_audience else host) + + # If the credentials are service account credentials, then always try to use self signed JWT. + if always_use_jwt_access and isinstance(credentials, service_account.Credentials) and hasattr(service_account.Credentials, "with_always_use_jwt_access"): + credentials = credentials.with_always_use_jwt_access(True) + + # Save the credentials. + self._credentials = credentials + + # Save the hostname. Default to port 443 (HTTPS) if none is specified. + if ':' not in host: + host += ':443' + self._host = host + + @property + def host(self): + return self._host + + def _prep_wrapped_messages(self, client_info): + # Precompute the wrapped methods. + self._wrapped_methods = { + self.synthesize_long_audio: gapic_v1.method.wrap_method( + self.synthesize_long_audio, + default_timeout=5000.0, + client_info=client_info, + ), + self.get_operation: gapic_v1.method.wrap_method( + self.get_operation, + default_timeout=None, + client_info=client_info, + ), + self.list_operations: gapic_v1.method.wrap_method( + self.list_operations, + default_timeout=None, + client_info=client_info, + ), + } + + def close(self): + """Closes resources associated with the transport. + + .. warning:: + Only call this method if the transport is NOT shared + with other clients - this may cause errors in other clients! + """ + raise NotImplementedError() + + @property + def operations_client(self): + """Return the client designed to process long-running operations.""" + raise NotImplementedError() + + @property + def synthesize_long_audio(self) -> Callable[ + [cloud_tts_lrs.SynthesizeLongAudioRequest], + Union[ + operations_pb2.Operation, + Awaitable[operations_pb2.Operation] + ]]: + raise NotImplementedError() + + @property + def list_operations( + self, + ) -> Callable[ + [operations_pb2.ListOperationsRequest], + Union[operations_pb2.ListOperationsResponse, Awaitable[operations_pb2.ListOperationsResponse]], + ]: + raise NotImplementedError() + + @property + def get_operation( + self, + ) -> Callable[ + [operations_pb2.GetOperationRequest], + Union[operations_pb2.Operation, Awaitable[operations_pb2.Operation]], + ]: + raise NotImplementedError() + + @property + def kind(self) -> str: + raise NotImplementedError() + + +__all__ = ( + 'TextToSpeechLongAudioSynthesizeTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc.py new file mode 100644 index 000000000000..2cafb36fa6df --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc.py @@ -0,0 +1,325 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 warnings +from typing import Callable, Dict, Optional, Sequence, Tuple, Union + +from google.api_core import grpc_helpers +from google.api_core import operations_v1 +from google.api_core import gapic_v1 +import google.auth # type: ignore +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore + +import grpc # type: ignore + +from google.cloud.texttospeech_v1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore +from .base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO + + +class TextToSpeechLongAudioSynthesizeGrpcTransport(TextToSpeechLongAudioSynthesizeTransport): + """gRPC backend transport for TextToSpeechLongAudioSynthesize. + + Service that implements Google Cloud Text-to-Speech API. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends protocol buffers over the wire using gRPC (which is built on + top of HTTP/2); the ``grpcio`` package must be installed. + """ + _stubs: Dict[str, Callable] + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + This argument is ignored if a ``channel`` instance is provided. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if a ``channel`` instance is provided. + scopes (Optional(Sequence[str])): A list of scopes. This argument is + ignored if a ``channel`` instance is provided. + channel (Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]]): + A ``Channel`` instance through which to make calls, or a Callable + that constructs and returns one. If set to None, ``self.create_channel`` + is used to create the channel. If a Callable is given, it will be called + with the same arguments as used in ``self.create_channel``. + api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. + If provided, it overrides the ``host`` argument and tries to create + a mutual TLS channel with client SSL credentials from + ``client_cert_source`` or application default SSL credentials. + client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): + Deprecated. A callback to provide client SSL certificate bytes and + private key bytes, both in PEM format. It is ignored if + ``api_mtls_endpoint`` is None. + ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials + for the grpc channel. It is ignored if a ``channel`` instance is provided. + client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): + A callback to provide client certificate bytes and private key bytes, + both in PEM format. It is used to configure a mutual TLS channel. It is + ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport + creation failed for any reason. + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + self._grpc_channel = None + self._ssl_channel_credentials = ssl_channel_credentials + self._stubs: Dict[str, Callable] = {} + self._operations_client: Optional[operations_v1.OperationsClient] = None + + if api_mtls_endpoint: + warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) + if client_cert_source: + warnings.warn("client_cert_source is deprecated", DeprecationWarning) + + if isinstance(channel, grpc.Channel): + # Ignore credentials if a channel was passed. + credentials = None + self._ignore_credentials = True + # If a channel was explicitly provided, set it. + self._grpc_channel = channel + self._ssl_channel_credentials = None + + else: + if api_mtls_endpoint: + host = api_mtls_endpoint + + # Create SSL credentials with client_cert_source or application + # default SSL credentials. + if client_cert_source: + cert, key = client_cert_source() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + else: + self._ssl_channel_credentials = SslCredentials().ssl_credentials + + else: + if client_cert_source_for_mtls and not ssl_channel_credentials: + cert, key = client_cert_source_for_mtls() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + + # The base transport sets the host, credentials and scopes + super().__init__( + host=host, + credentials=credentials, + credentials_file=credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + + if not self._grpc_channel: + # initialize with the provided callable or the default channel + channel_init = channel or type(self).create_channel + self._grpc_channel = channel_init( + self._host, + # use the credentials which are saved + credentials=self._credentials, + # Set ``credentials_file`` to ``None`` here as + # the credentials that we saved earlier should be used. + credentials_file=None, + scopes=self._scopes, + ssl_credentials=self._ssl_channel_credentials, + quota_project_id=quota_project_id, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Wrap messages. This must be done after self._grpc_channel exists + self._prep_wrapped_messages(client_info) + + @classmethod + def create_channel(cls, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + **kwargs) -> grpc.Channel: + """Create and return a gRPC channel object. + Args: + host (Optional[str]): The host for the channel to use. + credentials (Optional[~.Credentials]): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If + none are specified, the client will attempt to ascertain + the credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is mutually exclusive with credentials. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + kwargs (Optional[dict]): Keyword arguments, which are passed to the + channel creation. + Returns: + grpc.Channel: A gRPC channel object. + + Raises: + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + + return grpc_helpers.create_channel( + host, + credentials=credentials, + credentials_file=credentials_file, + quota_project_id=quota_project_id, + default_scopes=cls.AUTH_SCOPES, + scopes=scopes, + default_host=cls.DEFAULT_HOST, + **kwargs + ) + + @property + def grpc_channel(self) -> grpc.Channel: + """Return the channel designed to connect to this service. + """ + return self._grpc_channel + + @property + def operations_client(self) -> operations_v1.OperationsClient: + """Create the client designed to process long-running operations. + + This property caches on the instance; repeated calls return the same + client. + """ + # Quick check: Only create a new client if we do not already have one. + if self._operations_client is None: + self._operations_client = operations_v1.OperationsClient( + self.grpc_channel + ) + + # Return the client from cache. + return self._operations_client + + @property + def synthesize_long_audio(self) -> Callable[ + [cloud_tts_lrs.SynthesizeLongAudioRequest], + operations_pb2.Operation]: + r"""Return a callable for the synthesize long audio method over gRPC. + + Synthesizes long form text asynchronously. + + Returns: + Callable[[~.SynthesizeLongAudioRequest], + ~.Operation]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'synthesize_long_audio' not in self._stubs: + self._stubs['synthesize_long_audio'] = self.grpc_channel.unary_unary( + '/google.cloud.texttospeech.v1.TextToSpeechLongAudioSynthesize/SynthesizeLongAudio', + request_serializer=cloud_tts_lrs.SynthesizeLongAudioRequest.serialize, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs['synthesize_long_audio'] + + def close(self): + self.grpc_channel.close() + + @property + def get_operation( + self, + ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: + r"""Return a callable for the get_operation method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_operation" not in self._stubs: + self._stubs["get_operation"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/GetOperation", + request_serializer=operations_pb2.GetOperationRequest.SerializeToString, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs["get_operation"] + + @property + def list_operations( + self, + ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: + r"""Return a callable for the list_operations method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "list_operations" not in self._stubs: + self._stubs["list_operations"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/ListOperations", + request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, + response_deserializer=operations_pb2.ListOperationsResponse.FromString, + ) + return self._stubs["list_operations"] + + @property + def kind(self) -> str: + return "grpc" + + +__all__ = ( + 'TextToSpeechLongAudioSynthesizeGrpcTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py new file mode 100644 index 000000000000..449ead9e3a40 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py @@ -0,0 +1,356 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 inspect +import warnings +from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union + +from google.api_core import gapic_v1 +from google.api_core import grpc_helpers_async +from google.api_core import exceptions as core_exceptions +from google.api_core import retry_async as retries +from google.api_core import operations_v1 +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore + +import grpc # type: ignore +from grpc.experimental import aio # type: ignore + +from google.cloud.texttospeech_v1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore +from .base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO +from .grpc import TextToSpeechLongAudioSynthesizeGrpcTransport + + +class TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport(TextToSpeechLongAudioSynthesizeTransport): + """gRPC AsyncIO backend transport for TextToSpeechLongAudioSynthesize. + + Service that implements Google Cloud Text-to-Speech API. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends protocol buffers over the wire using gRPC (which is built on + top of HTTP/2); the ``grpcio`` package must be installed. + """ + + _grpc_channel: aio.Channel + _stubs: Dict[str, Callable] = {} + + @classmethod + def create_channel(cls, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + **kwargs) -> aio.Channel: + """Create and return a gRPC AsyncIO channel object. + Args: + host (Optional[str]): The host for the channel to use. + credentials (Optional[~.Credentials]): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If + none are specified, the client will attempt to ascertain + the credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + kwargs (Optional[dict]): Keyword arguments, which are passed to the + channel creation. + Returns: + aio.Channel: A gRPC AsyncIO channel object. + """ + + return grpc_helpers_async.create_channel( + host, + credentials=credentials, + credentials_file=credentials_file, + quota_project_id=quota_project_id, + default_scopes=cls.AUTH_SCOPES, + scopes=scopes, + default_host=cls.DEFAULT_HOST, + **kwargs + ) + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[Union[aio.Channel, Callable[..., aio.Channel]]] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + This argument is ignored if a ``channel`` instance is provided. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if a ``channel`` instance is provided. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + channel (Optional[Union[aio.Channel, Callable[..., aio.Channel]]]): + A ``Channel`` instance through which to make calls, or a Callable + that constructs and returns one. If set to None, ``self.create_channel`` + is used to create the channel. If a Callable is given, it will be called + with the same arguments as used in ``self.create_channel``. + api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. + If provided, it overrides the ``host`` argument and tries to create + a mutual TLS channel with client SSL credentials from + ``client_cert_source`` or application default SSL credentials. + client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): + Deprecated. A callback to provide client SSL certificate bytes and + private key bytes, both in PEM format. It is ignored if + ``api_mtls_endpoint`` is None. + ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials + for the grpc channel. It is ignored if a ``channel`` instance is provided. + client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): + A callback to provide client certificate bytes and private key bytes, + both in PEM format. It is used to configure a mutual TLS channel. It is + ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + + Raises: + google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport + creation failed for any reason. + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + self._grpc_channel = None + self._ssl_channel_credentials = ssl_channel_credentials + self._stubs: Dict[str, Callable] = {} + self._operations_client: Optional[operations_v1.OperationsAsyncClient] = None + + if api_mtls_endpoint: + warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) + if client_cert_source: + warnings.warn("client_cert_source is deprecated", DeprecationWarning) + + if isinstance(channel, aio.Channel): + # Ignore credentials if a channel was passed. + credentials = None + self._ignore_credentials = True + # If a channel was explicitly provided, set it. + self._grpc_channel = channel + self._ssl_channel_credentials = None + else: + if api_mtls_endpoint: + host = api_mtls_endpoint + + # Create SSL credentials with client_cert_source or application + # default SSL credentials. + if client_cert_source: + cert, key = client_cert_source() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + else: + self._ssl_channel_credentials = SslCredentials().ssl_credentials + + else: + if client_cert_source_for_mtls and not ssl_channel_credentials: + cert, key = client_cert_source_for_mtls() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + + # The base transport sets the host, credentials and scopes + super().__init__( + host=host, + credentials=credentials, + credentials_file=credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + + if not self._grpc_channel: + # initialize with the provided callable or the default channel + channel_init = channel or type(self).create_channel + self._grpc_channel = channel_init( + self._host, + # use the credentials which are saved + credentials=self._credentials, + # Set ``credentials_file`` to ``None`` here as + # the credentials that we saved earlier should be used. + credentials_file=None, + scopes=self._scopes, + ssl_credentials=self._ssl_channel_credentials, + quota_project_id=quota_project_id, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Wrap messages. This must be done after self._grpc_channel exists + self._wrap_with_kind = "kind" in inspect.signature(gapic_v1.method_async.wrap_method).parameters + self._prep_wrapped_messages(client_info) + + @property + def grpc_channel(self) -> aio.Channel: + """Create the channel designed to connect to this service. + + This property caches on the instance; repeated calls return + the same channel. + """ + # Return the channel from cache. + return self._grpc_channel + + @property + def operations_client(self) -> operations_v1.OperationsAsyncClient: + """Create the client designed to process long-running operations. + + This property caches on the instance; repeated calls return the same + client. + """ + # Quick check: Only create a new client if we do not already have one. + if self._operations_client is None: + self._operations_client = operations_v1.OperationsAsyncClient( + self.grpc_channel + ) + + # Return the client from cache. + return self._operations_client + + @property + def synthesize_long_audio(self) -> Callable[ + [cloud_tts_lrs.SynthesizeLongAudioRequest], + Awaitable[operations_pb2.Operation]]: + r"""Return a callable for the synthesize long audio method over gRPC. + + Synthesizes long form text asynchronously. + + Returns: + Callable[[~.SynthesizeLongAudioRequest], + Awaitable[~.Operation]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'synthesize_long_audio' not in self._stubs: + self._stubs['synthesize_long_audio'] = self.grpc_channel.unary_unary( + '/google.cloud.texttospeech.v1.TextToSpeechLongAudioSynthesize/SynthesizeLongAudio', + request_serializer=cloud_tts_lrs.SynthesizeLongAudioRequest.serialize, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs['synthesize_long_audio'] + + def _prep_wrapped_messages(self, client_info): + """ Precompute the wrapped methods, overriding the base class method to use async wrappers.""" + self._wrapped_methods = { + self.synthesize_long_audio: self._wrap_method( + self.synthesize_long_audio, + default_timeout=5000.0, + client_info=client_info, + ), + self.get_operation: self._wrap_method( + self.get_operation, + default_timeout=None, + client_info=client_info, + ), + self.list_operations: self._wrap_method( + self.list_operations, + default_timeout=None, + client_info=client_info, + ), + } + + def _wrap_method(self, func, *args, **kwargs): + if self._wrap_with_kind: # pragma: NO COVER + kwargs["kind"] = self.kind + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) + + def close(self): + return self.grpc_channel.close() + + @property + def kind(self) -> str: + return "grpc_asyncio" + + @property + def get_operation( + self, + ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: + r"""Return a callable for the get_operation method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_operation" not in self._stubs: + self._stubs["get_operation"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/GetOperation", + request_serializer=operations_pb2.GetOperationRequest.SerializeToString, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs["get_operation"] + + @property + def list_operations( + self, + ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: + r"""Return a callable for the list_operations method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "list_operations" not in self._stubs: + self._stubs["list_operations"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/ListOperations", + request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, + response_deserializer=operations_pb2.ListOperationsResponse.FromString, + ) + return self._stubs["list_operations"] + + +__all__ = ( + 'TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py new file mode 100644 index 000000000000..e8b0059786af --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py @@ -0,0 +1,509 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# + +from google.auth.transport.requests import AuthorizedSession # type: ignore +import json # type: ignore +from google.auth import credentials as ga_credentials # type: ignore +from google.api_core import exceptions as core_exceptions +from google.api_core import retry as retries +from google.api_core import rest_helpers +from google.api_core import rest_streaming +from google.api_core import gapic_v1 + +from google.protobuf import json_format +from google.api_core import operations_v1 + +from requests import __version__ as requests_version +import dataclasses +from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union +import warnings + + +from google.cloud.texttospeech_v1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore + + +from .rest_base import _BaseTextToSpeechLongAudioSynthesizeRestTransport +from .base import DEFAULT_CLIENT_INFO as BASE_DEFAULT_CLIENT_INFO + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object, None] # type: ignore + + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, + grpc_version=None, + rest_version=f"requests@{requests_version}", +) + + +class TextToSpeechLongAudioSynthesizeRestInterceptor: + """Interceptor for TextToSpeechLongAudioSynthesize. + + Interceptors are used to manipulate requests, request metadata, and responses + in arbitrary ways. + Example use cases include: + * Logging + * Verifying requests according to service or custom semantics + * Stripping extraneous information from responses + + These use cases and more can be enabled by injecting an + instance of a custom subclass when constructing the TextToSpeechLongAudioSynthesizeRestTransport. + + .. code-block:: python + class MyCustomTextToSpeechLongAudioSynthesizeInterceptor(TextToSpeechLongAudioSynthesizeRestInterceptor): + def pre_synthesize_long_audio(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_synthesize_long_audio(self, response): + logging.log(f"Received response: {response}") + return response + + transport = TextToSpeechLongAudioSynthesizeRestTransport(interceptor=MyCustomTextToSpeechLongAudioSynthesizeInterceptor()) + client = TextToSpeechLongAudioSynthesizeClient(transport=transport) + + + """ + def pre_synthesize_long_audio(self, request: cloud_tts_lrs.SynthesizeLongAudioRequest, metadata: Sequence[Tuple[str, str]]) -> Tuple[cloud_tts_lrs.SynthesizeLongAudioRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for synthesize_long_audio + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeechLongAudioSynthesize server. + """ + return request, metadata + + def post_synthesize_long_audio(self, response: operations_pb2.Operation) -> operations_pb2.Operation: + """Post-rpc interceptor for synthesize_long_audio + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeechLongAudioSynthesize server but before + it is returned to user code. + """ + return response + + def pre_get_operation( + self, request: operations_pb2.GetOperationRequest, metadata: Sequence[Tuple[str, str]] + ) -> Tuple[operations_pb2.GetOperationRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for get_operation + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeechLongAudioSynthesize server. + """ + return request, metadata + + def post_get_operation( + self, response: operations_pb2.Operation + ) -> operations_pb2.Operation: + """Post-rpc interceptor for get_operation + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeechLongAudioSynthesize server but before + it is returned to user code. + """ + return response + + def pre_list_operations( + self, request: operations_pb2.ListOperationsRequest, metadata: Sequence[Tuple[str, str]] + ) -> Tuple[operations_pb2.ListOperationsRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for list_operations + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeechLongAudioSynthesize server. + """ + return request, metadata + + def post_list_operations( + self, response: operations_pb2.ListOperationsResponse + ) -> operations_pb2.ListOperationsResponse: + """Post-rpc interceptor for list_operations + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeechLongAudioSynthesize server but before + it is returned to user code. + """ + return response + + +@dataclasses.dataclass +class TextToSpeechLongAudioSynthesizeRestStub: + _session: AuthorizedSession + _host: str + _interceptor: TextToSpeechLongAudioSynthesizeRestInterceptor + + +class TextToSpeechLongAudioSynthesizeRestTransport(_BaseTextToSpeechLongAudioSynthesizeRestTransport): + """REST backend synchronous transport for TextToSpeechLongAudioSynthesize. + + Service that implements Google Cloud Text-to-Speech API. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends JSON representations of protocol buffers over HTTP/1.1 + """ + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + client_cert_source_for_mtls: Optional[Callable[[ + ], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + url_scheme: str = 'https', + interceptor: Optional[TextToSpeechLongAudioSynthesizeRestInterceptor] = None, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + NOTE: This REST transport functionality is currently in a beta + state (preview). We welcome your feedback via a GitHub issue in + this library's repository. Thank you! + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if ``channel`` is provided. + scopes (Optional(Sequence[str])): A list of scopes. This argument is + ignored if ``channel`` is provided. + client_cert_source_for_mtls (Callable[[], Tuple[bytes, bytes]]): Client + certificate to configure mutual TLS HTTP channel. It is ignored + if ``channel`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you are developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + url_scheme: the protocol scheme for the API endpoint. Normally + "https", but for testing or local servers, + "http" can be specified. + """ + # Run the base constructor + # TODO(yon-mg): resolve other ctor params i.e. scopes, quota, etc. + # TODO: When custom host (api_endpoint) is set, `scopes` must *also* be set on the + # credentials object + super().__init__( + host=host, + credentials=credentials, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + url_scheme=url_scheme, + api_audience=api_audience + ) + self._session = AuthorizedSession( + self._credentials, default_host=self.DEFAULT_HOST) + self._operations_client: Optional[operations_v1.AbstractOperationsClient] = None + if client_cert_source_for_mtls: + self._session.configure_mtls_channel(client_cert_source_for_mtls) + self._interceptor = interceptor or TextToSpeechLongAudioSynthesizeRestInterceptor() + self._prep_wrapped_messages(client_info) + + @property + def operations_client(self) -> operations_v1.AbstractOperationsClient: + """Create the client designed to process long-running operations. + + This property caches on the instance; repeated calls return the same + client. + """ + # Only create a new client if we do not already have one. + if self._operations_client is None: + http_options: Dict[str, List[Dict[str, str]]] = { + 'google.longrunning.Operations.GetOperation': [ + { + 'method': 'get', + 'uri': '/v1/{name=projects/*/locations/*/operations/*}', + }, + ], + 'google.longrunning.Operations.ListOperations': [ + { + 'method': 'get', + 'uri': '/v1/{name=projects/*/locations/*}/operations', + }, + ], + } + + rest_transport = operations_v1.OperationsRestTransport( + host=self._host, + # use the credentials which are saved + credentials=self._credentials, + scopes=self._scopes, + http_options=http_options, + path_prefix="v1") + + self._operations_client = operations_v1.AbstractOperationsClient(transport=rest_transport) + + # Return the client from cache. + return self._operations_client + + class _SynthesizeLongAudio(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio, TextToSpeechLongAudioSynthesizeRestStub): + def __hash__(self): + return hash("TextToSpeechLongAudioSynthesizeRestTransport.SynthesizeLongAudio") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + return response + + def __call__(self, + request: cloud_tts_lrs.SynthesizeLongAudioRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> operations_pb2.Operation: + r"""Call the synthesize long audio method over HTTP. + + Args: + request (~.cloud_tts_lrs.SynthesizeLongAudioRequest): + The request object. The top-level message sent by the client for the + ``SynthesizeLongAudio`` method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.operations_pb2.Operation: + This resource represents a + long-running operation that is the + result of a network API call. + + """ + + http_options = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_http_options() + request, metadata = self._interceptor.pre_synthesize_long_audio(request, metadata) + transcoded_request = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_transcoded_request(http_options, request) + + body = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_request_body_json(transcoded_request) + + # Jsonify the query params + query_params = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechLongAudioSynthesizeRestTransport._SynthesizeLongAudio._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request, body) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = operations_pb2.Operation() + json_format.Parse(response.content, resp, ignore_unknown_fields=True) + resp = self._interceptor.post_synthesize_long_audio(resp) + return resp + + @property + def synthesize_long_audio(self) -> Callable[ + [cloud_tts_lrs.SynthesizeLongAudioRequest], + operations_pb2.Operation]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._SynthesizeLongAudio(self._session, self._host, self._interceptor) # type: ignore + + @property + def get_operation(self): + return self._GetOperation(self._session, self._host, self._interceptor) # type: ignore + + class _GetOperation(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation, TextToSpeechLongAudioSynthesizeRestStub): + def __hash__(self): + return hash("TextToSpeechLongAudioSynthesizeRestTransport.GetOperation") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + return response + + def __call__(self, + request: operations_pb2.GetOperationRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> operations_pb2.Operation: + + r"""Call the get operation method over HTTP. + + Args: + request (operations_pb2.GetOperationRequest): + The request object for GetOperation method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + operations_pb2.Operation: Response from GetOperation method. + """ + + http_options = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation._get_http_options() + request, metadata = self._interceptor.pre_get_operation(request, metadata) + transcoded_request = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation._get_transcoded_request(http_options, request) + + # Jsonify the query params + query_params = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechLongAudioSynthesizeRestTransport._GetOperation._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + content = response.content.decode("utf-8") + resp = operations_pb2.Operation() + resp = json_format.Parse(content, resp) + resp = self._interceptor.post_get_operation(resp) + return resp + + @property + def list_operations(self): + return self._ListOperations(self._session, self._host, self._interceptor) # type: ignore + + class _ListOperations(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations, TextToSpeechLongAudioSynthesizeRestStub): + def __hash__(self): + return hash("TextToSpeechLongAudioSynthesizeRestTransport.ListOperations") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + return response + + def __call__(self, + request: operations_pb2.ListOperationsRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> operations_pb2.ListOperationsResponse: + + r"""Call the list operations method over HTTP. + + Args: + request (operations_pb2.ListOperationsRequest): + The request object for ListOperations method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + operations_pb2.ListOperationsResponse: Response from ListOperations method. + """ + + http_options = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations._get_http_options() + request, metadata = self._interceptor.pre_list_operations(request, metadata) + transcoded_request = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations._get_transcoded_request(http_options, request) + + # Jsonify the query params + query_params = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechLongAudioSynthesizeRestTransport._ListOperations._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + content = response.content.decode("utf-8") + resp = operations_pb2.ListOperationsResponse() + resp = json_format.Parse(content, resp) + resp = self._interceptor.post_list_operations(resp) + return resp + + @property + def kind(self) -> str: + return "rest" + + def close(self): + self._session.close() + + +__all__=( + 'TextToSpeechLongAudioSynthesizeRestTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py new file mode 100644 index 000000000000..8859c1b35e44 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 json # type: ignore +from google.api_core import path_template +from google.api_core import gapic_v1 + +from google.protobuf import json_format +from .base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO + +import re +from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union + + +from google.cloud.texttospeech_v1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore + + +class _BaseTextToSpeechLongAudioSynthesizeRestTransport(TextToSpeechLongAudioSynthesizeTransport): + """Base REST backend transport for TextToSpeechLongAudioSynthesize. + + Note: This class is not meant to be used directly. Use its sync and + async sub-classes instead. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends JSON representations of protocol buffers over HTTP/1.1 + """ + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[Any] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + url_scheme: str = 'https', + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[Any]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you are developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + url_scheme: the protocol scheme for the API endpoint. Normally + "https", but for testing or local servers, + "http" can be specified. + """ + # Run the base constructor + maybe_url_match = re.match("^(?Phttp(?:s)?://)?(?P.*)$", host) + if maybe_url_match is None: + raise ValueError(f"Unexpected hostname structure: {host}") # pragma: NO COVER + + url_match_items = maybe_url_match.groupdict() + + host = f"{url_scheme}://{host}" if not url_match_items["scheme"] else host + + super().__init__( + host=host, + credentials=credentials, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience + ) + + class _BaseSynthesizeLongAudio: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = { + } + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return {k: v for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() if k not in message_dict} + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'post', + 'uri': '/v1/{parent=projects/*/locations/*}:synthesizeLongAudio', + 'body': '*', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = cloud_tts_lrs.SynthesizeLongAudioRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_request_body_json(transcoded_request): + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request['body'], + use_integers_for_enums=False + ) + return body + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json_format.MessageToJson( + transcoded_request['query_params'], + use_integers_for_enums=False, + )) + query_params.update(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_unset_required_fields(query_params)) + + return query_params + + class _BaseGetOperation: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'get', + 'uri': '/v1/{name=projects/*/locations/*/operations/*}', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + request_kwargs = json_format.MessageToDict(request) + transcoded_request = path_template.transcode( + http_options, **request_kwargs) + return transcoded_request + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json.dumps(transcoded_request['query_params'])) + return query_params + + class _BaseListOperations: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'get', + 'uri': '/v1/{name=projects/*/locations/*}/operations', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + request_kwargs = json_format.MessageToDict(request) + transcoded_request = path_template.transcode( + http_options, **request_kwargs) + return transcoded_request + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json.dumps(transcoded_request['query_params'])) + return query_params + + +__all__=( + '_BaseTextToSpeechLongAudioSynthesizeRestTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/__init__.py new file mode 100644 index 000000000000..2af1e44bc6c6 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/__init__.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from .cloud_tts import ( + AdvancedVoiceOptions, + AudioConfig, + CustomPronunciationParams, + CustomPronunciations, + CustomVoiceParams, + ListVoicesRequest, + ListVoicesResponse, + StreamingSynthesisInput, + StreamingSynthesizeConfig, + StreamingSynthesizeRequest, + StreamingSynthesizeResponse, + SynthesisInput, + SynthesizeSpeechRequest, + SynthesizeSpeechResponse, + Voice, + VoiceCloneParams, + VoiceSelectionParams, + AudioEncoding, + SsmlVoiceGender, +) +from .cloud_tts_lrs import ( + SynthesizeLongAudioMetadata, + SynthesizeLongAudioRequest, + SynthesizeLongAudioResponse, +) + +__all__ = ( + 'AdvancedVoiceOptions', + 'AudioConfig', + 'CustomPronunciationParams', + 'CustomPronunciations', + 'CustomVoiceParams', + 'ListVoicesRequest', + 'ListVoicesResponse', + 'StreamingSynthesisInput', + 'StreamingSynthesizeConfig', + 'StreamingSynthesizeRequest', + 'StreamingSynthesizeResponse', + 'SynthesisInput', + 'SynthesizeSpeechRequest', + 'SynthesizeSpeechResponse', + 'Voice', + 'VoiceCloneParams', + 'VoiceSelectionParams', + 'AudioEncoding', + 'SsmlVoiceGender', + 'SynthesizeLongAudioMetadata', + 'SynthesizeLongAudioRequest', + 'SynthesizeLongAudioResponse', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts.py new file mode 100644 index 000000000000..dd8938a27c81 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts.py @@ -0,0 +1,713 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from __future__ import annotations + +from typing import MutableMapping, MutableSequence + +import proto # type: ignore + + +__protobuf__ = proto.module( + package='google.cloud.texttospeech.v1', + manifest={ + 'SsmlVoiceGender', + 'AudioEncoding', + 'ListVoicesRequest', + 'ListVoicesResponse', + 'Voice', + 'AdvancedVoiceOptions', + 'SynthesizeSpeechRequest', + 'CustomPronunciationParams', + 'CustomPronunciations', + 'SynthesisInput', + 'VoiceSelectionParams', + 'AudioConfig', + 'CustomVoiceParams', + 'VoiceCloneParams', + 'SynthesizeSpeechResponse', + 'StreamingSynthesizeConfig', + 'StreamingSynthesisInput', + 'StreamingSynthesizeRequest', + 'StreamingSynthesizeResponse', + }, +) + + +class SsmlVoiceGender(proto.Enum): + r"""Gender of the voice as described in `SSML voice + element `__. + + Values: + SSML_VOICE_GENDER_UNSPECIFIED (0): + An unspecified gender. + In VoiceSelectionParams, this means that the + client doesn't care which gender the selected + voice will have. In the Voice field of + ListVoicesResponse, this may mean that the voice + doesn't fit any of the other categories in this + enum, or that the gender of the voice isn't + known. + MALE (1): + A male voice. + FEMALE (2): + A female voice. + NEUTRAL (3): + A gender-neutral voice. This voice is not yet + supported. + """ + SSML_VOICE_GENDER_UNSPECIFIED = 0 + MALE = 1 + FEMALE = 2 + NEUTRAL = 3 + + +class AudioEncoding(proto.Enum): + r"""Configuration to set up audio encoder. The encoding + determines the output audio format that we'd like. + + Values: + AUDIO_ENCODING_UNSPECIFIED (0): + Not specified. Will return result + [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. + LINEAR16 (1): + Uncompressed 16-bit signed little-endian + samples (Linear PCM). Audio content returned as + LINEAR16 also contains a WAV header. + MP3 (2): + MP3 audio at 32kbps. + OGG_OPUS (3): + Opus encoded audio wrapped in an ogg + container. The result will be a file which can + be played natively on Android, and in browsers + (at least Chrome and Firefox). The quality of + the encoding is considerably higher than MP3 + while using approximately the same bitrate. + MULAW (5): + 8-bit samples that compand 14-bit audio + samples using G.711 PCMU/mu-law. Audio content + returned as MULAW also contains a WAV header. + ALAW (6): + 8-bit samples that compand 14-bit audio + samples using G.711 PCMU/A-law. Audio content + returned as ALAW also contains a WAV header. + """ + AUDIO_ENCODING_UNSPECIFIED = 0 + LINEAR16 = 1 + MP3 = 2 + OGG_OPUS = 3 + MULAW = 5 + ALAW = 6 + + +class ListVoicesRequest(proto.Message): + r"""The top-level message sent by the client for the ``ListVoices`` + method. + + Attributes: + language_code (str): + Optional. Recommended. + `BCP-47 `__ + language tag. If not specified, the API will return all + supported voices. If specified, the ListVoices call will + only return voices that can be used to synthesize this + language_code. For example, if you specify ``"en-NZ"``, all + ``"en-NZ"`` voices will be returned. If you specify + ``"no"``, both ``"no-\*"`` (Norwegian) and ``"nb-\*"`` + (Norwegian Bokmal) voices will be returned. + """ + + language_code: str = proto.Field( + proto.STRING, + number=1, + ) + + +class ListVoicesResponse(proto.Message): + r"""The message returned to the client by the ``ListVoices`` method. + + Attributes: + voices (MutableSequence[google.cloud.texttospeech_v1.types.Voice]): + The list of voices. + """ + + voices: MutableSequence['Voice'] = proto.RepeatedField( + proto.MESSAGE, + number=1, + message='Voice', + ) + + +class Voice(proto.Message): + r"""Description of a voice supported by the TTS service. + + Attributes: + language_codes (MutableSequence[str]): + The languages that this voice supports, expressed as + `BCP-47 `__ + language tags (e.g. "en-US", "es-419", "cmn-tw"). + name (str): + The name of this voice. Each distinct voice + has a unique name. + ssml_gender (google.cloud.texttospeech_v1.types.SsmlVoiceGender): + The gender of this voice. + natural_sample_rate_hertz (int): + The natural sample rate (in hertz) for this + voice. + """ + + language_codes: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=1, + ) + name: str = proto.Field( + proto.STRING, + number=2, + ) + ssml_gender: 'SsmlVoiceGender' = proto.Field( + proto.ENUM, + number=3, + enum='SsmlVoiceGender', + ) + natural_sample_rate_hertz: int = proto.Field( + proto.INT32, + number=4, + ) + + +class AdvancedVoiceOptions(proto.Message): + r"""Used for advanced voice options. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + low_latency_journey_synthesis (bool): + Only for Journey voices. If false, the + synthesis will be context aware and have higher + latency. + + This field is a member of `oneof`_ ``_low_latency_journey_synthesis``. + """ + + low_latency_journey_synthesis: bool = proto.Field( + proto.BOOL, + number=1, + optional=True, + ) + + +class SynthesizeSpeechRequest(proto.Message): + r"""The top-level message sent by the client for the + ``SynthesizeSpeech`` method. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + input (google.cloud.texttospeech_v1.types.SynthesisInput): + Required. The Synthesizer requires either + plain text or SSML as input. + voice (google.cloud.texttospeech_v1.types.VoiceSelectionParams): + Required. The desired voice of the + synthesized audio. + audio_config (google.cloud.texttospeech_v1.types.AudioConfig): + Required. The configuration of the + synthesized audio. + advanced_voice_options (google.cloud.texttospeech_v1.types.AdvancedVoiceOptions): + Advanced voice options. + + This field is a member of `oneof`_ ``_advanced_voice_options``. + """ + + input: 'SynthesisInput' = proto.Field( + proto.MESSAGE, + number=1, + message='SynthesisInput', + ) + voice: 'VoiceSelectionParams' = proto.Field( + proto.MESSAGE, + number=2, + message='VoiceSelectionParams', + ) + audio_config: 'AudioConfig' = proto.Field( + proto.MESSAGE, + number=3, + message='AudioConfig', + ) + advanced_voice_options: 'AdvancedVoiceOptions' = proto.Field( + proto.MESSAGE, + number=8, + optional=True, + message='AdvancedVoiceOptions', + ) + + +class CustomPronunciationParams(proto.Message): + r"""Pronunciation customization for a phrase. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + phrase (str): + The phrase to which the customization will be + applied. The phrase can be multiple words (in + the case of proper nouns etc), but should not + span to a whole sentence. + + This field is a member of `oneof`_ ``_phrase``. + phonetic_encoding (google.cloud.texttospeech_v1.types.CustomPronunciationParams.PhoneticEncoding): + The phonetic encoding of the phrase. + + This field is a member of `oneof`_ ``_phonetic_encoding``. + pronunciation (str): + The pronunciation of the phrase. This must be + in the phonetic encoding specified above. + + This field is a member of `oneof`_ ``_pronunciation``. + """ + class PhoneticEncoding(proto.Enum): + r"""The phonetic encoding of the phrase. + + Values: + PHONETIC_ENCODING_UNSPECIFIED (0): + Not specified. + PHONETIC_ENCODING_IPA (1): + IPA. (e.g. apple -> ˈæpəl ) + https://en.wikipedia.org/wiki/International_Phonetic_Alphabet + PHONETIC_ENCODING_X_SAMPA (2): + X-SAMPA (e.g. apple -> "{p@l" ) + https://en.wikipedia.org/wiki/X-SAMPA + """ + PHONETIC_ENCODING_UNSPECIFIED = 0 + PHONETIC_ENCODING_IPA = 1 + PHONETIC_ENCODING_X_SAMPA = 2 + + phrase: str = proto.Field( + proto.STRING, + number=1, + optional=True, + ) + phonetic_encoding: PhoneticEncoding = proto.Field( + proto.ENUM, + number=2, + optional=True, + enum=PhoneticEncoding, + ) + pronunciation: str = proto.Field( + proto.STRING, + number=3, + optional=True, + ) + + +class CustomPronunciations(proto.Message): + r"""A collection of pronunciation customizations. + + Attributes: + pronunciations (MutableSequence[google.cloud.texttospeech_v1.types.CustomPronunciationParams]): + The pronunciation customizations to be + applied. + """ + + pronunciations: MutableSequence['CustomPronunciationParams'] = proto.RepeatedField( + proto.MESSAGE, + number=1, + message='CustomPronunciationParams', + ) + + +class SynthesisInput(proto.Message): + r"""Contains text input to be synthesized. Either ``text`` or ``ssml`` + must be supplied. Supplying both or neither returns + [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. + The input size is limited to 5000 bytes. + + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + text (str): + The raw text to be synthesized. + + This field is a member of `oneof`_ ``input_source``. + ssml (str): + The SSML document to be synthesized. The SSML document must + be valid and well-formed. Otherwise the RPC will fail and + return + [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. + For more information, see + `SSML `__. + + This field is a member of `oneof`_ ``input_source``. + custom_pronunciations (google.cloud.texttospeech_v1.types.CustomPronunciations): + Optional. The pronunciation customizations to + be applied to the input. If this is set, the + input will be synthesized using the given + pronunciation customizations. + + The initial support will be for EFIGS (English, + French, Italian, German, Spanish) languages, as + provided in VoiceSelectionParams. Journey and + Instant Clone voices are not supported yet. + + In order to customize the pronunciation of a + phrase, there must be an exact match of the + phrase in the input types. If using SSML, the + phrase must not be inside a phoneme tag + (entirely or partially). + """ + + text: str = proto.Field( + proto.STRING, + number=1, + oneof='input_source', + ) + ssml: str = proto.Field( + proto.STRING, + number=2, + oneof='input_source', + ) + custom_pronunciations: 'CustomPronunciations' = proto.Field( + proto.MESSAGE, + number=3, + message='CustomPronunciations', + ) + + +class VoiceSelectionParams(proto.Message): + r"""Description of which voice to use for a synthesis request. + + Attributes: + language_code (str): + Required. The language (and potentially also the region) of + the voice expressed as a + `BCP-47 `__ + language tag, e.g. "en-US". This should not include a script + tag (e.g. use "cmn-cn" rather than "cmn-Hant-cn"), because + the script will be inferred from the input provided in the + SynthesisInput. The TTS service will use this parameter to + help choose an appropriate voice. Note that the TTS service + may choose a voice with a slightly different language code + than the one selected; it may substitute a different region + (e.g. using en-US rather than en-CA if there isn't a + Canadian voice available), or even a different language, + e.g. using "nb" (Norwegian Bokmal) instead of "no" + (Norwegian)". + name (str): + The name of the voice. If both the name and the gender are + not set, the service will choose a voice based on the other + parameters such as language_code. + ssml_gender (google.cloud.texttospeech_v1.types.SsmlVoiceGender): + The preferred gender of the voice. If not set, the service + will choose a voice based on the other parameters such as + language_code and name. Note that this is only a preference, + not requirement; if a voice of the appropriate gender is not + available, the synthesizer should substitute a voice with a + different gender rather than failing the request. + custom_voice (google.cloud.texttospeech_v1.types.CustomVoiceParams): + The configuration for a custom voice. If + [CustomVoiceParams.model] is set, the service will choose + the custom voice matching the specified configuration. + voice_clone (google.cloud.texttospeech_v1.types.VoiceCloneParams): + Optional. The configuration for a voice clone. If + [VoiceCloneParams.voice_clone_key] is set, the service will + choose the voice clone matching the specified configuration. + """ + + language_code: str = proto.Field( + proto.STRING, + number=1, + ) + name: str = proto.Field( + proto.STRING, + number=2, + ) + ssml_gender: 'SsmlVoiceGender' = proto.Field( + proto.ENUM, + number=3, + enum='SsmlVoiceGender', + ) + custom_voice: 'CustomVoiceParams' = proto.Field( + proto.MESSAGE, + number=4, + message='CustomVoiceParams', + ) + voice_clone: 'VoiceCloneParams' = proto.Field( + proto.MESSAGE, + number=5, + message='VoiceCloneParams', + ) + + +class AudioConfig(proto.Message): + r"""Description of audio data to be synthesized. + + Attributes: + audio_encoding (google.cloud.texttospeech_v1.types.AudioEncoding): + Required. The format of the audio byte + stream. + speaking_rate (float): + Optional. Input only. Speaking rate/speed, in the range + [0.25, 4.0]. 1.0 is the normal native speed supported by the + specific voice. 2.0 is twice as fast, and 0.5 is half as + fast. If unset(0.0), defaults to the native 1.0 speed. Any + other values < 0.25 or > 4.0 will return an error. + pitch (float): + Optional. Input only. Speaking pitch, in the range [-20.0, + 20.0]. 20 means increase 20 semitones from the original + pitch. -20 means decrease 20 semitones from the original + pitch. + volume_gain_db (float): + Optional. Input only. Volume gain (in dB) of the normal + native volume supported by the specific voice, in the range + [-96.0, 16.0]. If unset, or set to a value of 0.0 (dB), will + play at normal native signal amplitude. A value of -6.0 (dB) + will play at approximately half the amplitude of the normal + native signal amplitude. A value of +6.0 (dB) will play at + approximately twice the amplitude of the normal native + signal amplitude. Strongly recommend not to exceed +10 (dB) + as there's usually no effective increase in loudness for any + value greater than that. + sample_rate_hertz (int): + Optional. The synthesis sample rate (in hertz) for this + audio. When this is specified in SynthesizeSpeechRequest, if + this is different from the voice's natural sample rate, then + the synthesizer will honor this request by converting to the + desired sample rate (which might result in worse audio + quality), unless the specified sample rate is not supported + for the encoding chosen, in which case it will fail the + request and return + [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. + effects_profile_id (MutableSequence[str]): + Optional. Input only. An identifier which selects 'audio + effects' profiles that are applied on (post synthesized) + text to speech. Effects are applied on top of each other in + the order they are given. See `audio + profiles `__ + for current supported profile ids. + """ + + audio_encoding: 'AudioEncoding' = proto.Field( + proto.ENUM, + number=1, + enum='AudioEncoding', + ) + speaking_rate: float = proto.Field( + proto.DOUBLE, + number=2, + ) + pitch: float = proto.Field( + proto.DOUBLE, + number=3, + ) + volume_gain_db: float = proto.Field( + proto.DOUBLE, + number=4, + ) + sample_rate_hertz: int = proto.Field( + proto.INT32, + number=5, + ) + effects_profile_id: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=6, + ) + + +class CustomVoiceParams(proto.Message): + r"""Description of the custom voice to be synthesized. + + Attributes: + model (str): + Required. The name of the AutoML model that + synthesizes the custom voice. + reported_usage (google.cloud.texttospeech_v1.types.CustomVoiceParams.ReportedUsage): + Optional. Deprecated. The usage of the + synthesized audio to be reported. + """ + class ReportedUsage(proto.Enum): + r"""Deprecated. The usage of the synthesized audio. Usage does + not affect billing. + + Values: + REPORTED_USAGE_UNSPECIFIED (0): + Request with reported usage unspecified will + be rejected. + REALTIME (1): + For scenarios where the synthesized audio is + not downloadable and can only be used once. For + example, real-time request in IVR system. + OFFLINE (2): + For scenarios where the synthesized audio is + downloadable and can be reused. For example, the + synthesized audio is downloaded, stored in + customer service system and played repeatedly. + """ + REPORTED_USAGE_UNSPECIFIED = 0 + REALTIME = 1 + OFFLINE = 2 + + model: str = proto.Field( + proto.STRING, + number=1, + ) + reported_usage: ReportedUsage = proto.Field( + proto.ENUM, + number=3, + enum=ReportedUsage, + ) + + +class VoiceCloneParams(proto.Message): + r"""The configuration of Voice Clone feature. + + Attributes: + voice_cloning_key (str): + Required. Created by GenerateVoiceCloningKey. + """ + + voice_cloning_key: str = proto.Field( + proto.STRING, + number=1, + ) + + +class SynthesizeSpeechResponse(proto.Message): + r"""The message returned to the client by the ``SynthesizeSpeech`` + method. + + Attributes: + audio_content (bytes): + The audio data bytes encoded as specified in the request, + including the header for encodings that are wrapped in + containers (e.g. MP3, OGG_OPUS). For LINEAR16 audio, we + include the WAV header. Note: as with all bytes fields, + protobuffers use a pure binary representation, whereas JSON + representations use base64. + """ + + audio_content: bytes = proto.Field( + proto.BYTES, + number=1, + ) + + +class StreamingSynthesizeConfig(proto.Message): + r"""Provides configuration information for the + StreamingSynthesize request. + + Attributes: + voice (google.cloud.texttospeech_v1.types.VoiceSelectionParams): + Required. The desired voice of the + synthesized audio. + """ + + voice: 'VoiceSelectionParams' = proto.Field( + proto.MESSAGE, + number=1, + message='VoiceSelectionParams', + ) + + +class StreamingSynthesisInput(proto.Message): + r"""Input to be synthesized. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + text (str): + The raw text to be synthesized. It is + recommended that each input contains complete, + terminating sentences, as this will likely + result in better prosody in the output audio. + That being said, users are free to input text + however they please. + + This field is a member of `oneof`_ ``input_source``. + """ + + text: str = proto.Field( + proto.STRING, + number=1, + oneof='input_source', + ) + + +class StreamingSynthesizeRequest(proto.Message): + r"""Request message for the ``StreamingSynthesize`` method. Multiple + ``StreamingSynthesizeRequest`` messages are sent in one call. The + first message must contain a ``streaming_config`` that fully + specifies the request configuration and must not contain ``input``. + All subsequent messages must only have ``input`` set. + + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + streaming_config (google.cloud.texttospeech_v1.types.StreamingSynthesizeConfig): + StreamingSynthesizeConfig to be used in this streaming + attempt. Only specified in the first message sent in a + ``StreamingSynthesize`` call. + + This field is a member of `oneof`_ ``streaming_request``. + input (google.cloud.texttospeech_v1.types.StreamingSynthesisInput): + Input to synthesize. Specified in all messages but the first + in a ``StreamingSynthesize`` call. + + This field is a member of `oneof`_ ``streaming_request``. + """ + + streaming_config: 'StreamingSynthesizeConfig' = proto.Field( + proto.MESSAGE, + number=1, + oneof='streaming_request', + message='StreamingSynthesizeConfig', + ) + input: 'StreamingSynthesisInput' = proto.Field( + proto.MESSAGE, + number=2, + oneof='streaming_request', + message='StreamingSynthesisInput', + ) + + +class StreamingSynthesizeResponse(proto.Message): + r"""``StreamingSynthesizeResponse`` is the only message returned to the + client by ``StreamingSynthesize`` method. A series of zero or more + ``StreamingSynthesizeResponse`` messages are streamed back to the + client. + + Attributes: + audio_content (bytes): + The audio data bytes encoded as specified in + the request. This is headerless LINEAR16 audio + with a sample rate of 24000. + """ + + audio_content: bytes = proto.Field( + proto.BYTES, + number=1, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts_lrs.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts_lrs.py new file mode 100644 index 000000000000..ba1d8809c246 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts_lrs.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from __future__ import annotations + +from typing import MutableMapping, MutableSequence + +import proto # type: ignore + +from google.cloud.texttospeech_v1.types import cloud_tts +from google.protobuf import timestamp_pb2 # type: ignore + + +__protobuf__ = proto.module( + package='google.cloud.texttospeech.v1', + manifest={ + 'SynthesizeLongAudioRequest', + 'SynthesizeLongAudioResponse', + 'SynthesizeLongAudioMetadata', + }, +) + + +class SynthesizeLongAudioRequest(proto.Message): + r"""The top-level message sent by the client for the + ``SynthesizeLongAudio`` method. + + Attributes: + parent (str): + The resource states of the request in the form of + ``projects/*/locations/*``. + input (google.cloud.texttospeech_v1.types.SynthesisInput): + Required. The Synthesizer requires either + plain text or SSML as input. + audio_config (google.cloud.texttospeech_v1.types.AudioConfig): + Required. The configuration of the + synthesized audio. + output_gcs_uri (str): + Required. Specifies a Cloud Storage URI for the synthesis + results. Must be specified in the format: + ``gs://bucket_name/object_name``, and the bucket must + already exist. + voice (google.cloud.texttospeech_v1.types.VoiceSelectionParams): + Required. The desired voice of the + synthesized audio. + """ + + parent: str = proto.Field( + proto.STRING, + number=1, + ) + input: cloud_tts.SynthesisInput = proto.Field( + proto.MESSAGE, + number=2, + message=cloud_tts.SynthesisInput, + ) + audio_config: cloud_tts.AudioConfig = proto.Field( + proto.MESSAGE, + number=3, + message=cloud_tts.AudioConfig, + ) + output_gcs_uri: str = proto.Field( + proto.STRING, + number=4, + ) + voice: cloud_tts.VoiceSelectionParams = proto.Field( + proto.MESSAGE, + number=5, + message=cloud_tts.VoiceSelectionParams, + ) + + +class SynthesizeLongAudioResponse(proto.Message): + r"""The message returned to the client by the ``SynthesizeLongAudio`` + method. + + """ + + +class SynthesizeLongAudioMetadata(proto.Message): + r"""Metadata for response returned by the ``SynthesizeLongAudio`` + method. + + Attributes: + start_time (google.protobuf.timestamp_pb2.Timestamp): + Time when the request was received. + last_update_time (google.protobuf.timestamp_pb2.Timestamp): + Deprecated. Do not use. + progress_percentage (float): + The progress of the most recent processing + update in percentage, ie. 70.0%. + """ + + start_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=1, + message=timestamp_pb2.Timestamp, + ) + last_update_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=2, + message=timestamp_pb2.Timestamp, + ) + progress_percentage: float = proto.Field( + proto.DOUBLE, + number=3, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/mypy.ini b/owl-bot-staging/google-cloud-texttospeech/v1/mypy.ini new file mode 100644 index 000000000000..574c5aed394b --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/mypy.ini @@ -0,0 +1,3 @@ +[mypy] +python_version = 3.7 +namespace_packages = True diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/noxfile.py b/owl-bot-staging/google-cloud-texttospeech/v1/noxfile.py new file mode 100644 index 000000000000..bb238d6c6872 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/noxfile.py @@ -0,0 +1,280 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 pathlib +import re +import shutil +import subprocess +import sys + + +import nox # type: ignore + +ALL_PYTHON = [ + "3.7", + "3.8", + "3.9", + "3.10", + "3.11", + "3.12", + "3.13", +] + +CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() + +LOWER_BOUND_CONSTRAINTS_FILE = CURRENT_DIRECTORY / "constraints.txt" +PACKAGE_NAME = 'google-cloud-texttospeech' + +BLACK_VERSION = "black==22.3.0" +BLACK_PATHS = ["docs", "google", "tests", "samples", "noxfile.py", "setup.py"] +DEFAULT_PYTHON_VERSION = "3.13" + +nox.sessions = [ + "unit", + "cover", + "mypy", + "check_lower_bounds" + # exclude update_lower_bounds from default + "docs", + "blacken", + "lint", + "prerelease_deps", +] + +@nox.session(python=ALL_PYTHON) +@nox.parametrize( + "protobuf_implementation", + [ "python", "upb", "cpp" ], +) +def unit(session, protobuf_implementation): + """Run the unit test suite.""" + + if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): + session.skip("cpp implementation is not supported in python 3.11+") + + session.install('coverage', 'pytest', 'pytest-cov', 'pytest-asyncio', 'asyncmock; python_version < "3.8"') + session.install('-e', '.', "-c", f"testing/constraints-{session.python}.txt") + + # Remove the 'cpp' implementation once support for Protobuf 3.x is dropped. + # The 'cpp' implementation requires Protobuf<4. + if protobuf_implementation == "cpp": + session.install("protobuf<4") + + session.run( + 'py.test', + '--quiet', + '--cov=google/cloud/texttospeech_v1/', + '--cov=tests/', + '--cov-config=.coveragerc', + '--cov-report=term', + '--cov-report=html', + os.path.join('tests', 'unit', ''.join(session.posargs)), + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) + +@nox.session(python=ALL_PYTHON[-1]) +@nox.parametrize( + "protobuf_implementation", + [ "python", "upb", "cpp" ], +) +def prerelease_deps(session, protobuf_implementation): + """Run the unit test suite against pre-release versions of dependencies.""" + + if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): + session.skip("cpp implementation is not supported in python 3.11+") + + # Install test environment dependencies + session.install('coverage', 'pytest', 'pytest-cov', 'pytest-asyncio', 'asyncmock; python_version < "3.8"') + + # Install the package without dependencies + session.install('-e', '.', '--no-deps') + + # We test the minimum dependency versions using the minimum Python + # version so the lowest python runtime that we test has a corresponding constraints + # file, located at `testing/constraints--.txt`, which contains all of the + # dependencies and extras. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{ALL_PYTHON[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + session.install(*constraints_deps) + + prerel_deps = [ + "googleapis-common-protos", + "google-api-core", + "google-auth", + # Exclude grpcio!=1.67.0rc1 which does not support python 3.13 + "grpcio!=1.67.0rc1", + "grpcio-status", + "protobuf", + "proto-plus", + ] + + for dep in prerel_deps: + session.install("--pre", "--no-deps", "--upgrade", dep) + + # Remaining dependencies + other_deps = [ + "requests", + ] + session.install(*other_deps) + + # Print out prerelease package versions + + session.run("python", "-c", "import google.api_core; print(google.api_core.__version__)") + session.run("python", "-c", "import google.auth; print(google.auth.__version__)") + session.run("python", "-c", "import grpc; print(grpc.__version__)") + session.run( + "python", "-c", "import google.protobuf; print(google.protobuf.__version__)" + ) + session.run( + "python", "-c", "import proto; print(proto.__version__)" + ) + + session.run( + 'py.test', + '--quiet', + '--cov=google/cloud/texttospeech_v1/', + '--cov=tests/', + '--cov-config=.coveragerc', + '--cov-report=term', + '--cov-report=html', + os.path.join('tests', 'unit', ''.join(session.posargs)), + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) + + +@nox.session(python=DEFAULT_PYTHON_VERSION) +def cover(session): + """Run the final coverage report. + This outputs the coverage report aggregating coverage from the unit + test runs (not system test runs), and then erases coverage data. + """ + session.install("coverage", "pytest-cov") + session.run("coverage", "report", "--show-missing", "--fail-under=100") + + session.run("coverage", "erase") + + +@nox.session(python=ALL_PYTHON) +def mypy(session): + """Run the type checker.""" + session.install( + 'mypy', + 'types-requests', + 'types-protobuf' + ) + session.install('.') + session.run( + 'mypy', + '-p', + 'google', + ) + + +@nox.session +def update_lower_bounds(session): + """Update lower bounds in constraints.txt to match setup.py""" + session.install('google-cloud-testutils') + session.install('.') + + session.run( + 'lower-bound-checker', + 'update', + '--package-name', + PACKAGE_NAME, + '--constraints-file', + str(LOWER_BOUND_CONSTRAINTS_FILE), + ) + + +@nox.session +def check_lower_bounds(session): + """Check lower bounds in setup.py are reflected in constraints file""" + session.install('google-cloud-testutils') + session.install('.') + + session.run( + 'lower-bound-checker', + 'check', + '--package-name', + PACKAGE_NAME, + '--constraints-file', + str(LOWER_BOUND_CONSTRAINTS_FILE), + ) + +@nox.session(python=DEFAULT_PYTHON_VERSION) +def docs(session): + """Build the docs for this library.""" + + session.install("-e", ".") + session.install("sphinx==7.0.1", "alabaster", "recommonmark") + + shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True) + session.run( + "sphinx-build", + "-W", # warnings as errors + "-T", # show full traceback on exception + "-N", # no colors + "-b", + "html", + "-d", + os.path.join("docs", "_build", "doctrees", ""), + os.path.join("docs", ""), + os.path.join("docs", "_build", "html", ""), + ) + + +@nox.session(python=DEFAULT_PYTHON_VERSION) +def lint(session): + """Run linters. + + Returns a failure if the linters find linting errors or sufficiently + serious code quality issues. + """ + session.install("flake8", BLACK_VERSION) + session.run( + "black", + "--check", + *BLACK_PATHS, + ) + session.run("flake8", "google", "tests", "samples") + + +@nox.session(python=DEFAULT_PYTHON_VERSION) +def blacken(session): + """Run black. Format code to uniform standard.""" + session.install(BLACK_VERSION) + session.run( + "black", + *BLACK_PATHS, + ) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json new file mode 100644 index 000000000000..f87785fcdd45 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json @@ -0,0 +1,659 @@ +{ + "clientLibrary": { + "apis": [ + { + "id": "google.cloud.texttospeech.v1", + "version": "v1" + } + ], + "language": "PYTHON", + "name": "google-cloud-texttospeech", + "version": "0.1.0" + }, + "snippets": [ + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.texttospeech_v1.TextToSpeechLongAudioSynthesizeAsyncClient", + "shortName": "TextToSpeechLongAudioSynthesizeAsyncClient" + }, + "fullName": "google.cloud.texttospeech_v1.TextToSpeechLongAudioSynthesizeAsyncClient.synthesize_long_audio", + "method": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeechLongAudioSynthesize.SynthesizeLongAudio", + "service": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeechLongAudioSynthesize", + "shortName": "TextToSpeechLongAudioSynthesize" + }, + "shortName": "SynthesizeLongAudio" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.texttospeech_v1.types.SynthesizeLongAudioRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation_async.AsyncOperation", + "shortName": "synthesize_long_audio" + }, + "description": "Sample for SynthesizeLongAudio", + "file": "texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_async", + "segments": [ + { + "end": 67, + "start": 27, + "type": "FULL" + }, + { + "end": 67, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 57, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 64, + "start": 58, + "type": "REQUEST_EXECUTION" + }, + { + "end": 68, + "start": 65, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.texttospeech_v1.TextToSpeechLongAudioSynthesizeClient", + "shortName": "TextToSpeechLongAudioSynthesizeClient" + }, + "fullName": "google.cloud.texttospeech_v1.TextToSpeechLongAudioSynthesizeClient.synthesize_long_audio", + "method": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeechLongAudioSynthesize.SynthesizeLongAudio", + "service": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeechLongAudioSynthesize", + "shortName": "TextToSpeechLongAudioSynthesize" + }, + "shortName": "SynthesizeLongAudio" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.texttospeech_v1.types.SynthesizeLongAudioRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation.Operation", + "shortName": "synthesize_long_audio" + }, + "description": "Sample for SynthesizeLongAudio", + "file": "texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_sync", + "segments": [ + { + "end": 67, + "start": 27, + "type": "FULL" + }, + { + "end": 67, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 57, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 64, + "start": 58, + "type": "REQUEST_EXECUTION" + }, + { + "end": 68, + "start": 65, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.texttospeech_v1.TextToSpeechAsyncClient", + "shortName": "TextToSpeechAsyncClient" + }, + "fullName": "google.cloud.texttospeech_v1.TextToSpeechAsyncClient.list_voices", + "method": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeech.ListVoices", + "service": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeech", + "shortName": "TextToSpeech" + }, + "shortName": "ListVoices" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.texttospeech_v1.types.ListVoicesRequest" + }, + { + "name": "language_code", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.texttospeech_v1.types.ListVoicesResponse", + "shortName": "list_voices" + }, + "description": "Sample for ListVoices", + "file": "texttospeech_v1_generated_text_to_speech_list_voices_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1_generated_TextToSpeech_ListVoices_async", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 44, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 47, + "start": 45, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "start": 48, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1_generated_text_to_speech_list_voices_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.texttospeech_v1.TextToSpeechClient", + "shortName": "TextToSpeechClient" + }, + "fullName": "google.cloud.texttospeech_v1.TextToSpeechClient.list_voices", + "method": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeech.ListVoices", + "service": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeech", + "shortName": "TextToSpeech" + }, + "shortName": "ListVoices" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.texttospeech_v1.types.ListVoicesRequest" + }, + { + "name": "language_code", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.texttospeech_v1.types.ListVoicesResponse", + "shortName": "list_voices" + }, + "description": "Sample for ListVoices", + "file": "texttospeech_v1_generated_text_to_speech_list_voices_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1_generated_TextToSpeech_ListVoices_sync", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 44, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 47, + "start": 45, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "start": 48, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1_generated_text_to_speech_list_voices_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.texttospeech_v1.TextToSpeechAsyncClient", + "shortName": "TextToSpeechAsyncClient" + }, + "fullName": "google.cloud.texttospeech_v1.TextToSpeechAsyncClient.streaming_synthesize", + "method": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeech.StreamingSynthesize", + "service": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeech", + "shortName": "TextToSpeech" + }, + "shortName": "StreamingSynthesize" + }, + "parameters": [ + { + "name": "requests", + "type": "Iterator[google.cloud.texttospeech_v1.types.StreamingSynthesizeRequest]" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "Iterable[google.cloud.texttospeech_v1.types.StreamingSynthesizeResponse]", + "shortName": "streaming_synthesize" + }, + "description": "Sample for StreamingSynthesize", + "file": "texttospeech_v1_generated_text_to_speech_streaming_synthesize_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1_generated_TextToSpeech_StreamingSynthesize_async", + "segments": [ + { + "end": 65, + "start": 27, + "type": "FULL" + }, + { + "end": 65, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 58, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 61, + "start": 59, + "type": "REQUEST_EXECUTION" + }, + { + "end": 66, + "start": 62, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1_generated_text_to_speech_streaming_synthesize_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.texttospeech_v1.TextToSpeechClient", + "shortName": "TextToSpeechClient" + }, + "fullName": "google.cloud.texttospeech_v1.TextToSpeechClient.streaming_synthesize", + "method": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeech.StreamingSynthesize", + "service": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeech", + "shortName": "TextToSpeech" + }, + "shortName": "StreamingSynthesize" + }, + "parameters": [ + { + "name": "requests", + "type": "Iterator[google.cloud.texttospeech_v1.types.StreamingSynthesizeRequest]" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "Iterable[google.cloud.texttospeech_v1.types.StreamingSynthesizeResponse]", + "shortName": "streaming_synthesize" + }, + "description": "Sample for StreamingSynthesize", + "file": "texttospeech_v1_generated_text_to_speech_streaming_synthesize_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1_generated_TextToSpeech_StreamingSynthesize_sync", + "segments": [ + { + "end": 65, + "start": 27, + "type": "FULL" + }, + { + "end": 65, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 58, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 61, + "start": 59, + "type": "REQUEST_EXECUTION" + }, + { + "end": 66, + "start": 62, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1_generated_text_to_speech_streaming_synthesize_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.texttospeech_v1.TextToSpeechAsyncClient", + "shortName": "TextToSpeechAsyncClient" + }, + "fullName": "google.cloud.texttospeech_v1.TextToSpeechAsyncClient.synthesize_speech", + "method": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeech.SynthesizeSpeech", + "service": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeech", + "shortName": "TextToSpeech" + }, + "shortName": "SynthesizeSpeech" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.texttospeech_v1.types.SynthesizeSpeechRequest" + }, + { + "name": "input", + "type": "google.cloud.texttospeech_v1.types.SynthesisInput" + }, + { + "name": "voice", + "type": "google.cloud.texttospeech_v1.types.VoiceSelectionParams" + }, + { + "name": "audio_config", + "type": "google.cloud.texttospeech_v1.types.AudioConfig" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.texttospeech_v1.types.SynthesizeSpeechResponse", + "shortName": "synthesize_speech" + }, + "description": "Sample for SynthesizeSpeech", + "file": "texttospeech_v1_generated_text_to_speech_synthesize_speech_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1_generated_TextToSpeech_SynthesizeSpeech_async", + "segments": [ + { + "end": 62, + "start": 27, + "type": "FULL" + }, + { + "end": 62, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 56, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 59, + "start": 57, + "type": "REQUEST_EXECUTION" + }, + { + "end": 63, + "start": 60, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1_generated_text_to_speech_synthesize_speech_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.texttospeech_v1.TextToSpeechClient", + "shortName": "TextToSpeechClient" + }, + "fullName": "google.cloud.texttospeech_v1.TextToSpeechClient.synthesize_speech", + "method": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeech.SynthesizeSpeech", + "service": { + "fullName": "google.cloud.texttospeech.v1.TextToSpeech", + "shortName": "TextToSpeech" + }, + "shortName": "SynthesizeSpeech" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.texttospeech_v1.types.SynthesizeSpeechRequest" + }, + { + "name": "input", + "type": "google.cloud.texttospeech_v1.types.SynthesisInput" + }, + { + "name": "voice", + "type": "google.cloud.texttospeech_v1.types.VoiceSelectionParams" + }, + { + "name": "audio_config", + "type": "google.cloud.texttospeech_v1.types.AudioConfig" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.texttospeech_v1.types.SynthesizeSpeechResponse", + "shortName": "synthesize_speech" + }, + "description": "Sample for SynthesizeSpeech", + "file": "texttospeech_v1_generated_text_to_speech_synthesize_speech_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1_generated_TextToSpeech_SynthesizeSpeech_sync", + "segments": [ + { + "end": 62, + "start": 27, + "type": "FULL" + }, + { + "end": 62, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 56, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 59, + "start": 57, + "type": "REQUEST_EXECUTION" + }, + { + "end": 63, + "start": 60, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1_generated_text_to_speech_synthesize_speech_sync.py" + } + ] +} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_async.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_async.py new file mode 100644 index 000000000000..3ea7da583ca0 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_async.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for ListVoices +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1_generated_TextToSpeech_ListVoices_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1 + + +async def sample_list_voices(): + # Create a client + client = texttospeech_v1.TextToSpeechAsyncClient() + + # Initialize request argument(s) + request = texttospeech_v1.ListVoicesRequest( + ) + + # Make the request + response = await client.list_voices(request=request) + + # Handle the response + print(response) + +# [END texttospeech_v1_generated_TextToSpeech_ListVoices_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_sync.py new file mode 100644 index 000000000000..bf57ff2a20fa --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_sync.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for ListVoices +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1_generated_TextToSpeech_ListVoices_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1 + + +def sample_list_voices(): + # Create a client + client = texttospeech_v1.TextToSpeechClient() + + # Initialize request argument(s) + request = texttospeech_v1.ListVoicesRequest( + ) + + # Make the request + response = client.list_voices(request=request) + + # Handle the response + print(response) + +# [END texttospeech_v1_generated_TextToSpeech_ListVoices_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py new file mode 100644 index 000000000000..9a5f80c775f7 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for SynthesizeLongAudio +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1 + + +async def sample_synthesize_long_audio(): + # Create a client + client = texttospeech_v1.TextToSpeechLongAudioSynthesizeAsyncClient() + + # Initialize request argument(s) + input = texttospeech_v1.SynthesisInput() + input.text = "text_value" + + audio_config = texttospeech_v1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + voice = texttospeech_v1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + request = texttospeech_v1.SynthesizeLongAudioRequest( + input=input, + audio_config=audio_config, + output_gcs_uri="output_gcs_uri_value", + voice=voice, + ) + + # Make the request + operation = client.synthesize_long_audio(request=request) + + print("Waiting for operation to complete...") + + response = (await operation).result() + + # Handle the response + print(response) + +# [END texttospeech_v1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py new file mode 100644 index 000000000000..3e903a4fa7c0 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for SynthesizeLongAudio +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1 + + +def sample_synthesize_long_audio(): + # Create a client + client = texttospeech_v1.TextToSpeechLongAudioSynthesizeClient() + + # Initialize request argument(s) + input = texttospeech_v1.SynthesisInput() + input.text = "text_value" + + audio_config = texttospeech_v1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + voice = texttospeech_v1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + request = texttospeech_v1.SynthesizeLongAudioRequest( + input=input, + audio_config=audio_config, + output_gcs_uri="output_gcs_uri_value", + voice=voice, + ) + + # Make the request + operation = client.synthesize_long_audio(request=request) + + print("Waiting for operation to complete...") + + response = operation.result() + + # Handle the response + print(response) + +# [END texttospeech_v1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_async.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_async.py new file mode 100644 index 000000000000..ef666ea6b2a3 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_async.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for StreamingSynthesize +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1_generated_TextToSpeech_StreamingSynthesize_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1 + + +async def sample_streaming_synthesize(): + # Create a client + client = texttospeech_v1.TextToSpeechAsyncClient() + + # Initialize request argument(s) + streaming_config = texttospeech_v1.StreamingSynthesizeConfig() + streaming_config.voice.language_code = "language_code_value" + + request = texttospeech_v1.StreamingSynthesizeRequest( + streaming_config=streaming_config, + ) + + # This method expects an iterator which contains + # 'texttospeech_v1.StreamingSynthesizeRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = await client.streaming_synthesize(requests=request_generator()) + + # Handle the response + async for response in stream: + print(response) + +# [END texttospeech_v1_generated_TextToSpeech_StreamingSynthesize_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_sync.py new file mode 100644 index 000000000000..a0f24ef1a98b --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_sync.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for StreamingSynthesize +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1_generated_TextToSpeech_StreamingSynthesize_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1 + + +def sample_streaming_synthesize(): + # Create a client + client = texttospeech_v1.TextToSpeechClient() + + # Initialize request argument(s) + streaming_config = texttospeech_v1.StreamingSynthesizeConfig() + streaming_config.voice.language_code = "language_code_value" + + request = texttospeech_v1.StreamingSynthesizeRequest( + streaming_config=streaming_config, + ) + + # This method expects an iterator which contains + # 'texttospeech_v1.StreamingSynthesizeRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = client.streaming_synthesize(requests=request_generator()) + + # Handle the response + for response in stream: + print(response) + +# [END texttospeech_v1_generated_TextToSpeech_StreamingSynthesize_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_async.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_async.py new file mode 100644 index 000000000000..dd9255013bfd --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_async.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for SynthesizeSpeech +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1_generated_TextToSpeech_SynthesizeSpeech_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1 + + +async def sample_synthesize_speech(): + # Create a client + client = texttospeech_v1.TextToSpeechAsyncClient() + + # Initialize request argument(s) + input = texttospeech_v1.SynthesisInput() + input.text = "text_value" + + voice = texttospeech_v1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + audio_config = texttospeech_v1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + request = texttospeech_v1.SynthesizeSpeechRequest( + input=input, + voice=voice, + audio_config=audio_config, + ) + + # Make the request + response = await client.synthesize_speech(request=request) + + # Handle the response + print(response) + +# [END texttospeech_v1_generated_TextToSpeech_SynthesizeSpeech_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_sync.py new file mode 100644 index 000000000000..8b8a0e8d59b1 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_sync.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for SynthesizeSpeech +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1_generated_TextToSpeech_SynthesizeSpeech_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1 + + +def sample_synthesize_speech(): + # Create a client + client = texttospeech_v1.TextToSpeechClient() + + # Initialize request argument(s) + input = texttospeech_v1.SynthesisInput() + input.text = "text_value" + + voice = texttospeech_v1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + audio_config = texttospeech_v1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + request = texttospeech_v1.SynthesizeSpeechRequest( + input=input, + voice=voice, + audio_config=audio_config, + ) + + # Make the request + response = client.synthesize_speech(request=request) + + # Handle the response + print(response) + +# [END texttospeech_v1_generated_TextToSpeech_SynthesizeSpeech_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/scripts/fixup_texttospeech_v1_keywords.py b/owl-bot-staging/google-cloud-texttospeech/v1/scripts/fixup_texttospeech_v1_keywords.py new file mode 100644 index 000000000000..10bbeee0c0cb --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/scripts/fixup_texttospeech_v1_keywords.py @@ -0,0 +1,179 @@ +#! /usr/bin/env python3 +# -*- coding: utf-8 -*- +# Copyright 2024 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 argparse +import os +import libcst as cst +import pathlib +import sys +from typing import (Any, Callable, Dict, List, Sequence, Tuple) + + +def partition( + predicate: Callable[[Any], bool], + iterator: Sequence[Any] +) -> Tuple[List[Any], List[Any]]: + """A stable, out-of-place partition.""" + results = ([], []) + + for i in iterator: + results[int(predicate(i))].append(i) + + # Returns trueList, falseList + return results[1], results[0] + + +class texttospeechCallTransformer(cst.CSTTransformer): + CTRL_PARAMS: Tuple[str] = ('retry', 'timeout', 'metadata') + METHOD_TO_PARAMS: Dict[str, Tuple[str]] = { + 'list_voices': ('language_code', ), + 'streaming_synthesize': ('streaming_config', 'input', ), + 'synthesize_long_audio': ('input', 'audio_config', 'output_gcs_uri', 'voice', 'parent', ), + 'synthesize_speech': ('input', 'voice', 'audio_config', 'advanced_voice_options', ), + } + + def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode: + try: + key = original.func.attr.value + kword_params = self.METHOD_TO_PARAMS[key] + except (AttributeError, KeyError): + # Either not a method from the API or too convoluted to be sure. + return updated + + # If the existing code is valid, keyword args come after positional args. + # Therefore, all positional args must map to the first parameters. + args, kwargs = partition(lambda a: not bool(a.keyword), updated.args) + if any(k.keyword.value == "request" for k in kwargs): + # We've already fixed this file, don't fix it again. + return updated + + kwargs, ctrl_kwargs = partition( + lambda a: a.keyword.value not in self.CTRL_PARAMS, + kwargs + ) + + args, ctrl_args = args[:len(kword_params)], args[len(kword_params):] + ctrl_kwargs.extend(cst.Arg(value=a.value, keyword=cst.Name(value=ctrl)) + for a, ctrl in zip(ctrl_args, self.CTRL_PARAMS)) + + request_arg = cst.Arg( + value=cst.Dict([ + cst.DictElement( + cst.SimpleString("'{}'".format(name)), +cst.Element(value=arg.value) + ) + # Note: the args + kwargs looks silly, but keep in mind that + # the control parameters had to be stripped out, and that + # those could have been passed positionally or by keyword. + for name, arg in zip(kword_params, args + kwargs)]), + keyword=cst.Name("request") + ) + + return updated.with_changes( + args=[request_arg] + ctrl_kwargs + ) + + +def fix_files( + in_dir: pathlib.Path, + out_dir: pathlib.Path, + *, + transformer=texttospeechCallTransformer(), +): + """Duplicate the input dir to the output dir, fixing file method calls. + + Preconditions: + * in_dir is a real directory + * out_dir is a real, empty directory + """ + pyfile_gen = ( + pathlib.Path(os.path.join(root, f)) + for root, _, files in os.walk(in_dir) + for f in files if os.path.splitext(f)[1] == ".py" + ) + + for fpath in pyfile_gen: + with open(fpath, 'r') as f: + src = f.read() + + # Parse the code and insert method call fixes. + tree = cst.parse_module(src) + updated = tree.visit(transformer) + + # Create the path and directory structure for the new file. + updated_path = out_dir.joinpath(fpath.relative_to(in_dir)) + updated_path.parent.mkdir(parents=True, exist_ok=True) + + # Generate the updated source file at the corresponding path. + with open(updated_path, 'w') as f: + f.write(updated.code) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description="""Fix up source that uses the texttospeech client library. + +The existing sources are NOT overwritten but are copied to output_dir with changes made. + +Note: This tool operates at a best-effort level at converting positional + parameters in client method calls to keyword based parameters. + Cases where it WILL FAIL include + A) * or ** expansion in a method call. + B) Calls via function or method alias (includes free function calls) + C) Indirect or dispatched calls (e.g. the method is looked up dynamically) + + These all constitute false negatives. The tool will also detect false + positives when an API method shares a name with another method. +""") + parser.add_argument( + '-d', + '--input-directory', + required=True, + dest='input_dir', + help='the input directory to walk for python files to fix up', + ) + parser.add_argument( + '-o', + '--output-directory', + required=True, + dest='output_dir', + help='the directory to output files fixed via un-flattening', + ) + args = parser.parse_args() + input_dir = pathlib.Path(args.input_dir) + output_dir = pathlib.Path(args.output_dir) + if not input_dir.is_dir(): + print( + f"input directory '{input_dir}' does not exist or is not a directory", + file=sys.stderr, + ) + sys.exit(-1) + + if not output_dir.is_dir(): + print( + f"output directory '{output_dir}' does not exist or is not a directory", + file=sys.stderr, + ) + sys.exit(-1) + + if os.listdir(output_dir): + print( + f"output directory '{output_dir}' is not empty", + file=sys.stderr, + ) + sys.exit(-1) + + fix_files(input_dir, output_dir) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/setup.py b/owl-bot-staging/google-cloud-texttospeech/v1/setup.py new file mode 100644 index 000000000000..d91c15741bbe --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/setup.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 io +import os +import re + +import setuptools # type: ignore + +package_root = os.path.abspath(os.path.dirname(__file__)) + +name = 'google-cloud-texttospeech' + + +description = "Google Cloud Texttospeech API client library" + +version = None + +with open(os.path.join(package_root, 'google/cloud/texttospeech/gapic_version.py')) as fp: + version_candidates = re.findall(r"(?<=\")\d+.\d+.\d+(?=\")", fp.read()) + assert (len(version_candidates) == 1) + version = version_candidates[0] + +if version[0] == "0": + release_status = "Development Status :: 4 - Beta" +else: + release_status = "Development Status :: 5 - Production/Stable" + +dependencies = [ + "google-api-core[grpc] >= 1.34.1, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*", + # Exclude incompatible versions of `google-auth` + # See https://github.com/googleapis/google-cloud-python/issues/12364 + "google-auth >= 2.14.1, <3.0.0dev,!=2.24.0,!=2.25.0", + "proto-plus >= 1.22.3, <2.0.0dev", + "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", + "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", +] +extras = { +} +url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-texttospeech" + +package_root = os.path.abspath(os.path.dirname(__file__)) + +readme_filename = os.path.join(package_root, "README.rst") +with io.open(readme_filename, encoding="utf-8") as readme_file: + readme = readme_file.read() + +packages = [ + package + for package in setuptools.find_namespace_packages() + if package.startswith("google") +] + +setuptools.setup( + name=name, + version=version, + description=description, + long_description=readme, + author="Google LLC", + author_email="googleapis-packages@google.com", + license="Apache 2.0", + url=url, + classifiers=[ + release_status, + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Operating System :: OS Independent", + "Topic :: Internet", + ], + platforms="Posix; MacOS X; Windows", + packages=packages, + python_requires=">=3.7", + install_requires=dependencies, + extras_require=extras, + include_package_data=True, + zip_safe=False, +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.10.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.10.txt new file mode 100644 index 000000000000..ed7f9aed2559 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.10.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.11.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.11.txt new file mode 100644 index 000000000000..ed7f9aed2559 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.11.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.12.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.12.txt new file mode 100644 index 000000000000..ed7f9aed2559 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.12.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.13.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.13.txt new file mode 100644 index 000000000000..ed7f9aed2559 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.13.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.7.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.7.txt new file mode 100644 index 000000000000..fc812592b0ee --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.7.txt @@ -0,0 +1,10 @@ +# This constraints file is used to check that lower bounds +# are correct in setup.py +# List all library dependencies and extras in this file. +# Pin the version to the lower bound. +# e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0dev", +# Then this file should have google-cloud-foo==1.14.0 +google-api-core==1.34.1 +google-auth==2.14.1 +proto-plus==1.22.3 +protobuf==3.20.2 diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.8.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.8.txt new file mode 100644 index 000000000000..ed7f9aed2559 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.8.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.9.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.9.txt new file mode 100644 index 000000000000..ed7f9aed2559 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.9.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/tests/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/tests/__init__.py new file mode 100644 index 000000000000..7b3de3117f38 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/tests/__init__.py @@ -0,0 +1,16 @@ + +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/__init__.py new file mode 100644 index 000000000000..7b3de3117f38 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/__init__.py @@ -0,0 +1,16 @@ + +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/__init__.py new file mode 100644 index 000000000000..7b3de3117f38 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/__init__.py @@ -0,0 +1,16 @@ + +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/__init__.py new file mode 100644 index 000000000000..7b3de3117f38 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/__init__.py @@ -0,0 +1,16 @@ + +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech.py b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech.py new file mode 100644 index 000000000000..bfe7d7538132 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech.py @@ -0,0 +1,3141 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 +# try/except added for compatibility with python < 3.8 +try: + from unittest import mock + from unittest.mock import AsyncMock # pragma: NO COVER +except ImportError: # pragma: NO COVER + import mock + +import grpc +from grpc.experimental import aio +from collections.abc import Iterable, AsyncIterable +from google.protobuf import json_format +import json +import math +import pytest +from google.api_core import api_core_version +from proto.marshal.rules.dates import DurationRule, TimestampRule +from proto.marshal.rules import wrappers +from requests import Response +from requests import Request, PreparedRequest +from requests.sessions import Session +from google.protobuf import json_format + +try: + from google.auth.aio import credentials as ga_credentials_async + HAS_GOOGLE_AUTH_AIO = True +except ImportError: # pragma: NO COVER + HAS_GOOGLE_AUTH_AIO = False + +from google.api_core import client_options +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import grpc_helpers +from google.api_core import grpc_helpers_async +from google.api_core import path_template +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials +from google.auth.exceptions import MutualTLSChannelError +from google.cloud.texttospeech_v1.services.text_to_speech import TextToSpeechAsyncClient +from google.cloud.texttospeech_v1.services.text_to_speech import TextToSpeechClient +from google.cloud.texttospeech_v1.services.text_to_speech import transports +from google.cloud.texttospeech_v1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore +from google.oauth2 import service_account +import google.auth + + +async def mock_async_gen(data, chunk_size=1): + for i in range(0, len(data)): # pragma: NO COVER + chunk = data[i : i + chunk_size] + yield chunk.encode("utf-8") + +def client_cert_source_callback(): + return b"cert bytes", b"key bytes" + +# TODO: use async auth anon credentials by default once the minimum version of google-auth is upgraded. +# See related issue: https://github.com/googleapis/gapic-generator-python/issues/2107. +def async_anonymous_credentials(): + if HAS_GOOGLE_AUTH_AIO: + return ga_credentials_async.AnonymousCredentials() + return ga_credentials.AnonymousCredentials() + +# If default endpoint is localhost, then default mtls endpoint will be the same. +# This method modifies the default endpoint so the client can produce a different +# mtls endpoint for endpoint testing purposes. +def modify_default_endpoint(client): + return "foo.googleapis.com" if ("localhost" in client.DEFAULT_ENDPOINT) else client.DEFAULT_ENDPOINT + +# If default endpoint template is localhost, then default mtls endpoint will be the same. +# This method modifies the default endpoint template so the client can produce a different +# mtls endpoint for endpoint testing purposes. +def modify_default_endpoint_template(client): + return "test.{UNIVERSE_DOMAIN}" if ("localhost" in client._DEFAULT_ENDPOINT_TEMPLATE) else client._DEFAULT_ENDPOINT_TEMPLATE + + +def test__get_default_mtls_endpoint(): + api_endpoint = "example.googleapis.com" + api_mtls_endpoint = "example.mtls.googleapis.com" + sandbox_endpoint = "example.sandbox.googleapis.com" + sandbox_mtls_endpoint = "example.mtls.sandbox.googleapis.com" + non_googleapi = "api.example.com" + + assert TextToSpeechClient._get_default_mtls_endpoint(None) is None + assert TextToSpeechClient._get_default_mtls_endpoint(api_endpoint) == api_mtls_endpoint + assert TextToSpeechClient._get_default_mtls_endpoint(api_mtls_endpoint) == api_mtls_endpoint + assert TextToSpeechClient._get_default_mtls_endpoint(sandbox_endpoint) == sandbox_mtls_endpoint + assert TextToSpeechClient._get_default_mtls_endpoint(sandbox_mtls_endpoint) == sandbox_mtls_endpoint + assert TextToSpeechClient._get_default_mtls_endpoint(non_googleapi) == non_googleapi + +def test__read_environment_variables(): + assert TextToSpeechClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + assert TextToSpeechClient._read_environment_variables() == (True, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): + assert TextToSpeechClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): + with pytest.raises(ValueError) as excinfo: + TextToSpeechClient._read_environment_variables() + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + assert TextToSpeechClient._read_environment_variables() == (False, "never", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + assert TextToSpeechClient._read_environment_variables() == (False, "always", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}): + assert TextToSpeechClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + TextToSpeechClient._read_environment_variables() + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + + with mock.patch.dict(os.environ, {"GOOGLE_CLOUD_UNIVERSE_DOMAIN": "foo.com"}): + assert TextToSpeechClient._read_environment_variables() == (False, "auto", "foo.com") + +def test__get_client_cert_source(): + mock_provided_cert_source = mock.Mock() + mock_default_cert_source = mock.Mock() + + assert TextToSpeechClient._get_client_cert_source(None, False) is None + assert TextToSpeechClient._get_client_cert_source(mock_provided_cert_source, False) is None + assert TextToSpeechClient._get_client_cert_source(mock_provided_cert_source, True) == mock_provided_cert_source + + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): + with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_default_cert_source): + assert TextToSpeechClient._get_client_cert_source(None, True) is mock_default_cert_source + assert TextToSpeechClient._get_client_cert_source(mock_provided_cert_source, "true") is mock_provided_cert_source + +@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) +@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) +def test__get_api_endpoint(): + api_override = "foo.com" + mock_client_cert_source = mock.Mock() + default_universe = TextToSpeechClient._DEFAULT_UNIVERSE + default_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) + mock_universe = "bar.com" + mock_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) + + assert TextToSpeechClient._get_api_endpoint(api_override, mock_client_cert_source, default_universe, "always") == api_override + assert TextToSpeechClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "auto") == TextToSpeechClient.DEFAULT_MTLS_ENDPOINT + assert TextToSpeechClient._get_api_endpoint(None, None, default_universe, "auto") == default_endpoint + assert TextToSpeechClient._get_api_endpoint(None, None, default_universe, "always") == TextToSpeechClient.DEFAULT_MTLS_ENDPOINT + assert TextToSpeechClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "always") == TextToSpeechClient.DEFAULT_MTLS_ENDPOINT + assert TextToSpeechClient._get_api_endpoint(None, None, mock_universe, "never") == mock_endpoint + assert TextToSpeechClient._get_api_endpoint(None, None, default_universe, "never") == default_endpoint + + with pytest.raises(MutualTLSChannelError) as excinfo: + TextToSpeechClient._get_api_endpoint(None, mock_client_cert_source, mock_universe, "auto") + assert str(excinfo.value) == "mTLS is not supported in any universe other than googleapis.com." + + +def test__get_universe_domain(): + client_universe_domain = "foo.com" + universe_domain_env = "bar.com" + + assert TextToSpeechClient._get_universe_domain(client_universe_domain, universe_domain_env) == client_universe_domain + assert TextToSpeechClient._get_universe_domain(None, universe_domain_env) == universe_domain_env + assert TextToSpeechClient._get_universe_domain(None, None) == TextToSpeechClient._DEFAULT_UNIVERSE + + with pytest.raises(ValueError) as excinfo: + TextToSpeechClient._get_universe_domain("", None) + assert str(excinfo.value) == "Universe Domain cannot be an empty string." + +@pytest.mark.parametrize("client_class,transport_class,transport_name", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc"), + (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest"), +]) +def test__validate_universe_domain(client_class, transport_class, transport_name): + client = client_class( + transport=transport_class( + credentials=ga_credentials.AnonymousCredentials() + ) + ) + assert client._validate_universe_domain() == True + + # Test the case when universe is already validated. + assert client._validate_universe_domain() == True + + if transport_name == "grpc": + # Test the case where credentials are provided by the + # `local_channel_credentials`. The default universes in both match. + channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) + client = client_class(transport=transport_class(channel=channel)) + assert client._validate_universe_domain() == True + + # Test the case where credentials do not exist: e.g. a transport is provided + # with no credentials. Validation should still succeed because there is no + # mismatch with non-existent credentials. + channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) + transport=transport_class(channel=channel) + transport._credentials = None + client = client_class(transport=transport) + assert client._validate_universe_domain() == True + + # TODO: This is needed to cater for older versions of google-auth + # Make this test unconditional once the minimum supported version of + # google-auth becomes 2.23.0 or higher. + google_auth_major, google_auth_minor = [int(part) for part in google.auth.__version__.split(".")[0:2]] + if google_auth_major > 2 or (google_auth_major == 2 and google_auth_minor >= 23): + credentials = ga_credentials.AnonymousCredentials() + credentials._universe_domain = "foo.com" + # Test the case when there is a universe mismatch from the credentials. + client = client_class( + transport=transport_class(credentials=credentials) + ) + with pytest.raises(ValueError) as excinfo: + client._validate_universe_domain() + assert str(excinfo.value) == "The configured universe domain (googleapis.com) does not match the universe domain found in the credentials (foo.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." + + # Test the case when there is a universe mismatch from the client. + # + # TODO: Make this test unconditional once the minimum supported version of + # google-api-core becomes 2.15.0 or higher. + api_core_major, api_core_minor = [int(part) for part in api_core_version.__version__.split(".")[0:2]] + if api_core_major > 2 or (api_core_major == 2 and api_core_minor >= 15): + client = client_class(client_options={"universe_domain": "bar.com"}, transport=transport_class(credentials=ga_credentials.AnonymousCredentials(),)) + with pytest.raises(ValueError) as excinfo: + client._validate_universe_domain() + assert str(excinfo.value) == "The configured universe domain (bar.com) does not match the universe domain found in the credentials (googleapis.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." + + # Test that ValueError is raised if universe_domain is provided via client options and credentials is None + with pytest.raises(ValueError): + client._compare_universes("foo.bar", None) + + +@pytest.mark.parametrize("client_class,transport_name", [ + (TextToSpeechClient, "grpc"), + (TextToSpeechAsyncClient, "grpc_asyncio"), + (TextToSpeechClient, "rest"), +]) +def test_text_to_speech_client_from_service_account_info(client_class, transport_name): + creds = ga_credentials.AnonymousCredentials() + with mock.patch.object(service_account.Credentials, 'from_service_account_info') as factory: + factory.return_value = creds + info = {"valid": True} + client = client_class.from_service_account_info(info, transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + assert client.transport._host == ( + 'texttospeech.googleapis.com:443' + if transport_name in ['grpc', 'grpc_asyncio'] + else + 'https://texttospeech.googleapis.com' + ) + + +@pytest.mark.parametrize("transport_class,transport_name", [ + (transports.TextToSpeechGrpcTransport, "grpc"), + (transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio"), + (transports.TextToSpeechRestTransport, "rest"), +]) +def test_text_to_speech_client_service_account_always_use_jwt(transport_class, transport_name): + with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=True) + use_jwt.assert_called_once_with(True) + + with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=False) + use_jwt.assert_not_called() + + +@pytest.mark.parametrize("client_class,transport_name", [ + (TextToSpeechClient, "grpc"), + (TextToSpeechAsyncClient, "grpc_asyncio"), + (TextToSpeechClient, "rest"), +]) +def test_text_to_speech_client_from_service_account_file(client_class, transport_name): + creds = ga_credentials.AnonymousCredentials() + with mock.patch.object(service_account.Credentials, 'from_service_account_file') as factory: + factory.return_value = creds + client = client_class.from_service_account_file("dummy/file/path.json", transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + client = client_class.from_service_account_json("dummy/file/path.json", transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + assert client.transport._host == ( + 'texttospeech.googleapis.com:443' + if transport_name in ['grpc', 'grpc_asyncio'] + else + 'https://texttospeech.googleapis.com' + ) + + +def test_text_to_speech_client_get_transport_class(): + transport = TextToSpeechClient.get_transport_class() + available_transports = [ + transports.TextToSpeechGrpcTransport, + transports.TextToSpeechRestTransport, + ] + assert transport in available_transports + + transport = TextToSpeechClient.get_transport_class("grpc") + assert transport == transports.TextToSpeechGrpcTransport + + +@pytest.mark.parametrize("client_class,transport_class,transport_name", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc"), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio"), + (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest"), +]) +@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) +@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) +def test_text_to_speech_client_client_options(client_class, transport_class, transport_name): + # Check that if channel is provided we won't create a new one. + with mock.patch.object(TextToSpeechClient, 'get_transport_class') as gtc: + transport = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ) + client = client_class(transport=transport) + gtc.assert_not_called() + + # Check that if channel is provided via str we will create a new one. + with mock.patch.object(TextToSpeechClient, 'get_transport_class') as gtc: + client = client_class(transport=transport_name) + gtc.assert_called() + + # Check the case api_endpoint is provided. + options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(transport=transport_name, client_options=options) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host="squid.clam.whelk", + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is + # "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is + # "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client.DEFAULT_MTLS_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has + # unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + client = client_class(transport=transport_name) + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + + # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): + with pytest.raises(ValueError) as excinfo: + client = client_class(transport=transport_name) + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + + # Check the case quota_project_id is provided + options = client_options.ClientOptions(quota_project_id="octopus") + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id="octopus", + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + # Check the case api_endpoint is provided + options = client_options.ClientOptions(api_audience="https://language.googleapis.com") + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience="https://language.googleapis.com" + ) + +@pytest.mark.parametrize("client_class,transport_class,transport_name,use_client_cert_env", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", "true"), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", "true"), + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", "false"), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", "false"), + (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest", "true"), + (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest", "false"), +]) +@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) +@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) +@mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}) +def test_text_to_speech_client_mtls_env_auto(client_class, transport_class, transport_name, use_client_cert_env): + # This tests the endpoint autoswitch behavior. Endpoint is autoswitched to the default + # mtls endpoint, if GOOGLE_API_USE_CLIENT_CERTIFICATE is "true" and client cert exists. + + # Check the case client_cert_source is provided. Whether client cert is used depends on + # GOOGLE_API_USE_CLIENT_CERTIFICATE value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): + options = client_options.ClientOptions(client_cert_source=client_cert_source_callback) + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + + if use_client_cert_env == "false": + expected_client_cert_source = None + expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) + else: + expected_client_cert_source = client_cert_source_callback + expected_host = client.DEFAULT_MTLS_ENDPOINT + + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=expected_host, + scopes=None, + client_cert_source_for_mtls=expected_client_cert_source, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case ADC client cert is provided. Whether client cert is used depends on + # GOOGLE_API_USE_CLIENT_CERTIFICATE value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): + with mock.patch.object(transport_class, '__init__') as patched: + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): + with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=client_cert_source_callback): + if use_client_cert_env == "false": + expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) + expected_client_cert_source = None + else: + expected_host = client.DEFAULT_MTLS_ENDPOINT + expected_client_cert_source = client_cert_source_callback + + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=expected_host, + scopes=None, + client_cert_source_for_mtls=expected_client_cert_source, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case client_cert_source and ADC client cert are not provided. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): + with mock.patch.object(transport_class, '__init__') as patched: + with mock.patch("google.auth.transport.mtls.has_default_client_cert_source", return_value=False): + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize("client_class", [ + TextToSpeechClient, TextToSpeechAsyncClient +]) +@mock.patch.object(TextToSpeechClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechClient)) +@mock.patch.object(TextToSpeechAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechAsyncClient)) +def test_text_to_speech_client_get_mtls_endpoint_and_cert_source(client_class): + mock_client_cert_source = mock.Mock() + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "true". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + mock_api_endpoint = "foo" + options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) + assert api_endpoint == mock_api_endpoint + assert cert_source == mock_client_cert_source + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "false". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): + mock_client_cert_source = mock.Mock() + mock_api_endpoint = "foo" + options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) + assert api_endpoint == mock_api_endpoint + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert doesn't exist. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=False): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert exists. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): + with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_client_cert_source): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source == mock_client_cert_source + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has + # unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + client_class.get_mtls_endpoint_and_cert_source() + + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + + # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): + with pytest.raises(ValueError) as excinfo: + client_class.get_mtls_endpoint_and_cert_source() + + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + +@pytest.mark.parametrize("client_class", [ + TextToSpeechClient, TextToSpeechAsyncClient +]) +@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) +@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) +def test_text_to_speech_client_client_api_endpoint(client_class): + mock_client_cert_source = client_cert_source_callback + api_override = "foo.com" + default_universe = TextToSpeechClient._DEFAULT_UNIVERSE + default_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) + mock_universe = "bar.com" + mock_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) + + # If ClientOptions.api_endpoint is set and GOOGLE_API_USE_CLIENT_CERTIFICATE="true", + # use ClientOptions.api_endpoint as the api endpoint regardless. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel"): + options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=api_override) + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == api_override + + # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="never", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + client = client_class(credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == default_endpoint + + # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="always", + # use the DEFAULT_MTLS_ENDPOINT as the api endpoint. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + client = client_class(credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + + # If ClientOptions.api_endpoint is not set, GOOGLE_API_USE_MTLS_ENDPOINT="auto" (default), + # GOOGLE_API_USE_CLIENT_CERTIFICATE="false" (default), default cert source doesn't exist, + # and ClientOptions.universe_domain="bar.com", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with universe domain as the api endpoint. + options = client_options.ClientOptions() + universe_exists = hasattr(options, "universe_domain") + if universe_exists: + options = client_options.ClientOptions(universe_domain=mock_universe) + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + else: + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == (mock_endpoint if universe_exists else default_endpoint) + assert client.universe_domain == (mock_universe if universe_exists else default_universe) + + # If ClientOptions does not have a universe domain attribute and GOOGLE_API_USE_MTLS_ENDPOINT="never", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. + options = client_options.ClientOptions() + if hasattr(options, "universe_domain"): + delattr(options, "universe_domain") + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == default_endpoint + + +@pytest.mark.parametrize("client_class,transport_class,transport_name", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc"), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio"), + (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest"), +]) +def test_text_to_speech_client_client_options_scopes(client_class, transport_class, transport_name): + # Check the case scopes are provided. + options = client_options.ClientOptions( + scopes=["1", "2"], + ) + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=["1", "2"], + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + +@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", grpc_helpers), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), + (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest", None), +]) +def test_text_to_speech_client_client_options_credentials_file(client_class, transport_class, transport_name, grpc_helpers): + # Check the case credentials file is provided. + options = client_options.ClientOptions( + credentials_file="credentials.json" + ) + + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file="credentials.json", + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + +def test_text_to_speech_client_client_options_from_dict(): + with mock.patch('google.cloud.texttospeech_v1.services.text_to_speech.transports.TextToSpeechGrpcTransport.__init__') as grpc_transport: + grpc_transport.return_value = None + client = TextToSpeechClient( + client_options={'api_endpoint': 'squid.clam.whelk'} + ) + grpc_transport.assert_called_once_with( + credentials=None, + credentials_file=None, + host="squid.clam.whelk", + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", grpc_helpers), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), +]) +def test_text_to_speech_client_create_channel_credentials_file(client_class, transport_class, transport_name, grpc_helpers): + # Check the case credentials file is provided. + options = client_options.ClientOptions( + credentials_file="credentials.json" + ) + + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file="credentials.json", + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # test that the credentials from file are saved and used as the credentials. + with mock.patch.object( + google.auth, "load_credentials_from_file", autospec=True + ) as load_creds, mock.patch.object( + google.auth, "default", autospec=True + ) as adc, mock.patch.object( + grpc_helpers, "create_channel" + ) as create_channel: + creds = ga_credentials.AnonymousCredentials() + file_creds = ga_credentials.AnonymousCredentials() + load_creds.return_value = (file_creds, None) + adc.return_value = (creds, None) + client = client_class(client_options=options, transport=transport_name) + create_channel.assert_called_with( + "texttospeech.googleapis.com:443", + credentials=file_creds, + credentials_file=None, + quota_project_id=None, + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + scopes=None, + default_host="texttospeech.googleapis.com", + ssl_credentials=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts.ListVoicesRequest, + dict, +]) +def test_list_voices(request_type, transport: str = 'grpc'): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = cloud_tts.ListVoicesResponse( + ) + response = client.list_voices(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = cloud_tts.ListVoicesRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, cloud_tts.ListVoicesResponse) + + +def test_list_voices_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='grpc', + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = cloud_tts.ListVoicesRequest( + language_code='language_code_value', + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + call.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client.list_voices(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == cloud_tts.ListVoicesRequest( + language_code='language_code_value', + ) + +def test_list_voices_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.list_voices in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.list_voices] = mock_rpc + request = {} + client.list_voices(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.list_voices(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_list_voices_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._client._transport.list_voices in client._client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[client._client._transport.list_voices] = mock_rpc + + request = {} + await client.list_voices(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.list_voices(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_list_voices_async(transport: str = 'grpc_asyncio', request_type=cloud_tts.ListVoicesRequest): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value =grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.ListVoicesResponse( + )) + response = await client.list_voices(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = cloud_tts.ListVoicesRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, cloud_tts.ListVoicesResponse) + + +@pytest.mark.asyncio +async def test_list_voices_async_from_dict(): + await test_list_voices_async(request_type=dict) + + +def test_list_voices_flattened(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = cloud_tts.ListVoicesResponse() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.list_voices( + language_code='language_code_value', + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].language_code + mock_val = 'language_code_value' + assert arg == mock_val + + +def test_list_voices_flattened_error(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.list_voices( + cloud_tts.ListVoicesRequest(), + language_code='language_code_value', + ) + +@pytest.mark.asyncio +async def test_list_voices_flattened_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = cloud_tts.ListVoicesResponse() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.ListVoicesResponse()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.list_voices( + language_code='language_code_value', + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].language_code + mock_val = 'language_code_value' + assert arg == mock_val + +@pytest.mark.asyncio +async def test_list_voices_flattened_error_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.list_voices( + cloud_tts.ListVoicesRequest(), + language_code='language_code_value', + ) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts.SynthesizeSpeechRequest, + dict, +]) +def test_synthesize_speech(request_type, transport: str = 'grpc'): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = cloud_tts.SynthesizeSpeechResponse( + audio_content=b'audio_content_blob', + ) + response = client.synthesize_speech(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = cloud_tts.SynthesizeSpeechRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, cloud_tts.SynthesizeSpeechResponse) + assert response.audio_content == b'audio_content_blob' + + +def test_synthesize_speech_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='grpc', + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = cloud_tts.SynthesizeSpeechRequest( + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + call.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client.synthesize_speech(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == cloud_tts.SynthesizeSpeechRequest( + ) + +def test_synthesize_speech_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.synthesize_speech in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.synthesize_speech] = mock_rpc + request = {} + client.synthesize_speech(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.synthesize_speech(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_synthesize_speech_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._client._transport.synthesize_speech in client._client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[client._client._transport.synthesize_speech] = mock_rpc + + request = {} + await client.synthesize_speech(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.synthesize_speech(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_synthesize_speech_async(transport: str = 'grpc_asyncio', request_type=cloud_tts.SynthesizeSpeechRequest): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value =grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.SynthesizeSpeechResponse( + audio_content=b'audio_content_blob', + )) + response = await client.synthesize_speech(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = cloud_tts.SynthesizeSpeechRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, cloud_tts.SynthesizeSpeechResponse) + assert response.audio_content == b'audio_content_blob' + + +@pytest.mark.asyncio +async def test_synthesize_speech_async_from_dict(): + await test_synthesize_speech_async(request_type=dict) + + +def test_synthesize_speech_flattened(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = cloud_tts.SynthesizeSpeechResponse() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.synthesize_speech( + input=cloud_tts.SynthesisInput(text='text_value'), + voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), + audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].input + mock_val = cloud_tts.SynthesisInput(text='text_value') + assert arg == mock_val + arg = args[0].voice + mock_val = cloud_tts.VoiceSelectionParams(language_code='language_code_value') + assert arg == mock_val + arg = args[0].audio_config + mock_val = cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16) + assert arg == mock_val + + +def test_synthesize_speech_flattened_error(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.synthesize_speech( + cloud_tts.SynthesizeSpeechRequest(), + input=cloud_tts.SynthesisInput(text='text_value'), + voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), + audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), + ) + +@pytest.mark.asyncio +async def test_synthesize_speech_flattened_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = cloud_tts.SynthesizeSpeechResponse() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.SynthesizeSpeechResponse()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.synthesize_speech( + input=cloud_tts.SynthesisInput(text='text_value'), + voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), + audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].input + mock_val = cloud_tts.SynthesisInput(text='text_value') + assert arg == mock_val + arg = args[0].voice + mock_val = cloud_tts.VoiceSelectionParams(language_code='language_code_value') + assert arg == mock_val + arg = args[0].audio_config + mock_val = cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16) + assert arg == mock_val + +@pytest.mark.asyncio +async def test_synthesize_speech_flattened_error_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.synthesize_speech( + cloud_tts.SynthesizeSpeechRequest(), + input=cloud_tts.SynthesisInput(text='text_value'), + voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), + audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), + ) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts.StreamingSynthesizeRequest, + dict, +]) +def test_streaming_synthesize(request_type, transport: str = 'grpc'): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + requests = [request] + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.streaming_synthesize), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = iter([cloud_tts.StreamingSynthesizeResponse()]) + response = client.streaming_synthesize(iter(requests)) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert next(args[0]) == request + + # Establish that the response is the type that we expect. + for message in response: + assert isinstance(message, cloud_tts.StreamingSynthesizeResponse) + + +def test_streaming_synthesize_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.streaming_synthesize in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.streaming_synthesize] = mock_rpc + request = [{}] + client.streaming_synthesize(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.streaming_synthesize(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_streaming_synthesize_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._client._transport.streaming_synthesize in client._client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[client._client._transport.streaming_synthesize] = mock_rpc + + request = [{}] + await client.streaming_synthesize(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.streaming_synthesize(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_streaming_synthesize_async(transport: str = 'grpc_asyncio', request_type=cloud_tts.StreamingSynthesizeRequest): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + requests = [request] + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.streaming_synthesize), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = mock.Mock(aio.StreamStreamCall, autospec=True) + call.return_value.read = mock.AsyncMock(side_effect=[cloud_tts.StreamingSynthesizeResponse()]) + response = await client.streaming_synthesize(iter(requests)) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert next(args[0]) == request + + # Establish that the response is the type that we expect. + message = await response.read() + assert isinstance(message, cloud_tts.StreamingSynthesizeResponse) + + +@pytest.mark.asyncio +async def test_streaming_synthesize_async_from_dict(): + await test_streaming_synthesize_async(request_type=dict) + + +def test_list_voices_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.list_voices in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.list_voices] = mock_rpc + + request = {} + client.list_voices(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.list_voices(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_list_voices_rest_flattened(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), 'request') as req: + # Designate an appropriate value for the returned response. + return_value = cloud_tts.ListVoicesResponse() + + # get arguments that satisfy an http rule for this method + sample_request = {} + + # get truthy value for each flattened field + mock_args = dict( + language_code='language_code_value', + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = cloud_tts.ListVoicesResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode('UTF-8') + req.return_value = response_value + + client.list_voices(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate("%s/v1/voices" % client.transport._host, args[1]) + + +def test_list_voices_rest_flattened_error(transport: str = 'rest'): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.list_voices( + cloud_tts.ListVoicesRequest(), + language_code='language_code_value', + ) + + +def test_synthesize_speech_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.synthesize_speech in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.synthesize_speech] = mock_rpc + + request = {} + client.synthesize_speech(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.synthesize_speech(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_synthesize_speech_rest_required_fields(request_type=cloud_tts.SynthesizeSpeechRequest): + transport_class = transports.TextToSpeechRestTransport + + request_init = {} + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads(json_format.MessageToJson( + pb_request, + use_integers_for_enums=False + )) + + # verify fields with default values are dropped + + unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_speech._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_speech._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='rest', + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = cloud_tts.SynthesizeSpeechResponse() + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, 'request') as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, 'transcode') as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + 'uri': 'v1/sample_method', + 'method': "post", + 'query_params': pb_request, + } + transcode_result['body'] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = cloud_tts.SynthesizeSpeechResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode('UTF-8') + req.return_value = response_value + + response = client.synthesize_speech(request) + + expected_params = [ + ] + actual_params = req.call_args.kwargs['params'] + assert expected_params == actual_params + + +def test_synthesize_speech_rest_unset_required_fields(): + transport = transports.TextToSpeechRestTransport(credentials=ga_credentials.AnonymousCredentials) + + unset_fields = transport.synthesize_speech._get_unset_required_fields({}) + assert set(unset_fields) == (set(()) & set(("input", "voice", "audioConfig", ))) + + +def test_synthesize_speech_rest_flattened(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), 'request') as req: + # Designate an appropriate value for the returned response. + return_value = cloud_tts.SynthesizeSpeechResponse() + + # get arguments that satisfy an http rule for this method + sample_request = {} + + # get truthy value for each flattened field + mock_args = dict( + input=cloud_tts.SynthesisInput(text='text_value'), + voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), + audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = cloud_tts.SynthesizeSpeechResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode('UTF-8') + req.return_value = response_value + + client.synthesize_speech(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate("%s/v1/text:synthesize" % client.transport._host, args[1]) + + +def test_synthesize_speech_rest_flattened_error(transport: str = 'rest'): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.synthesize_speech( + cloud_tts.SynthesizeSpeechRequest(), + input=cloud_tts.SynthesisInput(text='text_value'), + voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), + audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), + ) + + +def test_streaming_synthesize_rest_no_http_options(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = cloud_tts.StreamingSynthesizeRequest() + requests = [request] + with pytest.raises(RuntimeError): + client.streaming_synthesize(requests) + + +def test_streaming_synthesize_rest_error(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='rest' + ) + # Since a `google.api.http` annotation is required for using a rest transport + # method, this should error. + with pytest.raises(NotImplementedError) as not_implemented_error: + client.streaming_synthesize({}) + assert ( + "Method StreamingSynthesize is not available over REST transport" + in str(not_implemented_error.value) + ) + + +def test_credentials_transport_error(): + # It is an error to provide credentials and a transport instance. + transport = transports.TextToSpeechGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # It is an error to provide a credentials file and a transport instance. + transport = transports.TextToSpeechGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = TextToSpeechClient( + client_options={"credentials_file": "credentials.json"}, + transport=transport, + ) + + # It is an error to provide an api_key and a transport instance. + transport = transports.TextToSpeechGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + options = client_options.ClientOptions() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = TextToSpeechClient( + client_options=options, + transport=transport, + ) + + # It is an error to provide an api_key and a credential. + options = client_options.ClientOptions() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = TextToSpeechClient( + client_options=options, + credentials=ga_credentials.AnonymousCredentials() + ) + + # It is an error to provide scopes and a transport instance. + transport = transports.TextToSpeechGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = TextToSpeechClient( + client_options={"scopes": ["1", "2"]}, + transport=transport, + ) + + +def test_transport_instance(): + # A client may be instantiated with a custom transport instance. + transport = transports.TextToSpeechGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + client = TextToSpeechClient(transport=transport) + assert client.transport is transport + +def test_transport_get_channel(): + # A client may be instantiated with a custom transport instance. + transport = transports.TextToSpeechGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + channel = transport.grpc_channel + assert channel + + transport = transports.TextToSpeechGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + channel = transport.grpc_channel + assert channel + +@pytest.mark.parametrize("transport_class", [ + transports.TextToSpeechGrpcTransport, + transports.TextToSpeechGrpcAsyncIOTransport, + transports.TextToSpeechRestTransport, +]) +def test_transport_adc(transport_class): + # Test default credentials are used if not provided. + with mock.patch.object(google.auth, 'default') as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport_class() + adc.assert_called_once() + +def test_transport_kind_grpc(): + transport = TextToSpeechClient.get_transport_class("grpc")( + credentials=ga_credentials.AnonymousCredentials() + ) + assert transport.kind == "grpc" + + +def test_initialize_client_w_grpc(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_list_voices_empty_call_grpc(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + call.return_value = cloud_tts.ListVoicesResponse() + client.list_voices(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts.ListVoicesRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_synthesize_speech_empty_call_grpc(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + call.return_value = cloud_tts.SynthesizeSpeechResponse() + client.synthesize_speech(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts.SynthesizeSpeechRequest() + + assert args[0] == request_msg + + +def test_transport_kind_grpc_asyncio(): + transport = TextToSpeechAsyncClient.get_transport_class("grpc_asyncio")( + credentials=async_anonymous_credentials() + ) + assert transport.kind == "grpc_asyncio" + + +def test_initialize_client_w_grpc_asyncio(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_list_voices_empty_call_grpc_asyncio(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.ListVoicesResponse( + )) + await client.list_voices(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts.ListVoicesRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_synthesize_speech_empty_call_grpc_asyncio(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.SynthesizeSpeechResponse( + audio_content=b'audio_content_blob', + )) + await client.synthesize_speech(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts.SynthesizeSpeechRequest() + + assert args[0] == request_msg + + +def test_transport_kind_rest(): + transport = TextToSpeechClient.get_transport_class("rest")( + credentials=ga_credentials.AnonymousCredentials() + ) + assert transport.kind == "rest" + + +def test_list_voices_rest_bad_request(request_type=cloud_tts.ListVoicesRequest): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + client.list_voices(request) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts.ListVoicesRequest, + dict, +]) +def test_list_voices_rest_call_success(request_type): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), 'request') as req: + # Designate an appropriate value for the returned response. + return_value = cloud_tts.ListVoicesResponse( + ) + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = cloud_tts.ListVoicesResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + req.return_value = response_value + response = client.list_voices(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, cloud_tts.ListVoicesResponse) + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_list_voices_rest_interceptors(null_interceptor): + transport = transports.TextToSpeechRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None if null_interceptor else transports.TextToSpeechRestInterceptor(), + ) + client = TextToSpeechClient(transport=transport) + + with mock.patch.object(type(client.transport._session), "request") as req, \ + mock.patch.object(path_template, "transcode") as transcode, \ + mock.patch.object(transports.TextToSpeechRestInterceptor, "post_list_voices") as post, \ + mock.patch.object(transports.TextToSpeechRestInterceptor, "pre_list_voices") as pre: + pre.assert_not_called() + post.assert_not_called() + pb_message = cloud_tts.ListVoicesRequest.pb(cloud_tts.ListVoicesRequest()) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + return_value = cloud_tts.ListVoicesResponse.to_json(cloud_tts.ListVoicesResponse()) + req.return_value.content = return_value + + request = cloud_tts.ListVoicesRequest() + metadata =[ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = cloud_tts.ListVoicesResponse() + + client.list_voices(request, metadata=[("key", "val"), ("cephalopod", "squid"),]) + + pre.assert_called_once() + post.assert_called_once() + + +def test_synthesize_speech_rest_bad_request(request_type=cloud_tts.SynthesizeSpeechRequest): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + client.synthesize_speech(request) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts.SynthesizeSpeechRequest, + dict, +]) +def test_synthesize_speech_rest_call_success(request_type): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), 'request') as req: + # Designate an appropriate value for the returned response. + return_value = cloud_tts.SynthesizeSpeechResponse( + audio_content=b'audio_content_blob', + ) + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = cloud_tts.SynthesizeSpeechResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + req.return_value = response_value + response = client.synthesize_speech(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, cloud_tts.SynthesizeSpeechResponse) + assert response.audio_content == b'audio_content_blob' + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_synthesize_speech_rest_interceptors(null_interceptor): + transport = transports.TextToSpeechRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None if null_interceptor else transports.TextToSpeechRestInterceptor(), + ) + client = TextToSpeechClient(transport=transport) + + with mock.patch.object(type(client.transport._session), "request") as req, \ + mock.patch.object(path_template, "transcode") as transcode, \ + mock.patch.object(transports.TextToSpeechRestInterceptor, "post_synthesize_speech") as post, \ + mock.patch.object(transports.TextToSpeechRestInterceptor, "pre_synthesize_speech") as pre: + pre.assert_not_called() + post.assert_not_called() + pb_message = cloud_tts.SynthesizeSpeechRequest.pb(cloud_tts.SynthesizeSpeechRequest()) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + return_value = cloud_tts.SynthesizeSpeechResponse.to_json(cloud_tts.SynthesizeSpeechResponse()) + req.return_value.content = return_value + + request = cloud_tts.SynthesizeSpeechRequest() + metadata =[ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = cloud_tts.SynthesizeSpeechResponse() + + client.synthesize_speech(request, metadata=[("key", "val"), ("cephalopod", "squid"),]) + + pre.assert_called_once() + post.assert_called_once() + + +def test_streaming_synthesize_rest_error(): + + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + + with pytest.raises(NotImplementedError) as not_implemented_error: + client.streaming_synthesize({}) + assert ( + "Method StreamingSynthesize is not available over REST transport" + in str(not_implemented_error.value) + ) + + +def test_get_operation_rest_bad_request(request_type=operations_pb2.GetOperationRequest): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type() + request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2/operations/sample3'}, request) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = Response() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = Request() + req.return_value = response_value + client.get_operation(request) + + +@pytest.mark.parametrize("request_type", [ + operations_pb2.GetOperationRequest, + dict, +]) +def test_get_operation_rest(request_type): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + request_init = {'name': 'projects/sample1/locations/sample2/operations/sample3'} + request = request_type(**request_init) + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, 'request') as req: + # Designate an appropriate value for the returned response. + return_value = operations_pb2.Operation() + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + + req.return_value = response_value + + response = client.get_operation(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.Operation) + + +def test_list_operations_rest_bad_request(request_type=operations_pb2.ListOperationsRequest): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type() + request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2'}, request) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = Response() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = Request() + req.return_value = response_value + client.list_operations(request) + + +@pytest.mark.parametrize("request_type", [ + operations_pb2.ListOperationsRequest, + dict, +]) +def test_list_operations_rest(request_type): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + request_init = {'name': 'projects/sample1/locations/sample2'} + request = request_type(**request_init) + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, 'request') as req: + # Designate an appropriate value for the returned response. + return_value = operations_pb2.ListOperationsResponse() + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + + req.return_value = response_value + + response = client.list_operations(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.ListOperationsResponse) + +def test_initialize_client_w_rest(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_list_voices_empty_call_rest(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + client.list_voices(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts.ListVoicesRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_synthesize_speech_empty_call_rest(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + client.synthesize_speech(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts.SynthesizeSpeechRequest() + + assert args[0] == request_msg + + +def test_transport_grpc_default(): + # A client should use the gRPC transport by default. + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + assert isinstance( + client.transport, + transports.TextToSpeechGrpcTransport, + ) + +def test_text_to_speech_base_transport_error(): + # Passing both a credentials object and credentials_file should raise an error + with pytest.raises(core_exceptions.DuplicateCredentialArgs): + transport = transports.TextToSpeechTransport( + credentials=ga_credentials.AnonymousCredentials(), + credentials_file="credentials.json" + ) + + +def test_text_to_speech_base_transport(): + # Instantiate the base transport. + with mock.patch('google.cloud.texttospeech_v1.services.text_to_speech.transports.TextToSpeechTransport.__init__') as Transport: + Transport.return_value = None + transport = transports.TextToSpeechTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Every method on the transport should just blindly + # raise NotImplementedError. + methods = ( + 'list_voices', + 'synthesize_speech', + 'streaming_synthesize', + 'get_operation', + 'list_operations', + ) + for method in methods: + with pytest.raises(NotImplementedError): + getattr(transport, method)(request=object()) + + with pytest.raises(NotImplementedError): + transport.close() + + # Catch all for all remaining methods and properties + remainder = [ + 'kind', + ] + for r in remainder: + with pytest.raises(NotImplementedError): + getattr(transport, r)() + + +def test_text_to_speech_base_transport_with_credentials_file(): + # Instantiate the base transport with a credentials file + with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('google.cloud.texttospeech_v1.services.text_to_speech.transports.TextToSpeechTransport._prep_wrapped_messages') as Transport: + Transport.return_value = None + load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) + transport = transports.TextToSpeechTransport( + credentials_file="credentials.json", + quota_project_id="octopus", + ) + load_creds.assert_called_once_with("credentials.json", + scopes=None, + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + quota_project_id="octopus", + ) + + +def test_text_to_speech_base_transport_with_adc(): + # Test the default credentials are used if credentials and credentials_file are None. + with mock.patch.object(google.auth, 'default', autospec=True) as adc, mock.patch('google.cloud.texttospeech_v1.services.text_to_speech.transports.TextToSpeechTransport._prep_wrapped_messages') as Transport: + Transport.return_value = None + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport = transports.TextToSpeechTransport() + adc.assert_called_once() + + +def test_text_to_speech_auth_adc(): + # If no credentials are provided, we should use ADC credentials. + with mock.patch.object(google.auth, 'default', autospec=True) as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + TextToSpeechClient() + adc.assert_called_once_with( + scopes=None, + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + quota_project_id=None, + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.TextToSpeechGrpcTransport, + transports.TextToSpeechGrpcAsyncIOTransport, + ], +) +def test_text_to_speech_transport_auth_adc(transport_class): + # If credentials and host are not provided, the transport class should use + # ADC credentials. + with mock.patch.object(google.auth, 'default', autospec=True) as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport_class(quota_project_id="octopus", scopes=["1", "2"]) + adc.assert_called_once_with( + scopes=["1", "2"], + default_scopes=( 'https://www.googleapis.com/auth/cloud-platform',), + quota_project_id="octopus", + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.TextToSpeechGrpcTransport, + transports.TextToSpeechGrpcAsyncIOTransport, + transports.TextToSpeechRestTransport, + ], +) +def test_text_to_speech_transport_auth_gdch_credentials(transport_class): + host = 'https://language.com' + api_audience_tests = [None, 'https://language2.com'] + api_audience_expect = [host, 'https://language2.com'] + for t, e in zip(api_audience_tests, api_audience_expect): + with mock.patch.object(google.auth, 'default', autospec=True) as adc: + gdch_mock = mock.MagicMock() + type(gdch_mock).with_gdch_audience = mock.PropertyMock(return_value=gdch_mock) + adc.return_value = (gdch_mock, None) + transport_class(host=host, api_audience=t) + gdch_mock.with_gdch_audience.assert_called_once_with( + e + ) + + +@pytest.mark.parametrize( + "transport_class,grpc_helpers", + [ + (transports.TextToSpeechGrpcTransport, grpc_helpers), + (transports.TextToSpeechGrpcAsyncIOTransport, grpc_helpers_async) + ], +) +def test_text_to_speech_transport_create_channel(transport_class, grpc_helpers): + # If credentials and host are not provided, the transport class should use + # ADC credentials. + with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch.object( + grpc_helpers, "create_channel", autospec=True + ) as create_channel: + creds = ga_credentials.AnonymousCredentials() + adc.return_value = (creds, None) + transport_class( + quota_project_id="octopus", + scopes=["1", "2"] + ) + + create_channel.assert_called_with( + "texttospeech.googleapis.com:443", + credentials=creds, + credentials_file=None, + quota_project_id="octopus", + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + scopes=["1", "2"], + default_host="texttospeech.googleapis.com", + ssl_credentials=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + +@pytest.mark.parametrize("transport_class", [transports.TextToSpeechGrpcTransport, transports.TextToSpeechGrpcAsyncIOTransport]) +def test_text_to_speech_grpc_transport_client_cert_source_for_mtls( + transport_class +): + cred = ga_credentials.AnonymousCredentials() + + # Check ssl_channel_credentials is used if provided. + with mock.patch.object(transport_class, "create_channel") as mock_create_channel: + mock_ssl_channel_creds = mock.Mock() + transport_class( + host="squid.clam.whelk", + credentials=cred, + ssl_channel_credentials=mock_ssl_channel_creds + ) + mock_create_channel.assert_called_once_with( + "squid.clam.whelk:443", + credentials=cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_channel_creds, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls + # is used. + with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()): + with mock.patch("grpc.ssl_channel_credentials") as mock_ssl_cred: + transport_class( + credentials=cred, + client_cert_source_for_mtls=client_cert_source_callback + ) + expected_cert, expected_key = client_cert_source_callback() + mock_ssl_cred.assert_called_once_with( + certificate_chain=expected_cert, + private_key=expected_key + ) + +def test_text_to_speech_http_transport_client_cert_source_for_mtls(): + cred = ga_credentials.AnonymousCredentials() + with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel") as mock_configure_mtls_channel: + transports.TextToSpeechRestTransport ( + credentials=cred, + client_cert_source_for_mtls=client_cert_source_callback + ) + mock_configure_mtls_channel.assert_called_once_with(client_cert_source_callback) + + +@pytest.mark.parametrize("transport_name", [ + "grpc", + "grpc_asyncio", + "rest", +]) +def test_text_to_speech_host_no_port(transport_name): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com'), + transport=transport_name, + ) + assert client.transport._host == ( + 'texttospeech.googleapis.com:443' + if transport_name in ['grpc', 'grpc_asyncio'] + else 'https://texttospeech.googleapis.com' + ) + +@pytest.mark.parametrize("transport_name", [ + "grpc", + "grpc_asyncio", + "rest", +]) +def test_text_to_speech_host_with_port(transport_name): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com:8000'), + transport=transport_name, + ) + assert client.transport._host == ( + 'texttospeech.googleapis.com:8000' + if transport_name in ['grpc', 'grpc_asyncio'] + else 'https://texttospeech.googleapis.com:8000' + ) + +@pytest.mark.parametrize("transport_name", [ + "rest", +]) +def test_text_to_speech_client_transport_session_collision(transport_name): + creds1 = ga_credentials.AnonymousCredentials() + creds2 = ga_credentials.AnonymousCredentials() + client1 = TextToSpeechClient( + credentials=creds1, + transport=transport_name, + ) + client2 = TextToSpeechClient( + credentials=creds2, + transport=transport_name, + ) + session1 = client1.transport.list_voices._session + session2 = client2.transport.list_voices._session + assert session1 != session2 + session1 = client1.transport.synthesize_speech._session + session2 = client2.transport.synthesize_speech._session + assert session1 != session2 + session1 = client1.transport.streaming_synthesize._session + session2 = client2.transport.streaming_synthesize._session + assert session1 != session2 +def test_text_to_speech_grpc_transport_channel(): + channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) + + # Check that channel is used if provided. + transport = transports.TextToSpeechGrpcTransport( + host="squid.clam.whelk", + channel=channel, + ) + assert transport.grpc_channel == channel + assert transport._host == "squid.clam.whelk:443" + assert transport._ssl_channel_credentials == None + + +def test_text_to_speech_grpc_asyncio_transport_channel(): + channel = aio.secure_channel('http://localhost/', grpc.local_channel_credentials()) + + # Check that channel is used if provided. + transport = transports.TextToSpeechGrpcAsyncIOTransport( + host="squid.clam.whelk", + channel=channel, + ) + assert transport.grpc_channel == channel + assert transport._host == "squid.clam.whelk:443" + assert transport._ssl_channel_credentials == None + + +# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are +# removed from grpc/grpc_asyncio transport constructor. +@pytest.mark.parametrize("transport_class", [transports.TextToSpeechGrpcTransport, transports.TextToSpeechGrpcAsyncIOTransport]) +def test_text_to_speech_transport_channel_mtls_with_client_cert_source( + transport_class +): + with mock.patch("grpc.ssl_channel_credentials", autospec=True) as grpc_ssl_channel_cred: + with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: + mock_ssl_cred = mock.Mock() + grpc_ssl_channel_cred.return_value = mock_ssl_cred + + mock_grpc_channel = mock.Mock() + grpc_create_channel.return_value = mock_grpc_channel + + cred = ga_credentials.AnonymousCredentials() + with pytest.warns(DeprecationWarning): + with mock.patch.object(google.auth, 'default') as adc: + adc.return_value = (cred, None) + transport = transport_class( + host="squid.clam.whelk", + api_mtls_endpoint="mtls.squid.clam.whelk", + client_cert_source=client_cert_source_callback, + ) + adc.assert_called_once() + + grpc_ssl_channel_cred.assert_called_once_with( + certificate_chain=b"cert bytes", private_key=b"key bytes" + ) + grpc_create_channel.assert_called_once_with( + "mtls.squid.clam.whelk:443", + credentials=cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_cred, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + assert transport.grpc_channel == mock_grpc_channel + assert transport._ssl_channel_credentials == mock_ssl_cred + + +# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are +# removed from grpc/grpc_asyncio transport constructor. +@pytest.mark.parametrize("transport_class", [transports.TextToSpeechGrpcTransport, transports.TextToSpeechGrpcAsyncIOTransport]) +def test_text_to_speech_transport_channel_mtls_with_adc( + transport_class +): + mock_ssl_cred = mock.Mock() + with mock.patch.multiple( + "google.auth.transport.grpc.SslCredentials", + __init__=mock.Mock(return_value=None), + ssl_credentials=mock.PropertyMock(return_value=mock_ssl_cred), + ): + with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: + mock_grpc_channel = mock.Mock() + grpc_create_channel.return_value = mock_grpc_channel + mock_cred = mock.Mock() + + with pytest.warns(DeprecationWarning): + transport = transport_class( + host="squid.clam.whelk", + credentials=mock_cred, + api_mtls_endpoint="mtls.squid.clam.whelk", + client_cert_source=None, + ) + + grpc_create_channel.assert_called_once_with( + "mtls.squid.clam.whelk:443", + credentials=mock_cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_cred, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + assert transport.grpc_channel == mock_grpc_channel + + +def test_model_path(): + project = "squid" + location = "clam" + model = "whelk" + expected = "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) + actual = TextToSpeechClient.model_path(project, location, model) + assert expected == actual + + +def test_parse_model_path(): + expected = { + "project": "octopus", + "location": "oyster", + "model": "nudibranch", + } + path = TextToSpeechClient.model_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechClient.parse_model_path(path) + assert expected == actual + +def test_common_billing_account_path(): + billing_account = "cuttlefish" + expected = "billingAccounts/{billing_account}".format(billing_account=billing_account, ) + actual = TextToSpeechClient.common_billing_account_path(billing_account) + assert expected == actual + + +def test_parse_common_billing_account_path(): + expected = { + "billing_account": "mussel", + } + path = TextToSpeechClient.common_billing_account_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechClient.parse_common_billing_account_path(path) + assert expected == actual + +def test_common_folder_path(): + folder = "winkle" + expected = "folders/{folder}".format(folder=folder, ) + actual = TextToSpeechClient.common_folder_path(folder) + assert expected == actual + + +def test_parse_common_folder_path(): + expected = { + "folder": "nautilus", + } + path = TextToSpeechClient.common_folder_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechClient.parse_common_folder_path(path) + assert expected == actual + +def test_common_organization_path(): + organization = "scallop" + expected = "organizations/{organization}".format(organization=organization, ) + actual = TextToSpeechClient.common_organization_path(organization) + assert expected == actual + + +def test_parse_common_organization_path(): + expected = { + "organization": "abalone", + } + path = TextToSpeechClient.common_organization_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechClient.parse_common_organization_path(path) + assert expected == actual + +def test_common_project_path(): + project = "squid" + expected = "projects/{project}".format(project=project, ) + actual = TextToSpeechClient.common_project_path(project) + assert expected == actual + + +def test_parse_common_project_path(): + expected = { + "project": "clam", + } + path = TextToSpeechClient.common_project_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechClient.parse_common_project_path(path) + assert expected == actual + +def test_common_location_path(): + project = "whelk" + location = "octopus" + expected = "projects/{project}/locations/{location}".format(project=project, location=location, ) + actual = TextToSpeechClient.common_location_path(project, location) + assert expected == actual + + +def test_parse_common_location_path(): + expected = { + "project": "oyster", + "location": "nudibranch", + } + path = TextToSpeechClient.common_location_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechClient.parse_common_location_path(path) + assert expected == actual + + +def test_client_with_default_client_info(): + client_info = gapic_v1.client_info.ClientInfo() + + with mock.patch.object(transports.TextToSpeechTransport, '_prep_wrapped_messages') as prep: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, + ) + prep.assert_called_once_with(client_info) + + with mock.patch.object(transports.TextToSpeechTransport, '_prep_wrapped_messages') as prep: + transport_class = TextToSpeechClient.get_transport_class() + transport = transport_class( + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, + ) + prep.assert_called_once_with(client_info) + + +def test_get_operation(transport: str = "grpc"): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.GetOperationRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation() + response = client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.Operation) +@pytest.mark.asyncio +async def test_get_operation_async(transport: str = "grpc_asyncio"): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.GetOperationRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation() + ) + response = await client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.Operation) + +def test_get_operation_field_headers(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.GetOperationRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + call.return_value = operations_pb2.Operation() + + client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +@pytest.mark.asyncio +async def test_get_operation_field_headers_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.GetOperationRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation() + ) + await client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + +def test_get_operation_from_dict(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation() + + response = client.get_operation( + request={ + "name": "locations", + } + ) + call.assert_called() +@pytest.mark.asyncio +async def test_get_operation_from_dict_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation() + ) + response = await client.get_operation( + request={ + "name": "locations", + } + ) + call.assert_called() + + +def test_list_operations(transport: str = "grpc"): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.ListOperationsRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.ListOperationsResponse() + response = client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.ListOperationsResponse) +@pytest.mark.asyncio +async def test_list_operations_async(transport: str = "grpc_asyncio"): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.ListOperationsRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.ListOperationsResponse() + ) + response = await client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.ListOperationsResponse) + +def test_list_operations_field_headers(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.ListOperationsRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + call.return_value = operations_pb2.ListOperationsResponse() + + client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +@pytest.mark.asyncio +async def test_list_operations_field_headers_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.ListOperationsRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.ListOperationsResponse() + ) + await client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + +def test_list_operations_from_dict(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.ListOperationsResponse() + + response = client.list_operations( + request={ + "name": "locations", + } + ) + call.assert_called() +@pytest.mark.asyncio +async def test_list_operations_from_dict_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.ListOperationsResponse() + ) + response = await client.list_operations( + request={ + "name": "locations", + } + ) + call.assert_called() + + +def test_transport_close_grpc(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc" + ) + with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +@pytest.mark.asyncio +async def test_transport_close_grpc_asyncio(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio" + ) + with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: + async with client: + close.assert_not_called() + close.assert_called_once() + + +def test_transport_close_rest(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + with mock.patch.object(type(getattr(client.transport, "_session")), "close") as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +def test_client_ctx(): + transports = [ + 'rest', + 'grpc', + ] + for transport in transports: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport + ) + # Test client calls underlying transport. + with mock.patch.object(type(client.transport), "close") as close: + close.assert_not_called() + with client: + pass + close.assert_called() + +@pytest.mark.parametrize("client_class,transport_class", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport), +]) +def test_api_key_credentials(client_class, transport_class): + with mock.patch.object( + google.auth._default, "get_api_key_credentials", create=True + ) as get_api_key_credentials: + mock_cred = mock.Mock() + get_api_key_credentials.return_value = mock_cred + options = client_options.ClientOptions() + options.api_key = "api_key" + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options) + patched.assert_called_once_with( + credentials=mock_cred, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech_long_audio_synthesize.py b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech_long_audio_synthesize.py new file mode 100644 index 000000000000..4a96f10d7cca --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech_long_audio_synthesize.py @@ -0,0 +1,2433 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 +# try/except added for compatibility with python < 3.8 +try: + from unittest import mock + from unittest.mock import AsyncMock # pragma: NO COVER +except ImportError: # pragma: NO COVER + import mock + +import grpc +from grpc.experimental import aio +from collections.abc import Iterable, AsyncIterable +from google.protobuf import json_format +import json +import math +import pytest +from google.api_core import api_core_version +from proto.marshal.rules.dates import DurationRule, TimestampRule +from proto.marshal.rules import wrappers +from requests import Response +from requests import Request, PreparedRequest +from requests.sessions import Session +from google.protobuf import json_format + +try: + from google.auth.aio import credentials as ga_credentials_async + HAS_GOOGLE_AUTH_AIO = True +except ImportError: # pragma: NO COVER + HAS_GOOGLE_AUTH_AIO = False + +from google.api_core import client_options +from google.api_core import exceptions as core_exceptions +from google.api_core import future +from google.api_core import gapic_v1 +from google.api_core import grpc_helpers +from google.api_core import grpc_helpers_async +from google.api_core import operation +from google.api_core import operation_async # type: ignore +from google.api_core import operations_v1 +from google.api_core import path_template +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials +from google.auth.exceptions import MutualTLSChannelError +from google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeAsyncClient +from google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeClient +from google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize import transports +from google.cloud.texttospeech_v1.types import cloud_tts +from google.cloud.texttospeech_v1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore +from google.oauth2 import service_account +import google.auth + + +async def mock_async_gen(data, chunk_size=1): + for i in range(0, len(data)): # pragma: NO COVER + chunk = data[i : i + chunk_size] + yield chunk.encode("utf-8") + +def client_cert_source_callback(): + return b"cert bytes", b"key bytes" + +# TODO: use async auth anon credentials by default once the minimum version of google-auth is upgraded. +# See related issue: https://github.com/googleapis/gapic-generator-python/issues/2107. +def async_anonymous_credentials(): + if HAS_GOOGLE_AUTH_AIO: + return ga_credentials_async.AnonymousCredentials() + return ga_credentials.AnonymousCredentials() + +# If default endpoint is localhost, then default mtls endpoint will be the same. +# This method modifies the default endpoint so the client can produce a different +# mtls endpoint for endpoint testing purposes. +def modify_default_endpoint(client): + return "foo.googleapis.com" if ("localhost" in client.DEFAULT_ENDPOINT) else client.DEFAULT_ENDPOINT + +# If default endpoint template is localhost, then default mtls endpoint will be the same. +# This method modifies the default endpoint template so the client can produce a different +# mtls endpoint for endpoint testing purposes. +def modify_default_endpoint_template(client): + return "test.{UNIVERSE_DOMAIN}" if ("localhost" in client._DEFAULT_ENDPOINT_TEMPLATE) else client._DEFAULT_ENDPOINT_TEMPLATE + + +def test__get_default_mtls_endpoint(): + api_endpoint = "example.googleapis.com" + api_mtls_endpoint = "example.mtls.googleapis.com" + sandbox_endpoint = "example.sandbox.googleapis.com" + sandbox_mtls_endpoint = "example.mtls.sandbox.googleapis.com" + non_googleapi = "api.example.com" + + assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(None) is None + assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(api_endpoint) == api_mtls_endpoint + assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(api_mtls_endpoint) == api_mtls_endpoint + assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(sandbox_endpoint) == sandbox_mtls_endpoint + assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(sandbox_mtls_endpoint) == sandbox_mtls_endpoint + assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(non_googleapi) == non_googleapi + +def test__read_environment_variables(): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (True, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): + with pytest.raises(ValueError) as excinfo: + TextToSpeechLongAudioSynthesizeClient._read_environment_variables() + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "never", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "always", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + TextToSpeechLongAudioSynthesizeClient._read_environment_variables() + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + + with mock.patch.dict(os.environ, {"GOOGLE_CLOUD_UNIVERSE_DOMAIN": "foo.com"}): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", "foo.com") + +def test__get_client_cert_source(): + mock_provided_cert_source = mock.Mock() + mock_default_cert_source = mock.Mock() + + assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(None, False) is None + assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(mock_provided_cert_source, False) is None + assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(mock_provided_cert_source, True) == mock_provided_cert_source + + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): + with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_default_cert_source): + assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(None, True) is mock_default_cert_source + assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(mock_provided_cert_source, "true") is mock_provided_cert_source + +@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) +@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) +def test__get_api_endpoint(): + api_override = "foo.com" + mock_client_cert_source = mock.Mock() + default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + default_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) + mock_universe = "bar.com" + mock_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) + + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(api_override, mock_client_cert_source, default_universe, "always") == api_override + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "auto") == TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, default_universe, "auto") == default_endpoint + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, default_universe, "always") == TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "always") == TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, mock_universe, "never") == mock_endpoint + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, default_universe, "never") == default_endpoint + + with pytest.raises(MutualTLSChannelError) as excinfo: + TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, mock_client_cert_source, mock_universe, "auto") + assert str(excinfo.value) == "mTLS is not supported in any universe other than googleapis.com." + + +def test__get_universe_domain(): + client_universe_domain = "foo.com" + universe_domain_env = "bar.com" + + assert TextToSpeechLongAudioSynthesizeClient._get_universe_domain(client_universe_domain, universe_domain_env) == client_universe_domain + assert TextToSpeechLongAudioSynthesizeClient._get_universe_domain(None, universe_domain_env) == universe_domain_env + assert TextToSpeechLongAudioSynthesizeClient._get_universe_domain(None, None) == TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + + with pytest.raises(ValueError) as excinfo: + TextToSpeechLongAudioSynthesizeClient._get_universe_domain("", None) + assert str(excinfo.value) == "Universe Domain cannot be an empty string." + +@pytest.mark.parametrize("client_class,transport_class,transport_name", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), +]) +def test__validate_universe_domain(client_class, transport_class, transport_name): + client = client_class( + transport=transport_class( + credentials=ga_credentials.AnonymousCredentials() + ) + ) + assert client._validate_universe_domain() == True + + # Test the case when universe is already validated. + assert client._validate_universe_domain() == True + + if transport_name == "grpc": + # Test the case where credentials are provided by the + # `local_channel_credentials`. The default universes in both match. + channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) + client = client_class(transport=transport_class(channel=channel)) + assert client._validate_universe_domain() == True + + # Test the case where credentials do not exist: e.g. a transport is provided + # with no credentials. Validation should still succeed because there is no + # mismatch with non-existent credentials. + channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) + transport=transport_class(channel=channel) + transport._credentials = None + client = client_class(transport=transport) + assert client._validate_universe_domain() == True + + # TODO: This is needed to cater for older versions of google-auth + # Make this test unconditional once the minimum supported version of + # google-auth becomes 2.23.0 or higher. + google_auth_major, google_auth_minor = [int(part) for part in google.auth.__version__.split(".")[0:2]] + if google_auth_major > 2 or (google_auth_major == 2 and google_auth_minor >= 23): + credentials = ga_credentials.AnonymousCredentials() + credentials._universe_domain = "foo.com" + # Test the case when there is a universe mismatch from the credentials. + client = client_class( + transport=transport_class(credentials=credentials) + ) + with pytest.raises(ValueError) as excinfo: + client._validate_universe_domain() + assert str(excinfo.value) == "The configured universe domain (googleapis.com) does not match the universe domain found in the credentials (foo.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." + + # Test the case when there is a universe mismatch from the client. + # + # TODO: Make this test unconditional once the minimum supported version of + # google-api-core becomes 2.15.0 or higher. + api_core_major, api_core_minor = [int(part) for part in api_core_version.__version__.split(".")[0:2]] + if api_core_major > 2 or (api_core_major == 2 and api_core_minor >= 15): + client = client_class(client_options={"universe_domain": "bar.com"}, transport=transport_class(credentials=ga_credentials.AnonymousCredentials(),)) + with pytest.raises(ValueError) as excinfo: + client._validate_universe_domain() + assert str(excinfo.value) == "The configured universe domain (bar.com) does not match the universe domain found in the credentials (googleapis.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." + + # Test that ValueError is raised if universe_domain is provided via client options and credentials is None + with pytest.raises(ValueError): + client._compare_universes("foo.bar", None) + + +@pytest.mark.parametrize("client_class,transport_name", [ + (TextToSpeechLongAudioSynthesizeClient, "grpc"), + (TextToSpeechLongAudioSynthesizeAsyncClient, "grpc_asyncio"), + (TextToSpeechLongAudioSynthesizeClient, "rest"), +]) +def test_text_to_speech_long_audio_synthesize_client_from_service_account_info(client_class, transport_name): + creds = ga_credentials.AnonymousCredentials() + with mock.patch.object(service_account.Credentials, 'from_service_account_info') as factory: + factory.return_value = creds + info = {"valid": True} + client = client_class.from_service_account_info(info, transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + assert client.transport._host == ( + 'texttospeech.googleapis.com:443' + if transport_name in ['grpc', 'grpc_asyncio'] + else + 'https://texttospeech.googleapis.com' + ) + + +@pytest.mark.parametrize("transport_class,transport_name", [ + (transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), + (transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio"), + (transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), +]) +def test_text_to_speech_long_audio_synthesize_client_service_account_always_use_jwt(transport_class, transport_name): + with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=True) + use_jwt.assert_called_once_with(True) + + with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=False) + use_jwt.assert_not_called() + + +@pytest.mark.parametrize("client_class,transport_name", [ + (TextToSpeechLongAudioSynthesizeClient, "grpc"), + (TextToSpeechLongAudioSynthesizeAsyncClient, "grpc_asyncio"), + (TextToSpeechLongAudioSynthesizeClient, "rest"), +]) +def test_text_to_speech_long_audio_synthesize_client_from_service_account_file(client_class, transport_name): + creds = ga_credentials.AnonymousCredentials() + with mock.patch.object(service_account.Credentials, 'from_service_account_file') as factory: + factory.return_value = creds + client = client_class.from_service_account_file("dummy/file/path.json", transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + client = client_class.from_service_account_json("dummy/file/path.json", transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + assert client.transport._host == ( + 'texttospeech.googleapis.com:443' + if transport_name in ['grpc', 'grpc_asyncio'] + else + 'https://texttospeech.googleapis.com' + ) + + +def test_text_to_speech_long_audio_synthesize_client_get_transport_class(): + transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class() + available_transports = [ + transports.TextToSpeechLongAudioSynthesizeGrpcTransport, + transports.TextToSpeechLongAudioSynthesizeRestTransport, + ] + assert transport in available_transports + + transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class("grpc") + assert transport == transports.TextToSpeechLongAudioSynthesizeGrpcTransport + + +@pytest.mark.parametrize("client_class,transport_class,transport_name", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio"), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), +]) +@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) +@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) +def test_text_to_speech_long_audio_synthesize_client_client_options(client_class, transport_class, transport_name): + # Check that if channel is provided we won't create a new one. + with mock.patch.object(TextToSpeechLongAudioSynthesizeClient, 'get_transport_class') as gtc: + transport = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ) + client = client_class(transport=transport) + gtc.assert_not_called() + + # Check that if channel is provided via str we will create a new one. + with mock.patch.object(TextToSpeechLongAudioSynthesizeClient, 'get_transport_class') as gtc: + client = client_class(transport=transport_name) + gtc.assert_called() + + # Check the case api_endpoint is provided. + options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(transport=transport_name, client_options=options) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host="squid.clam.whelk", + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is + # "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is + # "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client.DEFAULT_MTLS_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has + # unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + client = client_class(transport=transport_name) + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + + # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): + with pytest.raises(ValueError) as excinfo: + client = client_class(transport=transport_name) + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + + # Check the case quota_project_id is provided + options = client_options.ClientOptions(quota_project_id="octopus") + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id="octopus", + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + # Check the case api_endpoint is provided + options = client_options.ClientOptions(api_audience="https://language.googleapis.com") + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience="https://language.googleapis.com" + ) + +@pytest.mark.parametrize("client_class,transport_class,transport_name,use_client_cert_env", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", "true"), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", "true"), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", "false"), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", "false"), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest", "true"), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest", "false"), +]) +@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) +@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) +@mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}) +def test_text_to_speech_long_audio_synthesize_client_mtls_env_auto(client_class, transport_class, transport_name, use_client_cert_env): + # This tests the endpoint autoswitch behavior. Endpoint is autoswitched to the default + # mtls endpoint, if GOOGLE_API_USE_CLIENT_CERTIFICATE is "true" and client cert exists. + + # Check the case client_cert_source is provided. Whether client cert is used depends on + # GOOGLE_API_USE_CLIENT_CERTIFICATE value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): + options = client_options.ClientOptions(client_cert_source=client_cert_source_callback) + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + + if use_client_cert_env == "false": + expected_client_cert_source = None + expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) + else: + expected_client_cert_source = client_cert_source_callback + expected_host = client.DEFAULT_MTLS_ENDPOINT + + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=expected_host, + scopes=None, + client_cert_source_for_mtls=expected_client_cert_source, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case ADC client cert is provided. Whether client cert is used depends on + # GOOGLE_API_USE_CLIENT_CERTIFICATE value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): + with mock.patch.object(transport_class, '__init__') as patched: + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): + with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=client_cert_source_callback): + if use_client_cert_env == "false": + expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) + expected_client_cert_source = None + else: + expected_host = client.DEFAULT_MTLS_ENDPOINT + expected_client_cert_source = client_cert_source_callback + + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=expected_host, + scopes=None, + client_cert_source_for_mtls=expected_client_cert_source, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case client_cert_source and ADC client cert are not provided. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): + with mock.patch.object(transport_class, '__init__') as patched: + with mock.patch("google.auth.transport.mtls.has_default_client_cert_source", return_value=False): + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize("client_class", [ + TextToSpeechLongAudioSynthesizeClient, TextToSpeechLongAudioSynthesizeAsyncClient +]) +@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechLongAudioSynthesizeClient)) +@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechLongAudioSynthesizeAsyncClient)) +def test_text_to_speech_long_audio_synthesize_client_get_mtls_endpoint_and_cert_source(client_class): + mock_client_cert_source = mock.Mock() + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "true". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + mock_api_endpoint = "foo" + options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) + assert api_endpoint == mock_api_endpoint + assert cert_source == mock_client_cert_source + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "false". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): + mock_client_cert_source = mock.Mock() + mock_api_endpoint = "foo" + options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) + assert api_endpoint == mock_api_endpoint + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert doesn't exist. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=False): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert exists. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): + with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_client_cert_source): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source == mock_client_cert_source + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has + # unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + client_class.get_mtls_endpoint_and_cert_source() + + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + + # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): + with pytest.raises(ValueError) as excinfo: + client_class.get_mtls_endpoint_and_cert_source() + + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + +@pytest.mark.parametrize("client_class", [ + TextToSpeechLongAudioSynthesizeClient, TextToSpeechLongAudioSynthesizeAsyncClient +]) +@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) +@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) +def test_text_to_speech_long_audio_synthesize_client_client_api_endpoint(client_class): + mock_client_cert_source = client_cert_source_callback + api_override = "foo.com" + default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + default_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) + mock_universe = "bar.com" + mock_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) + + # If ClientOptions.api_endpoint is set and GOOGLE_API_USE_CLIENT_CERTIFICATE="true", + # use ClientOptions.api_endpoint as the api endpoint regardless. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel"): + options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=api_override) + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == api_override + + # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="never", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + client = client_class(credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == default_endpoint + + # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="always", + # use the DEFAULT_MTLS_ENDPOINT as the api endpoint. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + client = client_class(credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + + # If ClientOptions.api_endpoint is not set, GOOGLE_API_USE_MTLS_ENDPOINT="auto" (default), + # GOOGLE_API_USE_CLIENT_CERTIFICATE="false" (default), default cert source doesn't exist, + # and ClientOptions.universe_domain="bar.com", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with universe domain as the api endpoint. + options = client_options.ClientOptions() + universe_exists = hasattr(options, "universe_domain") + if universe_exists: + options = client_options.ClientOptions(universe_domain=mock_universe) + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + else: + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == (mock_endpoint if universe_exists else default_endpoint) + assert client.universe_domain == (mock_universe if universe_exists else default_universe) + + # If ClientOptions does not have a universe domain attribute and GOOGLE_API_USE_MTLS_ENDPOINT="never", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. + options = client_options.ClientOptions() + if hasattr(options, "universe_domain"): + delattr(options, "universe_domain") + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == default_endpoint + + +@pytest.mark.parametrize("client_class,transport_class,transport_name", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio"), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), +]) +def test_text_to_speech_long_audio_synthesize_client_client_options_scopes(client_class, transport_class, transport_name): + # Check the case scopes are provided. + options = client_options.ClientOptions( + scopes=["1", "2"], + ) + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=["1", "2"], + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + +@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", grpc_helpers), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest", None), +]) +def test_text_to_speech_long_audio_synthesize_client_client_options_credentials_file(client_class, transport_class, transport_name, grpc_helpers): + # Check the case credentials file is provided. + options = client_options.ClientOptions( + credentials_file="credentials.json" + ) + + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file="credentials.json", + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + +def test_text_to_speech_long_audio_synthesize_client_client_options_from_dict(): + with mock.patch('google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeGrpcTransport.__init__') as grpc_transport: + grpc_transport.return_value = None + client = TextToSpeechLongAudioSynthesizeClient( + client_options={'api_endpoint': 'squid.clam.whelk'} + ) + grpc_transport.assert_called_once_with( + credentials=None, + credentials_file=None, + host="squid.clam.whelk", + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", grpc_helpers), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), +]) +def test_text_to_speech_long_audio_synthesize_client_create_channel_credentials_file(client_class, transport_class, transport_name, grpc_helpers): + # Check the case credentials file is provided. + options = client_options.ClientOptions( + credentials_file="credentials.json" + ) + + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file="credentials.json", + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # test that the credentials from file are saved and used as the credentials. + with mock.patch.object( + google.auth, "load_credentials_from_file", autospec=True + ) as load_creds, mock.patch.object( + google.auth, "default", autospec=True + ) as adc, mock.patch.object( + grpc_helpers, "create_channel" + ) as create_channel: + creds = ga_credentials.AnonymousCredentials() + file_creds = ga_credentials.AnonymousCredentials() + load_creds.return_value = (file_creds, None) + adc.return_value = (creds, None) + client = client_class(client_options=options, transport=transport_name) + create_channel.assert_called_with( + "texttospeech.googleapis.com:443", + credentials=file_creds, + credentials_file=None, + quota_project_id=None, + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + scopes=None, + default_host="texttospeech.googleapis.com", + ssl_credentials=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts_lrs.SynthesizeLongAudioRequest, + dict, +]) +def test_synthesize_long_audio(request_type, transport: str = 'grpc'): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation(name='operations/spam') + response = client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = cloud_tts_lrs.SynthesizeLongAudioRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, future.Future) + + +def test_synthesize_long_audio_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='grpc', + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = cloud_tts_lrs.SynthesizeLongAudioRequest( + parent='parent_value', + output_gcs_uri='output_gcs_uri_value', + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + call.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client.synthesize_long_audio(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == cloud_tts_lrs.SynthesizeLongAudioRequest( + parent='parent_value', + output_gcs_uri='output_gcs_uri_value', + ) + +def test_synthesize_long_audio_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.synthesize_long_audio in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.synthesize_long_audio] = mock_rpc + request = {} + client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + # Operation methods call wrapper_fn to build a cached + # client._transport.operations_client instance on first rpc call. + # Subsequent calls should use the cached wrapper + wrapper_fn.reset_mock() + + client.synthesize_long_audio(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_synthesize_long_audio_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._client._transport.synthesize_long_audio in client._client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[client._client._transport.synthesize_long_audio] = mock_rpc + + request = {} + await client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + # Operation methods call wrapper_fn to build a cached + # client._transport.operations_client instance on first rpc call. + # Subsequent calls should use the cached wrapper + wrapper_fn.reset_mock() + + await client.synthesize_long_audio(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_synthesize_long_audio_async(transport: str = 'grpc_asyncio', request_type=cloud_tts_lrs.SynthesizeLongAudioRequest): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation(name='operations/spam') + ) + response = await client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = cloud_tts_lrs.SynthesizeLongAudioRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, future.Future) + + +@pytest.mark.asyncio +async def test_synthesize_long_audio_async_from_dict(): + await test_synthesize_long_audio_async(request_type=dict) + +def test_synthesize_long_audio_field_headers(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = cloud_tts_lrs.SynthesizeLongAudioRequest() + + request.parent = 'parent_value' + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + call.return_value = operations_pb2.Operation(name='operations/op') + client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ( + 'x-goog-request-params', + 'parent=parent_value', + ) in kw['metadata'] + + +@pytest.mark.asyncio +async def test_synthesize_long_audio_field_headers_async(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = cloud_tts_lrs.SynthesizeLongAudioRequest() + + request.parent = 'parent_value' + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(operations_pb2.Operation(name='operations/op')) + await client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ( + 'x-goog-request-params', + 'parent=parent_value', + ) in kw['metadata'] + + +def test_synthesize_long_audio_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.synthesize_long_audio in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.synthesize_long_audio] = mock_rpc + + request = {} + client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + # Operation methods build a cached wrapper on first rpc call + # subsequent calls should use the cached wrapper + wrapper_fn.reset_mock() + + client.synthesize_long_audio(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_synthesize_long_audio_rest_required_fields(request_type=cloud_tts_lrs.SynthesizeLongAudioRequest): + transport_class = transports.TextToSpeechLongAudioSynthesizeRestTransport + + request_init = {} + request_init["output_gcs_uri"] = "" + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads(json_format.MessageToJson( + pb_request, + use_integers_for_enums=False + )) + + # verify fields with default values are dropped + + unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_long_audio._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + jsonified_request["outputGcsUri"] = 'output_gcs_uri_value' + + unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_long_audio._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + assert "outputGcsUri" in jsonified_request + assert jsonified_request["outputGcsUri"] == 'output_gcs_uri_value' + + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='rest', + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = operations_pb2.Operation(name='operations/spam') + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, 'request') as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, 'transcode') as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + 'uri': 'v1/sample_method', + 'method': "post", + 'query_params': pb_request, + } + transcode_result['body'] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode('UTF-8') + req.return_value = response_value + + response = client.synthesize_long_audio(request) + + expected_params = [ + ] + actual_params = req.call_args.kwargs['params'] + assert expected_params == actual_params + + +def test_synthesize_long_audio_rest_unset_required_fields(): + transport = transports.TextToSpeechLongAudioSynthesizeRestTransport(credentials=ga_credentials.AnonymousCredentials) + + unset_fields = transport.synthesize_long_audio._get_unset_required_fields({}) + assert set(unset_fields) == (set(()) & set(("input", "audioConfig", "outputGcsUri", "voice", ))) + + +def test_credentials_transport_error(): + # It is an error to provide credentials and a transport instance. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # It is an error to provide a credentials file and a transport instance. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = TextToSpeechLongAudioSynthesizeClient( + client_options={"credentials_file": "credentials.json"}, + transport=transport, + ) + + # It is an error to provide an api_key and a transport instance. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + options = client_options.ClientOptions() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = TextToSpeechLongAudioSynthesizeClient( + client_options=options, + transport=transport, + ) + + # It is an error to provide an api_key and a credential. + options = client_options.ClientOptions() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = TextToSpeechLongAudioSynthesizeClient( + client_options=options, + credentials=ga_credentials.AnonymousCredentials() + ) + + # It is an error to provide scopes and a transport instance. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = TextToSpeechLongAudioSynthesizeClient( + client_options={"scopes": ["1", "2"]}, + transport=transport, + ) + + +def test_transport_instance(): + # A client may be instantiated with a custom transport instance. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + client = TextToSpeechLongAudioSynthesizeClient(transport=transport) + assert client.transport is transport + +def test_transport_get_channel(): + # A client may be instantiated with a custom transport instance. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + channel = transport.grpc_channel + assert channel + + transport = transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + channel = transport.grpc_channel + assert channel + +@pytest.mark.parametrize("transport_class", [ + transports.TextToSpeechLongAudioSynthesizeGrpcTransport, + transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, + transports.TextToSpeechLongAudioSynthesizeRestTransport, +]) +def test_transport_adc(transport_class): + # Test default credentials are used if not provided. + with mock.patch.object(google.auth, 'default') as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport_class() + adc.assert_called_once() + +def test_transport_kind_grpc(): + transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class("grpc")( + credentials=ga_credentials.AnonymousCredentials() + ) + assert transport.kind == "grpc" + + +def test_initialize_client_w_grpc(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_synthesize_long_audio_empty_call_grpc(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + call.return_value = operations_pb2.Operation(name='operations/op') + client.synthesize_long_audio(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts_lrs.SynthesizeLongAudioRequest() + + assert args[0] == request_msg + + +def test_transport_kind_grpc_asyncio(): + transport = TextToSpeechLongAudioSynthesizeAsyncClient.get_transport_class("grpc_asyncio")( + credentials=async_anonymous_credentials() + ) + assert transport.kind == "grpc_asyncio" + + +def test_initialize_client_w_grpc_asyncio(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_synthesize_long_audio_empty_call_grpc_asyncio(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation(name='operations/spam') + ) + await client.synthesize_long_audio(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts_lrs.SynthesizeLongAudioRequest() + + assert args[0] == request_msg + + +def test_transport_kind_rest(): + transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class("rest")( + credentials=ga_credentials.AnonymousCredentials() + ) + assert transport.kind == "rest" + + +def test_synthesize_long_audio_rest_bad_request(request_type=cloud_tts_lrs.SynthesizeLongAudioRequest): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {'parent': 'projects/sample1/locations/sample2'} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + client.synthesize_long_audio(request) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts_lrs.SynthesizeLongAudioRequest, + dict, +]) +def test_synthesize_long_audio_rest_call_success(request_type): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {'parent': 'projects/sample1/locations/sample2'} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), 'request') as req: + # Designate an appropriate value for the returned response. + return_value = operations_pb2.Operation(name='operations/spam') + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + req.return_value = response_value + response = client.synthesize_long_audio(request) + + # Establish that the response is the type that we expect. + json_return_value = json_format.MessageToJson(return_value) + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_synthesize_long_audio_rest_interceptors(null_interceptor): + transport = transports.TextToSpeechLongAudioSynthesizeRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None if null_interceptor else transports.TextToSpeechLongAudioSynthesizeRestInterceptor(), + ) + client = TextToSpeechLongAudioSynthesizeClient(transport=transport) + + with mock.patch.object(type(client.transport._session), "request") as req, \ + mock.patch.object(path_template, "transcode") as transcode, \ + mock.patch.object(operation.Operation, "_set_result_from_operation"), \ + mock.patch.object(transports.TextToSpeechLongAudioSynthesizeRestInterceptor, "post_synthesize_long_audio") as post, \ + mock.patch.object(transports.TextToSpeechLongAudioSynthesizeRestInterceptor, "pre_synthesize_long_audio") as pre: + pre.assert_not_called() + post.assert_not_called() + pb_message = cloud_tts_lrs.SynthesizeLongAudioRequest.pb(cloud_tts_lrs.SynthesizeLongAudioRequest()) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + return_value = json_format.MessageToJson(operations_pb2.Operation()) + req.return_value.content = return_value + + request = cloud_tts_lrs.SynthesizeLongAudioRequest() + metadata =[ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = operations_pb2.Operation() + + client.synthesize_long_audio(request, metadata=[("key", "val"), ("cephalopod", "squid"),]) + + pre.assert_called_once() + post.assert_called_once() + + +def test_get_operation_rest_bad_request(request_type=operations_pb2.GetOperationRequest): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type() + request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2/operations/sample3'}, request) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = Response() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = Request() + req.return_value = response_value + client.get_operation(request) + + +@pytest.mark.parametrize("request_type", [ + operations_pb2.GetOperationRequest, + dict, +]) +def test_get_operation_rest(request_type): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + request_init = {'name': 'projects/sample1/locations/sample2/operations/sample3'} + request = request_type(**request_init) + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, 'request') as req: + # Designate an appropriate value for the returned response. + return_value = operations_pb2.Operation() + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + + req.return_value = response_value + + response = client.get_operation(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.Operation) + + +def test_list_operations_rest_bad_request(request_type=operations_pb2.ListOperationsRequest): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type() + request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2'}, request) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = Response() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = Request() + req.return_value = response_value + client.list_operations(request) + + +@pytest.mark.parametrize("request_type", [ + operations_pb2.ListOperationsRequest, + dict, +]) +def test_list_operations_rest(request_type): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + request_init = {'name': 'projects/sample1/locations/sample2'} + request = request_type(**request_init) + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, 'request') as req: + # Designate an appropriate value for the returned response. + return_value = operations_pb2.ListOperationsResponse() + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + + req.return_value = response_value + + response = client.list_operations(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.ListOperationsResponse) + +def test_initialize_client_w_rest(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_synthesize_long_audio_empty_call_rest(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + client.synthesize_long_audio(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts_lrs.SynthesizeLongAudioRequest() + + assert args[0] == request_msg + + +def test_text_to_speech_long_audio_synthesize_rest_lro_client(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + transport = client.transport + + # Ensure that we have an api-core operations client. + assert isinstance( + transport.operations_client, +operations_v1.AbstractOperationsClient, + ) + + # Ensure that subsequent calls to the property send the exact same object. + assert transport.operations_client is transport.operations_client + +def test_transport_grpc_default(): + # A client should use the gRPC transport by default. + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + assert isinstance( + client.transport, + transports.TextToSpeechLongAudioSynthesizeGrpcTransport, + ) + +def test_text_to_speech_long_audio_synthesize_base_transport_error(): + # Passing both a credentials object and credentials_file should raise an error + with pytest.raises(core_exceptions.DuplicateCredentialArgs): + transport = transports.TextToSpeechLongAudioSynthesizeTransport( + credentials=ga_credentials.AnonymousCredentials(), + credentials_file="credentials.json" + ) + + +def test_text_to_speech_long_audio_synthesize_base_transport(): + # Instantiate the base transport. + with mock.patch('google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeTransport.__init__') as Transport: + Transport.return_value = None + transport = transports.TextToSpeechLongAudioSynthesizeTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Every method on the transport should just blindly + # raise NotImplementedError. + methods = ( + 'synthesize_long_audio', + 'get_operation', + 'list_operations', + ) + for method in methods: + with pytest.raises(NotImplementedError): + getattr(transport, method)(request=object()) + + with pytest.raises(NotImplementedError): + transport.close() + + # Additionally, the LRO client (a property) should + # also raise NotImplementedError + with pytest.raises(NotImplementedError): + transport.operations_client + + # Catch all for all remaining methods and properties + remainder = [ + 'kind', + ] + for r in remainder: + with pytest.raises(NotImplementedError): + getattr(transport, r)() + + +def test_text_to_speech_long_audio_synthesize_base_transport_with_credentials_file(): + # Instantiate the base transport with a credentials file + with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeTransport._prep_wrapped_messages') as Transport: + Transport.return_value = None + load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) + transport = transports.TextToSpeechLongAudioSynthesizeTransport( + credentials_file="credentials.json", + quota_project_id="octopus", + ) + load_creds.assert_called_once_with("credentials.json", + scopes=None, + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + quota_project_id="octopus", + ) + + +def test_text_to_speech_long_audio_synthesize_base_transport_with_adc(): + # Test the default credentials are used if credentials and credentials_file are None. + with mock.patch.object(google.auth, 'default', autospec=True) as adc, mock.patch('google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeTransport._prep_wrapped_messages') as Transport: + Transport.return_value = None + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport = transports.TextToSpeechLongAudioSynthesizeTransport() + adc.assert_called_once() + + +def test_text_to_speech_long_audio_synthesize_auth_adc(): + # If no credentials are provided, we should use ADC credentials. + with mock.patch.object(google.auth, 'default', autospec=True) as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + TextToSpeechLongAudioSynthesizeClient() + adc.assert_called_once_with( + scopes=None, + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + quota_project_id=None, + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.TextToSpeechLongAudioSynthesizeGrpcTransport, + transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, + ], +) +def test_text_to_speech_long_audio_synthesize_transport_auth_adc(transport_class): + # If credentials and host are not provided, the transport class should use + # ADC credentials. + with mock.patch.object(google.auth, 'default', autospec=True) as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport_class(quota_project_id="octopus", scopes=["1", "2"]) + adc.assert_called_once_with( + scopes=["1", "2"], + default_scopes=( 'https://www.googleapis.com/auth/cloud-platform',), + quota_project_id="octopus", + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.TextToSpeechLongAudioSynthesizeGrpcTransport, + transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, + transports.TextToSpeechLongAudioSynthesizeRestTransport, + ], +) +def test_text_to_speech_long_audio_synthesize_transport_auth_gdch_credentials(transport_class): + host = 'https://language.com' + api_audience_tests = [None, 'https://language2.com'] + api_audience_expect = [host, 'https://language2.com'] + for t, e in zip(api_audience_tests, api_audience_expect): + with mock.patch.object(google.auth, 'default', autospec=True) as adc: + gdch_mock = mock.MagicMock() + type(gdch_mock).with_gdch_audience = mock.PropertyMock(return_value=gdch_mock) + adc.return_value = (gdch_mock, None) + transport_class(host=host, api_audience=t) + gdch_mock.with_gdch_audience.assert_called_once_with( + e + ) + + +@pytest.mark.parametrize( + "transport_class,grpc_helpers", + [ + (transports.TextToSpeechLongAudioSynthesizeGrpcTransport, grpc_helpers), + (transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, grpc_helpers_async) + ], +) +def test_text_to_speech_long_audio_synthesize_transport_create_channel(transport_class, grpc_helpers): + # If credentials and host are not provided, the transport class should use + # ADC credentials. + with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch.object( + grpc_helpers, "create_channel", autospec=True + ) as create_channel: + creds = ga_credentials.AnonymousCredentials() + adc.return_value = (creds, None) + transport_class( + quota_project_id="octopus", + scopes=["1", "2"] + ) + + create_channel.assert_called_with( + "texttospeech.googleapis.com:443", + credentials=creds, + credentials_file=None, + quota_project_id="octopus", + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + scopes=["1", "2"], + default_host="texttospeech.googleapis.com", + ssl_credentials=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + +@pytest.mark.parametrize("transport_class", [transports.TextToSpeechLongAudioSynthesizeGrpcTransport, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport]) +def test_text_to_speech_long_audio_synthesize_grpc_transport_client_cert_source_for_mtls( + transport_class +): + cred = ga_credentials.AnonymousCredentials() + + # Check ssl_channel_credentials is used if provided. + with mock.patch.object(transport_class, "create_channel") as mock_create_channel: + mock_ssl_channel_creds = mock.Mock() + transport_class( + host="squid.clam.whelk", + credentials=cred, + ssl_channel_credentials=mock_ssl_channel_creds + ) + mock_create_channel.assert_called_once_with( + "squid.clam.whelk:443", + credentials=cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_channel_creds, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls + # is used. + with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()): + with mock.patch("grpc.ssl_channel_credentials") as mock_ssl_cred: + transport_class( + credentials=cred, + client_cert_source_for_mtls=client_cert_source_callback + ) + expected_cert, expected_key = client_cert_source_callback() + mock_ssl_cred.assert_called_once_with( + certificate_chain=expected_cert, + private_key=expected_key + ) + +def test_text_to_speech_long_audio_synthesize_http_transport_client_cert_source_for_mtls(): + cred = ga_credentials.AnonymousCredentials() + with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel") as mock_configure_mtls_channel: + transports.TextToSpeechLongAudioSynthesizeRestTransport ( + credentials=cred, + client_cert_source_for_mtls=client_cert_source_callback + ) + mock_configure_mtls_channel.assert_called_once_with(client_cert_source_callback) + + +@pytest.mark.parametrize("transport_name", [ + "grpc", + "grpc_asyncio", + "rest", +]) +def test_text_to_speech_long_audio_synthesize_host_no_port(transport_name): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com'), + transport=transport_name, + ) + assert client.transport._host == ( + 'texttospeech.googleapis.com:443' + if transport_name in ['grpc', 'grpc_asyncio'] + else 'https://texttospeech.googleapis.com' + ) + +@pytest.mark.parametrize("transport_name", [ + "grpc", + "grpc_asyncio", + "rest", +]) +def test_text_to_speech_long_audio_synthesize_host_with_port(transport_name): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com:8000'), + transport=transport_name, + ) + assert client.transport._host == ( + 'texttospeech.googleapis.com:8000' + if transport_name in ['grpc', 'grpc_asyncio'] + else 'https://texttospeech.googleapis.com:8000' + ) + +@pytest.mark.parametrize("transport_name", [ + "rest", +]) +def test_text_to_speech_long_audio_synthesize_client_transport_session_collision(transport_name): + creds1 = ga_credentials.AnonymousCredentials() + creds2 = ga_credentials.AnonymousCredentials() + client1 = TextToSpeechLongAudioSynthesizeClient( + credentials=creds1, + transport=transport_name, + ) + client2 = TextToSpeechLongAudioSynthesizeClient( + credentials=creds2, + transport=transport_name, + ) + session1 = client1.transport.synthesize_long_audio._session + session2 = client2.transport.synthesize_long_audio._session + assert session1 != session2 +def test_text_to_speech_long_audio_synthesize_grpc_transport_channel(): + channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) + + # Check that channel is used if provided. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + host="squid.clam.whelk", + channel=channel, + ) + assert transport.grpc_channel == channel + assert transport._host == "squid.clam.whelk:443" + assert transport._ssl_channel_credentials == None + + +def test_text_to_speech_long_audio_synthesize_grpc_asyncio_transport_channel(): + channel = aio.secure_channel('http://localhost/', grpc.local_channel_credentials()) + + # Check that channel is used if provided. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport( + host="squid.clam.whelk", + channel=channel, + ) + assert transport.grpc_channel == channel + assert transport._host == "squid.clam.whelk:443" + assert transport._ssl_channel_credentials == None + + +# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are +# removed from grpc/grpc_asyncio transport constructor. +@pytest.mark.parametrize("transport_class", [transports.TextToSpeechLongAudioSynthesizeGrpcTransport, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport]) +def test_text_to_speech_long_audio_synthesize_transport_channel_mtls_with_client_cert_source( + transport_class +): + with mock.patch("grpc.ssl_channel_credentials", autospec=True) as grpc_ssl_channel_cred: + with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: + mock_ssl_cred = mock.Mock() + grpc_ssl_channel_cred.return_value = mock_ssl_cred + + mock_grpc_channel = mock.Mock() + grpc_create_channel.return_value = mock_grpc_channel + + cred = ga_credentials.AnonymousCredentials() + with pytest.warns(DeprecationWarning): + with mock.patch.object(google.auth, 'default') as adc: + adc.return_value = (cred, None) + transport = transport_class( + host="squid.clam.whelk", + api_mtls_endpoint="mtls.squid.clam.whelk", + client_cert_source=client_cert_source_callback, + ) + adc.assert_called_once() + + grpc_ssl_channel_cred.assert_called_once_with( + certificate_chain=b"cert bytes", private_key=b"key bytes" + ) + grpc_create_channel.assert_called_once_with( + "mtls.squid.clam.whelk:443", + credentials=cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_cred, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + assert transport.grpc_channel == mock_grpc_channel + assert transport._ssl_channel_credentials == mock_ssl_cred + + +# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are +# removed from grpc/grpc_asyncio transport constructor. +@pytest.mark.parametrize("transport_class", [transports.TextToSpeechLongAudioSynthesizeGrpcTransport, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport]) +def test_text_to_speech_long_audio_synthesize_transport_channel_mtls_with_adc( + transport_class +): + mock_ssl_cred = mock.Mock() + with mock.patch.multiple( + "google.auth.transport.grpc.SslCredentials", + __init__=mock.Mock(return_value=None), + ssl_credentials=mock.PropertyMock(return_value=mock_ssl_cred), + ): + with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: + mock_grpc_channel = mock.Mock() + grpc_create_channel.return_value = mock_grpc_channel + mock_cred = mock.Mock() + + with pytest.warns(DeprecationWarning): + transport = transport_class( + host="squid.clam.whelk", + credentials=mock_cred, + api_mtls_endpoint="mtls.squid.clam.whelk", + client_cert_source=None, + ) + + grpc_create_channel.assert_called_once_with( + "mtls.squid.clam.whelk:443", + credentials=mock_cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_cred, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + assert transport.grpc_channel == mock_grpc_channel + + +def test_text_to_speech_long_audio_synthesize_grpc_lro_client(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='grpc', + ) + transport = client.transport + + # Ensure that we have a api-core operations client. + assert isinstance( + transport.operations_client, + operations_v1.OperationsClient, + ) + + # Ensure that subsequent calls to the property send the exact same object. + assert transport.operations_client is transport.operations_client + + +def test_text_to_speech_long_audio_synthesize_grpc_lro_async_client(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='grpc_asyncio', + ) + transport = client.transport + + # Ensure that we have a api-core operations client. + assert isinstance( + transport.operations_client, + operations_v1.OperationsAsyncClient, + ) + + # Ensure that subsequent calls to the property send the exact same object. + assert transport.operations_client is transport.operations_client + + +def test_model_path(): + project = "squid" + location = "clam" + model = "whelk" + expected = "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) + actual = TextToSpeechLongAudioSynthesizeClient.model_path(project, location, model) + assert expected == actual + + +def test_parse_model_path(): + expected = { + "project": "octopus", + "location": "oyster", + "model": "nudibranch", + } + path = TextToSpeechLongAudioSynthesizeClient.model_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechLongAudioSynthesizeClient.parse_model_path(path) + assert expected == actual + +def test_common_billing_account_path(): + billing_account = "cuttlefish" + expected = "billingAccounts/{billing_account}".format(billing_account=billing_account, ) + actual = TextToSpeechLongAudioSynthesizeClient.common_billing_account_path(billing_account) + assert expected == actual + + +def test_parse_common_billing_account_path(): + expected = { + "billing_account": "mussel", + } + path = TextToSpeechLongAudioSynthesizeClient.common_billing_account_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechLongAudioSynthesizeClient.parse_common_billing_account_path(path) + assert expected == actual + +def test_common_folder_path(): + folder = "winkle" + expected = "folders/{folder}".format(folder=folder, ) + actual = TextToSpeechLongAudioSynthesizeClient.common_folder_path(folder) + assert expected == actual + + +def test_parse_common_folder_path(): + expected = { + "folder": "nautilus", + } + path = TextToSpeechLongAudioSynthesizeClient.common_folder_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechLongAudioSynthesizeClient.parse_common_folder_path(path) + assert expected == actual + +def test_common_organization_path(): + organization = "scallop" + expected = "organizations/{organization}".format(organization=organization, ) + actual = TextToSpeechLongAudioSynthesizeClient.common_organization_path(organization) + assert expected == actual + + +def test_parse_common_organization_path(): + expected = { + "organization": "abalone", + } + path = TextToSpeechLongAudioSynthesizeClient.common_organization_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechLongAudioSynthesizeClient.parse_common_organization_path(path) + assert expected == actual + +def test_common_project_path(): + project = "squid" + expected = "projects/{project}".format(project=project, ) + actual = TextToSpeechLongAudioSynthesizeClient.common_project_path(project) + assert expected == actual + + +def test_parse_common_project_path(): + expected = { + "project": "clam", + } + path = TextToSpeechLongAudioSynthesizeClient.common_project_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechLongAudioSynthesizeClient.parse_common_project_path(path) + assert expected == actual + +def test_common_location_path(): + project = "whelk" + location = "octopus" + expected = "projects/{project}/locations/{location}".format(project=project, location=location, ) + actual = TextToSpeechLongAudioSynthesizeClient.common_location_path(project, location) + assert expected == actual + + +def test_parse_common_location_path(): + expected = { + "project": "oyster", + "location": "nudibranch", + } + path = TextToSpeechLongAudioSynthesizeClient.common_location_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechLongAudioSynthesizeClient.parse_common_location_path(path) + assert expected == actual + + +def test_client_with_default_client_info(): + client_info = gapic_v1.client_info.ClientInfo() + + with mock.patch.object(transports.TextToSpeechLongAudioSynthesizeTransport, '_prep_wrapped_messages') as prep: + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, + ) + prep.assert_called_once_with(client_info) + + with mock.patch.object(transports.TextToSpeechLongAudioSynthesizeTransport, '_prep_wrapped_messages') as prep: + transport_class = TextToSpeechLongAudioSynthesizeClient.get_transport_class() + transport = transport_class( + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, + ) + prep.assert_called_once_with(client_info) + + +def test_get_operation(transport: str = "grpc"): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.GetOperationRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation() + response = client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.Operation) +@pytest.mark.asyncio +async def test_get_operation_async(transport: str = "grpc_asyncio"): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.GetOperationRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation() + ) + response = await client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.Operation) + +def test_get_operation_field_headers(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.GetOperationRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + call.return_value = operations_pb2.Operation() + + client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +@pytest.mark.asyncio +async def test_get_operation_field_headers_async(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.GetOperationRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation() + ) + await client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + +def test_get_operation_from_dict(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation() + + response = client.get_operation( + request={ + "name": "locations", + } + ) + call.assert_called() +@pytest.mark.asyncio +async def test_get_operation_from_dict_async(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation() + ) + response = await client.get_operation( + request={ + "name": "locations", + } + ) + call.assert_called() + + +def test_list_operations(transport: str = "grpc"): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.ListOperationsRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.ListOperationsResponse() + response = client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.ListOperationsResponse) +@pytest.mark.asyncio +async def test_list_operations_async(transport: str = "grpc_asyncio"): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.ListOperationsRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.ListOperationsResponse() + ) + response = await client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.ListOperationsResponse) + +def test_list_operations_field_headers(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.ListOperationsRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + call.return_value = operations_pb2.ListOperationsResponse() + + client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +@pytest.mark.asyncio +async def test_list_operations_field_headers_async(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.ListOperationsRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.ListOperationsResponse() + ) + await client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + +def test_list_operations_from_dict(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.ListOperationsResponse() + + response = client.list_operations( + request={ + "name": "locations", + } + ) + call.assert_called() +@pytest.mark.asyncio +async def test_list_operations_from_dict_async(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.ListOperationsResponse() + ) + response = await client.list_operations( + request={ + "name": "locations", + } + ) + call.assert_called() + + +def test_transport_close_grpc(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc" + ) + with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +@pytest.mark.asyncio +async def test_transport_close_grpc_asyncio(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio" + ) + with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: + async with client: + close.assert_not_called() + close.assert_called_once() + + +def test_transport_close_rest(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + with mock.patch.object(type(getattr(client.transport, "_session")), "close") as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +def test_client_ctx(): + transports = [ + 'rest', + 'grpc', + ] + for transport in transports: + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport + ) + # Test client calls underlying transport. + with mock.patch.object(type(client.transport), "close") as close: + close.assert_not_called() + with client: + pass + close.assert_called() + +@pytest.mark.parametrize("client_class,transport_class", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport), +]) +def test_api_key_credentials(client_class, transport_class): + with mock.patch.object( + google.auth._default, "get_api_key_credentials", create=True + ) as get_api_key_credentials: + mock_cred = mock.Mock() + get_api_key_credentials.return_value = mock_cred + options = client_options.ClientOptions() + options.api_key = "api_key" + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options) + patched.assert_called_once_with( + credentials=mock_cred, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/.coveragerc b/owl-bot-staging/google-cloud-texttospeech/v1beta1/.coveragerc new file mode 100644 index 000000000000..8f3a0ab7f83b --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/.coveragerc @@ -0,0 +1,13 @@ +[run] +branch = True + +[report] +show_missing = True +omit = + google/cloud/texttospeech/__init__.py + google/cloud/texttospeech/gapic_version.py +exclude_lines = + # Re-enable the standard pragma + pragma: NO COVER + # Ignore debug-only repr + def __repr__ diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/.flake8 b/owl-bot-staging/google-cloud-texttospeech/v1beta1/.flake8 new file mode 100644 index 000000000000..29227d4cf419 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/.flake8 @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# +# 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 +# +# https://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. + +# Generated by synthtool. DO NOT EDIT! +[flake8] +ignore = E203, E266, E501, W503 +exclude = + # Exclude generated code. + **/proto/** + **/gapic/** + **/services/** + **/types/** + *_pb2.py + + # Standard linting exemptions. + **/.nox/** + __pycache__, + .git, + *.pyc, + conf.py diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/MANIFEST.in b/owl-bot-staging/google-cloud-texttospeech/v1beta1/MANIFEST.in new file mode 100644 index 000000000000..1cf382f027d1 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/MANIFEST.in @@ -0,0 +1,2 @@ +recursive-include google/cloud/texttospeech *.py +recursive-include google/cloud/texttospeech_v1beta1 *.py diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/README.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/README.rst new file mode 100644 index 000000000000..25f53907ce0c --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/README.rst @@ -0,0 +1,49 @@ +Python Client for Google Cloud Texttospeech API +================================================= + +Quick Start +----------- + +In order to use this library, you first need to go through the following steps: + +1. `Select or create a Cloud Platform project.`_ +2. `Enable billing for your project.`_ +3. Enable the Google Cloud Texttospeech API. +4. `Setup Authentication.`_ + +.. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project +.. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project +.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html + +Installation +~~~~~~~~~~~~ + +Install this library in a `virtualenv`_ using pip. `virtualenv`_ is a tool to +create isolated Python environments. The basic problem it addresses is one of +dependencies and versions, and indirectly permissions. + +With `virtualenv`_, it's possible to install this library without needing system +install permissions, and without clashing with the installed system +dependencies. + +.. _`virtualenv`: https://virtualenv.pypa.io/en/latest/ + + +Mac/Linux +^^^^^^^^^ + +.. code-block:: console + + python3 -m venv + source /bin/activate + /bin/pip install /path/to/library + + +Windows +^^^^^^^ + +.. code-block:: console + + python3 -m venv + \Scripts\activate + \Scripts\pip.exe install \path\to\library diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/_static/custom.css b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/_static/custom.css new file mode 100644 index 000000000000..06423be0b592 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/_static/custom.css @@ -0,0 +1,3 @@ +dl.field-list > dt { + min-width: 100px +} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/conf.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/conf.py new file mode 100644 index 000000000000..4e7d47829ddb --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/conf.py @@ -0,0 +1,376 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# +# google-cloud-texttospeech documentation build configuration file +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os +import shlex + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +sys.path.insert(0, os.path.abspath("..")) + +__version__ = "0.1.0" + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +needs_sphinx = "4.0.1" + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "sphinx.ext.intersphinx", + "sphinx.ext.coverage", + "sphinx.ext.napoleon", + "sphinx.ext.todo", + "sphinx.ext.viewcode", +] + +# autodoc/autosummary flags +autoclass_content = "both" +autodoc_default_flags = ["members"] +autosummary_generate = True + + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# Allow markdown includes (so releases.md can include CHANGLEOG.md) +# http://www.sphinx-doc.org/en/master/markdown.html +source_parsers = {".md": "recommonmark.parser.CommonMarkParser"} + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +source_suffix = [".rst", ".md"] + +# The encoding of source files. +# source_encoding = 'utf-8-sig' + +# The root toctree document. +root_doc = "index" + +# General information about the project. +project = u"google-cloud-texttospeech" +copyright = u"2023, Google, LLC" +author = u"Google APIs" # TODO: autogenerate this bit + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The full version, including alpha/beta/rc tags. +release = __version__ +# The short X.Y version. +version = ".".join(release.split(".")[0:2]) + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = 'en' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# today = '' +# Else, today_fmt is used as the format for a strftime call. +# today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ["_build"] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +# default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +# add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = "sphinx" + +# A list of ignored prefixes for module index sorting. +# modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +# keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = True + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = "alabaster" + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +html_theme_options = { + "description": "Google Cloud Client Libraries for Python", + "github_user": "googleapis", + "github_repo": "google-cloud-python", + "github_banner": True, + "font_family": "'Roboto', Georgia, sans", + "head_font_family": "'Roboto', Georgia, serif", + "code_font_family": "'Roboto Mono', 'Consolas', monospace", +} + +# Add any paths that contain custom themes here, relative to this directory. +# html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +# html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +# html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +# html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# html_additional_pages = {} + +# If false, no module index is generated. +# html_domain_indices = True + +# If false, no index is generated. +# html_use_index = True + +# If true, the index is split into individual pages for each letter. +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +# html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +# html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +# html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' +# html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# Now only 'ja' uses this config value +# html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +# html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = "google-cloud-texttospeech-doc" + +# -- Options for warnings ------------------------------------------------------ + + +suppress_warnings = [ + # Temporarily suppress this to avoid "more than one target found for + # cross-reference" warning, which are intractable for us to avoid while in + # a mono-repo. + # See https://github.com/sphinx-doc/sphinx/blob + # /2a65ffeef5c107c19084fabdd706cdff3f52d93c/sphinx/domains/python.py#L843 + "ref.python" +] + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # 'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + # 'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + # 'preamble': '', + # Latex figure (float) alignment + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ( + root_doc, + "google-cloud-texttospeech.tex", + u"google-cloud-texttospeech Documentation", + author, + "manual", + ) +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# latex_use_parts = False + +# If true, show page references after internal links. +# latex_show_pagerefs = False + +# If true, show URL addresses after external links. +# latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# latex_appendices = [] + +# If false, no module index is generated. +# latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ( + root_doc, + "google-cloud-texttospeech", + u"Google Cloud Texttospeech Documentation", + [author], + 1, + ) +] + +# If true, show URL addresses after external links. +# man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ( + root_doc, + "google-cloud-texttospeech", + u"google-cloud-texttospeech Documentation", + author, + "google-cloud-texttospeech", + "GAPIC library for Google Cloud Texttospeech API", + "APIs", + ) +] + +# Documents to append as an appendix to all manuals. +# texinfo_appendices = [] + +# If false, no module index is generated. +# texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +# texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +# texinfo_no_detailmenu = False + + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = { + "python": ("http://python.readthedocs.org/en/latest/", None), + "gax": ("https://gax-python.readthedocs.org/en/latest/", None), + "google-auth": ("https://google-auth.readthedocs.io/en/stable", None), + "google-gax": ("https://gax-python.readthedocs.io/en/latest/", None), + "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None), + "grpc": ("https://grpc.io/grpc/python/", None), + "requests": ("http://requests.kennethreitz.org/en/stable/", None), + "proto": ("https://proto-plus-python.readthedocs.io/en/stable", None), + "protobuf": ("https://googleapis.dev/python/protobuf/latest/", None), +} + + +# Napoleon settings +napoleon_google_docstring = True +napoleon_numpy_docstring = True +napoleon_include_private_with_doc = False +napoleon_include_special_with_doc = True +napoleon_use_admonition_for_examples = False +napoleon_use_admonition_for_notes = False +napoleon_use_admonition_for_references = False +napoleon_use_ivar = False +napoleon_use_param = True +napoleon_use_rtype = True diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/index.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/index.rst new file mode 100644 index 000000000000..f591f479e77e --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/index.rst @@ -0,0 +1,7 @@ +API Reference +------------- +.. toctree:: + :maxdepth: 2 + + texttospeech_v1beta1/services_ + texttospeech_v1beta1/types_ diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/services_.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/services_.rst new file mode 100644 index 000000000000..338598a60eb8 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/services_.rst @@ -0,0 +1,7 @@ +Services for Google Cloud Texttospeech v1beta1 API +================================================== +.. toctree:: + :maxdepth: 2 + + text_to_speech + text_to_speech_long_audio_synthesize diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech.rst new file mode 100644 index 000000000000..8521daf8070a --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech.rst @@ -0,0 +1,6 @@ +TextToSpeech +------------------------------ + +.. automodule:: google.cloud.texttospeech_v1beta1.services.text_to_speech + :members: + :inherited-members: diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech_long_audio_synthesize.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech_long_audio_synthesize.rst new file mode 100644 index 000000000000..50ef34c6c59f --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech_long_audio_synthesize.rst @@ -0,0 +1,6 @@ +TextToSpeechLongAudioSynthesize +------------------------------------------------- + +.. automodule:: google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize + :members: + :inherited-members: diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/types_.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/types_.rst new file mode 100644 index 000000000000..57ba4be821d0 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/types_.rst @@ -0,0 +1,6 @@ +Types for Google Cloud Texttospeech v1beta1 API +=============================================== + +.. automodule:: google.cloud.texttospeech_v1beta1.types + :members: + :show-inheritance: diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/__init__.py new file mode 100644 index 000000000000..29429722d1c9 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/__init__.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from google.cloud.texttospeech import gapic_version as package_version + +__version__ = package_version.__version__ + + +from google.cloud.texttospeech_v1beta1.services.text_to_speech.client import TextToSpeechClient +from google.cloud.texttospeech_v1beta1.services.text_to_speech.async_client import TextToSpeechAsyncClient +from google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize.client import TextToSpeechLongAudioSynthesizeClient +from google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize.async_client import TextToSpeechLongAudioSynthesizeAsyncClient + +from google.cloud.texttospeech_v1beta1.types.cloud_tts import AdvancedVoiceOptions +from google.cloud.texttospeech_v1beta1.types.cloud_tts import AudioConfig +from google.cloud.texttospeech_v1beta1.types.cloud_tts import CustomPronunciationParams +from google.cloud.texttospeech_v1beta1.types.cloud_tts import CustomPronunciations +from google.cloud.texttospeech_v1beta1.types.cloud_tts import CustomVoiceParams +from google.cloud.texttospeech_v1beta1.types.cloud_tts import ListVoicesRequest +from google.cloud.texttospeech_v1beta1.types.cloud_tts import ListVoicesResponse +from google.cloud.texttospeech_v1beta1.types.cloud_tts import MultiSpeakerMarkup +from google.cloud.texttospeech_v1beta1.types.cloud_tts import StreamingSynthesisInput +from google.cloud.texttospeech_v1beta1.types.cloud_tts import StreamingSynthesizeConfig +from google.cloud.texttospeech_v1beta1.types.cloud_tts import StreamingSynthesizeRequest +from google.cloud.texttospeech_v1beta1.types.cloud_tts import StreamingSynthesizeResponse +from google.cloud.texttospeech_v1beta1.types.cloud_tts import SynthesisInput +from google.cloud.texttospeech_v1beta1.types.cloud_tts import SynthesizeSpeechRequest +from google.cloud.texttospeech_v1beta1.types.cloud_tts import SynthesizeSpeechResponse +from google.cloud.texttospeech_v1beta1.types.cloud_tts import Timepoint +from google.cloud.texttospeech_v1beta1.types.cloud_tts import Voice +from google.cloud.texttospeech_v1beta1.types.cloud_tts import VoiceCloneParams +from google.cloud.texttospeech_v1beta1.types.cloud_tts import VoiceSelectionParams +from google.cloud.texttospeech_v1beta1.types.cloud_tts import AudioEncoding +from google.cloud.texttospeech_v1beta1.types.cloud_tts import SsmlVoiceGender +from google.cloud.texttospeech_v1beta1.types.cloud_tts_lrs import SynthesizeLongAudioMetadata +from google.cloud.texttospeech_v1beta1.types.cloud_tts_lrs import SynthesizeLongAudioRequest +from google.cloud.texttospeech_v1beta1.types.cloud_tts_lrs import SynthesizeLongAudioResponse + +__all__ = ('TextToSpeechClient', + 'TextToSpeechAsyncClient', + 'TextToSpeechLongAudioSynthesizeClient', + 'TextToSpeechLongAudioSynthesizeAsyncClient', + 'AdvancedVoiceOptions', + 'AudioConfig', + 'CustomPronunciationParams', + 'CustomPronunciations', + 'CustomVoiceParams', + 'ListVoicesRequest', + 'ListVoicesResponse', + 'MultiSpeakerMarkup', + 'StreamingSynthesisInput', + 'StreamingSynthesizeConfig', + 'StreamingSynthesizeRequest', + 'StreamingSynthesizeResponse', + 'SynthesisInput', + 'SynthesizeSpeechRequest', + 'SynthesizeSpeechResponse', + 'Timepoint', + 'Voice', + 'VoiceCloneParams', + 'VoiceSelectionParams', + 'AudioEncoding', + 'SsmlVoiceGender', + 'SynthesizeLongAudioMetadata', + 'SynthesizeLongAudioRequest', + 'SynthesizeLongAudioResponse', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/gapic_version.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/gapic_version.py new file mode 100644 index 000000000000..558c8aab67c5 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/gapic_version.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +__version__ = "0.0.0" # {x-release-please-version} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/py.typed b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/py.typed new file mode 100644 index 000000000000..9b87c1e1cbf9 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# The google-cloud-texttospeech package uses inline types. diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/__init__.py new file mode 100644 index 000000000000..0cbc8b072416 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/__init__.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from google.cloud.texttospeech_v1beta1 import gapic_version as package_version + +__version__ = package_version.__version__ + + +from .services.text_to_speech import TextToSpeechClient +from .services.text_to_speech import TextToSpeechAsyncClient +from .services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeClient +from .services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeAsyncClient + +from .types.cloud_tts import AdvancedVoiceOptions +from .types.cloud_tts import AudioConfig +from .types.cloud_tts import CustomPronunciationParams +from .types.cloud_tts import CustomPronunciations +from .types.cloud_tts import CustomVoiceParams +from .types.cloud_tts import ListVoicesRequest +from .types.cloud_tts import ListVoicesResponse +from .types.cloud_tts import MultiSpeakerMarkup +from .types.cloud_tts import StreamingSynthesisInput +from .types.cloud_tts import StreamingSynthesizeConfig +from .types.cloud_tts import StreamingSynthesizeRequest +from .types.cloud_tts import StreamingSynthesizeResponse +from .types.cloud_tts import SynthesisInput +from .types.cloud_tts import SynthesizeSpeechRequest +from .types.cloud_tts import SynthesizeSpeechResponse +from .types.cloud_tts import Timepoint +from .types.cloud_tts import Voice +from .types.cloud_tts import VoiceCloneParams +from .types.cloud_tts import VoiceSelectionParams +from .types.cloud_tts import AudioEncoding +from .types.cloud_tts import SsmlVoiceGender +from .types.cloud_tts_lrs import SynthesizeLongAudioMetadata +from .types.cloud_tts_lrs import SynthesizeLongAudioRequest +from .types.cloud_tts_lrs import SynthesizeLongAudioResponse + +__all__ = ( + 'TextToSpeechAsyncClient', + 'TextToSpeechLongAudioSynthesizeAsyncClient', +'AdvancedVoiceOptions', +'AudioConfig', +'AudioEncoding', +'CustomPronunciationParams', +'CustomPronunciations', +'CustomVoiceParams', +'ListVoicesRequest', +'ListVoicesResponse', +'MultiSpeakerMarkup', +'SsmlVoiceGender', +'StreamingSynthesisInput', +'StreamingSynthesizeConfig', +'StreamingSynthesizeRequest', +'StreamingSynthesizeResponse', +'SynthesisInput', +'SynthesizeLongAudioMetadata', +'SynthesizeLongAudioRequest', +'SynthesizeLongAudioResponse', +'SynthesizeSpeechRequest', +'SynthesizeSpeechResponse', +'TextToSpeechClient', +'TextToSpeechLongAudioSynthesizeClient', +'Timepoint', +'Voice', +'VoiceCloneParams', +'VoiceSelectionParams', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_metadata.json b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_metadata.json new file mode 100644 index 000000000000..174c6d86b5f4 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_metadata.json @@ -0,0 +1,107 @@ + { + "comment": "This file maps proto services/RPCs to the corresponding library clients/methods", + "language": "python", + "libraryPackage": "google.cloud.texttospeech_v1beta1", + "protoPackage": "google.cloud.texttospeech.v1beta1", + "schema": "1.0", + "services": { + "TextToSpeech": { + "clients": { + "grpc": { + "libraryClient": "TextToSpeechClient", + "rpcs": { + "ListVoices": { + "methods": [ + "list_voices" + ] + }, + "StreamingSynthesize": { + "methods": [ + "streaming_synthesize" + ] + }, + "SynthesizeSpeech": { + "methods": [ + "synthesize_speech" + ] + } + } + }, + "grpc-async": { + "libraryClient": "TextToSpeechAsyncClient", + "rpcs": { + "ListVoices": { + "methods": [ + "list_voices" + ] + }, + "StreamingSynthesize": { + "methods": [ + "streaming_synthesize" + ] + }, + "SynthesizeSpeech": { + "methods": [ + "synthesize_speech" + ] + } + } + }, + "rest": { + "libraryClient": "TextToSpeechClient", + "rpcs": { + "ListVoices": { + "methods": [ + "list_voices" + ] + }, + "StreamingSynthesize": { + "methods": [ + "streaming_synthesize" + ] + }, + "SynthesizeSpeech": { + "methods": [ + "synthesize_speech" + ] + } + } + } + } + }, + "TextToSpeechLongAudioSynthesize": { + "clients": { + "grpc": { + "libraryClient": "TextToSpeechLongAudioSynthesizeClient", + "rpcs": { + "SynthesizeLongAudio": { + "methods": [ + "synthesize_long_audio" + ] + } + } + }, + "grpc-async": { + "libraryClient": "TextToSpeechLongAudioSynthesizeAsyncClient", + "rpcs": { + "SynthesizeLongAudio": { + "methods": [ + "synthesize_long_audio" + ] + } + } + }, + "rest": { + "libraryClient": "TextToSpeechLongAudioSynthesizeClient", + "rpcs": { + "SynthesizeLongAudio": { + "methods": [ + "synthesize_long_audio" + ] + } + } + } + } + } + } +} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_version.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_version.py new file mode 100644 index 000000000000..558c8aab67c5 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_version.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +__version__ = "0.0.0" # {x-release-please-version} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/py.typed b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/py.typed new file mode 100644 index 000000000000..9b87c1e1cbf9 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# The google-cloud-texttospeech package uses inline types. diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/__init__.py new file mode 100644 index 000000000000..8f6cf068242c --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/__init__.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/__init__.py new file mode 100644 index 000000000000..fa16c00b5f6f --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from .client import TextToSpeechClient +from .async_client import TextToSpeechAsyncClient + +__all__ = ( + 'TextToSpeechClient', + 'TextToSpeechAsyncClient', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/async_client.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/async_client.py new file mode 100644 index 000000000000..628c54182023 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/async_client.py @@ -0,0 +1,660 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from collections import OrderedDict +import re +from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, AsyncIterable, Awaitable, AsyncIterator, Sequence, Tuple, Type, Union + +from google.cloud.texttospeech_v1beta1 import gapic_version as package_version + +from google.api_core.client_options import ClientOptions +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry_async as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.oauth2 import service_account # type: ignore + + +try: + OptionalRetry = Union[retries.AsyncRetry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.AsyncRetry, object, None] # type: ignore + +from google.cloud.texttospeech_v1beta1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore +from .transports.base import TextToSpeechTransport, DEFAULT_CLIENT_INFO +from .transports.grpc_asyncio import TextToSpeechGrpcAsyncIOTransport +from .client import TextToSpeechClient + + +class TextToSpeechAsyncClient: + """Service that implements Google Cloud Text-to-Speech API.""" + + _client: TextToSpeechClient + + # Copy defaults from the synchronous client for use here. + # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. + DEFAULT_ENDPOINT = TextToSpeechClient.DEFAULT_ENDPOINT + DEFAULT_MTLS_ENDPOINT = TextToSpeechClient.DEFAULT_MTLS_ENDPOINT + _DEFAULT_ENDPOINT_TEMPLATE = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE + _DEFAULT_UNIVERSE = TextToSpeechClient._DEFAULT_UNIVERSE + + model_path = staticmethod(TextToSpeechClient.model_path) + parse_model_path = staticmethod(TextToSpeechClient.parse_model_path) + common_billing_account_path = staticmethod(TextToSpeechClient.common_billing_account_path) + parse_common_billing_account_path = staticmethod(TextToSpeechClient.parse_common_billing_account_path) + common_folder_path = staticmethod(TextToSpeechClient.common_folder_path) + parse_common_folder_path = staticmethod(TextToSpeechClient.parse_common_folder_path) + common_organization_path = staticmethod(TextToSpeechClient.common_organization_path) + parse_common_organization_path = staticmethod(TextToSpeechClient.parse_common_organization_path) + common_project_path = staticmethod(TextToSpeechClient.common_project_path) + parse_common_project_path = staticmethod(TextToSpeechClient.parse_common_project_path) + common_location_path = staticmethod(TextToSpeechClient.common_location_path) + parse_common_location_path = staticmethod(TextToSpeechClient.parse_common_location_path) + + @classmethod + def from_service_account_info(cls, info: dict, *args, **kwargs): + """Creates an instance of this client using the provided credentials + info. + + Args: + info (dict): The service account private key info. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechAsyncClient: The constructed client. + """ + return TextToSpeechClient.from_service_account_info.__func__(TextToSpeechAsyncClient, info, *args, **kwargs) # type: ignore + + @classmethod + def from_service_account_file(cls, filename: str, *args, **kwargs): + """Creates an instance of this client using the provided credentials + file. + + Args: + filename (str): The path to the service account private key json + file. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechAsyncClient: The constructed client. + """ + return TextToSpeechClient.from_service_account_file.__func__(TextToSpeechAsyncClient, filename, *args, **kwargs) # type: ignore + + from_service_account_json = from_service_account_file + + @classmethod + def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[ClientOptions] = None): + """Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variable is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + return TextToSpeechClient.get_mtls_endpoint_and_cert_source(client_options) # type: ignore + + @property + def transport(self) -> TextToSpeechTransport: + """Returns the transport used by the client instance. + + Returns: + TextToSpeechTransport: The transport used by the client instance. + """ + return self._client.transport + + @property + def api_endpoint(self): + """Return the API endpoint used by the client instance. + + Returns: + str: The API endpoint used by the client instance. + """ + return self._client._api_endpoint + + @property + def universe_domain(self) -> str: + """Return the universe domain used by the client instance. + + Returns: + str: The universe domain used + by the client instance. + """ + return self._client._universe_domain + + get_transport_class = TextToSpeechClient.get_transport_class + + def __init__(self, *, + credentials: Optional[ga_credentials.Credentials] = None, + transport: Optional[Union[str, TextToSpeechTransport, Callable[..., TextToSpeechTransport]]] = "grpc_asyncio", + client_options: Optional[ClientOptions] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + ) -> None: + """Instantiates the text to speech async client. + + Args: + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + transport (Optional[Union[str,TextToSpeechTransport,Callable[..., TextToSpeechTransport]]]): + The transport to use, or a Callable that constructs and returns a new transport to use. + If a Callable is given, it will be called with the same set of initialization + arguments as used in the TextToSpeechTransport constructor. + If set to None, a transport is chosen automatically. + NOTE: "rest" transport functionality is currently in a + beta state (preview). We welcome your feedback via an + issue in this library's source repository. + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): + Custom options for the client. + + 1. The ``api_endpoint`` property can be used to override the + default endpoint provided by the client when ``transport`` is + not explicitly provided. Only if this property is not set and + ``transport`` was not explicitly provided, the endpoint is + determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment + variable, which have one of the following values: + "always" (always use the default mTLS endpoint), "never" (always + use the default regular endpoint) and "auto" (auto-switch to the + default mTLS endpoint if client certificate is present; this is + the default value). + + 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable + is "true", then the ``client_cert_source`` property can be used + to provide a client certificate for mTLS transport. If + not provided, the default SSL client certificate will be used if + present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not + set, no client certificate will be used. + + 3. The ``universe_domain`` property can be used to override the + default "googleapis.com" universe. Note that ``api_endpoint`` + property still takes precedence; and ``universe_domain`` is + currently not supported for mTLS. + + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + + Raises: + google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport + creation failed for any reason. + """ + self._client = TextToSpeechClient( + credentials=credentials, + transport=transport, + client_options=client_options, + client_info=client_info, + + ) + + async def list_voices(self, + request: Optional[Union[cloud_tts.ListVoicesRequest, dict]] = None, + *, + language_code: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> cloud_tts.ListVoicesResponse: + r"""Returns a list of Voice supported for synthesis. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1beta1 + + async def sample_list_voices(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechAsyncClient() + + # Initialize request argument(s) + request = texttospeech_v1beta1.ListVoicesRequest( + ) + + # Make the request + response = await client.list_voices(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.texttospeech_v1beta1.types.ListVoicesRequest, dict]]): + The request object. The top-level message sent by the client for the + ``ListVoices`` method. + language_code (:class:`str`): + Optional. Recommended. + `BCP-47 `__ + language tag. If not specified, the API will return all + supported voices. If specified, the ListVoices call will + only return voices that can be used to synthesize this + language_code. For example, if you specify ``"en-NZ"``, + all ``"en-NZ"`` voices will be returned. If you specify + ``"no"``, both ``"no-\*"`` (Norwegian) and ``"nb-\*"`` + (Norwegian Bokmal) voices will be returned. + + This corresponds to the ``language_code`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.cloud.texttospeech_v1beta1.types.ListVoicesResponse: + The message returned to the client by the ListVoices + method. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([language_code]) + if request is not None and has_flattened_params: + raise ValueError("If the `request` argument is set, then none of " + "the individual field arguments should be set.") + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, cloud_tts.ListVoicesRequest): + request = cloud_tts.ListVoicesRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if language_code is not None: + request.language_code = language_code + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[self._client._transport.list_voices] + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def synthesize_speech(self, + request: Optional[Union[cloud_tts.SynthesizeSpeechRequest, dict]] = None, + *, + input: Optional[cloud_tts.SynthesisInput] = None, + voice: Optional[cloud_tts.VoiceSelectionParams] = None, + audio_config: Optional[cloud_tts.AudioConfig] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> cloud_tts.SynthesizeSpeechResponse: + r"""Synthesizes speech synchronously: receive results + after all text input has been processed. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1beta1 + + async def sample_synthesize_speech(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechAsyncClient() + + # Initialize request argument(s) + input = texttospeech_v1beta1.SynthesisInput() + input.text = "text_value" + + voice = texttospeech_v1beta1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + audio_config = texttospeech_v1beta1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + request = texttospeech_v1beta1.SynthesizeSpeechRequest( + input=input, + voice=voice, + audio_config=audio_config, + ) + + # Make the request + response = await client.synthesize_speech(request=request) + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechRequest, dict]]): + The request object. The top-level message sent by the client for the + ``SynthesizeSpeech`` method. + input (:class:`google.cloud.texttospeech_v1beta1.types.SynthesisInput`): + Required. The Synthesizer requires + either plain text or SSML as input. + + This corresponds to the ``input`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + voice (:class:`google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams`): + Required. The desired voice of the + synthesized audio. + + This corresponds to the ``voice`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + audio_config (:class:`google.cloud.texttospeech_v1beta1.types.AudioConfig`): + Required. The configuration of the + synthesized audio. + + This corresponds to the ``audio_config`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechResponse: + The message returned to the client by the + SynthesizeSpeech method. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([input, voice, audio_config]) + if request is not None and has_flattened_params: + raise ValueError("If the `request` argument is set, then none of " + "the individual field arguments should be set.") + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, cloud_tts.SynthesizeSpeechRequest): + request = cloud_tts.SynthesizeSpeechRequest(request) + + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if input is not None: + request.input = input + if voice is not None: + request.voice = voice + if audio_config is not None: + request.audio_config = audio_config + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[self._client._transport.synthesize_speech] + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def streaming_synthesize(self, + requests: Optional[AsyncIterator[cloud_tts.StreamingSynthesizeRequest]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> Awaitable[AsyncIterable[cloud_tts.StreamingSynthesizeResponse]]: + r"""Performs bidirectional streaming speech synthesis: + receive audio while sending text. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1beta1 + + async def sample_streaming_synthesize(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechAsyncClient() + + # Initialize request argument(s) + streaming_config = texttospeech_v1beta1.StreamingSynthesizeConfig() + streaming_config.voice.language_code = "language_code_value" + + request = texttospeech_v1beta1.StreamingSynthesizeRequest( + streaming_config=streaming_config, + ) + + # This method expects an iterator which contains + # 'texttospeech_v1beta1.StreamingSynthesizeRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = await client.streaming_synthesize(requests=request_generator()) + + # Handle the response + async for response in stream: + print(response) + + Args: + requests (AsyncIterator[`google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeRequest`]): + The request object AsyncIterator. Request message for the ``StreamingSynthesize`` method. + Multiple ``StreamingSynthesizeRequest`` messages are + sent in one call. The first message must contain a + ``streaming_config`` that fully specifies the request + configuration and must not contain ``input``. All + subsequent messages must only have ``input`` set. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + AsyncIterable[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeResponse]: + StreamingSynthesizeResponse is the only message returned to the + client by StreamingSynthesize method. A series of + zero or more StreamingSynthesizeResponse messages are + streamed back to the client. + + """ + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[self._client._transport.streaming_synthesize] + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = rpc( + requests, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + async def list_operations( + self, + request: Optional[operations_pb2.ListOperationsRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.ListOperationsResponse: + r"""Lists operations that match the specified filter in the request. + + Args: + request (:class:`~.operations_pb2.ListOperationsRequest`): + The request object. Request message for + `ListOperations` method. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.ListOperationsResponse: + Response message for ``ListOperations`` method. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.ListOperationsRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self.transport._wrapped_methods[self._client._transport.list_operations] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + async def get_operation( + self, + request: Optional[operations_pb2.GetOperationRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.Operation: + r"""Gets the latest state of a long-running operation. + + Args: + request (:class:`~.operations_pb2.GetOperationRequest`): + The request object. Request message for + `GetOperation` method. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.Operation: + An ``Operation`` object. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.GetOperationRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self.transport._wrapped_methods[self._client._transport.get_operation] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + async def __aenter__(self) -> "TextToSpeechAsyncClient": + return self + + async def __aexit__(self, exc_type, exc, tb): + await self.transport.close() + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) + + +__all__ = ( + "TextToSpeechAsyncClient", +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/client.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/client.py new file mode 100644 index 000000000000..8f581026e88a --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/client.py @@ -0,0 +1,1017 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from collections import OrderedDict +import os +import re +from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Iterable, Iterator, Sequence, Tuple, Type, Union, cast +import warnings + +from google.cloud.texttospeech_v1beta1 import gapic_version as package_version + +from google.api_core import client_options as client_options_lib +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport import mtls # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore +from google.auth.exceptions import MutualTLSChannelError # type: ignore +from google.oauth2 import service_account # type: ignore + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object, None] # type: ignore + +from google.cloud.texttospeech_v1beta1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore +from .transports.base import TextToSpeechTransport, DEFAULT_CLIENT_INFO +from .transports.grpc import TextToSpeechGrpcTransport +from .transports.grpc_asyncio import TextToSpeechGrpcAsyncIOTransport +from .transports.rest import TextToSpeechRestTransport + + +class TextToSpeechClientMeta(type): + """Metaclass for the TextToSpeech client. + + This provides class-level methods for building and retrieving + support objects (e.g. transport) without polluting the client instance + objects. + """ + _transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechTransport]] + _transport_registry["grpc"] = TextToSpeechGrpcTransport + _transport_registry["grpc_asyncio"] = TextToSpeechGrpcAsyncIOTransport + _transport_registry["rest"] = TextToSpeechRestTransport + + def get_transport_class(cls, + label: Optional[str] = None, + ) -> Type[TextToSpeechTransport]: + """Returns an appropriate transport class. + + Args: + label: The name of the desired transport. If none is + provided, then the first transport in the registry is used. + + Returns: + The transport class to use. + """ + # If a specific transport is requested, return that one. + if label: + return cls._transport_registry[label] + + # No transport is requested; return the default (that is, the first one + # in the dictionary). + return next(iter(cls._transport_registry.values())) + + +class TextToSpeechClient(metaclass=TextToSpeechClientMeta): + """Service that implements Google Cloud Text-to-Speech API.""" + + @staticmethod + def _get_default_mtls_endpoint(api_endpoint): + """Converts api endpoint to mTLS endpoint. + + Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to + "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively. + Args: + api_endpoint (Optional[str]): the api endpoint to convert. + Returns: + str: converted mTLS api endpoint. + """ + if not api_endpoint: + return api_endpoint + + mtls_endpoint_re = re.compile( + r"(?P[^.]+)(?P\.mtls)?(?P\.sandbox)?(?P\.googleapis\.com)?" + ) + + m = mtls_endpoint_re.match(api_endpoint) + name, mtls, sandbox, googledomain = m.groups() + if mtls or not googledomain: + return api_endpoint + + if sandbox: + return api_endpoint.replace( + "sandbox.googleapis.com", "mtls.sandbox.googleapis.com" + ) + + return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com") + + # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. + DEFAULT_ENDPOINT = "texttospeech.googleapis.com" + DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore + DEFAULT_ENDPOINT + ) + + _DEFAULT_ENDPOINT_TEMPLATE = "texttospeech.{UNIVERSE_DOMAIN}" + _DEFAULT_UNIVERSE = "googleapis.com" + + @classmethod + def from_service_account_info(cls, info: dict, *args, **kwargs): + """Creates an instance of this client using the provided credentials + info. + + Args: + info (dict): The service account private key info. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechClient: The constructed client. + """ + credentials = service_account.Credentials.from_service_account_info(info) + kwargs["credentials"] = credentials + return cls(*args, **kwargs) + + @classmethod + def from_service_account_file(cls, filename: str, *args, **kwargs): + """Creates an instance of this client using the provided credentials + file. + + Args: + filename (str): The path to the service account private key json + file. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechClient: The constructed client. + """ + credentials = service_account.Credentials.from_service_account_file( + filename) + kwargs["credentials"] = credentials + return cls(*args, **kwargs) + + from_service_account_json = from_service_account_file + + @property + def transport(self) -> TextToSpeechTransport: + """Returns the transport used by the client instance. + + Returns: + TextToSpeechTransport: The transport used by the client + instance. + """ + return self._transport + + @staticmethod + def model_path(project: str,location: str,model: str,) -> str: + """Returns a fully-qualified model string.""" + return "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) + + @staticmethod + def parse_model_path(path: str) -> Dict[str,str]: + """Parses a model path into its component segments.""" + m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)/models/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_billing_account_path(billing_account: str, ) -> str: + """Returns a fully-qualified billing_account string.""" + return "billingAccounts/{billing_account}".format(billing_account=billing_account, ) + + @staticmethod + def parse_common_billing_account_path(path: str) -> Dict[str,str]: + """Parse a billing_account path into its component segments.""" + m = re.match(r"^billingAccounts/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_folder_path(folder: str, ) -> str: + """Returns a fully-qualified folder string.""" + return "folders/{folder}".format(folder=folder, ) + + @staticmethod + def parse_common_folder_path(path: str) -> Dict[str,str]: + """Parse a folder path into its component segments.""" + m = re.match(r"^folders/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_organization_path(organization: str, ) -> str: + """Returns a fully-qualified organization string.""" + return "organizations/{organization}".format(organization=organization, ) + + @staticmethod + def parse_common_organization_path(path: str) -> Dict[str,str]: + """Parse a organization path into its component segments.""" + m = re.match(r"^organizations/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_project_path(project: str, ) -> str: + """Returns a fully-qualified project string.""" + return "projects/{project}".format(project=project, ) + + @staticmethod + def parse_common_project_path(path: str) -> Dict[str,str]: + """Parse a project path into its component segments.""" + m = re.match(r"^projects/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_location_path(project: str, location: str, ) -> str: + """Returns a fully-qualified location string.""" + return "projects/{project}/locations/{location}".format(project=project, location=location, ) + + @staticmethod + def parse_common_location_path(path: str) -> Dict[str,str]: + """Parse a location path into its component segments.""" + m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path) + return m.groupdict() if m else {} + + @classmethod + def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[client_options_lib.ClientOptions] = None): + """Deprecated. Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variable is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + + warnings.warn("get_mtls_endpoint_and_cert_source is deprecated. Use the api_endpoint property instead.", + DeprecationWarning) + if client_options is None: + client_options = client_options_lib.ClientOptions() + use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") + use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") + if use_client_cert not in ("true", "false"): + raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") + if use_mtls_endpoint not in ("auto", "never", "always"): + raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") + + # Figure out the client cert source to use. + client_cert_source = None + if use_client_cert == "true": + if client_options.client_cert_source: + client_cert_source = client_options.client_cert_source + elif mtls.has_default_client_cert_source(): + client_cert_source = mtls.default_client_cert_source() + + # Figure out which api endpoint to use. + if client_options.api_endpoint is not None: + api_endpoint = client_options.api_endpoint + elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): + api_endpoint = cls.DEFAULT_MTLS_ENDPOINT + else: + api_endpoint = cls.DEFAULT_ENDPOINT + + return api_endpoint, client_cert_source + + @staticmethod + def _read_environment_variables(): + """Returns the environment variables used by the client. + + Returns: + Tuple[bool, str, str]: returns the GOOGLE_API_USE_CLIENT_CERTIFICATE, + GOOGLE_API_USE_MTLS_ENDPOINT, and GOOGLE_CLOUD_UNIVERSE_DOMAIN environment variables. + + Raises: + ValueError: If GOOGLE_API_USE_CLIENT_CERTIFICATE is not + any of ["true", "false"]. + google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT + is not any of ["auto", "never", "always"]. + """ + use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false").lower() + use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower() + universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN") + if use_client_cert not in ("true", "false"): + raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") + if use_mtls_endpoint not in ("auto", "never", "always"): + raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") + return use_client_cert == "true", use_mtls_endpoint, universe_domain_env + + @staticmethod + def _get_client_cert_source(provided_cert_source, use_cert_flag): + """Return the client cert source to be used by the client. + + Args: + provided_cert_source (bytes): The client certificate source provided. + use_cert_flag (bool): A flag indicating whether to use the client certificate. + + Returns: + bytes or None: The client cert source to be used by the client. + """ + client_cert_source = None + if use_cert_flag: + if provided_cert_source: + client_cert_source = provided_cert_source + elif mtls.has_default_client_cert_source(): + client_cert_source = mtls.default_client_cert_source() + return client_cert_source + + @staticmethod + def _get_api_endpoint(api_override, client_cert_source, universe_domain, use_mtls_endpoint): + """Return the API endpoint used by the client. + + Args: + api_override (str): The API endpoint override. If specified, this is always + the return value of this function and the other arguments are not used. + client_cert_source (bytes): The client certificate source used by the client. + universe_domain (str): The universe domain used by the client. + use_mtls_endpoint (str): How to use the mTLS endpoint, which depends also on the other parameters. + Possible values are "always", "auto", or "never". + + Returns: + str: The API endpoint to be used by the client. + """ + if api_override is not None: + api_endpoint = api_override + elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): + _default_universe = TextToSpeechClient._DEFAULT_UNIVERSE + if universe_domain != _default_universe: + raise MutualTLSChannelError(f"mTLS is not supported in any universe other than {_default_universe}.") + api_endpoint = TextToSpeechClient.DEFAULT_MTLS_ENDPOINT + else: + api_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=universe_domain) + return api_endpoint + + @staticmethod + def _get_universe_domain(client_universe_domain: Optional[str], universe_domain_env: Optional[str]) -> str: + """Return the universe domain used by the client. + + Args: + client_universe_domain (Optional[str]): The universe domain configured via the client options. + universe_domain_env (Optional[str]): The universe domain configured via the "GOOGLE_CLOUD_UNIVERSE_DOMAIN" environment variable. + + Returns: + str: The universe domain to be used by the client. + + Raises: + ValueError: If the universe domain is an empty string. + """ + universe_domain = TextToSpeechClient._DEFAULT_UNIVERSE + if client_universe_domain is not None: + universe_domain = client_universe_domain + elif universe_domain_env is not None: + universe_domain = universe_domain_env + if len(universe_domain.strip()) == 0: + raise ValueError("Universe Domain cannot be an empty string.") + return universe_domain + + @staticmethod + def _compare_universes(client_universe: str, + credentials: ga_credentials.Credentials) -> bool: + """Returns True iff the universe domains used by the client and credentials match. + + Args: + client_universe (str): The universe domain configured via the client options. + credentials (ga_credentials.Credentials): The credentials being used in the client. + + Returns: + bool: True iff client_universe matches the universe in credentials. + + Raises: + ValueError: when client_universe does not match the universe in credentials. + """ + + default_universe = TextToSpeechClient._DEFAULT_UNIVERSE + credentials_universe = getattr(credentials, "universe_domain", default_universe) + + if client_universe != credentials_universe: + raise ValueError("The configured universe domain " + f"({client_universe}) does not match the universe domain " + f"found in the credentials ({credentials_universe}). " + "If you haven't configured the universe domain explicitly, " + f"`{default_universe}` is the default.") + return True + + def _validate_universe_domain(self): + """Validates client's and credentials' universe domains are consistent. + + Returns: + bool: True iff the configured universe domain is valid. + + Raises: + ValueError: If the configured universe domain is not valid. + """ + self._is_universe_domain_valid = (self._is_universe_domain_valid or + TextToSpeechClient._compare_universes(self.universe_domain, self.transport._credentials)) + return self._is_universe_domain_valid + + @property + def api_endpoint(self): + """Return the API endpoint used by the client instance. + + Returns: + str: The API endpoint used by the client instance. + """ + return self._api_endpoint + + @property + def universe_domain(self) -> str: + """Return the universe domain used by the client instance. + + Returns: + str: The universe domain used by the client instance. + """ + return self._universe_domain + + def __init__(self, *, + credentials: Optional[ga_credentials.Credentials] = None, + transport: Optional[Union[str, TextToSpeechTransport, Callable[..., TextToSpeechTransport]]] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + ) -> None: + """Instantiates the text to speech client. + + Args: + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + transport (Optional[Union[str,TextToSpeechTransport,Callable[..., TextToSpeechTransport]]]): + The transport to use, or a Callable that constructs and returns a new transport. + If a Callable is given, it will be called with the same set of initialization + arguments as used in the TextToSpeechTransport constructor. + If set to None, a transport is chosen automatically. + NOTE: "rest" transport functionality is currently in a + beta state (preview). We welcome your feedback via an + issue in this library's source repository. + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): + Custom options for the client. + + 1. The ``api_endpoint`` property can be used to override the + default endpoint provided by the client when ``transport`` is + not explicitly provided. Only if this property is not set and + ``transport`` was not explicitly provided, the endpoint is + determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment + variable, which have one of the following values: + "always" (always use the default mTLS endpoint), "never" (always + use the default regular endpoint) and "auto" (auto-switch to the + default mTLS endpoint if client certificate is present; this is + the default value). + + 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable + is "true", then the ``client_cert_source`` property can be used + to provide a client certificate for mTLS transport. If + not provided, the default SSL client certificate will be used if + present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not + set, no client certificate will be used. + + 3. The ``universe_domain`` property can be used to override the + default "googleapis.com" universe. Note that the ``api_endpoint`` + property still takes precedence; and ``universe_domain`` is + currently not supported for mTLS. + + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport + creation failed for any reason. + """ + self._client_options = client_options + if isinstance(self._client_options, dict): + self._client_options = client_options_lib.from_dict(self._client_options) + if self._client_options is None: + self._client_options = client_options_lib.ClientOptions() + self._client_options = cast(client_options_lib.ClientOptions, self._client_options) + + universe_domain_opt = getattr(self._client_options, 'universe_domain', None) + + self._use_client_cert, self._use_mtls_endpoint, self._universe_domain_env = TextToSpeechClient._read_environment_variables() + self._client_cert_source = TextToSpeechClient._get_client_cert_source(self._client_options.client_cert_source, self._use_client_cert) + self._universe_domain = TextToSpeechClient._get_universe_domain(universe_domain_opt, self._universe_domain_env) + self._api_endpoint = None # updated below, depending on `transport` + + # Initialize the universe domain validation. + self._is_universe_domain_valid = False + + api_key_value = getattr(self._client_options, "api_key", None) + if api_key_value and credentials: + raise ValueError("client_options.api_key and credentials are mutually exclusive") + + # Save or instantiate the transport. + # Ordinarily, we provide the transport, but allowing a custom transport + # instance provides an extensibility point for unusual situations. + transport_provided = isinstance(transport, TextToSpeechTransport) + if transport_provided: + # transport is a TextToSpeechTransport instance. + if credentials or self._client_options.credentials_file or api_key_value: + raise ValueError("When providing a transport instance, " + "provide its credentials directly.") + if self._client_options.scopes: + raise ValueError( + "When providing a transport instance, provide its scopes " + "directly." + ) + self._transport = cast(TextToSpeechTransport, transport) + self._api_endpoint = self._transport.host + + self._api_endpoint = (self._api_endpoint or + TextToSpeechClient._get_api_endpoint( + self._client_options.api_endpoint, + self._client_cert_source, + self._universe_domain, + self._use_mtls_endpoint)) + + if not transport_provided: + import google.auth._default # type: ignore + + if api_key_value and hasattr(google.auth._default, "get_api_key_credentials"): + credentials = google.auth._default.get_api_key_credentials(api_key_value) + + transport_init: Union[Type[TextToSpeechTransport], Callable[..., TextToSpeechTransport]] = ( + TextToSpeechClient.get_transport_class(transport) + if isinstance(transport, str) or transport is None + else cast(Callable[..., TextToSpeechTransport], transport) + ) + # initialize with the provided callable or the passed in class + self._transport = transport_init( + credentials=credentials, + credentials_file=self._client_options.credentials_file, + host=self._api_endpoint, + scopes=self._client_options.scopes, + client_cert_source_for_mtls=self._client_cert_source, + quota_project_id=self._client_options.quota_project_id, + client_info=client_info, + always_use_jwt_access=True, + api_audience=self._client_options.api_audience, + ) + + def list_voices(self, + request: Optional[Union[cloud_tts.ListVoicesRequest, dict]] = None, + *, + language_code: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> cloud_tts.ListVoicesResponse: + r"""Returns a list of Voice supported for synthesis. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1beta1 + + def sample_list_voices(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechClient() + + # Initialize request argument(s) + request = texttospeech_v1beta1.ListVoicesRequest( + ) + + # Make the request + response = client.list_voices(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.texttospeech_v1beta1.types.ListVoicesRequest, dict]): + The request object. The top-level message sent by the client for the + ``ListVoices`` method. + language_code (str): + Optional. Recommended. + `BCP-47 `__ + language tag. If not specified, the API will return all + supported voices. If specified, the ListVoices call will + only return voices that can be used to synthesize this + language_code. For example, if you specify ``"en-NZ"``, + all ``"en-NZ"`` voices will be returned. If you specify + ``"no"``, both ``"no-\*"`` (Norwegian) and ``"nb-\*"`` + (Norwegian Bokmal) voices will be returned. + + This corresponds to the ``language_code`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.cloud.texttospeech_v1beta1.types.ListVoicesResponse: + The message returned to the client by the ListVoices + method. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([language_code]) + if request is not None and has_flattened_params: + raise ValueError('If the `request` argument is set, then none of ' + 'the individual field arguments should be set.') + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, cloud_tts.ListVoicesRequest): + request = cloud_tts.ListVoicesRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if language_code is not None: + request.language_code = language_code + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.list_voices] + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def synthesize_speech(self, + request: Optional[Union[cloud_tts.SynthesizeSpeechRequest, dict]] = None, + *, + input: Optional[cloud_tts.SynthesisInput] = None, + voice: Optional[cloud_tts.VoiceSelectionParams] = None, + audio_config: Optional[cloud_tts.AudioConfig] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> cloud_tts.SynthesizeSpeechResponse: + r"""Synthesizes speech synchronously: receive results + after all text input has been processed. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1beta1 + + def sample_synthesize_speech(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechClient() + + # Initialize request argument(s) + input = texttospeech_v1beta1.SynthesisInput() + input.text = "text_value" + + voice = texttospeech_v1beta1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + audio_config = texttospeech_v1beta1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + request = texttospeech_v1beta1.SynthesizeSpeechRequest( + input=input, + voice=voice, + audio_config=audio_config, + ) + + # Make the request + response = client.synthesize_speech(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechRequest, dict]): + The request object. The top-level message sent by the client for the + ``SynthesizeSpeech`` method. + input (google.cloud.texttospeech_v1beta1.types.SynthesisInput): + Required. The Synthesizer requires + either plain text or SSML as input. + + This corresponds to the ``input`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + voice (google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams): + Required. The desired voice of the + synthesized audio. + + This corresponds to the ``voice`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + audio_config (google.cloud.texttospeech_v1beta1.types.AudioConfig): + Required. The configuration of the + synthesized audio. + + This corresponds to the ``audio_config`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechResponse: + The message returned to the client by the + SynthesizeSpeech method. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + has_flattened_params = any([input, voice, audio_config]) + if request is not None and has_flattened_params: + raise ValueError('If the `request` argument is set, then none of ' + 'the individual field arguments should be set.') + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, cloud_tts.SynthesizeSpeechRequest): + request = cloud_tts.SynthesizeSpeechRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if input is not None: + request.input = input + if voice is not None: + request.voice = voice + if audio_config is not None: + request.audio_config = audio_config + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.synthesize_speech] + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def streaming_synthesize(self, + requests: Optional[Iterator[cloud_tts.StreamingSynthesizeRequest]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> Iterable[cloud_tts.StreamingSynthesizeResponse]: + r"""Performs bidirectional streaming speech synthesis: + receive audio while sending text. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1beta1 + + def sample_streaming_synthesize(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechClient() + + # Initialize request argument(s) + streaming_config = texttospeech_v1beta1.StreamingSynthesizeConfig() + streaming_config.voice.language_code = "language_code_value" + + request = texttospeech_v1beta1.StreamingSynthesizeRequest( + streaming_config=streaming_config, + ) + + # This method expects an iterator which contains + # 'texttospeech_v1beta1.StreamingSynthesizeRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = client.streaming_synthesize(requests=request_generator()) + + # Handle the response + for response in stream: + print(response) + + Args: + requests (Iterator[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeRequest]): + The request object iterator. Request message for the ``StreamingSynthesize`` method. + Multiple ``StreamingSynthesizeRequest`` messages are + sent in one call. The first message must contain a + ``streaming_config`` that fully specifies the request + configuration and must not contain ``input``. All + subsequent messages must only have ``input`` set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + Iterable[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeResponse]: + StreamingSynthesizeResponse is the only message returned to the + client by StreamingSynthesize method. A series of + zero or more StreamingSynthesizeResponse messages are + streamed back to the client. + + """ + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.streaming_synthesize] + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + requests, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def __enter__(self) -> "TextToSpeechClient": + return self + + def __exit__(self, type, value, traceback): + """Releases underlying transport's resources. + + .. warning:: + ONLY use as a context manager if the transport is NOT shared + with other clients! Exiting the with block will CLOSE the transport + and may cause errors in other clients! + """ + self.transport.close() + + def list_operations( + self, + request: Optional[operations_pb2.ListOperationsRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.ListOperationsResponse: + r"""Lists operations that match the specified filter in the request. + + Args: + request (:class:`~.operations_pb2.ListOperationsRequest`): + The request object. Request message for + `ListOperations` method. + retry (google.api_core.retry.Retry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.ListOperationsResponse: + Response message for ``ListOperations`` method. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.ListOperationsRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.list_operations] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + def get_operation( + self, + request: Optional[operations_pb2.GetOperationRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.Operation: + r"""Gets the latest state of a long-running operation. + + Args: + request (:class:`~.operations_pb2.GetOperationRequest`): + The request object. Request message for + `GetOperation` method. + retry (google.api_core.retry.Retry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.Operation: + An ``Operation`` object. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.GetOperationRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.get_operation] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + + + + + + + + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) + + +__all__ = ( + "TextToSpeechClient", +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/README.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/README.rst new file mode 100644 index 000000000000..37ce873b979b --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/README.rst @@ -0,0 +1,9 @@ + +transport inheritance structure +_______________________________ + +`TextToSpeechTransport` is the ABC for all transports. +- public child `TextToSpeechGrpcTransport` for sync gRPC transport (defined in `grpc.py`). +- public child `TextToSpeechGrpcAsyncIOTransport` for async gRPC transport (defined in `grpc_asyncio.py`). +- private child `_BaseTextToSpeechRestTransport` for base REST transport with inner classes `_BaseMETHOD` (defined in `rest_base.py`). +- public child `TextToSpeechRestTransport` for sync REST transport with inner classes `METHOD` derived from the parent's corresponding `_BaseMETHOD` classes (defined in `rest.py`). diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/__init__.py new file mode 100644 index 000000000000..84d107252aae --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/__init__.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from collections import OrderedDict +from typing import Dict, Type + +from .base import TextToSpeechTransport +from .grpc import TextToSpeechGrpcTransport +from .grpc_asyncio import TextToSpeechGrpcAsyncIOTransport +from .rest import TextToSpeechRestTransport +from .rest import TextToSpeechRestInterceptor + + +# Compile a registry of transports. +_transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechTransport]] +_transport_registry['grpc'] = TextToSpeechGrpcTransport +_transport_registry['grpc_asyncio'] = TextToSpeechGrpcAsyncIOTransport +_transport_registry['rest'] = TextToSpeechRestTransport + +__all__ = ( + 'TextToSpeechTransport', + 'TextToSpeechGrpcTransport', + 'TextToSpeechGrpcAsyncIOTransport', + 'TextToSpeechRestTransport', + 'TextToSpeechRestInterceptor', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/base.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/base.py new file mode 100644 index 000000000000..fc9be644b7d0 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/base.py @@ -0,0 +1,211 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 abc +from typing import Awaitable, Callable, Dict, Optional, Sequence, Union + +from google.cloud.texttospeech_v1beta1 import gapic_version as package_version + +import google.auth # type: ignore +import google.api_core +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.oauth2 import service_account # type: ignore + +from google.cloud.texttospeech_v1beta1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) + + +class TextToSpeechTransport(abc.ABC): + """Abstract transport class for TextToSpeech.""" + + AUTH_SCOPES = ( + 'https://www.googleapis.com/auth/cloud-platform', + ) + + DEFAULT_HOST: str = 'texttospeech.googleapis.com' + def __init__( + self, *, + host: str = DEFAULT_HOST, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + **kwargs, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is mutually exclusive with credentials. + scopes (Optional[Sequence[str]]): A list of scopes. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + """ + + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} + + # Save the scopes. + self._scopes = scopes + if not hasattr(self, "_ignore_credentials"): + self._ignore_credentials: bool = False + + # If no credentials are provided, then determine the appropriate + # defaults. + if credentials and credentials_file: + raise core_exceptions.DuplicateCredentialArgs("'credentials_file' and 'credentials' are mutually exclusive") + + if credentials_file is not None: + credentials, _ = google.auth.load_credentials_from_file( + credentials_file, + **scopes_kwargs, + quota_project_id=quota_project_id + ) + elif credentials is None and not self._ignore_credentials: + credentials, _ = google.auth.default(**scopes_kwargs, quota_project_id=quota_project_id) + # Don't apply audience if the credentials file passed from user. + if hasattr(credentials, "with_gdch_audience"): + credentials = credentials.with_gdch_audience(api_audience if api_audience else host) + + # If the credentials are service account credentials, then always try to use self signed JWT. + if always_use_jwt_access and isinstance(credentials, service_account.Credentials) and hasattr(service_account.Credentials, "with_always_use_jwt_access"): + credentials = credentials.with_always_use_jwt_access(True) + + # Save the credentials. + self._credentials = credentials + + # Save the hostname. Default to port 443 (HTTPS) if none is specified. + if ':' not in host: + host += ':443' + self._host = host + + @property + def host(self): + return self._host + + def _prep_wrapped_messages(self, client_info): + # Precompute the wrapped methods. + self._wrapped_methods = { + self.list_voices: gapic_v1.method.wrap_method( + self.list_voices, + default_timeout=None, + client_info=client_info, + ), + self.synthesize_speech: gapic_v1.method.wrap_method( + self.synthesize_speech, + default_timeout=None, + client_info=client_info, + ), + self.streaming_synthesize: gapic_v1.method.wrap_method( + self.streaming_synthesize, + default_timeout=None, + client_info=client_info, + ), + self.get_operation: gapic_v1.method.wrap_method( + self.get_operation, + default_timeout=None, + client_info=client_info, + ), + self.list_operations: gapic_v1.method.wrap_method( + self.list_operations, + default_timeout=None, + client_info=client_info, + ), + } + + def close(self): + """Closes resources associated with the transport. + + .. warning:: + Only call this method if the transport is NOT shared + with other clients - this may cause errors in other clients! + """ + raise NotImplementedError() + + @property + def list_voices(self) -> Callable[ + [cloud_tts.ListVoicesRequest], + Union[ + cloud_tts.ListVoicesResponse, + Awaitable[cloud_tts.ListVoicesResponse] + ]]: + raise NotImplementedError() + + @property + def synthesize_speech(self) -> Callable[ + [cloud_tts.SynthesizeSpeechRequest], + Union[ + cloud_tts.SynthesizeSpeechResponse, + Awaitable[cloud_tts.SynthesizeSpeechResponse] + ]]: + raise NotImplementedError() + + @property + def streaming_synthesize(self) -> Callable[ + [cloud_tts.StreamingSynthesizeRequest], + Union[ + cloud_tts.StreamingSynthesizeResponse, + Awaitable[cloud_tts.StreamingSynthesizeResponse] + ]]: + raise NotImplementedError() + + @property + def list_operations( + self, + ) -> Callable[ + [operations_pb2.ListOperationsRequest], + Union[operations_pb2.ListOperationsResponse, Awaitable[operations_pb2.ListOperationsResponse]], + ]: + raise NotImplementedError() + + @property + def get_operation( + self, + ) -> Callable[ + [operations_pb2.GetOperationRequest], + Union[operations_pb2.Operation, Awaitable[operations_pb2.Operation]], + ]: + raise NotImplementedError() + + @property + def kind(self) -> str: + raise NotImplementedError() + + +__all__ = ( + 'TextToSpeechTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc.py new file mode 100644 index 000000000000..b4efbccf737b --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc.py @@ -0,0 +1,361 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 warnings +from typing import Callable, Dict, Optional, Sequence, Tuple, Union + +from google.api_core import grpc_helpers +from google.api_core import gapic_v1 +import google.auth # type: ignore +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore + +import grpc # type: ignore + +from google.cloud.texttospeech_v1beta1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore +from .base import TextToSpeechTransport, DEFAULT_CLIENT_INFO + + +class TextToSpeechGrpcTransport(TextToSpeechTransport): + """gRPC backend transport for TextToSpeech. + + Service that implements Google Cloud Text-to-Speech API. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends protocol buffers over the wire using gRPC (which is built on + top of HTTP/2); the ``grpcio`` package must be installed. + """ + _stubs: Dict[str, Callable] + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + This argument is ignored if a ``channel`` instance is provided. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if a ``channel`` instance is provided. + scopes (Optional(Sequence[str])): A list of scopes. This argument is + ignored if a ``channel`` instance is provided. + channel (Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]]): + A ``Channel`` instance through which to make calls, or a Callable + that constructs and returns one. If set to None, ``self.create_channel`` + is used to create the channel. If a Callable is given, it will be called + with the same arguments as used in ``self.create_channel``. + api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. + If provided, it overrides the ``host`` argument and tries to create + a mutual TLS channel with client SSL credentials from + ``client_cert_source`` or application default SSL credentials. + client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): + Deprecated. A callback to provide client SSL certificate bytes and + private key bytes, both in PEM format. It is ignored if + ``api_mtls_endpoint`` is None. + ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials + for the grpc channel. It is ignored if a ``channel`` instance is provided. + client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): + A callback to provide client certificate bytes and private key bytes, + both in PEM format. It is used to configure a mutual TLS channel. It is + ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport + creation failed for any reason. + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + self._grpc_channel = None + self._ssl_channel_credentials = ssl_channel_credentials + self._stubs: Dict[str, Callable] = {} + + if api_mtls_endpoint: + warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) + if client_cert_source: + warnings.warn("client_cert_source is deprecated", DeprecationWarning) + + if isinstance(channel, grpc.Channel): + # Ignore credentials if a channel was passed. + credentials = None + self._ignore_credentials = True + # If a channel was explicitly provided, set it. + self._grpc_channel = channel + self._ssl_channel_credentials = None + + else: + if api_mtls_endpoint: + host = api_mtls_endpoint + + # Create SSL credentials with client_cert_source or application + # default SSL credentials. + if client_cert_source: + cert, key = client_cert_source() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + else: + self._ssl_channel_credentials = SslCredentials().ssl_credentials + + else: + if client_cert_source_for_mtls and not ssl_channel_credentials: + cert, key = client_cert_source_for_mtls() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + + # The base transport sets the host, credentials and scopes + super().__init__( + host=host, + credentials=credentials, + credentials_file=credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + + if not self._grpc_channel: + # initialize with the provided callable or the default channel + channel_init = channel or type(self).create_channel + self._grpc_channel = channel_init( + self._host, + # use the credentials which are saved + credentials=self._credentials, + # Set ``credentials_file`` to ``None`` here as + # the credentials that we saved earlier should be used. + credentials_file=None, + scopes=self._scopes, + ssl_credentials=self._ssl_channel_credentials, + quota_project_id=quota_project_id, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Wrap messages. This must be done after self._grpc_channel exists + self._prep_wrapped_messages(client_info) + + @classmethod + def create_channel(cls, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + **kwargs) -> grpc.Channel: + """Create and return a gRPC channel object. + Args: + host (Optional[str]): The host for the channel to use. + credentials (Optional[~.Credentials]): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If + none are specified, the client will attempt to ascertain + the credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is mutually exclusive with credentials. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + kwargs (Optional[dict]): Keyword arguments, which are passed to the + channel creation. + Returns: + grpc.Channel: A gRPC channel object. + + Raises: + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + + return grpc_helpers.create_channel( + host, + credentials=credentials, + credentials_file=credentials_file, + quota_project_id=quota_project_id, + default_scopes=cls.AUTH_SCOPES, + scopes=scopes, + default_host=cls.DEFAULT_HOST, + **kwargs + ) + + @property + def grpc_channel(self) -> grpc.Channel: + """Return the channel designed to connect to this service. + """ + return self._grpc_channel + + @property + def list_voices(self) -> Callable[ + [cloud_tts.ListVoicesRequest], + cloud_tts.ListVoicesResponse]: + r"""Return a callable for the list voices method over gRPC. + + Returns a list of Voice supported for synthesis. + + Returns: + Callable[[~.ListVoicesRequest], + ~.ListVoicesResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'list_voices' not in self._stubs: + self._stubs['list_voices'] = self.grpc_channel.unary_unary( + '/google.cloud.texttospeech.v1beta1.TextToSpeech/ListVoices', + request_serializer=cloud_tts.ListVoicesRequest.serialize, + response_deserializer=cloud_tts.ListVoicesResponse.deserialize, + ) + return self._stubs['list_voices'] + + @property + def synthesize_speech(self) -> Callable[ + [cloud_tts.SynthesizeSpeechRequest], + cloud_tts.SynthesizeSpeechResponse]: + r"""Return a callable for the synthesize speech method over gRPC. + + Synthesizes speech synchronously: receive results + after all text input has been processed. + + Returns: + Callable[[~.SynthesizeSpeechRequest], + ~.SynthesizeSpeechResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'synthesize_speech' not in self._stubs: + self._stubs['synthesize_speech'] = self.grpc_channel.unary_unary( + '/google.cloud.texttospeech.v1beta1.TextToSpeech/SynthesizeSpeech', + request_serializer=cloud_tts.SynthesizeSpeechRequest.serialize, + response_deserializer=cloud_tts.SynthesizeSpeechResponse.deserialize, + ) + return self._stubs['synthesize_speech'] + + @property + def streaming_synthesize(self) -> Callable[ + [cloud_tts.StreamingSynthesizeRequest], + cloud_tts.StreamingSynthesizeResponse]: + r"""Return a callable for the streaming synthesize method over gRPC. + + Performs bidirectional streaming speech synthesis: + receive audio while sending text. + + Returns: + Callable[[~.StreamingSynthesizeRequest], + ~.StreamingSynthesizeResponse]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'streaming_synthesize' not in self._stubs: + self._stubs['streaming_synthesize'] = self.grpc_channel.stream_stream( + '/google.cloud.texttospeech.v1beta1.TextToSpeech/StreamingSynthesize', + request_serializer=cloud_tts.StreamingSynthesizeRequest.serialize, + response_deserializer=cloud_tts.StreamingSynthesizeResponse.deserialize, + ) + return self._stubs['streaming_synthesize'] + + def close(self): + self.grpc_channel.close() + + @property + def get_operation( + self, + ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: + r"""Return a callable for the get_operation method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_operation" not in self._stubs: + self._stubs["get_operation"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/GetOperation", + request_serializer=operations_pb2.GetOperationRequest.SerializeToString, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs["get_operation"] + + @property + def list_operations( + self, + ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: + r"""Return a callable for the list_operations method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "list_operations" not in self._stubs: + self._stubs["list_operations"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/ListOperations", + request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, + response_deserializer=operations_pb2.ListOperationsResponse.FromString, + ) + return self._stubs["list_operations"] + + @property + def kind(self) -> str: + return "grpc" + + +__all__ = ( + 'TextToSpeechGrpcTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc_asyncio.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc_asyncio.py new file mode 100644 index 000000000000..be218265087f --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc_asyncio.py @@ -0,0 +1,402 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 inspect +import warnings +from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union + +from google.api_core import gapic_v1 +from google.api_core import grpc_helpers_async +from google.api_core import exceptions as core_exceptions +from google.api_core import retry_async as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore + +import grpc # type: ignore +from grpc.experimental import aio # type: ignore + +from google.cloud.texttospeech_v1beta1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore +from .base import TextToSpeechTransport, DEFAULT_CLIENT_INFO +from .grpc import TextToSpeechGrpcTransport + + +class TextToSpeechGrpcAsyncIOTransport(TextToSpeechTransport): + """gRPC AsyncIO backend transport for TextToSpeech. + + Service that implements Google Cloud Text-to-Speech API. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends protocol buffers over the wire using gRPC (which is built on + top of HTTP/2); the ``grpcio`` package must be installed. + """ + + _grpc_channel: aio.Channel + _stubs: Dict[str, Callable] = {} + + @classmethod + def create_channel(cls, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + **kwargs) -> aio.Channel: + """Create and return a gRPC AsyncIO channel object. + Args: + host (Optional[str]): The host for the channel to use. + credentials (Optional[~.Credentials]): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If + none are specified, the client will attempt to ascertain + the credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + kwargs (Optional[dict]): Keyword arguments, which are passed to the + channel creation. + Returns: + aio.Channel: A gRPC AsyncIO channel object. + """ + + return grpc_helpers_async.create_channel( + host, + credentials=credentials, + credentials_file=credentials_file, + quota_project_id=quota_project_id, + default_scopes=cls.AUTH_SCOPES, + scopes=scopes, + default_host=cls.DEFAULT_HOST, + **kwargs + ) + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[Union[aio.Channel, Callable[..., aio.Channel]]] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + This argument is ignored if a ``channel`` instance is provided. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if a ``channel`` instance is provided. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + channel (Optional[Union[aio.Channel, Callable[..., aio.Channel]]]): + A ``Channel`` instance through which to make calls, or a Callable + that constructs and returns one. If set to None, ``self.create_channel`` + is used to create the channel. If a Callable is given, it will be called + with the same arguments as used in ``self.create_channel``. + api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. + If provided, it overrides the ``host`` argument and tries to create + a mutual TLS channel with client SSL credentials from + ``client_cert_source`` or application default SSL credentials. + client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): + Deprecated. A callback to provide client SSL certificate bytes and + private key bytes, both in PEM format. It is ignored if + ``api_mtls_endpoint`` is None. + ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials + for the grpc channel. It is ignored if a ``channel`` instance is provided. + client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): + A callback to provide client certificate bytes and private key bytes, + both in PEM format. It is used to configure a mutual TLS channel. It is + ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + + Raises: + google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport + creation failed for any reason. + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + self._grpc_channel = None + self._ssl_channel_credentials = ssl_channel_credentials + self._stubs: Dict[str, Callable] = {} + + if api_mtls_endpoint: + warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) + if client_cert_source: + warnings.warn("client_cert_source is deprecated", DeprecationWarning) + + if isinstance(channel, aio.Channel): + # Ignore credentials if a channel was passed. + credentials = None + self._ignore_credentials = True + # If a channel was explicitly provided, set it. + self._grpc_channel = channel + self._ssl_channel_credentials = None + else: + if api_mtls_endpoint: + host = api_mtls_endpoint + + # Create SSL credentials with client_cert_source or application + # default SSL credentials. + if client_cert_source: + cert, key = client_cert_source() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + else: + self._ssl_channel_credentials = SslCredentials().ssl_credentials + + else: + if client_cert_source_for_mtls and not ssl_channel_credentials: + cert, key = client_cert_source_for_mtls() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + + # The base transport sets the host, credentials and scopes + super().__init__( + host=host, + credentials=credentials, + credentials_file=credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + + if not self._grpc_channel: + # initialize with the provided callable or the default channel + channel_init = channel or type(self).create_channel + self._grpc_channel = channel_init( + self._host, + # use the credentials which are saved + credentials=self._credentials, + # Set ``credentials_file`` to ``None`` here as + # the credentials that we saved earlier should be used. + credentials_file=None, + scopes=self._scopes, + ssl_credentials=self._ssl_channel_credentials, + quota_project_id=quota_project_id, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Wrap messages. This must be done after self._grpc_channel exists + self._wrap_with_kind = "kind" in inspect.signature(gapic_v1.method_async.wrap_method).parameters + self._prep_wrapped_messages(client_info) + + @property + def grpc_channel(self) -> aio.Channel: + """Create the channel designed to connect to this service. + + This property caches on the instance; repeated calls return + the same channel. + """ + # Return the channel from cache. + return self._grpc_channel + + @property + def list_voices(self) -> Callable[ + [cloud_tts.ListVoicesRequest], + Awaitable[cloud_tts.ListVoicesResponse]]: + r"""Return a callable for the list voices method over gRPC. + + Returns a list of Voice supported for synthesis. + + Returns: + Callable[[~.ListVoicesRequest], + Awaitable[~.ListVoicesResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'list_voices' not in self._stubs: + self._stubs['list_voices'] = self.grpc_channel.unary_unary( + '/google.cloud.texttospeech.v1beta1.TextToSpeech/ListVoices', + request_serializer=cloud_tts.ListVoicesRequest.serialize, + response_deserializer=cloud_tts.ListVoicesResponse.deserialize, + ) + return self._stubs['list_voices'] + + @property + def synthesize_speech(self) -> Callable[ + [cloud_tts.SynthesizeSpeechRequest], + Awaitable[cloud_tts.SynthesizeSpeechResponse]]: + r"""Return a callable for the synthesize speech method over gRPC. + + Synthesizes speech synchronously: receive results + after all text input has been processed. + + Returns: + Callable[[~.SynthesizeSpeechRequest], + Awaitable[~.SynthesizeSpeechResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'synthesize_speech' not in self._stubs: + self._stubs['synthesize_speech'] = self.grpc_channel.unary_unary( + '/google.cloud.texttospeech.v1beta1.TextToSpeech/SynthesizeSpeech', + request_serializer=cloud_tts.SynthesizeSpeechRequest.serialize, + response_deserializer=cloud_tts.SynthesizeSpeechResponse.deserialize, + ) + return self._stubs['synthesize_speech'] + + @property + def streaming_synthesize(self) -> Callable[ + [cloud_tts.StreamingSynthesizeRequest], + Awaitable[cloud_tts.StreamingSynthesizeResponse]]: + r"""Return a callable for the streaming synthesize method over gRPC. + + Performs bidirectional streaming speech synthesis: + receive audio while sending text. + + Returns: + Callable[[~.StreamingSynthesizeRequest], + Awaitable[~.StreamingSynthesizeResponse]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'streaming_synthesize' not in self._stubs: + self._stubs['streaming_synthesize'] = self.grpc_channel.stream_stream( + '/google.cloud.texttospeech.v1beta1.TextToSpeech/StreamingSynthesize', + request_serializer=cloud_tts.StreamingSynthesizeRequest.serialize, + response_deserializer=cloud_tts.StreamingSynthesizeResponse.deserialize, + ) + return self._stubs['streaming_synthesize'] + + def _prep_wrapped_messages(self, client_info): + """ Precompute the wrapped methods, overriding the base class method to use async wrappers.""" + self._wrapped_methods = { + self.list_voices: self._wrap_method( + self.list_voices, + default_timeout=None, + client_info=client_info, + ), + self.synthesize_speech: self._wrap_method( + self.synthesize_speech, + default_timeout=None, + client_info=client_info, + ), + self.streaming_synthesize: self._wrap_method( + self.streaming_synthesize, + default_timeout=None, + client_info=client_info, + ), + self.get_operation: self._wrap_method( + self.get_operation, + default_timeout=None, + client_info=client_info, + ), + self.list_operations: self._wrap_method( + self.list_operations, + default_timeout=None, + client_info=client_info, + ), + } + + def _wrap_method(self, func, *args, **kwargs): + if self._wrap_with_kind: # pragma: NO COVER + kwargs["kind"] = self.kind + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) + + def close(self): + return self.grpc_channel.close() + + @property + def kind(self) -> str: + return "grpc_asyncio" + + @property + def get_operation( + self, + ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: + r"""Return a callable for the get_operation method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_operation" not in self._stubs: + self._stubs["get_operation"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/GetOperation", + request_serializer=operations_pb2.GetOperationRequest.SerializeToString, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs["get_operation"] + + @property + def list_operations( + self, + ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: + r"""Return a callable for the list_operations method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "list_operations" not in self._stubs: + self._stubs["list_operations"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/ListOperations", + request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, + response_deserializer=operations_pb2.ListOperationsResponse.FromString, + ) + return self._stubs["list_operations"] + + +__all__ = ( + 'TextToSpeechGrpcAsyncIOTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py new file mode 100644 index 000000000000..0545222676ab --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py @@ -0,0 +1,599 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# + +from google.auth.transport.requests import AuthorizedSession # type: ignore +import json # type: ignore +from google.auth import credentials as ga_credentials # type: ignore +from google.api_core import exceptions as core_exceptions +from google.api_core import retry as retries +from google.api_core import rest_helpers +from google.api_core import rest_streaming +from google.api_core import gapic_v1 + +from google.protobuf import json_format + +from requests import __version__ as requests_version +import dataclasses +from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union +import warnings + + +from google.cloud.texttospeech_v1beta1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore + + +from .rest_base import _BaseTextToSpeechRestTransport +from .base import DEFAULT_CLIENT_INFO as BASE_DEFAULT_CLIENT_INFO + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object, None] # type: ignore + + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, + grpc_version=None, + rest_version=f"requests@{requests_version}", +) + + +class TextToSpeechRestInterceptor: + """Interceptor for TextToSpeech. + + Interceptors are used to manipulate requests, request metadata, and responses + in arbitrary ways. + Example use cases include: + * Logging + * Verifying requests according to service or custom semantics + * Stripping extraneous information from responses + + These use cases and more can be enabled by injecting an + instance of a custom subclass when constructing the TextToSpeechRestTransport. + + .. code-block:: python + class MyCustomTextToSpeechInterceptor(TextToSpeechRestInterceptor): + def pre_list_voices(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_list_voices(self, response): + logging.log(f"Received response: {response}") + return response + + def pre_synthesize_speech(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_synthesize_speech(self, response): + logging.log(f"Received response: {response}") + return response + + transport = TextToSpeechRestTransport(interceptor=MyCustomTextToSpeechInterceptor()) + client = TextToSpeechClient(transport=transport) + + + """ + def pre_list_voices(self, request: cloud_tts.ListVoicesRequest, metadata: Sequence[Tuple[str, str]]) -> Tuple[cloud_tts.ListVoicesRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for list_voices + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeech server. + """ + return request, metadata + + def post_list_voices(self, response: cloud_tts.ListVoicesResponse) -> cloud_tts.ListVoicesResponse: + """Post-rpc interceptor for list_voices + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeech server but before + it is returned to user code. + """ + return response + + def pre_synthesize_speech(self, request: cloud_tts.SynthesizeSpeechRequest, metadata: Sequence[Tuple[str, str]]) -> Tuple[cloud_tts.SynthesizeSpeechRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for synthesize_speech + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeech server. + """ + return request, metadata + + def post_synthesize_speech(self, response: cloud_tts.SynthesizeSpeechResponse) -> cloud_tts.SynthesizeSpeechResponse: + """Post-rpc interceptor for synthesize_speech + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeech server but before + it is returned to user code. + """ + return response + + def pre_get_operation( + self, request: operations_pb2.GetOperationRequest, metadata: Sequence[Tuple[str, str]] + ) -> Tuple[operations_pb2.GetOperationRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for get_operation + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeech server. + """ + return request, metadata + + def post_get_operation( + self, response: operations_pb2.Operation + ) -> operations_pb2.Operation: + """Post-rpc interceptor for get_operation + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeech server but before + it is returned to user code. + """ + return response + + def pre_list_operations( + self, request: operations_pb2.ListOperationsRequest, metadata: Sequence[Tuple[str, str]] + ) -> Tuple[operations_pb2.ListOperationsRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for list_operations + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeech server. + """ + return request, metadata + + def post_list_operations( + self, response: operations_pb2.ListOperationsResponse + ) -> operations_pb2.ListOperationsResponse: + """Post-rpc interceptor for list_operations + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeech server but before + it is returned to user code. + """ + return response + + +@dataclasses.dataclass +class TextToSpeechRestStub: + _session: AuthorizedSession + _host: str + _interceptor: TextToSpeechRestInterceptor + + +class TextToSpeechRestTransport(_BaseTextToSpeechRestTransport): + """REST backend synchronous transport for TextToSpeech. + + Service that implements Google Cloud Text-to-Speech API. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends JSON representations of protocol buffers over HTTP/1.1 + """ + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + client_cert_source_for_mtls: Optional[Callable[[ + ], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + url_scheme: str = 'https', + interceptor: Optional[TextToSpeechRestInterceptor] = None, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + NOTE: This REST transport functionality is currently in a beta + state (preview). We welcome your feedback via a GitHub issue in + this library's repository. Thank you! + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if ``channel`` is provided. + scopes (Optional(Sequence[str])): A list of scopes. This argument is + ignored if ``channel`` is provided. + client_cert_source_for_mtls (Callable[[], Tuple[bytes, bytes]]): Client + certificate to configure mutual TLS HTTP channel. It is ignored + if ``channel`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you are developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + url_scheme: the protocol scheme for the API endpoint. Normally + "https", but for testing or local servers, + "http" can be specified. + """ + # Run the base constructor + # TODO(yon-mg): resolve other ctor params i.e. scopes, quota, etc. + # TODO: When custom host (api_endpoint) is set, `scopes` must *also* be set on the + # credentials object + super().__init__( + host=host, + credentials=credentials, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + url_scheme=url_scheme, + api_audience=api_audience + ) + self._session = AuthorizedSession( + self._credentials, default_host=self.DEFAULT_HOST) + if client_cert_source_for_mtls: + self._session.configure_mtls_channel(client_cert_source_for_mtls) + self._interceptor = interceptor or TextToSpeechRestInterceptor() + self._prep_wrapped_messages(client_info) + + class _ListVoices(_BaseTextToSpeechRestTransport._BaseListVoices, TextToSpeechRestStub): + def __hash__(self): + return hash("TextToSpeechRestTransport.ListVoices") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + return response + + def __call__(self, + request: cloud_tts.ListVoicesRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> cloud_tts.ListVoicesResponse: + r"""Call the list voices method over HTTP. + + Args: + request (~.cloud_tts.ListVoicesRequest): + The request object. The top-level message sent by the client for the + ``ListVoices`` method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.cloud_tts.ListVoicesResponse: + The message returned to the client by the ``ListVoices`` + method. + + """ + + http_options = _BaseTextToSpeechRestTransport._BaseListVoices._get_http_options() + request, metadata = self._interceptor.pre_list_voices(request, metadata) + transcoded_request = _BaseTextToSpeechRestTransport._BaseListVoices._get_transcoded_request(http_options, request) + + # Jsonify the query params + query_params = _BaseTextToSpeechRestTransport._BaseListVoices._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechRestTransport._ListVoices._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = cloud_tts.ListVoicesResponse() + pb_resp = cloud_tts.ListVoicesResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_list_voices(resp) + return resp + + class _StreamingSynthesize(_BaseTextToSpeechRestTransport._BaseStreamingSynthesize, TextToSpeechRestStub): + def __hash__(self): + return hash("TextToSpeechRestTransport.StreamingSynthesize") + + def __call__(self, + request: cloud_tts.StreamingSynthesizeRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> rest_streaming.ResponseIterator: + raise NotImplementedError( + "Method StreamingSynthesize is not available over REST transport" + ) + class _SynthesizeSpeech(_BaseTextToSpeechRestTransport._BaseSynthesizeSpeech, TextToSpeechRestStub): + def __hash__(self): + return hash("TextToSpeechRestTransport.SynthesizeSpeech") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + return response + + def __call__(self, + request: cloud_tts.SynthesizeSpeechRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> cloud_tts.SynthesizeSpeechResponse: + r"""Call the synthesize speech method over HTTP. + + Args: + request (~.cloud_tts.SynthesizeSpeechRequest): + The request object. The top-level message sent by the client for the + ``SynthesizeSpeech`` method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.cloud_tts.SynthesizeSpeechResponse: + The message returned to the client by the + ``SynthesizeSpeech`` method. + + """ + + http_options = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_http_options() + request, metadata = self._interceptor.pre_synthesize_speech(request, metadata) + transcoded_request = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_transcoded_request(http_options, request) + + body = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_request_body_json(transcoded_request) + + # Jsonify the query params + query_params = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechRestTransport._SynthesizeSpeech._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request, body) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = cloud_tts.SynthesizeSpeechResponse() + pb_resp = cloud_tts.SynthesizeSpeechResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + resp = self._interceptor.post_synthesize_speech(resp) + return resp + + @property + def list_voices(self) -> Callable[ + [cloud_tts.ListVoicesRequest], + cloud_tts.ListVoicesResponse]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._ListVoices(self._session, self._host, self._interceptor) # type: ignore + + @property + def streaming_synthesize(self) -> Callable[ + [cloud_tts.StreamingSynthesizeRequest], + cloud_tts.StreamingSynthesizeResponse]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._StreamingSynthesize(self._session, self._host, self._interceptor) # type: ignore + + @property + def synthesize_speech(self) -> Callable[ + [cloud_tts.SynthesizeSpeechRequest], + cloud_tts.SynthesizeSpeechResponse]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._SynthesizeSpeech(self._session, self._host, self._interceptor) # type: ignore + + @property + def get_operation(self): + return self._GetOperation(self._session, self._host, self._interceptor) # type: ignore + + class _GetOperation(_BaseTextToSpeechRestTransport._BaseGetOperation, TextToSpeechRestStub): + def __hash__(self): + return hash("TextToSpeechRestTransport.GetOperation") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + return response + + def __call__(self, + request: operations_pb2.GetOperationRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> operations_pb2.Operation: + + r"""Call the get operation method over HTTP. + + Args: + request (operations_pb2.GetOperationRequest): + The request object for GetOperation method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + operations_pb2.Operation: Response from GetOperation method. + """ + + http_options = _BaseTextToSpeechRestTransport._BaseGetOperation._get_http_options() + request, metadata = self._interceptor.pre_get_operation(request, metadata) + transcoded_request = _BaseTextToSpeechRestTransport._BaseGetOperation._get_transcoded_request(http_options, request) + + # Jsonify the query params + query_params = _BaseTextToSpeechRestTransport._BaseGetOperation._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechRestTransport._GetOperation._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + content = response.content.decode("utf-8") + resp = operations_pb2.Operation() + resp = json_format.Parse(content, resp) + resp = self._interceptor.post_get_operation(resp) + return resp + + @property + def list_operations(self): + return self._ListOperations(self._session, self._host, self._interceptor) # type: ignore + + class _ListOperations(_BaseTextToSpeechRestTransport._BaseListOperations, TextToSpeechRestStub): + def __hash__(self): + return hash("TextToSpeechRestTransport.ListOperations") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + return response + + def __call__(self, + request: operations_pb2.ListOperationsRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> operations_pb2.ListOperationsResponse: + + r"""Call the list operations method over HTTP. + + Args: + request (operations_pb2.ListOperationsRequest): + The request object for ListOperations method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + operations_pb2.ListOperationsResponse: Response from ListOperations method. + """ + + http_options = _BaseTextToSpeechRestTransport._BaseListOperations._get_http_options() + request, metadata = self._interceptor.pre_list_operations(request, metadata) + transcoded_request = _BaseTextToSpeechRestTransport._BaseListOperations._get_transcoded_request(http_options, request) + + # Jsonify the query params + query_params = _BaseTextToSpeechRestTransport._BaseListOperations._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechRestTransport._ListOperations._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + content = response.content.decode("utf-8") + resp = operations_pb2.ListOperationsResponse() + resp = json_format.Parse(content, resp) + resp = self._interceptor.post_list_operations(resp) + return resp + + @property + def kind(self) -> str: + return "rest" + + def close(self): + self._session.close() + + +__all__=( + 'TextToSpeechRestTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest_base.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest_base.py new file mode 100644 index 000000000000..f1752d008c12 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest_base.py @@ -0,0 +1,220 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 json # type: ignore +from google.api_core import path_template +from google.api_core import gapic_v1 + +from google.protobuf import json_format +from .base import TextToSpeechTransport, DEFAULT_CLIENT_INFO + +import re +from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union + + +from google.cloud.texttospeech_v1beta1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore + + +class _BaseTextToSpeechRestTransport(TextToSpeechTransport): + """Base REST backend transport for TextToSpeech. + + Note: This class is not meant to be used directly. Use its sync and + async sub-classes instead. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends JSON representations of protocol buffers over HTTP/1.1 + """ + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[Any] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + url_scheme: str = 'https', + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[Any]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you are developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + url_scheme: the protocol scheme for the API endpoint. Normally + "https", but for testing or local servers, + "http" can be specified. + """ + # Run the base constructor + maybe_url_match = re.match("^(?Phttp(?:s)?://)?(?P.*)$", host) + if maybe_url_match is None: + raise ValueError(f"Unexpected hostname structure: {host}") # pragma: NO COVER + + url_match_items = maybe_url_match.groupdict() + + host = f"{url_scheme}://{host}" if not url_match_items["scheme"] else host + + super().__init__( + host=host, + credentials=credentials, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience + ) + + class _BaseListVoices: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'get', + 'uri': '/v1beta1/voices', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = cloud_tts.ListVoicesRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json_format.MessageToJson( + transcoded_request['query_params'], + use_integers_for_enums=False, + )) + + return query_params + + class _BaseStreamingSynthesize: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + class _BaseSynthesizeSpeech: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = { + } + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return {k: v for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() if k not in message_dict} + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'post', + 'uri': '/v1beta1/text:synthesize', + 'body': '*', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = cloud_tts.SynthesizeSpeechRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_request_body_json(transcoded_request): + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request['body'], + use_integers_for_enums=False + ) + return body + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json_format.MessageToJson( + transcoded_request['query_params'], + use_integers_for_enums=False, + )) + query_params.update(_BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_unset_required_fields(query_params)) + + return query_params + + class _BaseGetOperation: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'get', + 'uri': '/v1beta1/{name=projects/*/locations/*/operations/*}', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + request_kwargs = json_format.MessageToDict(request) + transcoded_request = path_template.transcode( + http_options, **request_kwargs) + return transcoded_request + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json.dumps(transcoded_request['query_params'])) + return query_params + + class _BaseListOperations: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'get', + 'uri': '/v1beta1/{name=projects/*/locations/*}/operations', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + request_kwargs = json_format.MessageToDict(request) + transcoded_request = path_template.transcode( + http_options, **request_kwargs) + return transcoded_request + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json.dumps(transcoded_request['query_params'])) + return query_params + + +__all__=( + '_BaseTextToSpeechRestTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/__init__.py new file mode 100644 index 000000000000..9a4b4f08eb08 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from .client import TextToSpeechLongAudioSynthesizeClient +from .async_client import TextToSpeechLongAudioSynthesizeAsyncClient + +__all__ = ( + 'TextToSpeechLongAudioSynthesizeClient', + 'TextToSpeechLongAudioSynthesizeAsyncClient', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/async_client.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/async_client.py new file mode 100644 index 000000000000..ec142430a338 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/async_client.py @@ -0,0 +1,454 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from collections import OrderedDict +import re +from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union + +from google.cloud.texttospeech_v1beta1 import gapic_version as package_version + +from google.api_core.client_options import ClientOptions +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry_async as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.oauth2 import service_account # type: ignore + + +try: + OptionalRetry = Union[retries.AsyncRetry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.AsyncRetry, object, None] # type: ignore + +from google.api_core import operation # type: ignore +from google.api_core import operation_async # type: ignore +from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore +from .transports.base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO +from .transports.grpc_asyncio import TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport +from .client import TextToSpeechLongAudioSynthesizeClient + + +class TextToSpeechLongAudioSynthesizeAsyncClient: + """Service that implements Google Cloud Text-to-Speech API.""" + + _client: TextToSpeechLongAudioSynthesizeClient + + # Copy defaults from the synchronous client for use here. + # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. + DEFAULT_ENDPOINT = TextToSpeechLongAudioSynthesizeClient.DEFAULT_ENDPOINT + DEFAULT_MTLS_ENDPOINT = TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT + _DEFAULT_ENDPOINT_TEMPLATE = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE + _DEFAULT_UNIVERSE = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + + model_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.model_path) + parse_model_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_model_path) + common_billing_account_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_billing_account_path) + parse_common_billing_account_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_billing_account_path) + common_folder_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_folder_path) + parse_common_folder_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_folder_path) + common_organization_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_organization_path) + parse_common_organization_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_organization_path) + common_project_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_project_path) + parse_common_project_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_project_path) + common_location_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_location_path) + parse_common_location_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_location_path) + + @classmethod + def from_service_account_info(cls, info: dict, *args, **kwargs): + """Creates an instance of this client using the provided credentials + info. + + Args: + info (dict): The service account private key info. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechLongAudioSynthesizeAsyncClient: The constructed client. + """ + return TextToSpeechLongAudioSynthesizeClient.from_service_account_info.__func__(TextToSpeechLongAudioSynthesizeAsyncClient, info, *args, **kwargs) # type: ignore + + @classmethod + def from_service_account_file(cls, filename: str, *args, **kwargs): + """Creates an instance of this client using the provided credentials + file. + + Args: + filename (str): The path to the service account private key json + file. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechLongAudioSynthesizeAsyncClient: The constructed client. + """ + return TextToSpeechLongAudioSynthesizeClient.from_service_account_file.__func__(TextToSpeechLongAudioSynthesizeAsyncClient, filename, *args, **kwargs) # type: ignore + + from_service_account_json = from_service_account_file + + @classmethod + def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[ClientOptions] = None): + """Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variable is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + return TextToSpeechLongAudioSynthesizeClient.get_mtls_endpoint_and_cert_source(client_options) # type: ignore + + @property + def transport(self) -> TextToSpeechLongAudioSynthesizeTransport: + """Returns the transport used by the client instance. + + Returns: + TextToSpeechLongAudioSynthesizeTransport: The transport used by the client instance. + """ + return self._client.transport + + @property + def api_endpoint(self): + """Return the API endpoint used by the client instance. + + Returns: + str: The API endpoint used by the client instance. + """ + return self._client._api_endpoint + + @property + def universe_domain(self) -> str: + """Return the universe domain used by the client instance. + + Returns: + str: The universe domain used + by the client instance. + """ + return self._client._universe_domain + + get_transport_class = TextToSpeechLongAudioSynthesizeClient.get_transport_class + + def __init__(self, *, + credentials: Optional[ga_credentials.Credentials] = None, + transport: Optional[Union[str, TextToSpeechLongAudioSynthesizeTransport, Callable[..., TextToSpeechLongAudioSynthesizeTransport]]] = "grpc_asyncio", + client_options: Optional[ClientOptions] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + ) -> None: + """Instantiates the text to speech long audio synthesize async client. + + Args: + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + transport (Optional[Union[str,TextToSpeechLongAudioSynthesizeTransport,Callable[..., TextToSpeechLongAudioSynthesizeTransport]]]): + The transport to use, or a Callable that constructs and returns a new transport to use. + If a Callable is given, it will be called with the same set of initialization + arguments as used in the TextToSpeechLongAudioSynthesizeTransport constructor. + If set to None, a transport is chosen automatically. + NOTE: "rest" transport functionality is currently in a + beta state (preview). We welcome your feedback via an + issue in this library's source repository. + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): + Custom options for the client. + + 1. The ``api_endpoint`` property can be used to override the + default endpoint provided by the client when ``transport`` is + not explicitly provided. Only if this property is not set and + ``transport`` was not explicitly provided, the endpoint is + determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment + variable, which have one of the following values: + "always" (always use the default mTLS endpoint), "never" (always + use the default regular endpoint) and "auto" (auto-switch to the + default mTLS endpoint if client certificate is present; this is + the default value). + + 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable + is "true", then the ``client_cert_source`` property can be used + to provide a client certificate for mTLS transport. If + not provided, the default SSL client certificate will be used if + present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not + set, no client certificate will be used. + + 3. The ``universe_domain`` property can be used to override the + default "googleapis.com" universe. Note that ``api_endpoint`` + property still takes precedence; and ``universe_domain`` is + currently not supported for mTLS. + + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + + Raises: + google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport + creation failed for any reason. + """ + self._client = TextToSpeechLongAudioSynthesizeClient( + credentials=credentials, + transport=transport, + client_options=client_options, + client_info=client_info, + + ) + + async def synthesize_long_audio(self, + request: Optional[Union[cloud_tts_lrs.SynthesizeLongAudioRequest, dict]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operation_async.AsyncOperation: + r"""Synthesizes long form text asynchronously. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1beta1 + + async def sample_synthesize_long_audio(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeAsyncClient() + + # Initialize request argument(s) + input = texttospeech_v1beta1.SynthesisInput() + input.text = "text_value" + + audio_config = texttospeech_v1beta1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + voice = texttospeech_v1beta1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + request = texttospeech_v1beta1.SynthesizeLongAudioRequest( + input=input, + audio_config=audio_config, + output_gcs_uri="output_gcs_uri_value", + voice=voice, + ) + + # Make the request + operation = client.synthesize_long_audio(request=request) + + print("Waiting for operation to complete...") + + response = (await operation).result() + + # Handle the response + print(response) + + Args: + request (Optional[Union[google.cloud.texttospeech_v1beta1.types.SynthesizeLongAudioRequest, dict]]): + The request object. The top-level message sent by the client for the + ``SynthesizeLongAudio`` method. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.api_core.operation_async.AsyncOperation: + An object representing a long-running operation. + + The result type for the operation will be + :class:`google.cloud.texttospeech_v1beta1.types.SynthesizeLongAudioResponse` + The message returned to the client by the + SynthesizeLongAudio method. + + """ + # Create or coerce a protobuf request object. + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, cloud_tts_lrs.SynthesizeLongAudioRequest): + request = cloud_tts_lrs.SynthesizeLongAudioRequest(request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._client._transport._wrapped_methods[self._client._transport.synthesize_long_audio] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(( + ("parent", request.parent), + )), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Wrap the response in an operation future. + response = operation_async.from_gapic( + response, + self._client._transport.operations_client, + cloud_tts_lrs.SynthesizeLongAudioResponse, + metadata_type=cloud_tts_lrs.SynthesizeLongAudioMetadata, + ) + + # Done; return the response. + return response + + async def list_operations( + self, + request: Optional[operations_pb2.ListOperationsRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.ListOperationsResponse: + r"""Lists operations that match the specified filter in the request. + + Args: + request (:class:`~.operations_pb2.ListOperationsRequest`): + The request object. Request message for + `ListOperations` method. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.ListOperationsResponse: + Response message for ``ListOperations`` method. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.ListOperationsRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self.transport._wrapped_methods[self._client._transport.list_operations] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + async def get_operation( + self, + request: Optional[operations_pb2.GetOperationRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.Operation: + r"""Gets the latest state of a long-running operation. + + Args: + request (:class:`~.operations_pb2.GetOperationRequest`): + The request object. Request message for + `GetOperation` method. + retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.Operation: + An ``Operation`` object. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.GetOperationRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self.transport._wrapped_methods[self._client._transport.get_operation] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._client._validate_universe_domain() + + # Send the request. + response = await rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + async def __aenter__(self) -> "TextToSpeechLongAudioSynthesizeAsyncClient": + return self + + async def __aexit__(self, exc_type, exc, tb): + await self.transport.close() + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) + + +__all__ = ( + "TextToSpeechLongAudioSynthesizeAsyncClient", +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/client.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/client.py new file mode 100644 index 000000000000..c3877f090f4e --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/client.py @@ -0,0 +1,813 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from collections import OrderedDict +import os +import re +from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union, cast +import warnings + +from google.cloud.texttospeech_v1beta1 import gapic_version as package_version + +from google.api_core import client_options as client_options_lib +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport import mtls # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore +from google.auth.exceptions import MutualTLSChannelError # type: ignore +from google.oauth2 import service_account # type: ignore + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object, None] # type: ignore + +from google.api_core import operation # type: ignore +from google.api_core import operation_async # type: ignore +from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore +from .transports.base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO +from .transports.grpc import TextToSpeechLongAudioSynthesizeGrpcTransport +from .transports.grpc_asyncio import TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport +from .transports.rest import TextToSpeechLongAudioSynthesizeRestTransport + + +class TextToSpeechLongAudioSynthesizeClientMeta(type): + """Metaclass for the TextToSpeechLongAudioSynthesize client. + + This provides class-level methods for building and retrieving + support objects (e.g. transport) without polluting the client instance + objects. + """ + _transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechLongAudioSynthesizeTransport]] + _transport_registry["grpc"] = TextToSpeechLongAudioSynthesizeGrpcTransport + _transport_registry["grpc_asyncio"] = TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport + _transport_registry["rest"] = TextToSpeechLongAudioSynthesizeRestTransport + + def get_transport_class(cls, + label: Optional[str] = None, + ) -> Type[TextToSpeechLongAudioSynthesizeTransport]: + """Returns an appropriate transport class. + + Args: + label: The name of the desired transport. If none is + provided, then the first transport in the registry is used. + + Returns: + The transport class to use. + """ + # If a specific transport is requested, return that one. + if label: + return cls._transport_registry[label] + + # No transport is requested; return the default (that is, the first one + # in the dictionary). + return next(iter(cls._transport_registry.values())) + + +class TextToSpeechLongAudioSynthesizeClient(metaclass=TextToSpeechLongAudioSynthesizeClientMeta): + """Service that implements Google Cloud Text-to-Speech API.""" + + @staticmethod + def _get_default_mtls_endpoint(api_endpoint): + """Converts api endpoint to mTLS endpoint. + + Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to + "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively. + Args: + api_endpoint (Optional[str]): the api endpoint to convert. + Returns: + str: converted mTLS api endpoint. + """ + if not api_endpoint: + return api_endpoint + + mtls_endpoint_re = re.compile( + r"(?P[^.]+)(?P\.mtls)?(?P\.sandbox)?(?P\.googleapis\.com)?" + ) + + m = mtls_endpoint_re.match(api_endpoint) + name, mtls, sandbox, googledomain = m.groups() + if mtls or not googledomain: + return api_endpoint + + if sandbox: + return api_endpoint.replace( + "sandbox.googleapis.com", "mtls.sandbox.googleapis.com" + ) + + return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com") + + # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. + DEFAULT_ENDPOINT = "texttospeech.googleapis.com" + DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore + DEFAULT_ENDPOINT + ) + + _DEFAULT_ENDPOINT_TEMPLATE = "texttospeech.{UNIVERSE_DOMAIN}" + _DEFAULT_UNIVERSE = "googleapis.com" + + @classmethod + def from_service_account_info(cls, info: dict, *args, **kwargs): + """Creates an instance of this client using the provided credentials + info. + + Args: + info (dict): The service account private key info. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechLongAudioSynthesizeClient: The constructed client. + """ + credentials = service_account.Credentials.from_service_account_info(info) + kwargs["credentials"] = credentials + return cls(*args, **kwargs) + + @classmethod + def from_service_account_file(cls, filename: str, *args, **kwargs): + """Creates an instance of this client using the provided credentials + file. + + Args: + filename (str): The path to the service account private key json + file. + args: Additional arguments to pass to the constructor. + kwargs: Additional arguments to pass to the constructor. + + Returns: + TextToSpeechLongAudioSynthesizeClient: The constructed client. + """ + credentials = service_account.Credentials.from_service_account_file( + filename) + kwargs["credentials"] = credentials + return cls(*args, **kwargs) + + from_service_account_json = from_service_account_file + + @property + def transport(self) -> TextToSpeechLongAudioSynthesizeTransport: + """Returns the transport used by the client instance. + + Returns: + TextToSpeechLongAudioSynthesizeTransport: The transport used by the client + instance. + """ + return self._transport + + @staticmethod + def model_path(project: str,location: str,model: str,) -> str: + """Returns a fully-qualified model string.""" + return "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) + + @staticmethod + def parse_model_path(path: str) -> Dict[str,str]: + """Parses a model path into its component segments.""" + m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)/models/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_billing_account_path(billing_account: str, ) -> str: + """Returns a fully-qualified billing_account string.""" + return "billingAccounts/{billing_account}".format(billing_account=billing_account, ) + + @staticmethod + def parse_common_billing_account_path(path: str) -> Dict[str,str]: + """Parse a billing_account path into its component segments.""" + m = re.match(r"^billingAccounts/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_folder_path(folder: str, ) -> str: + """Returns a fully-qualified folder string.""" + return "folders/{folder}".format(folder=folder, ) + + @staticmethod + def parse_common_folder_path(path: str) -> Dict[str,str]: + """Parse a folder path into its component segments.""" + m = re.match(r"^folders/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_organization_path(organization: str, ) -> str: + """Returns a fully-qualified organization string.""" + return "organizations/{organization}".format(organization=organization, ) + + @staticmethod + def parse_common_organization_path(path: str) -> Dict[str,str]: + """Parse a organization path into its component segments.""" + m = re.match(r"^organizations/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_project_path(project: str, ) -> str: + """Returns a fully-qualified project string.""" + return "projects/{project}".format(project=project, ) + + @staticmethod + def parse_common_project_path(path: str) -> Dict[str,str]: + """Parse a project path into its component segments.""" + m = re.match(r"^projects/(?P.+?)$", path) + return m.groupdict() if m else {} + + @staticmethod + def common_location_path(project: str, location: str, ) -> str: + """Returns a fully-qualified location string.""" + return "projects/{project}/locations/{location}".format(project=project, location=location, ) + + @staticmethod + def parse_common_location_path(path: str) -> Dict[str,str]: + """Parse a location path into its component segments.""" + m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path) + return m.groupdict() if m else {} + + @classmethod + def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[client_options_lib.ClientOptions] = None): + """Deprecated. Return the API endpoint and client cert source for mutual TLS. + + The client cert source is determined in the following order: + (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the + client cert source is None. + (2) if `client_options.client_cert_source` is provided, use the provided one; if the + default client cert source exists, use the default one; otherwise the client cert + source is None. + + The API endpoint is determined in the following order: + (1) if `client_options.api_endpoint` if provided, use the provided one. + (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the + default mTLS endpoint; if the environment variable is "never", use the default API + endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise + use the default API endpoint. + + More details can be found at https://google.aip.dev/auth/4114. + + Args: + client_options (google.api_core.client_options.ClientOptions): Custom options for the + client. Only the `api_endpoint` and `client_cert_source` properties may be used + in this method. + + Returns: + Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the + client cert source to use. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If any errors happen. + """ + + warnings.warn("get_mtls_endpoint_and_cert_source is deprecated. Use the api_endpoint property instead.", + DeprecationWarning) + if client_options is None: + client_options = client_options_lib.ClientOptions() + use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") + use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") + if use_client_cert not in ("true", "false"): + raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") + if use_mtls_endpoint not in ("auto", "never", "always"): + raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") + + # Figure out the client cert source to use. + client_cert_source = None + if use_client_cert == "true": + if client_options.client_cert_source: + client_cert_source = client_options.client_cert_source + elif mtls.has_default_client_cert_source(): + client_cert_source = mtls.default_client_cert_source() + + # Figure out which api endpoint to use. + if client_options.api_endpoint is not None: + api_endpoint = client_options.api_endpoint + elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): + api_endpoint = cls.DEFAULT_MTLS_ENDPOINT + else: + api_endpoint = cls.DEFAULT_ENDPOINT + + return api_endpoint, client_cert_source + + @staticmethod + def _read_environment_variables(): + """Returns the environment variables used by the client. + + Returns: + Tuple[bool, str, str]: returns the GOOGLE_API_USE_CLIENT_CERTIFICATE, + GOOGLE_API_USE_MTLS_ENDPOINT, and GOOGLE_CLOUD_UNIVERSE_DOMAIN environment variables. + + Raises: + ValueError: If GOOGLE_API_USE_CLIENT_CERTIFICATE is not + any of ["true", "false"]. + google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT + is not any of ["auto", "never", "always"]. + """ + use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false").lower() + use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower() + universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN") + if use_client_cert not in ("true", "false"): + raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") + if use_mtls_endpoint not in ("auto", "never", "always"): + raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") + return use_client_cert == "true", use_mtls_endpoint, universe_domain_env + + @staticmethod + def _get_client_cert_source(provided_cert_source, use_cert_flag): + """Return the client cert source to be used by the client. + + Args: + provided_cert_source (bytes): The client certificate source provided. + use_cert_flag (bool): A flag indicating whether to use the client certificate. + + Returns: + bytes or None: The client cert source to be used by the client. + """ + client_cert_source = None + if use_cert_flag: + if provided_cert_source: + client_cert_source = provided_cert_source + elif mtls.has_default_client_cert_source(): + client_cert_source = mtls.default_client_cert_source() + return client_cert_source + + @staticmethod + def _get_api_endpoint(api_override, client_cert_source, universe_domain, use_mtls_endpoint): + """Return the API endpoint used by the client. + + Args: + api_override (str): The API endpoint override. If specified, this is always + the return value of this function and the other arguments are not used. + client_cert_source (bytes): The client certificate source used by the client. + universe_domain (str): The universe domain used by the client. + use_mtls_endpoint (str): How to use the mTLS endpoint, which depends also on the other parameters. + Possible values are "always", "auto", or "never". + + Returns: + str: The API endpoint to be used by the client. + """ + if api_override is not None: + api_endpoint = api_override + elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): + _default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + if universe_domain != _default_universe: + raise MutualTLSChannelError(f"mTLS is not supported in any universe other than {_default_universe}.") + api_endpoint = TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT + else: + api_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=universe_domain) + return api_endpoint + + @staticmethod + def _get_universe_domain(client_universe_domain: Optional[str], universe_domain_env: Optional[str]) -> str: + """Return the universe domain used by the client. + + Args: + client_universe_domain (Optional[str]): The universe domain configured via the client options. + universe_domain_env (Optional[str]): The universe domain configured via the "GOOGLE_CLOUD_UNIVERSE_DOMAIN" environment variable. + + Returns: + str: The universe domain to be used by the client. + + Raises: + ValueError: If the universe domain is an empty string. + """ + universe_domain = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + if client_universe_domain is not None: + universe_domain = client_universe_domain + elif universe_domain_env is not None: + universe_domain = universe_domain_env + if len(universe_domain.strip()) == 0: + raise ValueError("Universe Domain cannot be an empty string.") + return universe_domain + + @staticmethod + def _compare_universes(client_universe: str, + credentials: ga_credentials.Credentials) -> bool: + """Returns True iff the universe domains used by the client and credentials match. + + Args: + client_universe (str): The universe domain configured via the client options. + credentials (ga_credentials.Credentials): The credentials being used in the client. + + Returns: + bool: True iff client_universe matches the universe in credentials. + + Raises: + ValueError: when client_universe does not match the universe in credentials. + """ + + default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + credentials_universe = getattr(credentials, "universe_domain", default_universe) + + if client_universe != credentials_universe: + raise ValueError("The configured universe domain " + f"({client_universe}) does not match the universe domain " + f"found in the credentials ({credentials_universe}). " + "If you haven't configured the universe domain explicitly, " + f"`{default_universe}` is the default.") + return True + + def _validate_universe_domain(self): + """Validates client's and credentials' universe domains are consistent. + + Returns: + bool: True iff the configured universe domain is valid. + + Raises: + ValueError: If the configured universe domain is not valid. + """ + self._is_universe_domain_valid = (self._is_universe_domain_valid or + TextToSpeechLongAudioSynthesizeClient._compare_universes(self.universe_domain, self.transport._credentials)) + return self._is_universe_domain_valid + + @property + def api_endpoint(self): + """Return the API endpoint used by the client instance. + + Returns: + str: The API endpoint used by the client instance. + """ + return self._api_endpoint + + @property + def universe_domain(self) -> str: + """Return the universe domain used by the client instance. + + Returns: + str: The universe domain used by the client instance. + """ + return self._universe_domain + + def __init__(self, *, + credentials: Optional[ga_credentials.Credentials] = None, + transport: Optional[Union[str, TextToSpeechLongAudioSynthesizeTransport, Callable[..., TextToSpeechLongAudioSynthesizeTransport]]] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + ) -> None: + """Instantiates the text to speech long audio synthesize client. + + Args: + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + transport (Optional[Union[str,TextToSpeechLongAudioSynthesizeTransport,Callable[..., TextToSpeechLongAudioSynthesizeTransport]]]): + The transport to use, or a Callable that constructs and returns a new transport. + If a Callable is given, it will be called with the same set of initialization + arguments as used in the TextToSpeechLongAudioSynthesizeTransport constructor. + If set to None, a transport is chosen automatically. + NOTE: "rest" transport functionality is currently in a + beta state (preview). We welcome your feedback via an + issue in this library's source repository. + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): + Custom options for the client. + + 1. The ``api_endpoint`` property can be used to override the + default endpoint provided by the client when ``transport`` is + not explicitly provided. Only if this property is not set and + ``transport`` was not explicitly provided, the endpoint is + determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment + variable, which have one of the following values: + "always" (always use the default mTLS endpoint), "never" (always + use the default regular endpoint) and "auto" (auto-switch to the + default mTLS endpoint if client certificate is present; this is + the default value). + + 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable + is "true", then the ``client_cert_source`` property can be used + to provide a client certificate for mTLS transport. If + not provided, the default SSL client certificate will be used if + present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not + set, no client certificate will be used. + + 3. The ``universe_domain`` property can be used to override the + default "googleapis.com" universe. Note that the ``api_endpoint`` + property still takes precedence; and ``universe_domain`` is + currently not supported for mTLS. + + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport + creation failed for any reason. + """ + self._client_options = client_options + if isinstance(self._client_options, dict): + self._client_options = client_options_lib.from_dict(self._client_options) + if self._client_options is None: + self._client_options = client_options_lib.ClientOptions() + self._client_options = cast(client_options_lib.ClientOptions, self._client_options) + + universe_domain_opt = getattr(self._client_options, 'universe_domain', None) + + self._use_client_cert, self._use_mtls_endpoint, self._universe_domain_env = TextToSpeechLongAudioSynthesizeClient._read_environment_variables() + self._client_cert_source = TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(self._client_options.client_cert_source, self._use_client_cert) + self._universe_domain = TextToSpeechLongAudioSynthesizeClient._get_universe_domain(universe_domain_opt, self._universe_domain_env) + self._api_endpoint = None # updated below, depending on `transport` + + # Initialize the universe domain validation. + self._is_universe_domain_valid = False + + api_key_value = getattr(self._client_options, "api_key", None) + if api_key_value and credentials: + raise ValueError("client_options.api_key and credentials are mutually exclusive") + + # Save or instantiate the transport. + # Ordinarily, we provide the transport, but allowing a custom transport + # instance provides an extensibility point for unusual situations. + transport_provided = isinstance(transport, TextToSpeechLongAudioSynthesizeTransport) + if transport_provided: + # transport is a TextToSpeechLongAudioSynthesizeTransport instance. + if credentials or self._client_options.credentials_file or api_key_value: + raise ValueError("When providing a transport instance, " + "provide its credentials directly.") + if self._client_options.scopes: + raise ValueError( + "When providing a transport instance, provide its scopes " + "directly." + ) + self._transport = cast(TextToSpeechLongAudioSynthesizeTransport, transport) + self._api_endpoint = self._transport.host + + self._api_endpoint = (self._api_endpoint or + TextToSpeechLongAudioSynthesizeClient._get_api_endpoint( + self._client_options.api_endpoint, + self._client_cert_source, + self._universe_domain, + self._use_mtls_endpoint)) + + if not transport_provided: + import google.auth._default # type: ignore + + if api_key_value and hasattr(google.auth._default, "get_api_key_credentials"): + credentials = google.auth._default.get_api_key_credentials(api_key_value) + + transport_init: Union[Type[TextToSpeechLongAudioSynthesizeTransport], Callable[..., TextToSpeechLongAudioSynthesizeTransport]] = ( + TextToSpeechLongAudioSynthesizeClient.get_transport_class(transport) + if isinstance(transport, str) or transport is None + else cast(Callable[..., TextToSpeechLongAudioSynthesizeTransport], transport) + ) + # initialize with the provided callable or the passed in class + self._transport = transport_init( + credentials=credentials, + credentials_file=self._client_options.credentials_file, + host=self._api_endpoint, + scopes=self._client_options.scopes, + client_cert_source_for_mtls=self._client_cert_source, + quota_project_id=self._client_options.quota_project_id, + client_info=client_info, + always_use_jwt_access=True, + api_audience=self._client_options.api_audience, + ) + + def synthesize_long_audio(self, + request: Optional[Union[cloud_tts_lrs.SynthesizeLongAudioRequest, dict]] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operation.Operation: + r"""Synthesizes long form text asynchronously. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import texttospeech_v1beta1 + + def sample_synthesize_long_audio(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeClient() + + # Initialize request argument(s) + input = texttospeech_v1beta1.SynthesisInput() + input.text = "text_value" + + audio_config = texttospeech_v1beta1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + voice = texttospeech_v1beta1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + request = texttospeech_v1beta1.SynthesizeLongAudioRequest( + input=input, + audio_config=audio_config, + output_gcs_uri="output_gcs_uri_value", + voice=voice, + ) + + # Make the request + operation = client.synthesize_long_audio(request=request) + + print("Waiting for operation to complete...") + + response = operation.result() + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.texttospeech_v1beta1.types.SynthesizeLongAudioRequest, dict]): + The request object. The top-level message sent by the client for the + ``SynthesizeLongAudio`` method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + google.api_core.operation.Operation: + An object representing a long-running operation. + + The result type for the operation will be + :class:`google.cloud.texttospeech_v1beta1.types.SynthesizeLongAudioResponse` + The message returned to the client by the + SynthesizeLongAudio method. + + """ + # Create or coerce a protobuf request object. + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, cloud_tts_lrs.SynthesizeLongAudioRequest): + request = cloud_tts_lrs.SynthesizeLongAudioRequest(request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.synthesize_long_audio] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata(( + ("parent", request.parent), + )), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Wrap the response in an operation future. + response = operation.from_gapic( + response, + self._transport.operations_client, + cloud_tts_lrs.SynthesizeLongAudioResponse, + metadata_type=cloud_tts_lrs.SynthesizeLongAudioMetadata, + ) + + # Done; return the response. + return response + + def __enter__(self) -> "TextToSpeechLongAudioSynthesizeClient": + return self + + def __exit__(self, type, value, traceback): + """Releases underlying transport's resources. + + .. warning:: + ONLY use as a context manager if the transport is NOT shared + with other clients! Exiting the with block will CLOSE the transport + and may cause errors in other clients! + """ + self.transport.close() + + def list_operations( + self, + request: Optional[operations_pb2.ListOperationsRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.ListOperationsResponse: + r"""Lists operations that match the specified filter in the request. + + Args: + request (:class:`~.operations_pb2.ListOperationsRequest`): + The request object. Request message for + `ListOperations` method. + retry (google.api_core.retry.Retry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.ListOperationsResponse: + Response message for ``ListOperations`` method. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.ListOperationsRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.list_operations] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + def get_operation( + self, + request: Optional[operations_pb2.GetOperationRequest] = None, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, str]] = (), + ) -> operations_pb2.Operation: + r"""Gets the latest state of a long-running operation. + + Args: + request (:class:`~.operations_pb2.GetOperationRequest`): + The request object. Request message for + `GetOperation` method. + retry (google.api_core.retry.Retry): Designation of what errors, + if any, should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + Returns: + ~.operations_pb2.Operation: + An ``Operation`` object. + """ + # Create or coerce a protobuf request object. + # The request isn't a proto-plus wrapped type, + # so it must be constructed via keyword expansion. + if isinstance(request, dict): + request = operations_pb2.GetOperationRequest(**request) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.get_operation] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + (("name", request.name),)), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, retry=retry, timeout=timeout, metadata=metadata,) + + # Done; return the response. + return response + + + + + + + + + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) + + +__all__ = ( + "TextToSpeechLongAudioSynthesizeClient", +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/README.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/README.rst new file mode 100644 index 000000000000..44ada032f342 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/README.rst @@ -0,0 +1,9 @@ + +transport inheritance structure +_______________________________ + +`TextToSpeechLongAudioSynthesizeTransport` is the ABC for all transports. +- public child `TextToSpeechLongAudioSynthesizeGrpcTransport` for sync gRPC transport (defined in `grpc.py`). +- public child `TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport` for async gRPC transport (defined in `grpc_asyncio.py`). +- private child `_BaseTextToSpeechLongAudioSynthesizeRestTransport` for base REST transport with inner classes `_BaseMETHOD` (defined in `rest_base.py`). +- public child `TextToSpeechLongAudioSynthesizeRestTransport` for sync REST transport with inner classes `METHOD` derived from the parent's corresponding `_BaseMETHOD` classes (defined in `rest.py`). diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/__init__.py new file mode 100644 index 000000000000..b9316b7eeac3 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/__init__.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from collections import OrderedDict +from typing import Dict, Type + +from .base import TextToSpeechLongAudioSynthesizeTransport +from .grpc import TextToSpeechLongAudioSynthesizeGrpcTransport +from .grpc_asyncio import TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport +from .rest import TextToSpeechLongAudioSynthesizeRestTransport +from .rest import TextToSpeechLongAudioSynthesizeRestInterceptor + + +# Compile a registry of transports. +_transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechLongAudioSynthesizeTransport]] +_transport_registry['grpc'] = TextToSpeechLongAudioSynthesizeGrpcTransport +_transport_registry['grpc_asyncio'] = TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport +_transport_registry['rest'] = TextToSpeechLongAudioSynthesizeRestTransport + +__all__ = ( + 'TextToSpeechLongAudioSynthesizeTransport', + 'TextToSpeechLongAudioSynthesizeGrpcTransport', + 'TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport', + 'TextToSpeechLongAudioSynthesizeRestTransport', + 'TextToSpeechLongAudioSynthesizeRestInterceptor', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/base.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/base.py new file mode 100644 index 000000000000..143a73ee1505 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/base.py @@ -0,0 +1,189 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 abc +from typing import Awaitable, Callable, Dict, Optional, Sequence, Union + +from google.cloud.texttospeech_v1beta1 import gapic_version as package_version + +import google.auth # type: ignore +import google.api_core +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import retry as retries +from google.api_core import operations_v1 +from google.auth import credentials as ga_credentials # type: ignore +from google.oauth2 import service_account # type: ignore + +from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) + + +class TextToSpeechLongAudioSynthesizeTransport(abc.ABC): + """Abstract transport class for TextToSpeechLongAudioSynthesize.""" + + AUTH_SCOPES = ( + 'https://www.googleapis.com/auth/cloud-platform', + ) + + DEFAULT_HOST: str = 'texttospeech.googleapis.com' + def __init__( + self, *, + host: str = DEFAULT_HOST, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + **kwargs, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is mutually exclusive with credentials. + scopes (Optional[Sequence[str]]): A list of scopes. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + """ + + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} + + # Save the scopes. + self._scopes = scopes + if not hasattr(self, "_ignore_credentials"): + self._ignore_credentials: bool = False + + # If no credentials are provided, then determine the appropriate + # defaults. + if credentials and credentials_file: + raise core_exceptions.DuplicateCredentialArgs("'credentials_file' and 'credentials' are mutually exclusive") + + if credentials_file is not None: + credentials, _ = google.auth.load_credentials_from_file( + credentials_file, + **scopes_kwargs, + quota_project_id=quota_project_id + ) + elif credentials is None and not self._ignore_credentials: + credentials, _ = google.auth.default(**scopes_kwargs, quota_project_id=quota_project_id) + # Don't apply audience if the credentials file passed from user. + if hasattr(credentials, "with_gdch_audience"): + credentials = credentials.with_gdch_audience(api_audience if api_audience else host) + + # If the credentials are service account credentials, then always try to use self signed JWT. + if always_use_jwt_access and isinstance(credentials, service_account.Credentials) and hasattr(service_account.Credentials, "with_always_use_jwt_access"): + credentials = credentials.with_always_use_jwt_access(True) + + # Save the credentials. + self._credentials = credentials + + # Save the hostname. Default to port 443 (HTTPS) if none is specified. + if ':' not in host: + host += ':443' + self._host = host + + @property + def host(self): + return self._host + + def _prep_wrapped_messages(self, client_info): + # Precompute the wrapped methods. + self._wrapped_methods = { + self.synthesize_long_audio: gapic_v1.method.wrap_method( + self.synthesize_long_audio, + default_timeout=5000.0, + client_info=client_info, + ), + self.get_operation: gapic_v1.method.wrap_method( + self.get_operation, + default_timeout=None, + client_info=client_info, + ), + self.list_operations: gapic_v1.method.wrap_method( + self.list_operations, + default_timeout=None, + client_info=client_info, + ), + } + + def close(self): + """Closes resources associated with the transport. + + .. warning:: + Only call this method if the transport is NOT shared + with other clients - this may cause errors in other clients! + """ + raise NotImplementedError() + + @property + def operations_client(self): + """Return the client designed to process long-running operations.""" + raise NotImplementedError() + + @property + def synthesize_long_audio(self) -> Callable[ + [cloud_tts_lrs.SynthesizeLongAudioRequest], + Union[ + operations_pb2.Operation, + Awaitable[operations_pb2.Operation] + ]]: + raise NotImplementedError() + + @property + def list_operations( + self, + ) -> Callable[ + [operations_pb2.ListOperationsRequest], + Union[operations_pb2.ListOperationsResponse, Awaitable[operations_pb2.ListOperationsResponse]], + ]: + raise NotImplementedError() + + @property + def get_operation( + self, + ) -> Callable[ + [operations_pb2.GetOperationRequest], + Union[operations_pb2.Operation, Awaitable[operations_pb2.Operation]], + ]: + raise NotImplementedError() + + @property + def kind(self) -> str: + raise NotImplementedError() + + +__all__ = ( + 'TextToSpeechLongAudioSynthesizeTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc.py new file mode 100644 index 000000000000..dd6f52849589 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc.py @@ -0,0 +1,325 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 warnings +from typing import Callable, Dict, Optional, Sequence, Tuple, Union + +from google.api_core import grpc_helpers +from google.api_core import operations_v1 +from google.api_core import gapic_v1 +import google.auth # type: ignore +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore + +import grpc # type: ignore + +from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore +from .base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO + + +class TextToSpeechLongAudioSynthesizeGrpcTransport(TextToSpeechLongAudioSynthesizeTransport): + """gRPC backend transport for TextToSpeechLongAudioSynthesize. + + Service that implements Google Cloud Text-to-Speech API. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends protocol buffers over the wire using gRPC (which is built on + top of HTTP/2); the ``grpcio`` package must be installed. + """ + _stubs: Dict[str, Callable] + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + This argument is ignored if a ``channel`` instance is provided. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if a ``channel`` instance is provided. + scopes (Optional(Sequence[str])): A list of scopes. This argument is + ignored if a ``channel`` instance is provided. + channel (Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]]): + A ``Channel`` instance through which to make calls, or a Callable + that constructs and returns one. If set to None, ``self.create_channel`` + is used to create the channel. If a Callable is given, it will be called + with the same arguments as used in ``self.create_channel``. + api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. + If provided, it overrides the ``host`` argument and tries to create + a mutual TLS channel with client SSL credentials from + ``client_cert_source`` or application default SSL credentials. + client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): + Deprecated. A callback to provide client SSL certificate bytes and + private key bytes, both in PEM format. It is ignored if + ``api_mtls_endpoint`` is None. + ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials + for the grpc channel. It is ignored if a ``channel`` instance is provided. + client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): + A callback to provide client certificate bytes and private key bytes, + both in PEM format. It is used to configure a mutual TLS channel. It is + ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + + Raises: + google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport + creation failed for any reason. + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + self._grpc_channel = None + self._ssl_channel_credentials = ssl_channel_credentials + self._stubs: Dict[str, Callable] = {} + self._operations_client: Optional[operations_v1.OperationsClient] = None + + if api_mtls_endpoint: + warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) + if client_cert_source: + warnings.warn("client_cert_source is deprecated", DeprecationWarning) + + if isinstance(channel, grpc.Channel): + # Ignore credentials if a channel was passed. + credentials = None + self._ignore_credentials = True + # If a channel was explicitly provided, set it. + self._grpc_channel = channel + self._ssl_channel_credentials = None + + else: + if api_mtls_endpoint: + host = api_mtls_endpoint + + # Create SSL credentials with client_cert_source or application + # default SSL credentials. + if client_cert_source: + cert, key = client_cert_source() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + else: + self._ssl_channel_credentials = SslCredentials().ssl_credentials + + else: + if client_cert_source_for_mtls and not ssl_channel_credentials: + cert, key = client_cert_source_for_mtls() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + + # The base transport sets the host, credentials and scopes + super().__init__( + host=host, + credentials=credentials, + credentials_file=credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + + if not self._grpc_channel: + # initialize with the provided callable or the default channel + channel_init = channel or type(self).create_channel + self._grpc_channel = channel_init( + self._host, + # use the credentials which are saved + credentials=self._credentials, + # Set ``credentials_file`` to ``None`` here as + # the credentials that we saved earlier should be used. + credentials_file=None, + scopes=self._scopes, + ssl_credentials=self._ssl_channel_credentials, + quota_project_id=quota_project_id, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Wrap messages. This must be done after self._grpc_channel exists + self._prep_wrapped_messages(client_info) + + @classmethod + def create_channel(cls, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + **kwargs) -> grpc.Channel: + """Create and return a gRPC channel object. + Args: + host (Optional[str]): The host for the channel to use. + credentials (Optional[~.Credentials]): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If + none are specified, the client will attempt to ascertain + the credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is mutually exclusive with credentials. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + kwargs (Optional[dict]): Keyword arguments, which are passed to the + channel creation. + Returns: + grpc.Channel: A gRPC channel object. + + Raises: + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + + return grpc_helpers.create_channel( + host, + credentials=credentials, + credentials_file=credentials_file, + quota_project_id=quota_project_id, + default_scopes=cls.AUTH_SCOPES, + scopes=scopes, + default_host=cls.DEFAULT_HOST, + **kwargs + ) + + @property + def grpc_channel(self) -> grpc.Channel: + """Return the channel designed to connect to this service. + """ + return self._grpc_channel + + @property + def operations_client(self) -> operations_v1.OperationsClient: + """Create the client designed to process long-running operations. + + This property caches on the instance; repeated calls return the same + client. + """ + # Quick check: Only create a new client if we do not already have one. + if self._operations_client is None: + self._operations_client = operations_v1.OperationsClient( + self.grpc_channel + ) + + # Return the client from cache. + return self._operations_client + + @property + def synthesize_long_audio(self) -> Callable[ + [cloud_tts_lrs.SynthesizeLongAudioRequest], + operations_pb2.Operation]: + r"""Return a callable for the synthesize long audio method over gRPC. + + Synthesizes long form text asynchronously. + + Returns: + Callable[[~.SynthesizeLongAudioRequest], + ~.Operation]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'synthesize_long_audio' not in self._stubs: + self._stubs['synthesize_long_audio'] = self.grpc_channel.unary_unary( + '/google.cloud.texttospeech.v1beta1.TextToSpeechLongAudioSynthesize/SynthesizeLongAudio', + request_serializer=cloud_tts_lrs.SynthesizeLongAudioRequest.serialize, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs['synthesize_long_audio'] + + def close(self): + self.grpc_channel.close() + + @property + def get_operation( + self, + ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: + r"""Return a callable for the get_operation method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_operation" not in self._stubs: + self._stubs["get_operation"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/GetOperation", + request_serializer=operations_pb2.GetOperationRequest.SerializeToString, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs["get_operation"] + + @property + def list_operations( + self, + ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: + r"""Return a callable for the list_operations method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "list_operations" not in self._stubs: + self._stubs["list_operations"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/ListOperations", + request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, + response_deserializer=operations_pb2.ListOperationsResponse.FromString, + ) + return self._stubs["list_operations"] + + @property + def kind(self) -> str: + return "grpc" + + +__all__ = ( + 'TextToSpeechLongAudioSynthesizeGrpcTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py new file mode 100644 index 000000000000..2f5ae21343fb --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py @@ -0,0 +1,356 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 inspect +import warnings +from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union + +from google.api_core import gapic_v1 +from google.api_core import grpc_helpers_async +from google.api_core import exceptions as core_exceptions +from google.api_core import retry_async as retries +from google.api_core import operations_v1 +from google.auth import credentials as ga_credentials # type: ignore +from google.auth.transport.grpc import SslCredentials # type: ignore + +import grpc # type: ignore +from grpc.experimental import aio # type: ignore + +from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore +from .base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO +from .grpc import TextToSpeechLongAudioSynthesizeGrpcTransport + + +class TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport(TextToSpeechLongAudioSynthesizeTransport): + """gRPC AsyncIO backend transport for TextToSpeechLongAudioSynthesize. + + Service that implements Google Cloud Text-to-Speech API. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends protocol buffers over the wire using gRPC (which is built on + top of HTTP/2); the ``grpcio`` package must be installed. + """ + + _grpc_channel: aio.Channel + _stubs: Dict[str, Callable] = {} + + @classmethod + def create_channel(cls, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + quota_project_id: Optional[str] = None, + **kwargs) -> aio.Channel: + """Create and return a gRPC AsyncIO channel object. + Args: + host (Optional[str]): The host for the channel to use. + credentials (Optional[~.Credentials]): The + authorization credentials to attach to requests. These + credentials identify this application to the service. If + none are specified, the client will attempt to ascertain + the credentials from the environment. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + kwargs (Optional[dict]): Keyword arguments, which are passed to the + channel creation. + Returns: + aio.Channel: A gRPC AsyncIO channel object. + """ + + return grpc_helpers_async.create_channel( + host, + credentials=credentials, + credentials_file=credentials_file, + quota_project_id=quota_project_id, + default_scopes=cls.AUTH_SCOPES, + scopes=scopes, + default_host=cls.DEFAULT_HOST, + **kwargs + ) + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[Union[aio.Channel, Callable[..., aio.Channel]]] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + This argument is ignored if a ``channel`` instance is provided. + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if a ``channel`` instance is provided. + scopes (Optional[Sequence[str]]): A optional list of scopes needed for this + service. These are only used when credentials are not specified and + are passed to :func:`google.auth.default`. + channel (Optional[Union[aio.Channel, Callable[..., aio.Channel]]]): + A ``Channel`` instance through which to make calls, or a Callable + that constructs and returns one. If set to None, ``self.create_channel`` + is used to create the channel. If a Callable is given, it will be called + with the same arguments as used in ``self.create_channel``. + api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. + If provided, it overrides the ``host`` argument and tries to create + a mutual TLS channel with client SSL credentials from + ``client_cert_source`` or application default SSL credentials. + client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): + Deprecated. A callback to provide client SSL certificate bytes and + private key bytes, both in PEM format. It is ignored if + ``api_mtls_endpoint`` is None. + ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials + for the grpc channel. It is ignored if a ``channel`` instance is provided. + client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): + A callback to provide client certificate bytes and private key bytes, + both in PEM format. It is used to configure a mutual TLS channel. It is + ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you're developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + + Raises: + google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport + creation failed for any reason. + google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` + and ``credentials_file`` are passed. + """ + self._grpc_channel = None + self._ssl_channel_credentials = ssl_channel_credentials + self._stubs: Dict[str, Callable] = {} + self._operations_client: Optional[operations_v1.OperationsAsyncClient] = None + + if api_mtls_endpoint: + warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) + if client_cert_source: + warnings.warn("client_cert_source is deprecated", DeprecationWarning) + + if isinstance(channel, aio.Channel): + # Ignore credentials if a channel was passed. + credentials = None + self._ignore_credentials = True + # If a channel was explicitly provided, set it. + self._grpc_channel = channel + self._ssl_channel_credentials = None + else: + if api_mtls_endpoint: + host = api_mtls_endpoint + + # Create SSL credentials with client_cert_source or application + # default SSL credentials. + if client_cert_source: + cert, key = client_cert_source() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + else: + self._ssl_channel_credentials = SslCredentials().ssl_credentials + + else: + if client_cert_source_for_mtls and not ssl_channel_credentials: + cert, key = client_cert_source_for_mtls() + self._ssl_channel_credentials = grpc.ssl_channel_credentials( + certificate_chain=cert, private_key=key + ) + + # The base transport sets the host, credentials and scopes + super().__init__( + host=host, + credentials=credentials, + credentials_file=credentials_file, + scopes=scopes, + quota_project_id=quota_project_id, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience, + ) + + if not self._grpc_channel: + # initialize with the provided callable or the default channel + channel_init = channel or type(self).create_channel + self._grpc_channel = channel_init( + self._host, + # use the credentials which are saved + credentials=self._credentials, + # Set ``credentials_file`` to ``None`` here as + # the credentials that we saved earlier should be used. + credentials_file=None, + scopes=self._scopes, + ssl_credentials=self._ssl_channel_credentials, + quota_project_id=quota_project_id, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Wrap messages. This must be done after self._grpc_channel exists + self._wrap_with_kind = "kind" in inspect.signature(gapic_v1.method_async.wrap_method).parameters + self._prep_wrapped_messages(client_info) + + @property + def grpc_channel(self) -> aio.Channel: + """Create the channel designed to connect to this service. + + This property caches on the instance; repeated calls return + the same channel. + """ + # Return the channel from cache. + return self._grpc_channel + + @property + def operations_client(self) -> operations_v1.OperationsAsyncClient: + """Create the client designed to process long-running operations. + + This property caches on the instance; repeated calls return the same + client. + """ + # Quick check: Only create a new client if we do not already have one. + if self._operations_client is None: + self._operations_client = operations_v1.OperationsAsyncClient( + self.grpc_channel + ) + + # Return the client from cache. + return self._operations_client + + @property + def synthesize_long_audio(self) -> Callable[ + [cloud_tts_lrs.SynthesizeLongAudioRequest], + Awaitable[operations_pb2.Operation]]: + r"""Return a callable for the synthesize long audio method over gRPC. + + Synthesizes long form text asynchronously. + + Returns: + Callable[[~.SynthesizeLongAudioRequest], + Awaitable[~.Operation]]: + A function that, when called, will call the underlying RPC + on the server. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if 'synthesize_long_audio' not in self._stubs: + self._stubs['synthesize_long_audio'] = self.grpc_channel.unary_unary( + '/google.cloud.texttospeech.v1beta1.TextToSpeechLongAudioSynthesize/SynthesizeLongAudio', + request_serializer=cloud_tts_lrs.SynthesizeLongAudioRequest.serialize, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs['synthesize_long_audio'] + + def _prep_wrapped_messages(self, client_info): + """ Precompute the wrapped methods, overriding the base class method to use async wrappers.""" + self._wrapped_methods = { + self.synthesize_long_audio: self._wrap_method( + self.synthesize_long_audio, + default_timeout=5000.0, + client_info=client_info, + ), + self.get_operation: self._wrap_method( + self.get_operation, + default_timeout=None, + client_info=client_info, + ), + self.list_operations: self._wrap_method( + self.list_operations, + default_timeout=None, + client_info=client_info, + ), + } + + def _wrap_method(self, func, *args, **kwargs): + if self._wrap_with_kind: # pragma: NO COVER + kwargs["kind"] = self.kind + return gapic_v1.method_async.wrap_method(func, *args, **kwargs) + + def close(self): + return self.grpc_channel.close() + + @property + def kind(self) -> str: + return "grpc_asyncio" + + @property + def get_operation( + self, + ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: + r"""Return a callable for the get_operation method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "get_operation" not in self._stubs: + self._stubs["get_operation"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/GetOperation", + request_serializer=operations_pb2.GetOperationRequest.SerializeToString, + response_deserializer=operations_pb2.Operation.FromString, + ) + return self._stubs["get_operation"] + + @property + def list_operations( + self, + ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: + r"""Return a callable for the list_operations method over gRPC. + """ + # Generate a "stub function" on-the-fly which will actually make + # the request. + # gRPC handles serialization and deserialization, so we just need + # to pass in the functions for each. + if "list_operations" not in self._stubs: + self._stubs["list_operations"] = self.grpc_channel.unary_unary( + "/google.longrunning.Operations/ListOperations", + request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, + response_deserializer=operations_pb2.ListOperationsResponse.FromString, + ) + return self._stubs["list_operations"] + + +__all__ = ( + 'TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py new file mode 100644 index 000000000000..e87b1cbbe722 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py @@ -0,0 +1,509 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# + +from google.auth.transport.requests import AuthorizedSession # type: ignore +import json # type: ignore +from google.auth import credentials as ga_credentials # type: ignore +from google.api_core import exceptions as core_exceptions +from google.api_core import retry as retries +from google.api_core import rest_helpers +from google.api_core import rest_streaming +from google.api_core import gapic_v1 + +from google.protobuf import json_format +from google.api_core import operations_v1 + +from requests import __version__ as requests_version +import dataclasses +from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union +import warnings + + +from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore + + +from .rest_base import _BaseTextToSpeechLongAudioSynthesizeRestTransport +from .base import DEFAULT_CLIENT_INFO as BASE_DEFAULT_CLIENT_INFO + +try: + OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] +except AttributeError: # pragma: NO COVER + OptionalRetry = Union[retries.Retry, object, None] # type: ignore + + +DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( + gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, + grpc_version=None, + rest_version=f"requests@{requests_version}", +) + + +class TextToSpeechLongAudioSynthesizeRestInterceptor: + """Interceptor for TextToSpeechLongAudioSynthesize. + + Interceptors are used to manipulate requests, request metadata, and responses + in arbitrary ways. + Example use cases include: + * Logging + * Verifying requests according to service or custom semantics + * Stripping extraneous information from responses + + These use cases and more can be enabled by injecting an + instance of a custom subclass when constructing the TextToSpeechLongAudioSynthesizeRestTransport. + + .. code-block:: python + class MyCustomTextToSpeechLongAudioSynthesizeInterceptor(TextToSpeechLongAudioSynthesizeRestInterceptor): + def pre_synthesize_long_audio(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_synthesize_long_audio(self, response): + logging.log(f"Received response: {response}") + return response + + transport = TextToSpeechLongAudioSynthesizeRestTransport(interceptor=MyCustomTextToSpeechLongAudioSynthesizeInterceptor()) + client = TextToSpeechLongAudioSynthesizeClient(transport=transport) + + + """ + def pre_synthesize_long_audio(self, request: cloud_tts_lrs.SynthesizeLongAudioRequest, metadata: Sequence[Tuple[str, str]]) -> Tuple[cloud_tts_lrs.SynthesizeLongAudioRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for synthesize_long_audio + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeechLongAudioSynthesize server. + """ + return request, metadata + + def post_synthesize_long_audio(self, response: operations_pb2.Operation) -> operations_pb2.Operation: + """Post-rpc interceptor for synthesize_long_audio + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeechLongAudioSynthesize server but before + it is returned to user code. + """ + return response + + def pre_get_operation( + self, request: operations_pb2.GetOperationRequest, metadata: Sequence[Tuple[str, str]] + ) -> Tuple[operations_pb2.GetOperationRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for get_operation + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeechLongAudioSynthesize server. + """ + return request, metadata + + def post_get_operation( + self, response: operations_pb2.Operation + ) -> operations_pb2.Operation: + """Post-rpc interceptor for get_operation + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeechLongAudioSynthesize server but before + it is returned to user code. + """ + return response + + def pre_list_operations( + self, request: operations_pb2.ListOperationsRequest, metadata: Sequence[Tuple[str, str]] + ) -> Tuple[operations_pb2.ListOperationsRequest, Sequence[Tuple[str, str]]]: + """Pre-rpc interceptor for list_operations + + Override in a subclass to manipulate the request or metadata + before they are sent to the TextToSpeechLongAudioSynthesize server. + """ + return request, metadata + + def post_list_operations( + self, response: operations_pb2.ListOperationsResponse + ) -> operations_pb2.ListOperationsResponse: + """Post-rpc interceptor for list_operations + + Override in a subclass to manipulate the response + after it is returned by the TextToSpeechLongAudioSynthesize server but before + it is returned to user code. + """ + return response + + +@dataclasses.dataclass +class TextToSpeechLongAudioSynthesizeRestStub: + _session: AuthorizedSession + _host: str + _interceptor: TextToSpeechLongAudioSynthesizeRestInterceptor + + +class TextToSpeechLongAudioSynthesizeRestTransport(_BaseTextToSpeechLongAudioSynthesizeRestTransport): + """REST backend synchronous transport for TextToSpeechLongAudioSynthesize. + + Service that implements Google Cloud Text-to-Speech API. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends JSON representations of protocol buffers over HTTP/1.1 + """ + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + client_cert_source_for_mtls: Optional[Callable[[ + ], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + url_scheme: str = 'https', + interceptor: Optional[TextToSpeechLongAudioSynthesizeRestInterceptor] = None, + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + + NOTE: This REST transport functionality is currently in a beta + state (preview). We welcome your feedback via a GitHub issue in + this library's repository. Thank you! + + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[google.auth.credentials.Credentials]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + + credentials_file (Optional[str]): A file with credentials that can + be loaded with :func:`google.auth.load_credentials_from_file`. + This argument is ignored if ``channel`` is provided. + scopes (Optional(Sequence[str])): A list of scopes. This argument is + ignored if ``channel`` is provided. + client_cert_source_for_mtls (Callable[[], Tuple[bytes, bytes]]): Client + certificate to configure mutual TLS HTTP channel. It is ignored + if ``channel`` is provided. + quota_project_id (Optional[str]): An optional project to use for billing + and quota. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you are developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + url_scheme: the protocol scheme for the API endpoint. Normally + "https", but for testing or local servers, + "http" can be specified. + """ + # Run the base constructor + # TODO(yon-mg): resolve other ctor params i.e. scopes, quota, etc. + # TODO: When custom host (api_endpoint) is set, `scopes` must *also* be set on the + # credentials object + super().__init__( + host=host, + credentials=credentials, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + url_scheme=url_scheme, + api_audience=api_audience + ) + self._session = AuthorizedSession( + self._credentials, default_host=self.DEFAULT_HOST) + self._operations_client: Optional[operations_v1.AbstractOperationsClient] = None + if client_cert_source_for_mtls: + self._session.configure_mtls_channel(client_cert_source_for_mtls) + self._interceptor = interceptor or TextToSpeechLongAudioSynthesizeRestInterceptor() + self._prep_wrapped_messages(client_info) + + @property + def operations_client(self) -> operations_v1.AbstractOperationsClient: + """Create the client designed to process long-running operations. + + This property caches on the instance; repeated calls return the same + client. + """ + # Only create a new client if we do not already have one. + if self._operations_client is None: + http_options: Dict[str, List[Dict[str, str]]] = { + 'google.longrunning.Operations.GetOperation': [ + { + 'method': 'get', + 'uri': '/v1beta1/{name=projects/*/locations/*/operations/*}', + }, + ], + 'google.longrunning.Operations.ListOperations': [ + { + 'method': 'get', + 'uri': '/v1beta1/{name=projects/*/locations/*}/operations', + }, + ], + } + + rest_transport = operations_v1.OperationsRestTransport( + host=self._host, + # use the credentials which are saved + credentials=self._credentials, + scopes=self._scopes, + http_options=http_options, + path_prefix="v1beta1") + + self._operations_client = operations_v1.AbstractOperationsClient(transport=rest_transport) + + # Return the client from cache. + return self._operations_client + + class _SynthesizeLongAudio(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio, TextToSpeechLongAudioSynthesizeRestStub): + def __hash__(self): + return hash("TextToSpeechLongAudioSynthesizeRestTransport.SynthesizeLongAudio") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + return response + + def __call__(self, + request: cloud_tts_lrs.SynthesizeLongAudioRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> operations_pb2.Operation: + r"""Call the synthesize long audio method over HTTP. + + Args: + request (~.cloud_tts_lrs.SynthesizeLongAudioRequest): + The request object. The top-level message sent by the client for the + ``SynthesizeLongAudio`` method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + ~.operations_pb2.Operation: + This resource represents a + long-running operation that is the + result of a network API call. + + """ + + http_options = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_http_options() + request, metadata = self._interceptor.pre_synthesize_long_audio(request, metadata) + transcoded_request = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_transcoded_request(http_options, request) + + body = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_request_body_json(transcoded_request) + + # Jsonify the query params + query_params = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechLongAudioSynthesizeRestTransport._SynthesizeLongAudio._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request, body) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = operations_pb2.Operation() + json_format.Parse(response.content, resp, ignore_unknown_fields=True) + resp = self._interceptor.post_synthesize_long_audio(resp) + return resp + + @property + def synthesize_long_audio(self) -> Callable[ + [cloud_tts_lrs.SynthesizeLongAudioRequest], + operations_pb2.Operation]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._SynthesizeLongAudio(self._session, self._host, self._interceptor) # type: ignore + + @property + def get_operation(self): + return self._GetOperation(self._session, self._host, self._interceptor) # type: ignore + + class _GetOperation(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation, TextToSpeechLongAudioSynthesizeRestStub): + def __hash__(self): + return hash("TextToSpeechLongAudioSynthesizeRestTransport.GetOperation") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + return response + + def __call__(self, + request: operations_pb2.GetOperationRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> operations_pb2.Operation: + + r"""Call the get operation method over HTTP. + + Args: + request (operations_pb2.GetOperationRequest): + The request object for GetOperation method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + operations_pb2.Operation: Response from GetOperation method. + """ + + http_options = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation._get_http_options() + request, metadata = self._interceptor.pre_get_operation(request, metadata) + transcoded_request = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation._get_transcoded_request(http_options, request) + + # Jsonify the query params + query_params = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechLongAudioSynthesizeRestTransport._GetOperation._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + content = response.content.decode("utf-8") + resp = operations_pb2.Operation() + resp = json_format.Parse(content, resp) + resp = self._interceptor.post_get_operation(resp) + return resp + + @property + def list_operations(self): + return self._ListOperations(self._session, self._host, self._interceptor) # type: ignore + + class _ListOperations(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations, TextToSpeechLongAudioSynthesizeRestStub): + def __hash__(self): + return hash("TextToSpeechLongAudioSynthesizeRestTransport.ListOperations") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None): + + uri = transcoded_request['uri'] + method = transcoded_request['method'] + headers = dict(metadata) + headers['Content-Type'] = 'application/json' + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + return response + + def __call__(self, + request: operations_pb2.ListOperationsRequest, *, + retry: OptionalRetry=gapic_v1.method.DEFAULT, + timeout: Optional[float]=None, + metadata: Sequence[Tuple[str, str]]=(), + ) -> operations_pb2.ListOperationsResponse: + + r"""Call the list operations method over HTTP. + + Args: + request (operations_pb2.ListOperationsRequest): + The request object for ListOperations method. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, str]]): Strings which should be + sent along with the request as metadata. + + Returns: + operations_pb2.ListOperationsResponse: Response from ListOperations method. + """ + + http_options = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations._get_http_options() + request, metadata = self._interceptor.pre_list_operations(request, metadata) + transcoded_request = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations._get_transcoded_request(http_options, request) + + # Jsonify the query params + query_params = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations._get_query_params_json(transcoded_request) + + # Send the request + response = TextToSpeechLongAudioSynthesizeRestTransport._ListOperations._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + content = response.content.decode("utf-8") + resp = operations_pb2.ListOperationsResponse() + resp = json_format.Parse(content, resp) + resp = self._interceptor.post_list_operations(resp) + return resp + + @property + def kind(self) -> str: + return "rest" + + def close(self): + self._session.close() + + +__all__=( + 'TextToSpeechLongAudioSynthesizeRestTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py new file mode 100644 index 000000000000..68ce436c1cbf --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 json # type: ignore +from google.api_core import path_template +from google.api_core import gapic_v1 + +from google.protobuf import json_format +from .base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO + +import re +from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union + + +from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore + + +class _BaseTextToSpeechLongAudioSynthesizeRestTransport(TextToSpeechLongAudioSynthesizeTransport): + """Base REST backend transport for TextToSpeechLongAudioSynthesize. + + Note: This class is not meant to be used directly. Use its sync and + async sub-classes instead. + + This class defines the same methods as the primary client, so the + primary client can load the underlying transport implementation + and call it. + + It sends JSON representations of protocol buffers over HTTP/1.1 + """ + + def __init__(self, *, + host: str = 'texttospeech.googleapis.com', + credentials: Optional[Any] = None, + client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, + always_use_jwt_access: Optional[bool] = False, + url_scheme: str = 'https', + api_audience: Optional[str] = None, + ) -> None: + """Instantiate the transport. + Args: + host (Optional[str]): + The hostname to connect to (default: 'texttospeech.googleapis.com'). + credentials (Optional[Any]): The + authorization credentials to attach to requests. These + credentials identify the application to the service; if none + are specified, the client will attempt to ascertain the + credentials from the environment. + client_info (google.api_core.gapic_v1.client_info.ClientInfo): + The client info used to send a user-agent string along with + API requests. If ``None``, then default info will be used. + Generally, you only need to set this if you are developing + your own client library. + always_use_jwt_access (Optional[bool]): Whether self signed JWT should + be used for service account credentials. + url_scheme: the protocol scheme for the API endpoint. Normally + "https", but for testing or local servers, + "http" can be specified. + """ + # Run the base constructor + maybe_url_match = re.match("^(?Phttp(?:s)?://)?(?P.*)$", host) + if maybe_url_match is None: + raise ValueError(f"Unexpected hostname structure: {host}") # pragma: NO COVER + + url_match_items = maybe_url_match.groupdict() + + host = f"{url_scheme}://{host}" if not url_match_items["scheme"] else host + + super().__init__( + host=host, + credentials=credentials, + client_info=client_info, + always_use_jwt_access=always_use_jwt_access, + api_audience=api_audience + ) + + class _BaseSynthesizeLongAudio: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = { + } + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return {k: v for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() if k not in message_dict} + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'post', + 'uri': '/v1beta1/{parent=projects/*/locations/*}:synthesizeLongAudio', + 'body': '*', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = cloud_tts_lrs.SynthesizeLongAudioRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_request_body_json(transcoded_request): + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request['body'], + use_integers_for_enums=False + ) + return body + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json_format.MessageToJson( + transcoded_request['query_params'], + use_integers_for_enums=False, + )) + query_params.update(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_unset_required_fields(query_params)) + + return query_params + + class _BaseGetOperation: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'get', + 'uri': '/v1beta1/{name=projects/*/locations/*/operations/*}', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + request_kwargs = json_format.MessageToDict(request) + transcoded_request = path_template.transcode( + http_options, **request_kwargs) + return transcoded_request + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json.dumps(transcoded_request['query_params'])) + return query_params + + class _BaseListOperations: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [{ + 'method': 'get', + 'uri': '/v1beta1/{name=projects/*/locations/*}/operations', + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + request_kwargs = json_format.MessageToDict(request) + transcoded_request = path_template.transcode( + http_options, **request_kwargs) + return transcoded_request + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads(json.dumps(transcoded_request['query_params'])) + return query_params + + +__all__=( + '_BaseTextToSpeechLongAudioSynthesizeRestTransport', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/__init__.py new file mode 100644 index 000000000000..ffdb4bb045cb --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/__init__.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from .cloud_tts import ( + AdvancedVoiceOptions, + AudioConfig, + CustomPronunciationParams, + CustomPronunciations, + CustomVoiceParams, + ListVoicesRequest, + ListVoicesResponse, + MultiSpeakerMarkup, + StreamingSynthesisInput, + StreamingSynthesizeConfig, + StreamingSynthesizeRequest, + StreamingSynthesizeResponse, + SynthesisInput, + SynthesizeSpeechRequest, + SynthesizeSpeechResponse, + Timepoint, + Voice, + VoiceCloneParams, + VoiceSelectionParams, + AudioEncoding, + SsmlVoiceGender, +) +from .cloud_tts_lrs import ( + SynthesizeLongAudioMetadata, + SynthesizeLongAudioRequest, + SynthesizeLongAudioResponse, +) + +__all__ = ( + 'AdvancedVoiceOptions', + 'AudioConfig', + 'CustomPronunciationParams', + 'CustomPronunciations', + 'CustomVoiceParams', + 'ListVoicesRequest', + 'ListVoicesResponse', + 'MultiSpeakerMarkup', + 'StreamingSynthesisInput', + 'StreamingSynthesizeConfig', + 'StreamingSynthesizeRequest', + 'StreamingSynthesizeResponse', + 'SynthesisInput', + 'SynthesizeSpeechRequest', + 'SynthesizeSpeechResponse', + 'Timepoint', + 'Voice', + 'VoiceCloneParams', + 'VoiceSelectionParams', + 'AudioEncoding', + 'SsmlVoiceGender', + 'SynthesizeLongAudioMetadata', + 'SynthesizeLongAudioRequest', + 'SynthesizeLongAudioResponse', +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts.py new file mode 100644 index 000000000000..722aceb992bb --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts.py @@ -0,0 +1,826 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from __future__ import annotations + +from typing import MutableMapping, MutableSequence + +import proto # type: ignore + + +__protobuf__ = proto.module( + package='google.cloud.texttospeech.v1beta1', + manifest={ + 'SsmlVoiceGender', + 'AudioEncoding', + 'ListVoicesRequest', + 'ListVoicesResponse', + 'Voice', + 'AdvancedVoiceOptions', + 'SynthesizeSpeechRequest', + 'CustomPronunciationParams', + 'CustomPronunciations', + 'MultiSpeakerMarkup', + 'SynthesisInput', + 'VoiceSelectionParams', + 'AudioConfig', + 'CustomVoiceParams', + 'VoiceCloneParams', + 'SynthesizeSpeechResponse', + 'Timepoint', + 'StreamingSynthesizeConfig', + 'StreamingSynthesisInput', + 'StreamingSynthesizeRequest', + 'StreamingSynthesizeResponse', + }, +) + + +class SsmlVoiceGender(proto.Enum): + r"""Gender of the voice as described in `SSML voice + element `__. + + Values: + SSML_VOICE_GENDER_UNSPECIFIED (0): + An unspecified gender. + In VoiceSelectionParams, this means that the + client doesn't care which gender the selected + voice will have. In the Voice field of + ListVoicesResponse, this may mean that the voice + doesn't fit any of the other categories in this + enum, or that the gender of the voice isn't + known. + MALE (1): + A male voice. + FEMALE (2): + A female voice. + NEUTRAL (3): + A gender-neutral voice. This voice is not yet + supported. + """ + SSML_VOICE_GENDER_UNSPECIFIED = 0 + MALE = 1 + FEMALE = 2 + NEUTRAL = 3 + + +class AudioEncoding(proto.Enum): + r"""Configuration to set up audio encoder. The encoding + determines the output audio format that we'd like. + + Values: + AUDIO_ENCODING_UNSPECIFIED (0): + Not specified. Will return result + [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. + LINEAR16 (1): + Uncompressed 16-bit signed little-endian + samples (Linear PCM). Audio content returned as + LINEAR16 also contains a WAV header. + MP3 (2): + MP3 audio at 32kbps. + MP3_64_KBPS (4): + MP3 at 64kbps. + OGG_OPUS (3): + Opus encoded audio wrapped in an ogg + container. The result will be a file which can + be played natively on Android, and in browsers + (at least Chrome and Firefox). The quality of + the encoding is considerably higher than MP3 + while using approximately the same bitrate. + MULAW (5): + 8-bit samples that compand 14-bit audio + samples using G.711 PCMU/mu-law. Audio content + returned as MULAW also contains a WAV header. + ALAW (6): + 8-bit samples that compand 14-bit audio + samples using G.711 PCMU/A-law. Audio content + returned as ALAW also contains a WAV header. + """ + AUDIO_ENCODING_UNSPECIFIED = 0 + LINEAR16 = 1 + MP3 = 2 + MP3_64_KBPS = 4 + OGG_OPUS = 3 + MULAW = 5 + ALAW = 6 + + +class ListVoicesRequest(proto.Message): + r"""The top-level message sent by the client for the ``ListVoices`` + method. + + Attributes: + language_code (str): + Optional. Recommended. + `BCP-47 `__ + language tag. If not specified, the API will return all + supported voices. If specified, the ListVoices call will + only return voices that can be used to synthesize this + language_code. For example, if you specify ``"en-NZ"``, all + ``"en-NZ"`` voices will be returned. If you specify + ``"no"``, both ``"no-\*"`` (Norwegian) and ``"nb-\*"`` + (Norwegian Bokmal) voices will be returned. + """ + + language_code: str = proto.Field( + proto.STRING, + number=1, + ) + + +class ListVoicesResponse(proto.Message): + r"""The message returned to the client by the ``ListVoices`` method. + + Attributes: + voices (MutableSequence[google.cloud.texttospeech_v1beta1.types.Voice]): + The list of voices. + """ + + voices: MutableSequence['Voice'] = proto.RepeatedField( + proto.MESSAGE, + number=1, + message='Voice', + ) + + +class Voice(proto.Message): + r"""Description of a voice supported by the TTS service. + + Attributes: + language_codes (MutableSequence[str]): + The languages that this voice supports, expressed as + `BCP-47 `__ + language tags (e.g. "en-US", "es-419", "cmn-tw"). + name (str): + The name of this voice. Each distinct voice + has a unique name. + ssml_gender (google.cloud.texttospeech_v1beta1.types.SsmlVoiceGender): + The gender of this voice. + natural_sample_rate_hertz (int): + The natural sample rate (in hertz) for this + voice. + """ + + language_codes: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=1, + ) + name: str = proto.Field( + proto.STRING, + number=2, + ) + ssml_gender: 'SsmlVoiceGender' = proto.Field( + proto.ENUM, + number=3, + enum='SsmlVoiceGender', + ) + natural_sample_rate_hertz: int = proto.Field( + proto.INT32, + number=4, + ) + + +class AdvancedVoiceOptions(proto.Message): + r"""Used for advanced voice options. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + low_latency_journey_synthesis (bool): + Only for Journey voices. If false, the + synthesis will be context aware and have higher + latency. + + This field is a member of `oneof`_ ``_low_latency_journey_synthesis``. + """ + + low_latency_journey_synthesis: bool = proto.Field( + proto.BOOL, + number=1, + optional=True, + ) + + +class SynthesizeSpeechRequest(proto.Message): + r"""The top-level message sent by the client for the + ``SynthesizeSpeech`` method. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + input (google.cloud.texttospeech_v1beta1.types.SynthesisInput): + Required. The Synthesizer requires either + plain text or SSML as input. + voice (google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams): + Required. The desired voice of the + synthesized audio. + audio_config (google.cloud.texttospeech_v1beta1.types.AudioConfig): + Required. The configuration of the + synthesized audio. + enable_time_pointing (MutableSequence[google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechRequest.TimepointType]): + Whether and what timepoints are returned in + the response. + advanced_voice_options (google.cloud.texttospeech_v1beta1.types.AdvancedVoiceOptions): + Advanced voice options. + + This field is a member of `oneof`_ ``_advanced_voice_options``. + """ + class TimepointType(proto.Enum): + r"""The type of timepoint information that is returned in the + response. + + Values: + TIMEPOINT_TYPE_UNSPECIFIED (0): + Not specified. No timepoint information will + be returned. + SSML_MARK (1): + Timepoint information of ```` tags in SSML input will + be returned. + """ + TIMEPOINT_TYPE_UNSPECIFIED = 0 + SSML_MARK = 1 + + input: 'SynthesisInput' = proto.Field( + proto.MESSAGE, + number=1, + message='SynthesisInput', + ) + voice: 'VoiceSelectionParams' = proto.Field( + proto.MESSAGE, + number=2, + message='VoiceSelectionParams', + ) + audio_config: 'AudioConfig' = proto.Field( + proto.MESSAGE, + number=3, + message='AudioConfig', + ) + enable_time_pointing: MutableSequence[TimepointType] = proto.RepeatedField( + proto.ENUM, + number=4, + enum=TimepointType, + ) + advanced_voice_options: 'AdvancedVoiceOptions' = proto.Field( + proto.MESSAGE, + number=8, + optional=True, + message='AdvancedVoiceOptions', + ) + + +class CustomPronunciationParams(proto.Message): + r"""Pronunciation customization for a phrase. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + phrase (str): + The phrase to which the customization will be + applied. The phrase can be multiple words (in + the case of proper nouns etc), but should not + span to a whole sentence. + + This field is a member of `oneof`_ ``_phrase``. + phonetic_encoding (google.cloud.texttospeech_v1beta1.types.CustomPronunciationParams.PhoneticEncoding): + The phonetic encoding of the phrase. + + This field is a member of `oneof`_ ``_phonetic_encoding``. + pronunciation (str): + The pronunciation of the phrase. This must be + in the phonetic encoding specified above. + + This field is a member of `oneof`_ ``_pronunciation``. + """ + class PhoneticEncoding(proto.Enum): + r"""The phonetic encoding of the phrase. + + Values: + PHONETIC_ENCODING_UNSPECIFIED (0): + Not specified. + PHONETIC_ENCODING_IPA (1): + IPA. (e.g. apple -> ˈæpəl ) + https://en.wikipedia.org/wiki/International_Phonetic_Alphabet + PHONETIC_ENCODING_X_SAMPA (2): + X-SAMPA (e.g. apple -> "{p@l" ) + https://en.wikipedia.org/wiki/X-SAMPA + """ + PHONETIC_ENCODING_UNSPECIFIED = 0 + PHONETIC_ENCODING_IPA = 1 + PHONETIC_ENCODING_X_SAMPA = 2 + + phrase: str = proto.Field( + proto.STRING, + number=1, + optional=True, + ) + phonetic_encoding: PhoneticEncoding = proto.Field( + proto.ENUM, + number=2, + optional=True, + enum=PhoneticEncoding, + ) + pronunciation: str = proto.Field( + proto.STRING, + number=3, + optional=True, + ) + + +class CustomPronunciations(proto.Message): + r"""A collection of pronunciation customizations. + + Attributes: + pronunciations (MutableSequence[google.cloud.texttospeech_v1beta1.types.CustomPronunciationParams]): + The pronunciation customizations to be + applied. + """ + + pronunciations: MutableSequence['CustomPronunciationParams'] = proto.RepeatedField( + proto.MESSAGE, + number=1, + message='CustomPronunciationParams', + ) + + +class MultiSpeakerMarkup(proto.Message): + r"""A collection of turns for multi-speaker synthesis. + + Attributes: + turns (MutableSequence[google.cloud.texttospeech_v1beta1.types.MultiSpeakerMarkup.Turn]): + Required. Speaker turns. + """ + + class Turn(proto.Message): + r"""A Multi-speaker turn. + + Attributes: + speaker (str): + Required. The speaker of the turn, for + example, 'O' or 'Q'. Please refer to + documentation for available speakers. + text (str): + Required. The text to speak. + """ + + speaker: str = proto.Field( + proto.STRING, + number=1, + ) + text: str = proto.Field( + proto.STRING, + number=2, + ) + + turns: MutableSequence[Turn] = proto.RepeatedField( + proto.MESSAGE, + number=1, + message=Turn, + ) + + +class SynthesisInput(proto.Message): + r"""Contains text input to be synthesized. Either ``text`` or ``ssml`` + must be supplied. Supplying both or neither returns + [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. + The input size is limited to 5000 bytes. + + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + text (str): + The raw text to be synthesized. + + This field is a member of `oneof`_ ``input_source``. + ssml (str): + The SSML document to be synthesized. The SSML document must + be valid and well-formed. Otherwise the RPC will fail and + return + [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. + For more information, see + `SSML `__. + + This field is a member of `oneof`_ ``input_source``. + multi_speaker_markup (google.cloud.texttospeech_v1beta1.types.MultiSpeakerMarkup): + The multi-speaker input to be synthesized. + Only applicable for multi-speaker synthesis. + + This field is a member of `oneof`_ ``input_source``. + custom_pronunciations (google.cloud.texttospeech_v1beta1.types.CustomPronunciations): + Optional. The pronunciation customizations to + be applied to the input. If this is set, the + input will be synthesized using the given + pronunciation customizations. + + The initial support will be for EFIGS (English, + French, Italian, German, Spanish) languages, as + provided in VoiceSelectionParams. Journey and + Instant Clone voices are not supported yet. + + In order to customize the pronunciation of a + phrase, there must be an exact match of the + phrase in the input types. If using SSML, the + phrase must not be inside a phoneme tag + (entirely or partially). + """ + + text: str = proto.Field( + proto.STRING, + number=1, + oneof='input_source', + ) + ssml: str = proto.Field( + proto.STRING, + number=2, + oneof='input_source', + ) + multi_speaker_markup: 'MultiSpeakerMarkup' = proto.Field( + proto.MESSAGE, + number=4, + oneof='input_source', + message='MultiSpeakerMarkup', + ) + custom_pronunciations: 'CustomPronunciations' = proto.Field( + proto.MESSAGE, + number=3, + message='CustomPronunciations', + ) + + +class VoiceSelectionParams(proto.Message): + r"""Description of which voice to use for a synthesis request. + + Attributes: + language_code (str): + Required. The language (and potentially also the region) of + the voice expressed as a + `BCP-47 `__ + language tag, e.g. "en-US". This should not include a script + tag (e.g. use "cmn-cn" rather than "cmn-Hant-cn"), because + the script will be inferred from the input provided in the + SynthesisInput. The TTS service will use this parameter to + help choose an appropriate voice. Note that the TTS service + may choose a voice with a slightly different language code + than the one selected; it may substitute a different region + (e.g. using en-US rather than en-CA if there isn't a + Canadian voice available), or even a different language, + e.g. using "nb" (Norwegian Bokmal) instead of "no" + (Norwegian)". + name (str): + The name of the voice. If both the name and the gender are + not set, the service will choose a voice based on the other + parameters such as language_code. + ssml_gender (google.cloud.texttospeech_v1beta1.types.SsmlVoiceGender): + The preferred gender of the voice. If not set, the service + will choose a voice based on the other parameters such as + language_code and name. Note that this is only a preference, + not requirement; if a voice of the appropriate gender is not + available, the synthesizer should substitute a voice with a + different gender rather than failing the request. + custom_voice (google.cloud.texttospeech_v1beta1.types.CustomVoiceParams): + The configuration for a custom voice. If + [CustomVoiceParams.model] is set, the service will choose + the custom voice matching the specified configuration. + voice_clone (google.cloud.texttospeech_v1beta1.types.VoiceCloneParams): + Optional. The configuration for a voice clone. If + [VoiceCloneParams.voice_clone_key] is set, the service will + choose the voice clone matching the specified configuration. + """ + + language_code: str = proto.Field( + proto.STRING, + number=1, + ) + name: str = proto.Field( + proto.STRING, + number=2, + ) + ssml_gender: 'SsmlVoiceGender' = proto.Field( + proto.ENUM, + number=3, + enum='SsmlVoiceGender', + ) + custom_voice: 'CustomVoiceParams' = proto.Field( + proto.MESSAGE, + number=4, + message='CustomVoiceParams', + ) + voice_clone: 'VoiceCloneParams' = proto.Field( + proto.MESSAGE, + number=5, + message='VoiceCloneParams', + ) + + +class AudioConfig(proto.Message): + r"""Description of audio data to be synthesized. + + Attributes: + audio_encoding (google.cloud.texttospeech_v1beta1.types.AudioEncoding): + Required. The format of the audio byte + stream. + speaking_rate (float): + Optional. Input only. Speaking rate/speed, in the range + [0.25, 4.0]. 1.0 is the normal native speed supported by the + specific voice. 2.0 is twice as fast, and 0.5 is half as + fast. If unset(0.0), defaults to the native 1.0 speed. Any + other values < 0.25 or > 4.0 will return an error. + pitch (float): + Optional. Input only. Speaking pitch, in the range [-20.0, + 20.0]. 20 means increase 20 semitones from the original + pitch. -20 means decrease 20 semitones from the original + pitch. + volume_gain_db (float): + Optional. Input only. Volume gain (in dB) of the normal + native volume supported by the specific voice, in the range + [-96.0, 16.0]. If unset, or set to a value of 0.0 (dB), will + play at normal native signal amplitude. A value of -6.0 (dB) + will play at approximately half the amplitude of the normal + native signal amplitude. A value of +6.0 (dB) will play at + approximately twice the amplitude of the normal native + signal amplitude. Strongly recommend not to exceed +10 (dB) + as there's usually no effective increase in loudness for any + value greater than that. + sample_rate_hertz (int): + Optional. The synthesis sample rate (in hertz) for this + audio. When this is specified in SynthesizeSpeechRequest, if + this is different from the voice's natural sample rate, then + the synthesizer will honor this request by converting to the + desired sample rate (which might result in worse audio + quality), unless the specified sample rate is not supported + for the encoding chosen, in which case it will fail the + request and return + [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. + effects_profile_id (MutableSequence[str]): + Optional. Input only. An identifier which selects 'audio + effects' profiles that are applied on (post synthesized) + text to speech. Effects are applied on top of each other in + the order they are given. See `audio + profiles `__ + for current supported profile ids. + """ + + audio_encoding: 'AudioEncoding' = proto.Field( + proto.ENUM, + number=1, + enum='AudioEncoding', + ) + speaking_rate: float = proto.Field( + proto.DOUBLE, + number=2, + ) + pitch: float = proto.Field( + proto.DOUBLE, + number=3, + ) + volume_gain_db: float = proto.Field( + proto.DOUBLE, + number=4, + ) + sample_rate_hertz: int = proto.Field( + proto.INT32, + number=5, + ) + effects_profile_id: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=6, + ) + + +class CustomVoiceParams(proto.Message): + r"""Description of the custom voice to be synthesized. + + Attributes: + model (str): + Required. The name of the AutoML model that + synthesizes the custom voice. + reported_usage (google.cloud.texttospeech_v1beta1.types.CustomVoiceParams.ReportedUsage): + Optional. Deprecated. The usage of the + synthesized audio to be reported. + """ + class ReportedUsage(proto.Enum): + r"""Deprecated. The usage of the synthesized audio. Usage does + not affect billing. + + Values: + REPORTED_USAGE_UNSPECIFIED (0): + Request with reported usage unspecified will + be rejected. + REALTIME (1): + For scenarios where the synthesized audio is + not downloadable and can only be used once. For + example, real-time request in IVR system. + OFFLINE (2): + For scenarios where the synthesized audio is + downloadable and can be reused. For example, the + synthesized audio is downloaded, stored in + customer service system and played repeatedly. + """ + REPORTED_USAGE_UNSPECIFIED = 0 + REALTIME = 1 + OFFLINE = 2 + + model: str = proto.Field( + proto.STRING, + number=1, + ) + reported_usage: ReportedUsage = proto.Field( + proto.ENUM, + number=3, + enum=ReportedUsage, + ) + + +class VoiceCloneParams(proto.Message): + r"""The configuration of Voice Clone feature. + + Attributes: + voice_cloning_key (str): + Required. Created by GenerateVoiceCloningKey. + """ + + voice_cloning_key: str = proto.Field( + proto.STRING, + number=1, + ) + + +class SynthesizeSpeechResponse(proto.Message): + r"""The message returned to the client by the ``SynthesizeSpeech`` + method. + + Attributes: + audio_content (bytes): + The audio data bytes encoded as specified in the request, + including the header for encodings that are wrapped in + containers (e.g. MP3, OGG_OPUS). For LINEAR16 audio, we + include the WAV header. Note: as with all bytes fields, + protobuffers use a pure binary representation, whereas JSON + representations use base64. + timepoints (MutableSequence[google.cloud.texttospeech_v1beta1.types.Timepoint]): + A link between a position in the original request input and + a corresponding time in the output audio. It's only + supported via ```` of SSML input. + audio_config (google.cloud.texttospeech_v1beta1.types.AudioConfig): + The audio metadata of ``audio_content``. + """ + + audio_content: bytes = proto.Field( + proto.BYTES, + number=1, + ) + timepoints: MutableSequence['Timepoint'] = proto.RepeatedField( + proto.MESSAGE, + number=2, + message='Timepoint', + ) + audio_config: 'AudioConfig' = proto.Field( + proto.MESSAGE, + number=4, + message='AudioConfig', + ) + + +class Timepoint(proto.Message): + r"""This contains a mapping between a certain point in the input + text and a corresponding time in the output audio. + + Attributes: + mark_name (str): + Timepoint name as received from the client within ```` + tag. + time_seconds (float): + Time offset in seconds from the start of the + synthesized audio. + """ + + mark_name: str = proto.Field( + proto.STRING, + number=4, + ) + time_seconds: float = proto.Field( + proto.DOUBLE, + number=3, + ) + + +class StreamingSynthesizeConfig(proto.Message): + r"""Provides configuration information for the + StreamingSynthesize request. + + Attributes: + voice (google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams): + Required. The desired voice of the + synthesized audio. + """ + + voice: 'VoiceSelectionParams' = proto.Field( + proto.MESSAGE, + number=1, + message='VoiceSelectionParams', + ) + + +class StreamingSynthesisInput(proto.Message): + r"""Input to be synthesized. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + text (str): + The raw text to be synthesized. It is + recommended that each input contains complete, + terminating sentences, as this will likely + result in better prosody in the output audio. + That being said, users are free to input text + however they please. + + This field is a member of `oneof`_ ``input_source``. + """ + + text: str = proto.Field( + proto.STRING, + number=1, + oneof='input_source', + ) + + +class StreamingSynthesizeRequest(proto.Message): + r"""Request message for the ``StreamingSynthesize`` method. Multiple + ``StreamingSynthesizeRequest`` messages are sent in one call. The + first message must contain a ``streaming_config`` that fully + specifies the request configuration and must not contain ``input``. + All subsequent messages must only have ``input`` set. + + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + streaming_config (google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeConfig): + StreamingSynthesizeConfig to be used in this streaming + attempt. Only specified in the first message sent in a + ``StreamingSynthesize`` call. + + This field is a member of `oneof`_ ``streaming_request``. + input (google.cloud.texttospeech_v1beta1.types.StreamingSynthesisInput): + Input to synthesize. Specified in all messages but the first + in a ``StreamingSynthesize`` call. + + This field is a member of `oneof`_ ``streaming_request``. + """ + + streaming_config: 'StreamingSynthesizeConfig' = proto.Field( + proto.MESSAGE, + number=1, + oneof='streaming_request', + message='StreamingSynthesizeConfig', + ) + input: 'StreamingSynthesisInput' = proto.Field( + proto.MESSAGE, + number=2, + oneof='streaming_request', + message='StreamingSynthesisInput', + ) + + +class StreamingSynthesizeResponse(proto.Message): + r"""``StreamingSynthesizeResponse`` is the only message returned to the + client by ``StreamingSynthesize`` method. A series of zero or more + ``StreamingSynthesizeResponse`` messages are streamed back to the + client. + + Attributes: + audio_content (bytes): + The audio data bytes encoded as specified in + the request. This is headerless LINEAR16 audio + with a sample rate of 24000. + """ + + audio_content: bytes = proto.Field( + proto.BYTES, + number=1, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts_lrs.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts_lrs.py new file mode 100644 index 000000000000..233decd928f3 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts_lrs.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +from __future__ import annotations + +from typing import MutableMapping, MutableSequence + +import proto # type: ignore + +from google.cloud.texttospeech_v1beta1.types import cloud_tts +from google.protobuf import timestamp_pb2 # type: ignore + + +__protobuf__ = proto.module( + package='google.cloud.texttospeech.v1beta1', + manifest={ + 'SynthesizeLongAudioRequest', + 'SynthesizeLongAudioResponse', + 'SynthesizeLongAudioMetadata', + }, +) + + +class SynthesizeLongAudioRequest(proto.Message): + r"""The top-level message sent by the client for the + ``SynthesizeLongAudio`` method. + + Attributes: + parent (str): + The resource states of the request in the form of + ``projects/*/locations/*``. + input (google.cloud.texttospeech_v1beta1.types.SynthesisInput): + Required. The Synthesizer requires either + plain text or SSML as input. + audio_config (google.cloud.texttospeech_v1beta1.types.AudioConfig): + Required. The configuration of the + synthesized audio. + output_gcs_uri (str): + Required. Specifies a Cloud Storage URI for the synthesis + results. Must be specified in the format: + ``gs://bucket_name/object_name``, and the bucket must + already exist. + voice (google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams): + Required. The desired voice of the + synthesized audio. + """ + + parent: str = proto.Field( + proto.STRING, + number=1, + ) + input: cloud_tts.SynthesisInput = proto.Field( + proto.MESSAGE, + number=2, + message=cloud_tts.SynthesisInput, + ) + audio_config: cloud_tts.AudioConfig = proto.Field( + proto.MESSAGE, + number=3, + message=cloud_tts.AudioConfig, + ) + output_gcs_uri: str = proto.Field( + proto.STRING, + number=4, + ) + voice: cloud_tts.VoiceSelectionParams = proto.Field( + proto.MESSAGE, + number=5, + message=cloud_tts.VoiceSelectionParams, + ) + + +class SynthesizeLongAudioResponse(proto.Message): + r"""The message returned to the client by the ``SynthesizeLongAudio`` + method. + + """ + + +class SynthesizeLongAudioMetadata(proto.Message): + r"""Metadata for response returned by the ``SynthesizeLongAudio`` + method. + + Attributes: + start_time (google.protobuf.timestamp_pb2.Timestamp): + Time when the request was received. + last_update_time (google.protobuf.timestamp_pb2.Timestamp): + Deprecated. Do not use. + progress_percentage (float): + The progress of the most recent processing + update in percentage, ie. 70.0%. + """ + + start_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=1, + message=timestamp_pb2.Timestamp, + ) + last_update_time: timestamp_pb2.Timestamp = proto.Field( + proto.MESSAGE, + number=2, + message=timestamp_pb2.Timestamp, + ) + progress_percentage: float = proto.Field( + proto.DOUBLE, + number=3, + ) + + +__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/mypy.ini b/owl-bot-staging/google-cloud-texttospeech/v1beta1/mypy.ini new file mode 100644 index 000000000000..574c5aed394b --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/mypy.ini @@ -0,0 +1,3 @@ +[mypy] +python_version = 3.7 +namespace_packages = True diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/noxfile.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/noxfile.py new file mode 100644 index 000000000000..70ae5c73c174 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/noxfile.py @@ -0,0 +1,280 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 pathlib +import re +import shutil +import subprocess +import sys + + +import nox # type: ignore + +ALL_PYTHON = [ + "3.7", + "3.8", + "3.9", + "3.10", + "3.11", + "3.12", + "3.13", +] + +CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() + +LOWER_BOUND_CONSTRAINTS_FILE = CURRENT_DIRECTORY / "constraints.txt" +PACKAGE_NAME = 'google-cloud-texttospeech' + +BLACK_VERSION = "black==22.3.0" +BLACK_PATHS = ["docs", "google", "tests", "samples", "noxfile.py", "setup.py"] +DEFAULT_PYTHON_VERSION = "3.13" + +nox.sessions = [ + "unit", + "cover", + "mypy", + "check_lower_bounds" + # exclude update_lower_bounds from default + "docs", + "blacken", + "lint", + "prerelease_deps", +] + +@nox.session(python=ALL_PYTHON) +@nox.parametrize( + "protobuf_implementation", + [ "python", "upb", "cpp" ], +) +def unit(session, protobuf_implementation): + """Run the unit test suite.""" + + if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): + session.skip("cpp implementation is not supported in python 3.11+") + + session.install('coverage', 'pytest', 'pytest-cov', 'pytest-asyncio', 'asyncmock; python_version < "3.8"') + session.install('-e', '.', "-c", f"testing/constraints-{session.python}.txt") + + # Remove the 'cpp' implementation once support for Protobuf 3.x is dropped. + # The 'cpp' implementation requires Protobuf<4. + if protobuf_implementation == "cpp": + session.install("protobuf<4") + + session.run( + 'py.test', + '--quiet', + '--cov=google/cloud/texttospeech_v1beta1/', + '--cov=tests/', + '--cov-config=.coveragerc', + '--cov-report=term', + '--cov-report=html', + os.path.join('tests', 'unit', ''.join(session.posargs)), + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) + +@nox.session(python=ALL_PYTHON[-1]) +@nox.parametrize( + "protobuf_implementation", + [ "python", "upb", "cpp" ], +) +def prerelease_deps(session, protobuf_implementation): + """Run the unit test suite against pre-release versions of dependencies.""" + + if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): + session.skip("cpp implementation is not supported in python 3.11+") + + # Install test environment dependencies + session.install('coverage', 'pytest', 'pytest-cov', 'pytest-asyncio', 'asyncmock; python_version < "3.8"') + + # Install the package without dependencies + session.install('-e', '.', '--no-deps') + + # We test the minimum dependency versions using the minimum Python + # version so the lowest python runtime that we test has a corresponding constraints + # file, located at `testing/constraints--.txt`, which contains all of the + # dependencies and extras. + with open( + CURRENT_DIRECTORY + / "testing" + / f"constraints-{ALL_PYTHON[0]}.txt", + encoding="utf-8", + ) as constraints_file: + constraints_text = constraints_file.read() + + # Ignore leading whitespace and comment lines. + constraints_deps = [ + match.group(1) + for match in re.finditer( + r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE + ) + ] + + session.install(*constraints_deps) + + prerel_deps = [ + "googleapis-common-protos", + "google-api-core", + "google-auth", + # Exclude grpcio!=1.67.0rc1 which does not support python 3.13 + "grpcio!=1.67.0rc1", + "grpcio-status", + "protobuf", + "proto-plus", + ] + + for dep in prerel_deps: + session.install("--pre", "--no-deps", "--upgrade", dep) + + # Remaining dependencies + other_deps = [ + "requests", + ] + session.install(*other_deps) + + # Print out prerelease package versions + + session.run("python", "-c", "import google.api_core; print(google.api_core.__version__)") + session.run("python", "-c", "import google.auth; print(google.auth.__version__)") + session.run("python", "-c", "import grpc; print(grpc.__version__)") + session.run( + "python", "-c", "import google.protobuf; print(google.protobuf.__version__)" + ) + session.run( + "python", "-c", "import proto; print(proto.__version__)" + ) + + session.run( + 'py.test', + '--quiet', + '--cov=google/cloud/texttospeech_v1beta1/', + '--cov=tests/', + '--cov-config=.coveragerc', + '--cov-report=term', + '--cov-report=html', + os.path.join('tests', 'unit', ''.join(session.posargs)), + env={ + "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, + }, + ) + + +@nox.session(python=DEFAULT_PYTHON_VERSION) +def cover(session): + """Run the final coverage report. + This outputs the coverage report aggregating coverage from the unit + test runs (not system test runs), and then erases coverage data. + """ + session.install("coverage", "pytest-cov") + session.run("coverage", "report", "--show-missing", "--fail-under=100") + + session.run("coverage", "erase") + + +@nox.session(python=ALL_PYTHON) +def mypy(session): + """Run the type checker.""" + session.install( + 'mypy', + 'types-requests', + 'types-protobuf' + ) + session.install('.') + session.run( + 'mypy', + '-p', + 'google', + ) + + +@nox.session +def update_lower_bounds(session): + """Update lower bounds in constraints.txt to match setup.py""" + session.install('google-cloud-testutils') + session.install('.') + + session.run( + 'lower-bound-checker', + 'update', + '--package-name', + PACKAGE_NAME, + '--constraints-file', + str(LOWER_BOUND_CONSTRAINTS_FILE), + ) + + +@nox.session +def check_lower_bounds(session): + """Check lower bounds in setup.py are reflected in constraints file""" + session.install('google-cloud-testutils') + session.install('.') + + session.run( + 'lower-bound-checker', + 'check', + '--package-name', + PACKAGE_NAME, + '--constraints-file', + str(LOWER_BOUND_CONSTRAINTS_FILE), + ) + +@nox.session(python=DEFAULT_PYTHON_VERSION) +def docs(session): + """Build the docs for this library.""" + + session.install("-e", ".") + session.install("sphinx==7.0.1", "alabaster", "recommonmark") + + shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True) + session.run( + "sphinx-build", + "-W", # warnings as errors + "-T", # show full traceback on exception + "-N", # no colors + "-b", + "html", + "-d", + os.path.join("docs", "_build", "doctrees", ""), + os.path.join("docs", ""), + os.path.join("docs", "_build", "html", ""), + ) + + +@nox.session(python=DEFAULT_PYTHON_VERSION) +def lint(session): + """Run linters. + + Returns a failure if the linters find linting errors or sufficiently + serious code quality issues. + """ + session.install("flake8", BLACK_VERSION) + session.run( + "black", + "--check", + *BLACK_PATHS, + ) + session.run("flake8", "google", "tests", "samples") + + +@nox.session(python=DEFAULT_PYTHON_VERSION) +def blacken(session): + """Run black. Format code to uniform standard.""" + session.install(BLACK_VERSION) + session.run( + "black", + *BLACK_PATHS, + ) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json new file mode 100644 index 000000000000..2877853b66c5 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json @@ -0,0 +1,659 @@ +{ + "clientLibrary": { + "apis": [ + { + "id": "google.cloud.texttospeech.v1beta1", + "version": "v1beta1" + } + ], + "language": "PYTHON", + "name": "google-cloud-texttospeech", + "version": "0.1.0" + }, + "snippets": [ + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeAsyncClient", + "shortName": "TextToSpeechLongAudioSynthesizeAsyncClient" + }, + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeAsyncClient.synthesize_long_audio", + "method": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeechLongAudioSynthesize.SynthesizeLongAudio", + "service": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeechLongAudioSynthesize", + "shortName": "TextToSpeechLongAudioSynthesize" + }, + "shortName": "SynthesizeLongAudio" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.texttospeech_v1beta1.types.SynthesizeLongAudioRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation_async.AsyncOperation", + "shortName": "synthesize_long_audio" + }, + "description": "Sample for SynthesizeLongAudio", + "file": "texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1beta1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_async", + "segments": [ + { + "end": 67, + "start": 27, + "type": "FULL" + }, + { + "end": 67, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 57, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 64, + "start": 58, + "type": "REQUEST_EXECUTION" + }, + { + "end": 68, + "start": 65, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeClient", + "shortName": "TextToSpeechLongAudioSynthesizeClient" + }, + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeClient.synthesize_long_audio", + "method": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeechLongAudioSynthesize.SynthesizeLongAudio", + "service": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeechLongAudioSynthesize", + "shortName": "TextToSpeechLongAudioSynthesize" + }, + "shortName": "SynthesizeLongAudio" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.texttospeech_v1beta1.types.SynthesizeLongAudioRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation.Operation", + "shortName": "synthesize_long_audio" + }, + "description": "Sample for SynthesizeLongAudio", + "file": "texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1beta1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_sync", + "segments": [ + { + "end": 67, + "start": 27, + "type": "FULL" + }, + { + "end": 67, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 57, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 64, + "start": 58, + "type": "REQUEST_EXECUTION" + }, + { + "end": 68, + "start": 65, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechAsyncClient", + "shortName": "TextToSpeechAsyncClient" + }, + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechAsyncClient.list_voices", + "method": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech.ListVoices", + "service": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech", + "shortName": "TextToSpeech" + }, + "shortName": "ListVoices" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.texttospeech_v1beta1.types.ListVoicesRequest" + }, + { + "name": "language_code", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.texttospeech_v1beta1.types.ListVoicesResponse", + "shortName": "list_voices" + }, + "description": "Sample for ListVoices", + "file": "texttospeech_v1beta1_generated_text_to_speech_list_voices_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1beta1_generated_TextToSpeech_ListVoices_async", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 44, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 47, + "start": 45, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "start": 48, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1beta1_generated_text_to_speech_list_voices_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechClient", + "shortName": "TextToSpeechClient" + }, + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechClient.list_voices", + "method": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech.ListVoices", + "service": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech", + "shortName": "TextToSpeech" + }, + "shortName": "ListVoices" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.texttospeech_v1beta1.types.ListVoicesRequest" + }, + { + "name": "language_code", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.texttospeech_v1beta1.types.ListVoicesResponse", + "shortName": "list_voices" + }, + "description": "Sample for ListVoices", + "file": "texttospeech_v1beta1_generated_text_to_speech_list_voices_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1beta1_generated_TextToSpeech_ListVoices_sync", + "segments": [ + { + "end": 50, + "start": 27, + "type": "FULL" + }, + { + "end": 50, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 44, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 47, + "start": 45, + "type": "REQUEST_EXECUTION" + }, + { + "end": 51, + "start": 48, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1beta1_generated_text_to_speech_list_voices_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechAsyncClient", + "shortName": "TextToSpeechAsyncClient" + }, + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechAsyncClient.streaming_synthesize", + "method": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech.StreamingSynthesize", + "service": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech", + "shortName": "TextToSpeech" + }, + "shortName": "StreamingSynthesize" + }, + "parameters": [ + { + "name": "requests", + "type": "Iterator[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeRequest]" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "Iterable[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeResponse]", + "shortName": "streaming_synthesize" + }, + "description": "Sample for StreamingSynthesize", + "file": "texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1beta1_generated_TextToSpeech_StreamingSynthesize_async", + "segments": [ + { + "end": 65, + "start": 27, + "type": "FULL" + }, + { + "end": 65, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 58, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 61, + "start": 59, + "type": "REQUEST_EXECUTION" + }, + { + "end": 66, + "start": 62, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechClient", + "shortName": "TextToSpeechClient" + }, + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechClient.streaming_synthesize", + "method": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech.StreamingSynthesize", + "service": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech", + "shortName": "TextToSpeech" + }, + "shortName": "StreamingSynthesize" + }, + "parameters": [ + { + "name": "requests", + "type": "Iterator[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeRequest]" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "Iterable[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeResponse]", + "shortName": "streaming_synthesize" + }, + "description": "Sample for StreamingSynthesize", + "file": "texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1beta1_generated_TextToSpeech_StreamingSynthesize_sync", + "segments": [ + { + "end": 65, + "start": 27, + "type": "FULL" + }, + { + "end": 65, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 58, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 61, + "start": 59, + "type": "REQUEST_EXECUTION" + }, + { + "end": 66, + "start": 62, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_sync.py" + }, + { + "canonical": true, + "clientMethod": { + "async": true, + "client": { + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechAsyncClient", + "shortName": "TextToSpeechAsyncClient" + }, + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechAsyncClient.synthesize_speech", + "method": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech.SynthesizeSpeech", + "service": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech", + "shortName": "TextToSpeech" + }, + "shortName": "SynthesizeSpeech" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechRequest" + }, + { + "name": "input", + "type": "google.cloud.texttospeech_v1beta1.types.SynthesisInput" + }, + { + "name": "voice", + "type": "google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams" + }, + { + "name": "audio_config", + "type": "google.cloud.texttospeech_v1beta1.types.AudioConfig" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechResponse", + "shortName": "synthesize_speech" + }, + "description": "Sample for SynthesizeSpeech", + "file": "texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1beta1_generated_TextToSpeech_SynthesizeSpeech_async", + "segments": [ + { + "end": 62, + "start": 27, + "type": "FULL" + }, + { + "end": 62, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 56, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 59, + "start": 57, + "type": "REQUEST_EXECUTION" + }, + { + "end": 63, + "start": 60, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_async.py" + }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechClient", + "shortName": "TextToSpeechClient" + }, + "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechClient.synthesize_speech", + "method": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech.SynthesizeSpeech", + "service": { + "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech", + "shortName": "TextToSpeech" + }, + "shortName": "SynthesizeSpeech" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechRequest" + }, + { + "name": "input", + "type": "google.cloud.texttospeech_v1beta1.types.SynthesisInput" + }, + { + "name": "voice", + "type": "google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams" + }, + { + "name": "audio_config", + "type": "google.cloud.texttospeech_v1beta1.types.AudioConfig" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechResponse", + "shortName": "synthesize_speech" + }, + "description": "Sample for SynthesizeSpeech", + "file": "texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "texttospeech_v1beta1_generated_TextToSpeech_SynthesizeSpeech_sync", + "segments": [ + { + "end": 62, + "start": 27, + "type": "FULL" + }, + { + "end": 62, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 56, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 59, + "start": 57, + "type": "REQUEST_EXECUTION" + }, + { + "end": 63, + "start": 60, + "type": "RESPONSE_HANDLING" + } + ], + "title": "texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_sync.py" + } + ] +} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_async.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_async.py new file mode 100644 index 000000000000..80d0fca4abdd --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_async.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for ListVoices +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1beta1_generated_TextToSpeech_ListVoices_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1beta1 + + +async def sample_list_voices(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechAsyncClient() + + # Initialize request argument(s) + request = texttospeech_v1beta1.ListVoicesRequest( + ) + + # Make the request + response = await client.list_voices(request=request) + + # Handle the response + print(response) + +# [END texttospeech_v1beta1_generated_TextToSpeech_ListVoices_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_sync.py new file mode 100644 index 000000000000..ecd143cd38b1 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_sync.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for ListVoices +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1beta1_generated_TextToSpeech_ListVoices_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1beta1 + + +def sample_list_voices(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechClient() + + # Initialize request argument(s) + request = texttospeech_v1beta1.ListVoicesRequest( + ) + + # Make the request + response = client.list_voices(request=request) + + # Handle the response + print(response) + +# [END texttospeech_v1beta1_generated_TextToSpeech_ListVoices_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py new file mode 100644 index 000000000000..1319a5349f8b --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for SynthesizeLongAudio +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1beta1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1beta1 + + +async def sample_synthesize_long_audio(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeAsyncClient() + + # Initialize request argument(s) + input = texttospeech_v1beta1.SynthesisInput() + input.text = "text_value" + + audio_config = texttospeech_v1beta1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + voice = texttospeech_v1beta1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + request = texttospeech_v1beta1.SynthesizeLongAudioRequest( + input=input, + audio_config=audio_config, + output_gcs_uri="output_gcs_uri_value", + voice=voice, + ) + + # Make the request + operation = client.synthesize_long_audio(request=request) + + print("Waiting for operation to complete...") + + response = (await operation).result() + + # Handle the response + print(response) + +# [END texttospeech_v1beta1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py new file mode 100644 index 000000000000..2acd42ac9c00 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for SynthesizeLongAudio +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1beta1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1beta1 + + +def sample_synthesize_long_audio(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeClient() + + # Initialize request argument(s) + input = texttospeech_v1beta1.SynthesisInput() + input.text = "text_value" + + audio_config = texttospeech_v1beta1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + voice = texttospeech_v1beta1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + request = texttospeech_v1beta1.SynthesizeLongAudioRequest( + input=input, + audio_config=audio_config, + output_gcs_uri="output_gcs_uri_value", + voice=voice, + ) + + # Make the request + operation = client.synthesize_long_audio(request=request) + + print("Waiting for operation to complete...") + + response = operation.result() + + # Handle the response + print(response) + +# [END texttospeech_v1beta1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_async.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_async.py new file mode 100644 index 000000000000..9b403cb1b4a1 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_async.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for StreamingSynthesize +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1beta1_generated_TextToSpeech_StreamingSynthesize_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1beta1 + + +async def sample_streaming_synthesize(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechAsyncClient() + + # Initialize request argument(s) + streaming_config = texttospeech_v1beta1.StreamingSynthesizeConfig() + streaming_config.voice.language_code = "language_code_value" + + request = texttospeech_v1beta1.StreamingSynthesizeRequest( + streaming_config=streaming_config, + ) + + # This method expects an iterator which contains + # 'texttospeech_v1beta1.StreamingSynthesizeRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = await client.streaming_synthesize(requests=request_generator()) + + # Handle the response + async for response in stream: + print(response) + +# [END texttospeech_v1beta1_generated_TextToSpeech_StreamingSynthesize_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_sync.py new file mode 100644 index 000000000000..cda6d83baa38 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_sync.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for StreamingSynthesize +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1beta1_generated_TextToSpeech_StreamingSynthesize_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1beta1 + + +def sample_streaming_synthesize(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechClient() + + # Initialize request argument(s) + streaming_config = texttospeech_v1beta1.StreamingSynthesizeConfig() + streaming_config.voice.language_code = "language_code_value" + + request = texttospeech_v1beta1.StreamingSynthesizeRequest( + streaming_config=streaming_config, + ) + + # This method expects an iterator which contains + # 'texttospeech_v1beta1.StreamingSynthesizeRequest' objects + # Here we create a generator that yields a single `request` for + # demonstrative purposes. + requests = [request] + + def request_generator(): + for request in requests: + yield request + + # Make the request + stream = client.streaming_synthesize(requests=request_generator()) + + # Handle the response + for response in stream: + print(response) + +# [END texttospeech_v1beta1_generated_TextToSpeech_StreamingSynthesize_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_async.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_async.py new file mode 100644 index 000000000000..6572f699ae90 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_async.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for SynthesizeSpeech +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1beta1_generated_TextToSpeech_SynthesizeSpeech_async] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1beta1 + + +async def sample_synthesize_speech(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechAsyncClient() + + # Initialize request argument(s) + input = texttospeech_v1beta1.SynthesisInput() + input.text = "text_value" + + voice = texttospeech_v1beta1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + audio_config = texttospeech_v1beta1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + request = texttospeech_v1beta1.SynthesizeSpeechRequest( + input=input, + voice=voice, + audio_config=audio_config, + ) + + # Make the request + response = await client.synthesize_speech(request=request) + + # Handle the response + print(response) + +# [END texttospeech_v1beta1_generated_TextToSpeech_SynthesizeSpeech_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_sync.py new file mode 100644 index 000000000000..3c635c21ded4 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_sync.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# +# Generated code. DO NOT EDIT! +# +# Snippet for SynthesizeSpeech +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-texttospeech + + +# [START texttospeech_v1beta1_generated_TextToSpeech_SynthesizeSpeech_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import texttospeech_v1beta1 + + +def sample_synthesize_speech(): + # Create a client + client = texttospeech_v1beta1.TextToSpeechClient() + + # Initialize request argument(s) + input = texttospeech_v1beta1.SynthesisInput() + input.text = "text_value" + + voice = texttospeech_v1beta1.VoiceSelectionParams() + voice.language_code = "language_code_value" + + audio_config = texttospeech_v1beta1.AudioConfig() + audio_config.audio_encoding = "ALAW" + + request = texttospeech_v1beta1.SynthesizeSpeechRequest( + input=input, + voice=voice, + audio_config=audio_config, + ) + + # Make the request + response = client.synthesize_speech(request=request) + + # Handle the response + print(response) + +# [END texttospeech_v1beta1_generated_TextToSpeech_SynthesizeSpeech_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/scripts/fixup_texttospeech_v1beta1_keywords.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/scripts/fixup_texttospeech_v1beta1_keywords.py new file mode 100644 index 000000000000..349a0a5110a2 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/scripts/fixup_texttospeech_v1beta1_keywords.py @@ -0,0 +1,179 @@ +#! /usr/bin/env python3 +# -*- coding: utf-8 -*- +# Copyright 2024 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 argparse +import os +import libcst as cst +import pathlib +import sys +from typing import (Any, Callable, Dict, List, Sequence, Tuple) + + +def partition( + predicate: Callable[[Any], bool], + iterator: Sequence[Any] +) -> Tuple[List[Any], List[Any]]: + """A stable, out-of-place partition.""" + results = ([], []) + + for i in iterator: + results[int(predicate(i))].append(i) + + # Returns trueList, falseList + return results[1], results[0] + + +class texttospeechCallTransformer(cst.CSTTransformer): + CTRL_PARAMS: Tuple[str] = ('retry', 'timeout', 'metadata') + METHOD_TO_PARAMS: Dict[str, Tuple[str]] = { + 'list_voices': ('language_code', ), + 'streaming_synthesize': ('streaming_config', 'input', ), + 'synthesize_long_audio': ('input', 'audio_config', 'output_gcs_uri', 'voice', 'parent', ), + 'synthesize_speech': ('input', 'voice', 'audio_config', 'enable_time_pointing', 'advanced_voice_options', ), + } + + def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode: + try: + key = original.func.attr.value + kword_params = self.METHOD_TO_PARAMS[key] + except (AttributeError, KeyError): + # Either not a method from the API or too convoluted to be sure. + return updated + + # If the existing code is valid, keyword args come after positional args. + # Therefore, all positional args must map to the first parameters. + args, kwargs = partition(lambda a: not bool(a.keyword), updated.args) + if any(k.keyword.value == "request" for k in kwargs): + # We've already fixed this file, don't fix it again. + return updated + + kwargs, ctrl_kwargs = partition( + lambda a: a.keyword.value not in self.CTRL_PARAMS, + kwargs + ) + + args, ctrl_args = args[:len(kword_params)], args[len(kword_params):] + ctrl_kwargs.extend(cst.Arg(value=a.value, keyword=cst.Name(value=ctrl)) + for a, ctrl in zip(ctrl_args, self.CTRL_PARAMS)) + + request_arg = cst.Arg( + value=cst.Dict([ + cst.DictElement( + cst.SimpleString("'{}'".format(name)), +cst.Element(value=arg.value) + ) + # Note: the args + kwargs looks silly, but keep in mind that + # the control parameters had to be stripped out, and that + # those could have been passed positionally or by keyword. + for name, arg in zip(kword_params, args + kwargs)]), + keyword=cst.Name("request") + ) + + return updated.with_changes( + args=[request_arg] + ctrl_kwargs + ) + + +def fix_files( + in_dir: pathlib.Path, + out_dir: pathlib.Path, + *, + transformer=texttospeechCallTransformer(), +): + """Duplicate the input dir to the output dir, fixing file method calls. + + Preconditions: + * in_dir is a real directory + * out_dir is a real, empty directory + """ + pyfile_gen = ( + pathlib.Path(os.path.join(root, f)) + for root, _, files in os.walk(in_dir) + for f in files if os.path.splitext(f)[1] == ".py" + ) + + for fpath in pyfile_gen: + with open(fpath, 'r') as f: + src = f.read() + + # Parse the code and insert method call fixes. + tree = cst.parse_module(src) + updated = tree.visit(transformer) + + # Create the path and directory structure for the new file. + updated_path = out_dir.joinpath(fpath.relative_to(in_dir)) + updated_path.parent.mkdir(parents=True, exist_ok=True) + + # Generate the updated source file at the corresponding path. + with open(updated_path, 'w') as f: + f.write(updated.code) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description="""Fix up source that uses the texttospeech client library. + +The existing sources are NOT overwritten but are copied to output_dir with changes made. + +Note: This tool operates at a best-effort level at converting positional + parameters in client method calls to keyword based parameters. + Cases where it WILL FAIL include + A) * or ** expansion in a method call. + B) Calls via function or method alias (includes free function calls) + C) Indirect or dispatched calls (e.g. the method is looked up dynamically) + + These all constitute false negatives. The tool will also detect false + positives when an API method shares a name with another method. +""") + parser.add_argument( + '-d', + '--input-directory', + required=True, + dest='input_dir', + help='the input directory to walk for python files to fix up', + ) + parser.add_argument( + '-o', + '--output-directory', + required=True, + dest='output_dir', + help='the directory to output files fixed via un-flattening', + ) + args = parser.parse_args() + input_dir = pathlib.Path(args.input_dir) + output_dir = pathlib.Path(args.output_dir) + if not input_dir.is_dir(): + print( + f"input directory '{input_dir}' does not exist or is not a directory", + file=sys.stderr, + ) + sys.exit(-1) + + if not output_dir.is_dir(): + print( + f"output directory '{output_dir}' does not exist or is not a directory", + file=sys.stderr, + ) + sys.exit(-1) + + if os.listdir(output_dir): + print( + f"output directory '{output_dir}' is not empty", + file=sys.stderr, + ) + sys.exit(-1) + + fix_files(input_dir, output_dir) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/setup.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/setup.py new file mode 100644 index 000000000000..d91c15741bbe --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/setup.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 io +import os +import re + +import setuptools # type: ignore + +package_root = os.path.abspath(os.path.dirname(__file__)) + +name = 'google-cloud-texttospeech' + + +description = "Google Cloud Texttospeech API client library" + +version = None + +with open(os.path.join(package_root, 'google/cloud/texttospeech/gapic_version.py')) as fp: + version_candidates = re.findall(r"(?<=\")\d+.\d+.\d+(?=\")", fp.read()) + assert (len(version_candidates) == 1) + version = version_candidates[0] + +if version[0] == "0": + release_status = "Development Status :: 4 - Beta" +else: + release_status = "Development Status :: 5 - Production/Stable" + +dependencies = [ + "google-api-core[grpc] >= 1.34.1, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*", + # Exclude incompatible versions of `google-auth` + # See https://github.com/googleapis/google-cloud-python/issues/12364 + "google-auth >= 2.14.1, <3.0.0dev,!=2.24.0,!=2.25.0", + "proto-plus >= 1.22.3, <2.0.0dev", + "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", + "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", +] +extras = { +} +url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-texttospeech" + +package_root = os.path.abspath(os.path.dirname(__file__)) + +readme_filename = os.path.join(package_root, "README.rst") +with io.open(readme_filename, encoding="utf-8") as readme_file: + readme = readme_file.read() + +packages = [ + package + for package in setuptools.find_namespace_packages() + if package.startswith("google") +] + +setuptools.setup( + name=name, + version=version, + description=description, + long_description=readme, + author="Google LLC", + author_email="googleapis-packages@google.com", + license="Apache 2.0", + url=url, + classifiers=[ + release_status, + "Intended Audience :: Developers", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Operating System :: OS Independent", + "Topic :: Internet", + ], + platforms="Posix; MacOS X; Windows", + packages=packages, + python_requires=">=3.7", + install_requires=dependencies, + extras_require=extras, + include_package_data=True, + zip_safe=False, +) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.10.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.10.txt new file mode 100644 index 000000000000..ed7f9aed2559 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.10.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.11.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.11.txt new file mode 100644 index 000000000000..ed7f9aed2559 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.11.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.12.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.12.txt new file mode 100644 index 000000000000..ed7f9aed2559 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.12.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.13.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.13.txt new file mode 100644 index 000000000000..ed7f9aed2559 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.13.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.7.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.7.txt new file mode 100644 index 000000000000..fc812592b0ee --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.7.txt @@ -0,0 +1,10 @@ +# This constraints file is used to check that lower bounds +# are correct in setup.py +# List all library dependencies and extras in this file. +# Pin the version to the lower bound. +# e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0dev", +# Then this file should have google-cloud-foo==1.14.0 +google-api-core==1.34.1 +google-auth==2.14.1 +proto-plus==1.22.3 +protobuf==3.20.2 diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.8.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.8.txt new file mode 100644 index 000000000000..ed7f9aed2559 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.8.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.9.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.9.txt new file mode 100644 index 000000000000..ed7f9aed2559 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.9.txt @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/__init__.py new file mode 100644 index 000000000000..7b3de3117f38 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/__init__.py @@ -0,0 +1,16 @@ + +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/__init__.py new file mode 100644 index 000000000000..7b3de3117f38 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/__init__.py @@ -0,0 +1,16 @@ + +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/__init__.py new file mode 100644 index 000000000000..7b3de3117f38 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/__init__.py @@ -0,0 +1,16 @@ + +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/__init__.py new file mode 100644 index 000000000000..7b3de3117f38 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/__init__.py @@ -0,0 +1,16 @@ + +# -*- coding: utf-8 -*- +# Copyright 2024 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. +# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech.py new file mode 100644 index 000000000000..c5d00459fbf4 --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech.py @@ -0,0 +1,3141 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 +# try/except added for compatibility with python < 3.8 +try: + from unittest import mock + from unittest.mock import AsyncMock # pragma: NO COVER +except ImportError: # pragma: NO COVER + import mock + +import grpc +from grpc.experimental import aio +from collections.abc import Iterable, AsyncIterable +from google.protobuf import json_format +import json +import math +import pytest +from google.api_core import api_core_version +from proto.marshal.rules.dates import DurationRule, TimestampRule +from proto.marshal.rules import wrappers +from requests import Response +from requests import Request, PreparedRequest +from requests.sessions import Session +from google.protobuf import json_format + +try: + from google.auth.aio import credentials as ga_credentials_async + HAS_GOOGLE_AUTH_AIO = True +except ImportError: # pragma: NO COVER + HAS_GOOGLE_AUTH_AIO = False + +from google.api_core import client_options +from google.api_core import exceptions as core_exceptions +from google.api_core import gapic_v1 +from google.api_core import grpc_helpers +from google.api_core import grpc_helpers_async +from google.api_core import path_template +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials +from google.auth.exceptions import MutualTLSChannelError +from google.cloud.texttospeech_v1beta1.services.text_to_speech import TextToSpeechAsyncClient +from google.cloud.texttospeech_v1beta1.services.text_to_speech import TextToSpeechClient +from google.cloud.texttospeech_v1beta1.services.text_to_speech import transports +from google.cloud.texttospeech_v1beta1.types import cloud_tts +from google.longrunning import operations_pb2 # type: ignore +from google.oauth2 import service_account +import google.auth + + +async def mock_async_gen(data, chunk_size=1): + for i in range(0, len(data)): # pragma: NO COVER + chunk = data[i : i + chunk_size] + yield chunk.encode("utf-8") + +def client_cert_source_callback(): + return b"cert bytes", b"key bytes" + +# TODO: use async auth anon credentials by default once the minimum version of google-auth is upgraded. +# See related issue: https://github.com/googleapis/gapic-generator-python/issues/2107. +def async_anonymous_credentials(): + if HAS_GOOGLE_AUTH_AIO: + return ga_credentials_async.AnonymousCredentials() + return ga_credentials.AnonymousCredentials() + +# If default endpoint is localhost, then default mtls endpoint will be the same. +# This method modifies the default endpoint so the client can produce a different +# mtls endpoint for endpoint testing purposes. +def modify_default_endpoint(client): + return "foo.googleapis.com" if ("localhost" in client.DEFAULT_ENDPOINT) else client.DEFAULT_ENDPOINT + +# If default endpoint template is localhost, then default mtls endpoint will be the same. +# This method modifies the default endpoint template so the client can produce a different +# mtls endpoint for endpoint testing purposes. +def modify_default_endpoint_template(client): + return "test.{UNIVERSE_DOMAIN}" if ("localhost" in client._DEFAULT_ENDPOINT_TEMPLATE) else client._DEFAULT_ENDPOINT_TEMPLATE + + +def test__get_default_mtls_endpoint(): + api_endpoint = "example.googleapis.com" + api_mtls_endpoint = "example.mtls.googleapis.com" + sandbox_endpoint = "example.sandbox.googleapis.com" + sandbox_mtls_endpoint = "example.mtls.sandbox.googleapis.com" + non_googleapi = "api.example.com" + + assert TextToSpeechClient._get_default_mtls_endpoint(None) is None + assert TextToSpeechClient._get_default_mtls_endpoint(api_endpoint) == api_mtls_endpoint + assert TextToSpeechClient._get_default_mtls_endpoint(api_mtls_endpoint) == api_mtls_endpoint + assert TextToSpeechClient._get_default_mtls_endpoint(sandbox_endpoint) == sandbox_mtls_endpoint + assert TextToSpeechClient._get_default_mtls_endpoint(sandbox_mtls_endpoint) == sandbox_mtls_endpoint + assert TextToSpeechClient._get_default_mtls_endpoint(non_googleapi) == non_googleapi + +def test__read_environment_variables(): + assert TextToSpeechClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + assert TextToSpeechClient._read_environment_variables() == (True, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): + assert TextToSpeechClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): + with pytest.raises(ValueError) as excinfo: + TextToSpeechClient._read_environment_variables() + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + assert TextToSpeechClient._read_environment_variables() == (False, "never", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + assert TextToSpeechClient._read_environment_variables() == (False, "always", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}): + assert TextToSpeechClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + TextToSpeechClient._read_environment_variables() + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + + with mock.patch.dict(os.environ, {"GOOGLE_CLOUD_UNIVERSE_DOMAIN": "foo.com"}): + assert TextToSpeechClient._read_environment_variables() == (False, "auto", "foo.com") + +def test__get_client_cert_source(): + mock_provided_cert_source = mock.Mock() + mock_default_cert_source = mock.Mock() + + assert TextToSpeechClient._get_client_cert_source(None, False) is None + assert TextToSpeechClient._get_client_cert_source(mock_provided_cert_source, False) is None + assert TextToSpeechClient._get_client_cert_source(mock_provided_cert_source, True) == mock_provided_cert_source + + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): + with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_default_cert_source): + assert TextToSpeechClient._get_client_cert_source(None, True) is mock_default_cert_source + assert TextToSpeechClient._get_client_cert_source(mock_provided_cert_source, "true") is mock_provided_cert_source + +@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) +@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) +def test__get_api_endpoint(): + api_override = "foo.com" + mock_client_cert_source = mock.Mock() + default_universe = TextToSpeechClient._DEFAULT_UNIVERSE + default_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) + mock_universe = "bar.com" + mock_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) + + assert TextToSpeechClient._get_api_endpoint(api_override, mock_client_cert_source, default_universe, "always") == api_override + assert TextToSpeechClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "auto") == TextToSpeechClient.DEFAULT_MTLS_ENDPOINT + assert TextToSpeechClient._get_api_endpoint(None, None, default_universe, "auto") == default_endpoint + assert TextToSpeechClient._get_api_endpoint(None, None, default_universe, "always") == TextToSpeechClient.DEFAULT_MTLS_ENDPOINT + assert TextToSpeechClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "always") == TextToSpeechClient.DEFAULT_MTLS_ENDPOINT + assert TextToSpeechClient._get_api_endpoint(None, None, mock_universe, "never") == mock_endpoint + assert TextToSpeechClient._get_api_endpoint(None, None, default_universe, "never") == default_endpoint + + with pytest.raises(MutualTLSChannelError) as excinfo: + TextToSpeechClient._get_api_endpoint(None, mock_client_cert_source, mock_universe, "auto") + assert str(excinfo.value) == "mTLS is not supported in any universe other than googleapis.com." + + +def test__get_universe_domain(): + client_universe_domain = "foo.com" + universe_domain_env = "bar.com" + + assert TextToSpeechClient._get_universe_domain(client_universe_domain, universe_domain_env) == client_universe_domain + assert TextToSpeechClient._get_universe_domain(None, universe_domain_env) == universe_domain_env + assert TextToSpeechClient._get_universe_domain(None, None) == TextToSpeechClient._DEFAULT_UNIVERSE + + with pytest.raises(ValueError) as excinfo: + TextToSpeechClient._get_universe_domain("", None) + assert str(excinfo.value) == "Universe Domain cannot be an empty string." + +@pytest.mark.parametrize("client_class,transport_class,transport_name", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc"), + (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest"), +]) +def test__validate_universe_domain(client_class, transport_class, transport_name): + client = client_class( + transport=transport_class( + credentials=ga_credentials.AnonymousCredentials() + ) + ) + assert client._validate_universe_domain() == True + + # Test the case when universe is already validated. + assert client._validate_universe_domain() == True + + if transport_name == "grpc": + # Test the case where credentials are provided by the + # `local_channel_credentials`. The default universes in both match. + channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) + client = client_class(transport=transport_class(channel=channel)) + assert client._validate_universe_domain() == True + + # Test the case where credentials do not exist: e.g. a transport is provided + # with no credentials. Validation should still succeed because there is no + # mismatch with non-existent credentials. + channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) + transport=transport_class(channel=channel) + transport._credentials = None + client = client_class(transport=transport) + assert client._validate_universe_domain() == True + + # TODO: This is needed to cater for older versions of google-auth + # Make this test unconditional once the minimum supported version of + # google-auth becomes 2.23.0 or higher. + google_auth_major, google_auth_minor = [int(part) for part in google.auth.__version__.split(".")[0:2]] + if google_auth_major > 2 or (google_auth_major == 2 and google_auth_minor >= 23): + credentials = ga_credentials.AnonymousCredentials() + credentials._universe_domain = "foo.com" + # Test the case when there is a universe mismatch from the credentials. + client = client_class( + transport=transport_class(credentials=credentials) + ) + with pytest.raises(ValueError) as excinfo: + client._validate_universe_domain() + assert str(excinfo.value) == "The configured universe domain (googleapis.com) does not match the universe domain found in the credentials (foo.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." + + # Test the case when there is a universe mismatch from the client. + # + # TODO: Make this test unconditional once the minimum supported version of + # google-api-core becomes 2.15.0 or higher. + api_core_major, api_core_minor = [int(part) for part in api_core_version.__version__.split(".")[0:2]] + if api_core_major > 2 or (api_core_major == 2 and api_core_minor >= 15): + client = client_class(client_options={"universe_domain": "bar.com"}, transport=transport_class(credentials=ga_credentials.AnonymousCredentials(),)) + with pytest.raises(ValueError) as excinfo: + client._validate_universe_domain() + assert str(excinfo.value) == "The configured universe domain (bar.com) does not match the universe domain found in the credentials (googleapis.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." + + # Test that ValueError is raised if universe_domain is provided via client options and credentials is None + with pytest.raises(ValueError): + client._compare_universes("foo.bar", None) + + +@pytest.mark.parametrize("client_class,transport_name", [ + (TextToSpeechClient, "grpc"), + (TextToSpeechAsyncClient, "grpc_asyncio"), + (TextToSpeechClient, "rest"), +]) +def test_text_to_speech_client_from_service_account_info(client_class, transport_name): + creds = ga_credentials.AnonymousCredentials() + with mock.patch.object(service_account.Credentials, 'from_service_account_info') as factory: + factory.return_value = creds + info = {"valid": True} + client = client_class.from_service_account_info(info, transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + assert client.transport._host == ( + 'texttospeech.googleapis.com:443' + if transport_name in ['grpc', 'grpc_asyncio'] + else + 'https://texttospeech.googleapis.com' + ) + + +@pytest.mark.parametrize("transport_class,transport_name", [ + (transports.TextToSpeechGrpcTransport, "grpc"), + (transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio"), + (transports.TextToSpeechRestTransport, "rest"), +]) +def test_text_to_speech_client_service_account_always_use_jwt(transport_class, transport_name): + with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=True) + use_jwt.assert_called_once_with(True) + + with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=False) + use_jwt.assert_not_called() + + +@pytest.mark.parametrize("client_class,transport_name", [ + (TextToSpeechClient, "grpc"), + (TextToSpeechAsyncClient, "grpc_asyncio"), + (TextToSpeechClient, "rest"), +]) +def test_text_to_speech_client_from_service_account_file(client_class, transport_name): + creds = ga_credentials.AnonymousCredentials() + with mock.patch.object(service_account.Credentials, 'from_service_account_file') as factory: + factory.return_value = creds + client = client_class.from_service_account_file("dummy/file/path.json", transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + client = client_class.from_service_account_json("dummy/file/path.json", transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + assert client.transport._host == ( + 'texttospeech.googleapis.com:443' + if transport_name in ['grpc', 'grpc_asyncio'] + else + 'https://texttospeech.googleapis.com' + ) + + +def test_text_to_speech_client_get_transport_class(): + transport = TextToSpeechClient.get_transport_class() + available_transports = [ + transports.TextToSpeechGrpcTransport, + transports.TextToSpeechRestTransport, + ] + assert transport in available_transports + + transport = TextToSpeechClient.get_transport_class("grpc") + assert transport == transports.TextToSpeechGrpcTransport + + +@pytest.mark.parametrize("client_class,transport_class,transport_name", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc"), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio"), + (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest"), +]) +@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) +@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) +def test_text_to_speech_client_client_options(client_class, transport_class, transport_name): + # Check that if channel is provided we won't create a new one. + with mock.patch.object(TextToSpeechClient, 'get_transport_class') as gtc: + transport = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ) + client = client_class(transport=transport) + gtc.assert_not_called() + + # Check that if channel is provided via str we will create a new one. + with mock.patch.object(TextToSpeechClient, 'get_transport_class') as gtc: + client = client_class(transport=transport_name) + gtc.assert_called() + + # Check the case api_endpoint is provided. + options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(transport=transport_name, client_options=options) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host="squid.clam.whelk", + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is + # "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is + # "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client.DEFAULT_MTLS_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has + # unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + client = client_class(transport=transport_name) + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + + # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): + with pytest.raises(ValueError) as excinfo: + client = client_class(transport=transport_name) + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + + # Check the case quota_project_id is provided + options = client_options.ClientOptions(quota_project_id="octopus") + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id="octopus", + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + # Check the case api_endpoint is provided + options = client_options.ClientOptions(api_audience="https://language.googleapis.com") + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience="https://language.googleapis.com" + ) + +@pytest.mark.parametrize("client_class,transport_class,transport_name,use_client_cert_env", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", "true"), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", "true"), + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", "false"), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", "false"), + (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest", "true"), + (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest", "false"), +]) +@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) +@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) +@mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}) +def test_text_to_speech_client_mtls_env_auto(client_class, transport_class, transport_name, use_client_cert_env): + # This tests the endpoint autoswitch behavior. Endpoint is autoswitched to the default + # mtls endpoint, if GOOGLE_API_USE_CLIENT_CERTIFICATE is "true" and client cert exists. + + # Check the case client_cert_source is provided. Whether client cert is used depends on + # GOOGLE_API_USE_CLIENT_CERTIFICATE value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): + options = client_options.ClientOptions(client_cert_source=client_cert_source_callback) + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + + if use_client_cert_env == "false": + expected_client_cert_source = None + expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) + else: + expected_client_cert_source = client_cert_source_callback + expected_host = client.DEFAULT_MTLS_ENDPOINT + + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=expected_host, + scopes=None, + client_cert_source_for_mtls=expected_client_cert_source, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case ADC client cert is provided. Whether client cert is used depends on + # GOOGLE_API_USE_CLIENT_CERTIFICATE value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): + with mock.patch.object(transport_class, '__init__') as patched: + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): + with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=client_cert_source_callback): + if use_client_cert_env == "false": + expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) + expected_client_cert_source = None + else: + expected_host = client.DEFAULT_MTLS_ENDPOINT + expected_client_cert_source = client_cert_source_callback + + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=expected_host, + scopes=None, + client_cert_source_for_mtls=expected_client_cert_source, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case client_cert_source and ADC client cert are not provided. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): + with mock.patch.object(transport_class, '__init__') as patched: + with mock.patch("google.auth.transport.mtls.has_default_client_cert_source", return_value=False): + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize("client_class", [ + TextToSpeechClient, TextToSpeechAsyncClient +]) +@mock.patch.object(TextToSpeechClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechClient)) +@mock.patch.object(TextToSpeechAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechAsyncClient)) +def test_text_to_speech_client_get_mtls_endpoint_and_cert_source(client_class): + mock_client_cert_source = mock.Mock() + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "true". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + mock_api_endpoint = "foo" + options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) + assert api_endpoint == mock_api_endpoint + assert cert_source == mock_client_cert_source + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "false". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): + mock_client_cert_source = mock.Mock() + mock_api_endpoint = "foo" + options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) + assert api_endpoint == mock_api_endpoint + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert doesn't exist. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=False): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert exists. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): + with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_client_cert_source): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source == mock_client_cert_source + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has + # unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + client_class.get_mtls_endpoint_and_cert_source() + + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + + # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): + with pytest.raises(ValueError) as excinfo: + client_class.get_mtls_endpoint_and_cert_source() + + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + +@pytest.mark.parametrize("client_class", [ + TextToSpeechClient, TextToSpeechAsyncClient +]) +@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) +@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) +def test_text_to_speech_client_client_api_endpoint(client_class): + mock_client_cert_source = client_cert_source_callback + api_override = "foo.com" + default_universe = TextToSpeechClient._DEFAULT_UNIVERSE + default_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) + mock_universe = "bar.com" + mock_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) + + # If ClientOptions.api_endpoint is set and GOOGLE_API_USE_CLIENT_CERTIFICATE="true", + # use ClientOptions.api_endpoint as the api endpoint regardless. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel"): + options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=api_override) + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == api_override + + # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="never", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + client = client_class(credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == default_endpoint + + # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="always", + # use the DEFAULT_MTLS_ENDPOINT as the api endpoint. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + client = client_class(credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + + # If ClientOptions.api_endpoint is not set, GOOGLE_API_USE_MTLS_ENDPOINT="auto" (default), + # GOOGLE_API_USE_CLIENT_CERTIFICATE="false" (default), default cert source doesn't exist, + # and ClientOptions.universe_domain="bar.com", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with universe domain as the api endpoint. + options = client_options.ClientOptions() + universe_exists = hasattr(options, "universe_domain") + if universe_exists: + options = client_options.ClientOptions(universe_domain=mock_universe) + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + else: + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == (mock_endpoint if universe_exists else default_endpoint) + assert client.universe_domain == (mock_universe if universe_exists else default_universe) + + # If ClientOptions does not have a universe domain attribute and GOOGLE_API_USE_MTLS_ENDPOINT="never", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. + options = client_options.ClientOptions() + if hasattr(options, "universe_domain"): + delattr(options, "universe_domain") + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == default_endpoint + + +@pytest.mark.parametrize("client_class,transport_class,transport_name", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc"), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio"), + (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest"), +]) +def test_text_to_speech_client_client_options_scopes(client_class, transport_class, transport_name): + # Check the case scopes are provided. + options = client_options.ClientOptions( + scopes=["1", "2"], + ) + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=["1", "2"], + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + +@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", grpc_helpers), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), + (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest", None), +]) +def test_text_to_speech_client_client_options_credentials_file(client_class, transport_class, transport_name, grpc_helpers): + # Check the case credentials file is provided. + options = client_options.ClientOptions( + credentials_file="credentials.json" + ) + + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file="credentials.json", + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + +def test_text_to_speech_client_client_options_from_dict(): + with mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech.transports.TextToSpeechGrpcTransport.__init__') as grpc_transport: + grpc_transport.return_value = None + client = TextToSpeechClient( + client_options={'api_endpoint': 'squid.clam.whelk'} + ) + grpc_transport.assert_called_once_with( + credentials=None, + credentials_file=None, + host="squid.clam.whelk", + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", grpc_helpers), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), +]) +def test_text_to_speech_client_create_channel_credentials_file(client_class, transport_class, transport_name, grpc_helpers): + # Check the case credentials file is provided. + options = client_options.ClientOptions( + credentials_file="credentials.json" + ) + + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file="credentials.json", + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # test that the credentials from file are saved and used as the credentials. + with mock.patch.object( + google.auth, "load_credentials_from_file", autospec=True + ) as load_creds, mock.patch.object( + google.auth, "default", autospec=True + ) as adc, mock.patch.object( + grpc_helpers, "create_channel" + ) as create_channel: + creds = ga_credentials.AnonymousCredentials() + file_creds = ga_credentials.AnonymousCredentials() + load_creds.return_value = (file_creds, None) + adc.return_value = (creds, None) + client = client_class(client_options=options, transport=transport_name) + create_channel.assert_called_with( + "texttospeech.googleapis.com:443", + credentials=file_creds, + credentials_file=None, + quota_project_id=None, + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + scopes=None, + default_host="texttospeech.googleapis.com", + ssl_credentials=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts.ListVoicesRequest, + dict, +]) +def test_list_voices(request_type, transport: str = 'grpc'): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = cloud_tts.ListVoicesResponse( + ) + response = client.list_voices(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = cloud_tts.ListVoicesRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, cloud_tts.ListVoicesResponse) + + +def test_list_voices_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='grpc', + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = cloud_tts.ListVoicesRequest( + language_code='language_code_value', + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + call.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client.list_voices(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == cloud_tts.ListVoicesRequest( + language_code='language_code_value', + ) + +def test_list_voices_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.list_voices in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.list_voices] = mock_rpc + request = {} + client.list_voices(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.list_voices(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_list_voices_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._client._transport.list_voices in client._client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[client._client._transport.list_voices] = mock_rpc + + request = {} + await client.list_voices(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.list_voices(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_list_voices_async(transport: str = 'grpc_asyncio', request_type=cloud_tts.ListVoicesRequest): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value =grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.ListVoicesResponse( + )) + response = await client.list_voices(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = cloud_tts.ListVoicesRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, cloud_tts.ListVoicesResponse) + + +@pytest.mark.asyncio +async def test_list_voices_async_from_dict(): + await test_list_voices_async(request_type=dict) + + +def test_list_voices_flattened(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = cloud_tts.ListVoicesResponse() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.list_voices( + language_code='language_code_value', + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].language_code + mock_val = 'language_code_value' + assert arg == mock_val + + +def test_list_voices_flattened_error(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.list_voices( + cloud_tts.ListVoicesRequest(), + language_code='language_code_value', + ) + +@pytest.mark.asyncio +async def test_list_voices_flattened_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = cloud_tts.ListVoicesResponse() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.ListVoicesResponse()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.list_voices( + language_code='language_code_value', + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].language_code + mock_val = 'language_code_value' + assert arg == mock_val + +@pytest.mark.asyncio +async def test_list_voices_flattened_error_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.list_voices( + cloud_tts.ListVoicesRequest(), + language_code='language_code_value', + ) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts.SynthesizeSpeechRequest, + dict, +]) +def test_synthesize_speech(request_type, transport: str = 'grpc'): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = cloud_tts.SynthesizeSpeechResponse( + audio_content=b'audio_content_blob', + ) + response = client.synthesize_speech(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = cloud_tts.SynthesizeSpeechRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, cloud_tts.SynthesizeSpeechResponse) + assert response.audio_content == b'audio_content_blob' + + +def test_synthesize_speech_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='grpc', + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = cloud_tts.SynthesizeSpeechRequest( + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + call.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client.synthesize_speech(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == cloud_tts.SynthesizeSpeechRequest( + ) + +def test_synthesize_speech_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.synthesize_speech in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.synthesize_speech] = mock_rpc + request = {} + client.synthesize_speech(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.synthesize_speech(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_synthesize_speech_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._client._transport.synthesize_speech in client._client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[client._client._transport.synthesize_speech] = mock_rpc + + request = {} + await client.synthesize_speech(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.synthesize_speech(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_synthesize_speech_async(transport: str = 'grpc_asyncio', request_type=cloud_tts.SynthesizeSpeechRequest): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value =grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.SynthesizeSpeechResponse( + audio_content=b'audio_content_blob', + )) + response = await client.synthesize_speech(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = cloud_tts.SynthesizeSpeechRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, cloud_tts.SynthesizeSpeechResponse) + assert response.audio_content == b'audio_content_blob' + + +@pytest.mark.asyncio +async def test_synthesize_speech_async_from_dict(): + await test_synthesize_speech_async(request_type=dict) + + +def test_synthesize_speech_flattened(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = cloud_tts.SynthesizeSpeechResponse() + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + client.synthesize_speech( + input=cloud_tts.SynthesisInput(text='text_value'), + voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), + audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + arg = args[0].input + mock_val = cloud_tts.SynthesisInput(text='text_value') + assert arg == mock_val + arg = args[0].voice + mock_val = cloud_tts.VoiceSelectionParams(language_code='language_code_value') + assert arg == mock_val + arg = args[0].audio_config + mock_val = cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16) + assert arg == mock_val + + +def test_synthesize_speech_flattened_error(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.synthesize_speech( + cloud_tts.SynthesizeSpeechRequest(), + input=cloud_tts.SynthesisInput(text='text_value'), + voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), + audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), + ) + +@pytest.mark.asyncio +async def test_synthesize_speech_flattened_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = cloud_tts.SynthesizeSpeechResponse() + + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.SynthesizeSpeechResponse()) + # Call the method with a truthy value for each flattened field, + # using the keyword arguments to the method. + response = await client.synthesize_speech( + input=cloud_tts.SynthesisInput(text='text_value'), + voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), + audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), + ) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + arg = args[0].input + mock_val = cloud_tts.SynthesisInput(text='text_value') + assert arg == mock_val + arg = args[0].voice + mock_val = cloud_tts.VoiceSelectionParams(language_code='language_code_value') + assert arg == mock_val + arg = args[0].audio_config + mock_val = cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16) + assert arg == mock_val + +@pytest.mark.asyncio +async def test_synthesize_speech_flattened_error_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + await client.synthesize_speech( + cloud_tts.SynthesizeSpeechRequest(), + input=cloud_tts.SynthesisInput(text='text_value'), + voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), + audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), + ) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts.StreamingSynthesizeRequest, + dict, +]) +def test_streaming_synthesize(request_type, transport: str = 'grpc'): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + requests = [request] + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.streaming_synthesize), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = iter([cloud_tts.StreamingSynthesizeResponse()]) + response = client.streaming_synthesize(iter(requests)) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert next(args[0]) == request + + # Establish that the response is the type that we expect. + for message in response: + assert isinstance(message, cloud_tts.StreamingSynthesizeResponse) + + +def test_streaming_synthesize_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.streaming_synthesize in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.streaming_synthesize] = mock_rpc + request = [{}] + client.streaming_synthesize(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.streaming_synthesize(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_streaming_synthesize_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._client._transport.streaming_synthesize in client._client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[client._client._transport.streaming_synthesize] = mock_rpc + + request = [{}] + await client.streaming_synthesize(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + await client.streaming_synthesize(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_streaming_synthesize_async(transport: str = 'grpc_asyncio', request_type=cloud_tts.StreamingSynthesizeRequest): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + requests = [request] + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.streaming_synthesize), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = mock.Mock(aio.StreamStreamCall, autospec=True) + call.return_value.read = mock.AsyncMock(side_effect=[cloud_tts.StreamingSynthesizeResponse()]) + response = await client.streaming_synthesize(iter(requests)) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert next(args[0]) == request + + # Establish that the response is the type that we expect. + message = await response.read() + assert isinstance(message, cloud_tts.StreamingSynthesizeResponse) + + +@pytest.mark.asyncio +async def test_streaming_synthesize_async_from_dict(): + await test_streaming_synthesize_async(request_type=dict) + + +def test_list_voices_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.list_voices in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.list_voices] = mock_rpc + + request = {} + client.list_voices(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.list_voices(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_list_voices_rest_flattened(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), 'request') as req: + # Designate an appropriate value for the returned response. + return_value = cloud_tts.ListVoicesResponse() + + # get arguments that satisfy an http rule for this method + sample_request = {} + + # get truthy value for each flattened field + mock_args = dict( + language_code='language_code_value', + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = cloud_tts.ListVoicesResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode('UTF-8') + req.return_value = response_value + + client.list_voices(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate("%s/v1beta1/voices" % client.transport._host, args[1]) + + +def test_list_voices_rest_flattened_error(transport: str = 'rest'): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.list_voices( + cloud_tts.ListVoicesRequest(), + language_code='language_code_value', + ) + + +def test_synthesize_speech_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.synthesize_speech in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.synthesize_speech] = mock_rpc + + request = {} + client.synthesize_speech(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.synthesize_speech(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_synthesize_speech_rest_required_fields(request_type=cloud_tts.SynthesizeSpeechRequest): + transport_class = transports.TextToSpeechRestTransport + + request_init = {} + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads(json_format.MessageToJson( + pb_request, + use_integers_for_enums=False + )) + + # verify fields with default values are dropped + + unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_speech._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_speech._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='rest', + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = cloud_tts.SynthesizeSpeechResponse() + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, 'request') as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, 'transcode') as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + 'uri': 'v1/sample_method', + 'method': "post", + 'query_params': pb_request, + } + transcode_result['body'] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = cloud_tts.SynthesizeSpeechResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode('UTF-8') + req.return_value = response_value + + response = client.synthesize_speech(request) + + expected_params = [ + ] + actual_params = req.call_args.kwargs['params'] + assert expected_params == actual_params + + +def test_synthesize_speech_rest_unset_required_fields(): + transport = transports.TextToSpeechRestTransport(credentials=ga_credentials.AnonymousCredentials) + + unset_fields = transport.synthesize_speech._get_unset_required_fields({}) + assert set(unset_fields) == (set(()) & set(("input", "voice", "audioConfig", ))) + + +def test_synthesize_speech_rest_flattened(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), 'request') as req: + # Designate an appropriate value for the returned response. + return_value = cloud_tts.SynthesizeSpeechResponse() + + # get arguments that satisfy an http rule for this method + sample_request = {} + + # get truthy value for each flattened field + mock_args = dict( + input=cloud_tts.SynthesisInput(text='text_value'), + voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), + audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = cloud_tts.SynthesizeSpeechResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode('UTF-8') + req.return_value = response_value + + client.synthesize_speech(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate("%s/v1beta1/text:synthesize" % client.transport._host, args[1]) + + +def test_synthesize_speech_rest_flattened_error(transport: str = 'rest'): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.synthesize_speech( + cloud_tts.SynthesizeSpeechRequest(), + input=cloud_tts.SynthesisInput(text='text_value'), + voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), + audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), + ) + + +def test_streaming_synthesize_rest_no_http_options(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = cloud_tts.StreamingSynthesizeRequest() + requests = [request] + with pytest.raises(RuntimeError): + client.streaming_synthesize(requests) + + +def test_streaming_synthesize_rest_error(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='rest' + ) + # Since a `google.api.http` annotation is required for using a rest transport + # method, this should error. + with pytest.raises(NotImplementedError) as not_implemented_error: + client.streaming_synthesize({}) + assert ( + "Method StreamingSynthesize is not available over REST transport" + in str(not_implemented_error.value) + ) + + +def test_credentials_transport_error(): + # It is an error to provide credentials and a transport instance. + transport = transports.TextToSpeechGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # It is an error to provide a credentials file and a transport instance. + transport = transports.TextToSpeechGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = TextToSpeechClient( + client_options={"credentials_file": "credentials.json"}, + transport=transport, + ) + + # It is an error to provide an api_key and a transport instance. + transport = transports.TextToSpeechGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + options = client_options.ClientOptions() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = TextToSpeechClient( + client_options=options, + transport=transport, + ) + + # It is an error to provide an api_key and a credential. + options = client_options.ClientOptions() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = TextToSpeechClient( + client_options=options, + credentials=ga_credentials.AnonymousCredentials() + ) + + # It is an error to provide scopes and a transport instance. + transport = transports.TextToSpeechGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = TextToSpeechClient( + client_options={"scopes": ["1", "2"]}, + transport=transport, + ) + + +def test_transport_instance(): + # A client may be instantiated with a custom transport instance. + transport = transports.TextToSpeechGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + client = TextToSpeechClient(transport=transport) + assert client.transport is transport + +def test_transport_get_channel(): + # A client may be instantiated with a custom transport instance. + transport = transports.TextToSpeechGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + channel = transport.grpc_channel + assert channel + + transport = transports.TextToSpeechGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + channel = transport.grpc_channel + assert channel + +@pytest.mark.parametrize("transport_class", [ + transports.TextToSpeechGrpcTransport, + transports.TextToSpeechGrpcAsyncIOTransport, + transports.TextToSpeechRestTransport, +]) +def test_transport_adc(transport_class): + # Test default credentials are used if not provided. + with mock.patch.object(google.auth, 'default') as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport_class() + adc.assert_called_once() + +def test_transport_kind_grpc(): + transport = TextToSpeechClient.get_transport_class("grpc")( + credentials=ga_credentials.AnonymousCredentials() + ) + assert transport.kind == "grpc" + + +def test_initialize_client_w_grpc(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_list_voices_empty_call_grpc(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + call.return_value = cloud_tts.ListVoicesResponse() + client.list_voices(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts.ListVoicesRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_synthesize_speech_empty_call_grpc(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + call.return_value = cloud_tts.SynthesizeSpeechResponse() + client.synthesize_speech(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts.SynthesizeSpeechRequest() + + assert args[0] == request_msg + + +def test_transport_kind_grpc_asyncio(): + transport = TextToSpeechAsyncClient.get_transport_class("grpc_asyncio")( + credentials=async_anonymous_credentials() + ) + assert transport.kind == "grpc_asyncio" + + +def test_initialize_client_w_grpc_asyncio(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_list_voices_empty_call_grpc_asyncio(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.ListVoicesResponse( + )) + await client.list_voices(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts.ListVoicesRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_synthesize_speech_empty_call_grpc_asyncio(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.SynthesizeSpeechResponse( + audio_content=b'audio_content_blob', + )) + await client.synthesize_speech(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts.SynthesizeSpeechRequest() + + assert args[0] == request_msg + + +def test_transport_kind_rest(): + transport = TextToSpeechClient.get_transport_class("rest")( + credentials=ga_credentials.AnonymousCredentials() + ) + assert transport.kind == "rest" + + +def test_list_voices_rest_bad_request(request_type=cloud_tts.ListVoicesRequest): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + client.list_voices(request) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts.ListVoicesRequest, + dict, +]) +def test_list_voices_rest_call_success(request_type): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), 'request') as req: + # Designate an appropriate value for the returned response. + return_value = cloud_tts.ListVoicesResponse( + ) + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = cloud_tts.ListVoicesResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + req.return_value = response_value + response = client.list_voices(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, cloud_tts.ListVoicesResponse) + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_list_voices_rest_interceptors(null_interceptor): + transport = transports.TextToSpeechRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None if null_interceptor else transports.TextToSpeechRestInterceptor(), + ) + client = TextToSpeechClient(transport=transport) + + with mock.patch.object(type(client.transport._session), "request") as req, \ + mock.patch.object(path_template, "transcode") as transcode, \ + mock.patch.object(transports.TextToSpeechRestInterceptor, "post_list_voices") as post, \ + mock.patch.object(transports.TextToSpeechRestInterceptor, "pre_list_voices") as pre: + pre.assert_not_called() + post.assert_not_called() + pb_message = cloud_tts.ListVoicesRequest.pb(cloud_tts.ListVoicesRequest()) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + return_value = cloud_tts.ListVoicesResponse.to_json(cloud_tts.ListVoicesResponse()) + req.return_value.content = return_value + + request = cloud_tts.ListVoicesRequest() + metadata =[ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = cloud_tts.ListVoicesResponse() + + client.list_voices(request, metadata=[("key", "val"), ("cephalopod", "squid"),]) + + pre.assert_called_once() + post.assert_called_once() + + +def test_synthesize_speech_rest_bad_request(request_type=cloud_tts.SynthesizeSpeechRequest): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + client.synthesize_speech(request) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts.SynthesizeSpeechRequest, + dict, +]) +def test_synthesize_speech_rest_call_success(request_type): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), 'request') as req: + # Designate an appropriate value for the returned response. + return_value = cloud_tts.SynthesizeSpeechResponse( + audio_content=b'audio_content_blob', + ) + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = cloud_tts.SynthesizeSpeechResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + req.return_value = response_value + response = client.synthesize_speech(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, cloud_tts.SynthesizeSpeechResponse) + assert response.audio_content == b'audio_content_blob' + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_synthesize_speech_rest_interceptors(null_interceptor): + transport = transports.TextToSpeechRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None if null_interceptor else transports.TextToSpeechRestInterceptor(), + ) + client = TextToSpeechClient(transport=transport) + + with mock.patch.object(type(client.transport._session), "request") as req, \ + mock.patch.object(path_template, "transcode") as transcode, \ + mock.patch.object(transports.TextToSpeechRestInterceptor, "post_synthesize_speech") as post, \ + mock.patch.object(transports.TextToSpeechRestInterceptor, "pre_synthesize_speech") as pre: + pre.assert_not_called() + post.assert_not_called() + pb_message = cloud_tts.SynthesizeSpeechRequest.pb(cloud_tts.SynthesizeSpeechRequest()) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + return_value = cloud_tts.SynthesizeSpeechResponse.to_json(cloud_tts.SynthesizeSpeechResponse()) + req.return_value.content = return_value + + request = cloud_tts.SynthesizeSpeechRequest() + metadata =[ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = cloud_tts.SynthesizeSpeechResponse() + + client.synthesize_speech(request, metadata=[("key", "val"), ("cephalopod", "squid"),]) + + pre.assert_called_once() + post.assert_called_once() + + +def test_streaming_synthesize_rest_error(): + + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + + with pytest.raises(NotImplementedError) as not_implemented_error: + client.streaming_synthesize({}) + assert ( + "Method StreamingSynthesize is not available over REST transport" + in str(not_implemented_error.value) + ) + + +def test_get_operation_rest_bad_request(request_type=operations_pb2.GetOperationRequest): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type() + request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2/operations/sample3'}, request) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = Response() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = Request() + req.return_value = response_value + client.get_operation(request) + + +@pytest.mark.parametrize("request_type", [ + operations_pb2.GetOperationRequest, + dict, +]) +def test_get_operation_rest(request_type): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + request_init = {'name': 'projects/sample1/locations/sample2/operations/sample3'} + request = request_type(**request_init) + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, 'request') as req: + # Designate an appropriate value for the returned response. + return_value = operations_pb2.Operation() + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + + req.return_value = response_value + + response = client.get_operation(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.Operation) + + +def test_list_operations_rest_bad_request(request_type=operations_pb2.ListOperationsRequest): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type() + request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2'}, request) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = Response() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = Request() + req.return_value = response_value + client.list_operations(request) + + +@pytest.mark.parametrize("request_type", [ + operations_pb2.ListOperationsRequest, + dict, +]) +def test_list_operations_rest(request_type): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + request_init = {'name': 'projects/sample1/locations/sample2'} + request = request_type(**request_init) + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, 'request') as req: + # Designate an appropriate value for the returned response. + return_value = operations_pb2.ListOperationsResponse() + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + + req.return_value = response_value + + response = client.list_operations(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.ListOperationsResponse) + +def test_initialize_client_w_rest(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_list_voices_empty_call_rest(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.list_voices), + '__call__') as call: + client.list_voices(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts.ListVoicesRequest() + + assert args[0] == request_msg + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_synthesize_speech_empty_call_rest(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_speech), + '__call__') as call: + client.synthesize_speech(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts.SynthesizeSpeechRequest() + + assert args[0] == request_msg + + +def test_transport_grpc_default(): + # A client should use the gRPC transport by default. + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + assert isinstance( + client.transport, + transports.TextToSpeechGrpcTransport, + ) + +def test_text_to_speech_base_transport_error(): + # Passing both a credentials object and credentials_file should raise an error + with pytest.raises(core_exceptions.DuplicateCredentialArgs): + transport = transports.TextToSpeechTransport( + credentials=ga_credentials.AnonymousCredentials(), + credentials_file="credentials.json" + ) + + +def test_text_to_speech_base_transport(): + # Instantiate the base transport. + with mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech.transports.TextToSpeechTransport.__init__') as Transport: + Transport.return_value = None + transport = transports.TextToSpeechTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Every method on the transport should just blindly + # raise NotImplementedError. + methods = ( + 'list_voices', + 'synthesize_speech', + 'streaming_synthesize', + 'get_operation', + 'list_operations', + ) + for method in methods: + with pytest.raises(NotImplementedError): + getattr(transport, method)(request=object()) + + with pytest.raises(NotImplementedError): + transport.close() + + # Catch all for all remaining methods and properties + remainder = [ + 'kind', + ] + for r in remainder: + with pytest.raises(NotImplementedError): + getattr(transport, r)() + + +def test_text_to_speech_base_transport_with_credentials_file(): + # Instantiate the base transport with a credentials file + with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech.transports.TextToSpeechTransport._prep_wrapped_messages') as Transport: + Transport.return_value = None + load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) + transport = transports.TextToSpeechTransport( + credentials_file="credentials.json", + quota_project_id="octopus", + ) + load_creds.assert_called_once_with("credentials.json", + scopes=None, + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + quota_project_id="octopus", + ) + + +def test_text_to_speech_base_transport_with_adc(): + # Test the default credentials are used if credentials and credentials_file are None. + with mock.patch.object(google.auth, 'default', autospec=True) as adc, mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech.transports.TextToSpeechTransport._prep_wrapped_messages') as Transport: + Transport.return_value = None + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport = transports.TextToSpeechTransport() + adc.assert_called_once() + + +def test_text_to_speech_auth_adc(): + # If no credentials are provided, we should use ADC credentials. + with mock.patch.object(google.auth, 'default', autospec=True) as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + TextToSpeechClient() + adc.assert_called_once_with( + scopes=None, + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + quota_project_id=None, + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.TextToSpeechGrpcTransport, + transports.TextToSpeechGrpcAsyncIOTransport, + ], +) +def test_text_to_speech_transport_auth_adc(transport_class): + # If credentials and host are not provided, the transport class should use + # ADC credentials. + with mock.patch.object(google.auth, 'default', autospec=True) as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport_class(quota_project_id="octopus", scopes=["1", "2"]) + adc.assert_called_once_with( + scopes=["1", "2"], + default_scopes=( 'https://www.googleapis.com/auth/cloud-platform',), + quota_project_id="octopus", + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.TextToSpeechGrpcTransport, + transports.TextToSpeechGrpcAsyncIOTransport, + transports.TextToSpeechRestTransport, + ], +) +def test_text_to_speech_transport_auth_gdch_credentials(transport_class): + host = 'https://language.com' + api_audience_tests = [None, 'https://language2.com'] + api_audience_expect = [host, 'https://language2.com'] + for t, e in zip(api_audience_tests, api_audience_expect): + with mock.patch.object(google.auth, 'default', autospec=True) as adc: + gdch_mock = mock.MagicMock() + type(gdch_mock).with_gdch_audience = mock.PropertyMock(return_value=gdch_mock) + adc.return_value = (gdch_mock, None) + transport_class(host=host, api_audience=t) + gdch_mock.with_gdch_audience.assert_called_once_with( + e + ) + + +@pytest.mark.parametrize( + "transport_class,grpc_helpers", + [ + (transports.TextToSpeechGrpcTransport, grpc_helpers), + (transports.TextToSpeechGrpcAsyncIOTransport, grpc_helpers_async) + ], +) +def test_text_to_speech_transport_create_channel(transport_class, grpc_helpers): + # If credentials and host are not provided, the transport class should use + # ADC credentials. + with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch.object( + grpc_helpers, "create_channel", autospec=True + ) as create_channel: + creds = ga_credentials.AnonymousCredentials() + adc.return_value = (creds, None) + transport_class( + quota_project_id="octopus", + scopes=["1", "2"] + ) + + create_channel.assert_called_with( + "texttospeech.googleapis.com:443", + credentials=creds, + credentials_file=None, + quota_project_id="octopus", + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + scopes=["1", "2"], + default_host="texttospeech.googleapis.com", + ssl_credentials=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + +@pytest.mark.parametrize("transport_class", [transports.TextToSpeechGrpcTransport, transports.TextToSpeechGrpcAsyncIOTransport]) +def test_text_to_speech_grpc_transport_client_cert_source_for_mtls( + transport_class +): + cred = ga_credentials.AnonymousCredentials() + + # Check ssl_channel_credentials is used if provided. + with mock.patch.object(transport_class, "create_channel") as mock_create_channel: + mock_ssl_channel_creds = mock.Mock() + transport_class( + host="squid.clam.whelk", + credentials=cred, + ssl_channel_credentials=mock_ssl_channel_creds + ) + mock_create_channel.assert_called_once_with( + "squid.clam.whelk:443", + credentials=cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_channel_creds, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls + # is used. + with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()): + with mock.patch("grpc.ssl_channel_credentials") as mock_ssl_cred: + transport_class( + credentials=cred, + client_cert_source_for_mtls=client_cert_source_callback + ) + expected_cert, expected_key = client_cert_source_callback() + mock_ssl_cred.assert_called_once_with( + certificate_chain=expected_cert, + private_key=expected_key + ) + +def test_text_to_speech_http_transport_client_cert_source_for_mtls(): + cred = ga_credentials.AnonymousCredentials() + with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel") as mock_configure_mtls_channel: + transports.TextToSpeechRestTransport ( + credentials=cred, + client_cert_source_for_mtls=client_cert_source_callback + ) + mock_configure_mtls_channel.assert_called_once_with(client_cert_source_callback) + + +@pytest.mark.parametrize("transport_name", [ + "grpc", + "grpc_asyncio", + "rest", +]) +def test_text_to_speech_host_no_port(transport_name): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com'), + transport=transport_name, + ) + assert client.transport._host == ( + 'texttospeech.googleapis.com:443' + if transport_name in ['grpc', 'grpc_asyncio'] + else 'https://texttospeech.googleapis.com' + ) + +@pytest.mark.parametrize("transport_name", [ + "grpc", + "grpc_asyncio", + "rest", +]) +def test_text_to_speech_host_with_port(transport_name): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com:8000'), + transport=transport_name, + ) + assert client.transport._host == ( + 'texttospeech.googleapis.com:8000' + if transport_name in ['grpc', 'grpc_asyncio'] + else 'https://texttospeech.googleapis.com:8000' + ) + +@pytest.mark.parametrize("transport_name", [ + "rest", +]) +def test_text_to_speech_client_transport_session_collision(transport_name): + creds1 = ga_credentials.AnonymousCredentials() + creds2 = ga_credentials.AnonymousCredentials() + client1 = TextToSpeechClient( + credentials=creds1, + transport=transport_name, + ) + client2 = TextToSpeechClient( + credentials=creds2, + transport=transport_name, + ) + session1 = client1.transport.list_voices._session + session2 = client2.transport.list_voices._session + assert session1 != session2 + session1 = client1.transport.synthesize_speech._session + session2 = client2.transport.synthesize_speech._session + assert session1 != session2 + session1 = client1.transport.streaming_synthesize._session + session2 = client2.transport.streaming_synthesize._session + assert session1 != session2 +def test_text_to_speech_grpc_transport_channel(): + channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) + + # Check that channel is used if provided. + transport = transports.TextToSpeechGrpcTransport( + host="squid.clam.whelk", + channel=channel, + ) + assert transport.grpc_channel == channel + assert transport._host == "squid.clam.whelk:443" + assert transport._ssl_channel_credentials == None + + +def test_text_to_speech_grpc_asyncio_transport_channel(): + channel = aio.secure_channel('http://localhost/', grpc.local_channel_credentials()) + + # Check that channel is used if provided. + transport = transports.TextToSpeechGrpcAsyncIOTransport( + host="squid.clam.whelk", + channel=channel, + ) + assert transport.grpc_channel == channel + assert transport._host == "squid.clam.whelk:443" + assert transport._ssl_channel_credentials == None + + +# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are +# removed from grpc/grpc_asyncio transport constructor. +@pytest.mark.parametrize("transport_class", [transports.TextToSpeechGrpcTransport, transports.TextToSpeechGrpcAsyncIOTransport]) +def test_text_to_speech_transport_channel_mtls_with_client_cert_source( + transport_class +): + with mock.patch("grpc.ssl_channel_credentials", autospec=True) as grpc_ssl_channel_cred: + with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: + mock_ssl_cred = mock.Mock() + grpc_ssl_channel_cred.return_value = mock_ssl_cred + + mock_grpc_channel = mock.Mock() + grpc_create_channel.return_value = mock_grpc_channel + + cred = ga_credentials.AnonymousCredentials() + with pytest.warns(DeprecationWarning): + with mock.patch.object(google.auth, 'default') as adc: + adc.return_value = (cred, None) + transport = transport_class( + host="squid.clam.whelk", + api_mtls_endpoint="mtls.squid.clam.whelk", + client_cert_source=client_cert_source_callback, + ) + adc.assert_called_once() + + grpc_ssl_channel_cred.assert_called_once_with( + certificate_chain=b"cert bytes", private_key=b"key bytes" + ) + grpc_create_channel.assert_called_once_with( + "mtls.squid.clam.whelk:443", + credentials=cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_cred, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + assert transport.grpc_channel == mock_grpc_channel + assert transport._ssl_channel_credentials == mock_ssl_cred + + +# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are +# removed from grpc/grpc_asyncio transport constructor. +@pytest.mark.parametrize("transport_class", [transports.TextToSpeechGrpcTransport, transports.TextToSpeechGrpcAsyncIOTransport]) +def test_text_to_speech_transport_channel_mtls_with_adc( + transport_class +): + mock_ssl_cred = mock.Mock() + with mock.patch.multiple( + "google.auth.transport.grpc.SslCredentials", + __init__=mock.Mock(return_value=None), + ssl_credentials=mock.PropertyMock(return_value=mock_ssl_cred), + ): + with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: + mock_grpc_channel = mock.Mock() + grpc_create_channel.return_value = mock_grpc_channel + mock_cred = mock.Mock() + + with pytest.warns(DeprecationWarning): + transport = transport_class( + host="squid.clam.whelk", + credentials=mock_cred, + api_mtls_endpoint="mtls.squid.clam.whelk", + client_cert_source=None, + ) + + grpc_create_channel.assert_called_once_with( + "mtls.squid.clam.whelk:443", + credentials=mock_cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_cred, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + assert transport.grpc_channel == mock_grpc_channel + + +def test_model_path(): + project = "squid" + location = "clam" + model = "whelk" + expected = "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) + actual = TextToSpeechClient.model_path(project, location, model) + assert expected == actual + + +def test_parse_model_path(): + expected = { + "project": "octopus", + "location": "oyster", + "model": "nudibranch", + } + path = TextToSpeechClient.model_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechClient.parse_model_path(path) + assert expected == actual + +def test_common_billing_account_path(): + billing_account = "cuttlefish" + expected = "billingAccounts/{billing_account}".format(billing_account=billing_account, ) + actual = TextToSpeechClient.common_billing_account_path(billing_account) + assert expected == actual + + +def test_parse_common_billing_account_path(): + expected = { + "billing_account": "mussel", + } + path = TextToSpeechClient.common_billing_account_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechClient.parse_common_billing_account_path(path) + assert expected == actual + +def test_common_folder_path(): + folder = "winkle" + expected = "folders/{folder}".format(folder=folder, ) + actual = TextToSpeechClient.common_folder_path(folder) + assert expected == actual + + +def test_parse_common_folder_path(): + expected = { + "folder": "nautilus", + } + path = TextToSpeechClient.common_folder_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechClient.parse_common_folder_path(path) + assert expected == actual + +def test_common_organization_path(): + organization = "scallop" + expected = "organizations/{organization}".format(organization=organization, ) + actual = TextToSpeechClient.common_organization_path(organization) + assert expected == actual + + +def test_parse_common_organization_path(): + expected = { + "organization": "abalone", + } + path = TextToSpeechClient.common_organization_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechClient.parse_common_organization_path(path) + assert expected == actual + +def test_common_project_path(): + project = "squid" + expected = "projects/{project}".format(project=project, ) + actual = TextToSpeechClient.common_project_path(project) + assert expected == actual + + +def test_parse_common_project_path(): + expected = { + "project": "clam", + } + path = TextToSpeechClient.common_project_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechClient.parse_common_project_path(path) + assert expected == actual + +def test_common_location_path(): + project = "whelk" + location = "octopus" + expected = "projects/{project}/locations/{location}".format(project=project, location=location, ) + actual = TextToSpeechClient.common_location_path(project, location) + assert expected == actual + + +def test_parse_common_location_path(): + expected = { + "project": "oyster", + "location": "nudibranch", + } + path = TextToSpeechClient.common_location_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechClient.parse_common_location_path(path) + assert expected == actual + + +def test_client_with_default_client_info(): + client_info = gapic_v1.client_info.ClientInfo() + + with mock.patch.object(transports.TextToSpeechTransport, '_prep_wrapped_messages') as prep: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, + ) + prep.assert_called_once_with(client_info) + + with mock.patch.object(transports.TextToSpeechTransport, '_prep_wrapped_messages') as prep: + transport_class = TextToSpeechClient.get_transport_class() + transport = transport_class( + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, + ) + prep.assert_called_once_with(client_info) + + +def test_get_operation(transport: str = "grpc"): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.GetOperationRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation() + response = client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.Operation) +@pytest.mark.asyncio +async def test_get_operation_async(transport: str = "grpc_asyncio"): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.GetOperationRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation() + ) + response = await client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.Operation) + +def test_get_operation_field_headers(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.GetOperationRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + call.return_value = operations_pb2.Operation() + + client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +@pytest.mark.asyncio +async def test_get_operation_field_headers_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.GetOperationRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation() + ) + await client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + +def test_get_operation_from_dict(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation() + + response = client.get_operation( + request={ + "name": "locations", + } + ) + call.assert_called() +@pytest.mark.asyncio +async def test_get_operation_from_dict_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation() + ) + response = await client.get_operation( + request={ + "name": "locations", + } + ) + call.assert_called() + + +def test_list_operations(transport: str = "grpc"): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.ListOperationsRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.ListOperationsResponse() + response = client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.ListOperationsResponse) +@pytest.mark.asyncio +async def test_list_operations_async(transport: str = "grpc_asyncio"): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.ListOperationsRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.ListOperationsResponse() + ) + response = await client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.ListOperationsResponse) + +def test_list_operations_field_headers(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.ListOperationsRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + call.return_value = operations_pb2.ListOperationsResponse() + + client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +@pytest.mark.asyncio +async def test_list_operations_field_headers_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.ListOperationsRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.ListOperationsResponse() + ) + await client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + +def test_list_operations_from_dict(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.ListOperationsResponse() + + response = client.list_operations( + request={ + "name": "locations", + } + ) + call.assert_called() +@pytest.mark.asyncio +async def test_list_operations_from_dict_async(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.ListOperationsResponse() + ) + response = await client.list_operations( + request={ + "name": "locations", + } + ) + call.assert_called() + + +def test_transport_close_grpc(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc" + ) + with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +@pytest.mark.asyncio +async def test_transport_close_grpc_asyncio(): + client = TextToSpeechAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio" + ) + with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: + async with client: + close.assert_not_called() + close.assert_called_once() + + +def test_transport_close_rest(): + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + with mock.patch.object(type(getattr(client.transport, "_session")), "close") as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +def test_client_ctx(): + transports = [ + 'rest', + 'grpc', + ] + for transport in transports: + client = TextToSpeechClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport + ) + # Test client calls underlying transport. + with mock.patch.object(type(client.transport), "close") as close: + close.assert_not_called() + with client: + pass + close.assert_called() + +@pytest.mark.parametrize("client_class,transport_class", [ + (TextToSpeechClient, transports.TextToSpeechGrpcTransport), + (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport), +]) +def test_api_key_credentials(client_class, transport_class): + with mock.patch.object( + google.auth._default, "get_api_key_credentials", create=True + ) as get_api_key_credentials: + mock_cred = mock.Mock() + get_api_key_credentials.return_value = mock_cred + options = client_options.ClientOptions() + options.api_key = "api_key" + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options) + patched.assert_called_once_with( + credentials=mock_cred, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech_long_audio_synthesize.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech_long_audio_synthesize.py new file mode 100644 index 000000000000..94782be9078e --- /dev/null +++ b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech_long_audio_synthesize.py @@ -0,0 +1,2433 @@ +# -*- coding: utf-8 -*- +# Copyright 2024 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 +# try/except added for compatibility with python < 3.8 +try: + from unittest import mock + from unittest.mock import AsyncMock # pragma: NO COVER +except ImportError: # pragma: NO COVER + import mock + +import grpc +from grpc.experimental import aio +from collections.abc import Iterable, AsyncIterable +from google.protobuf import json_format +import json +import math +import pytest +from google.api_core import api_core_version +from proto.marshal.rules.dates import DurationRule, TimestampRule +from proto.marshal.rules import wrappers +from requests import Response +from requests import Request, PreparedRequest +from requests.sessions import Session +from google.protobuf import json_format + +try: + from google.auth.aio import credentials as ga_credentials_async + HAS_GOOGLE_AUTH_AIO = True +except ImportError: # pragma: NO COVER + HAS_GOOGLE_AUTH_AIO = False + +from google.api_core import client_options +from google.api_core import exceptions as core_exceptions +from google.api_core import future +from google.api_core import gapic_v1 +from google.api_core import grpc_helpers +from google.api_core import grpc_helpers_async +from google.api_core import operation +from google.api_core import operation_async # type: ignore +from google.api_core import operations_v1 +from google.api_core import path_template +from google.api_core import retry as retries +from google.auth import credentials as ga_credentials +from google.auth.exceptions import MutualTLSChannelError +from google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeAsyncClient +from google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeClient +from google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize import transports +from google.cloud.texttospeech_v1beta1.types import cloud_tts +from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs +from google.longrunning import operations_pb2 # type: ignore +from google.oauth2 import service_account +import google.auth + + +async def mock_async_gen(data, chunk_size=1): + for i in range(0, len(data)): # pragma: NO COVER + chunk = data[i : i + chunk_size] + yield chunk.encode("utf-8") + +def client_cert_source_callback(): + return b"cert bytes", b"key bytes" + +# TODO: use async auth anon credentials by default once the minimum version of google-auth is upgraded. +# See related issue: https://github.com/googleapis/gapic-generator-python/issues/2107. +def async_anonymous_credentials(): + if HAS_GOOGLE_AUTH_AIO: + return ga_credentials_async.AnonymousCredentials() + return ga_credentials.AnonymousCredentials() + +# If default endpoint is localhost, then default mtls endpoint will be the same. +# This method modifies the default endpoint so the client can produce a different +# mtls endpoint for endpoint testing purposes. +def modify_default_endpoint(client): + return "foo.googleapis.com" if ("localhost" in client.DEFAULT_ENDPOINT) else client.DEFAULT_ENDPOINT + +# If default endpoint template is localhost, then default mtls endpoint will be the same. +# This method modifies the default endpoint template so the client can produce a different +# mtls endpoint for endpoint testing purposes. +def modify_default_endpoint_template(client): + return "test.{UNIVERSE_DOMAIN}" if ("localhost" in client._DEFAULT_ENDPOINT_TEMPLATE) else client._DEFAULT_ENDPOINT_TEMPLATE + + +def test__get_default_mtls_endpoint(): + api_endpoint = "example.googleapis.com" + api_mtls_endpoint = "example.mtls.googleapis.com" + sandbox_endpoint = "example.sandbox.googleapis.com" + sandbox_mtls_endpoint = "example.mtls.sandbox.googleapis.com" + non_googleapi = "api.example.com" + + assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(None) is None + assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(api_endpoint) == api_mtls_endpoint + assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(api_mtls_endpoint) == api_mtls_endpoint + assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(sandbox_endpoint) == sandbox_mtls_endpoint + assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(sandbox_mtls_endpoint) == sandbox_mtls_endpoint + assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(non_googleapi) == non_googleapi + +def test__read_environment_variables(): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (True, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): + with pytest.raises(ValueError) as excinfo: + TextToSpeechLongAudioSynthesizeClient._read_environment_variables() + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "never", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "always", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", None) + + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + TextToSpeechLongAudioSynthesizeClient._read_environment_variables() + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + + with mock.patch.dict(os.environ, {"GOOGLE_CLOUD_UNIVERSE_DOMAIN": "foo.com"}): + assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", "foo.com") + +def test__get_client_cert_source(): + mock_provided_cert_source = mock.Mock() + mock_default_cert_source = mock.Mock() + + assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(None, False) is None + assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(mock_provided_cert_source, False) is None + assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(mock_provided_cert_source, True) == mock_provided_cert_source + + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): + with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_default_cert_source): + assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(None, True) is mock_default_cert_source + assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(mock_provided_cert_source, "true") is mock_provided_cert_source + +@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) +@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) +def test__get_api_endpoint(): + api_override = "foo.com" + mock_client_cert_source = mock.Mock() + default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + default_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) + mock_universe = "bar.com" + mock_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) + + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(api_override, mock_client_cert_source, default_universe, "always") == api_override + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "auto") == TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, default_universe, "auto") == default_endpoint + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, default_universe, "always") == TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "always") == TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, mock_universe, "never") == mock_endpoint + assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, default_universe, "never") == default_endpoint + + with pytest.raises(MutualTLSChannelError) as excinfo: + TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, mock_client_cert_source, mock_universe, "auto") + assert str(excinfo.value) == "mTLS is not supported in any universe other than googleapis.com." + + +def test__get_universe_domain(): + client_universe_domain = "foo.com" + universe_domain_env = "bar.com" + + assert TextToSpeechLongAudioSynthesizeClient._get_universe_domain(client_universe_domain, universe_domain_env) == client_universe_domain + assert TextToSpeechLongAudioSynthesizeClient._get_universe_domain(None, universe_domain_env) == universe_domain_env + assert TextToSpeechLongAudioSynthesizeClient._get_universe_domain(None, None) == TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + + with pytest.raises(ValueError) as excinfo: + TextToSpeechLongAudioSynthesizeClient._get_universe_domain("", None) + assert str(excinfo.value) == "Universe Domain cannot be an empty string." + +@pytest.mark.parametrize("client_class,transport_class,transport_name", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), +]) +def test__validate_universe_domain(client_class, transport_class, transport_name): + client = client_class( + transport=transport_class( + credentials=ga_credentials.AnonymousCredentials() + ) + ) + assert client._validate_universe_domain() == True + + # Test the case when universe is already validated. + assert client._validate_universe_domain() == True + + if transport_name == "grpc": + # Test the case where credentials are provided by the + # `local_channel_credentials`. The default universes in both match. + channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) + client = client_class(transport=transport_class(channel=channel)) + assert client._validate_universe_domain() == True + + # Test the case where credentials do not exist: e.g. a transport is provided + # with no credentials. Validation should still succeed because there is no + # mismatch with non-existent credentials. + channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) + transport=transport_class(channel=channel) + transport._credentials = None + client = client_class(transport=transport) + assert client._validate_universe_domain() == True + + # TODO: This is needed to cater for older versions of google-auth + # Make this test unconditional once the minimum supported version of + # google-auth becomes 2.23.0 or higher. + google_auth_major, google_auth_minor = [int(part) for part in google.auth.__version__.split(".")[0:2]] + if google_auth_major > 2 or (google_auth_major == 2 and google_auth_minor >= 23): + credentials = ga_credentials.AnonymousCredentials() + credentials._universe_domain = "foo.com" + # Test the case when there is a universe mismatch from the credentials. + client = client_class( + transport=transport_class(credentials=credentials) + ) + with pytest.raises(ValueError) as excinfo: + client._validate_universe_domain() + assert str(excinfo.value) == "The configured universe domain (googleapis.com) does not match the universe domain found in the credentials (foo.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." + + # Test the case when there is a universe mismatch from the client. + # + # TODO: Make this test unconditional once the minimum supported version of + # google-api-core becomes 2.15.0 or higher. + api_core_major, api_core_minor = [int(part) for part in api_core_version.__version__.split(".")[0:2]] + if api_core_major > 2 or (api_core_major == 2 and api_core_minor >= 15): + client = client_class(client_options={"universe_domain": "bar.com"}, transport=transport_class(credentials=ga_credentials.AnonymousCredentials(),)) + with pytest.raises(ValueError) as excinfo: + client._validate_universe_domain() + assert str(excinfo.value) == "The configured universe domain (bar.com) does not match the universe domain found in the credentials (googleapis.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." + + # Test that ValueError is raised if universe_domain is provided via client options and credentials is None + with pytest.raises(ValueError): + client._compare_universes("foo.bar", None) + + +@pytest.mark.parametrize("client_class,transport_name", [ + (TextToSpeechLongAudioSynthesizeClient, "grpc"), + (TextToSpeechLongAudioSynthesizeAsyncClient, "grpc_asyncio"), + (TextToSpeechLongAudioSynthesizeClient, "rest"), +]) +def test_text_to_speech_long_audio_synthesize_client_from_service_account_info(client_class, transport_name): + creds = ga_credentials.AnonymousCredentials() + with mock.patch.object(service_account.Credentials, 'from_service_account_info') as factory: + factory.return_value = creds + info = {"valid": True} + client = client_class.from_service_account_info(info, transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + assert client.transport._host == ( + 'texttospeech.googleapis.com:443' + if transport_name in ['grpc', 'grpc_asyncio'] + else + 'https://texttospeech.googleapis.com' + ) + + +@pytest.mark.parametrize("transport_class,transport_name", [ + (transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), + (transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio"), + (transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), +]) +def test_text_to_speech_long_audio_synthesize_client_service_account_always_use_jwt(transport_class, transport_name): + with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=True) + use_jwt.assert_called_once_with(True) + + with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: + creds = service_account.Credentials(None, None, None) + transport = transport_class(credentials=creds, always_use_jwt_access=False) + use_jwt.assert_not_called() + + +@pytest.mark.parametrize("client_class,transport_name", [ + (TextToSpeechLongAudioSynthesizeClient, "grpc"), + (TextToSpeechLongAudioSynthesizeAsyncClient, "grpc_asyncio"), + (TextToSpeechLongAudioSynthesizeClient, "rest"), +]) +def test_text_to_speech_long_audio_synthesize_client_from_service_account_file(client_class, transport_name): + creds = ga_credentials.AnonymousCredentials() + with mock.patch.object(service_account.Credentials, 'from_service_account_file') as factory: + factory.return_value = creds + client = client_class.from_service_account_file("dummy/file/path.json", transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + client = client_class.from_service_account_json("dummy/file/path.json", transport=transport_name) + assert client.transport._credentials == creds + assert isinstance(client, client_class) + + assert client.transport._host == ( + 'texttospeech.googleapis.com:443' + if transport_name in ['grpc', 'grpc_asyncio'] + else + 'https://texttospeech.googleapis.com' + ) + + +def test_text_to_speech_long_audio_synthesize_client_get_transport_class(): + transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class() + available_transports = [ + transports.TextToSpeechLongAudioSynthesizeGrpcTransport, + transports.TextToSpeechLongAudioSynthesizeRestTransport, + ] + assert transport in available_transports + + transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class("grpc") + assert transport == transports.TextToSpeechLongAudioSynthesizeGrpcTransport + + +@pytest.mark.parametrize("client_class,transport_class,transport_name", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio"), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), +]) +@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) +@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) +def test_text_to_speech_long_audio_synthesize_client_client_options(client_class, transport_class, transport_name): + # Check that if channel is provided we won't create a new one. + with mock.patch.object(TextToSpeechLongAudioSynthesizeClient, 'get_transport_class') as gtc: + transport = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ) + client = client_class(transport=transport) + gtc.assert_not_called() + + # Check that if channel is provided via str we will create a new one. + with mock.patch.object(TextToSpeechLongAudioSynthesizeClient, 'get_transport_class') as gtc: + client = client_class(transport=transport_name) + gtc.assert_called() + + # Check the case api_endpoint is provided. + options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(transport=transport_name, client_options=options) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host="squid.clam.whelk", + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is + # "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is + # "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client.DEFAULT_MTLS_ENDPOINT, + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has + # unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + client = client_class(transport=transport_name) + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + + # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): + with pytest.raises(ValueError) as excinfo: + client = client_class(transport=transport_name) + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + + # Check the case quota_project_id is provided + options = client_options.ClientOptions(quota_project_id="octopus") + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id="octopus", + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + # Check the case api_endpoint is provided + options = client_options.ClientOptions(api_audience="https://language.googleapis.com") + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience="https://language.googleapis.com" + ) + +@pytest.mark.parametrize("client_class,transport_class,transport_name,use_client_cert_env", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", "true"), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", "true"), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", "false"), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", "false"), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest", "true"), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest", "false"), +]) +@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) +@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) +@mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}) +def test_text_to_speech_long_audio_synthesize_client_mtls_env_auto(client_class, transport_class, transport_name, use_client_cert_env): + # This tests the endpoint autoswitch behavior. Endpoint is autoswitched to the default + # mtls endpoint, if GOOGLE_API_USE_CLIENT_CERTIFICATE is "true" and client cert exists. + + # Check the case client_cert_source is provided. Whether client cert is used depends on + # GOOGLE_API_USE_CLIENT_CERTIFICATE value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): + options = client_options.ClientOptions(client_cert_source=client_cert_source_callback) + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + + if use_client_cert_env == "false": + expected_client_cert_source = None + expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) + else: + expected_client_cert_source = client_cert_source_callback + expected_host = client.DEFAULT_MTLS_ENDPOINT + + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=expected_host, + scopes=None, + client_cert_source_for_mtls=expected_client_cert_source, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case ADC client cert is provided. Whether client cert is used depends on + # GOOGLE_API_USE_CLIENT_CERTIFICATE value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): + with mock.patch.object(transport_class, '__init__') as patched: + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): + with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=client_cert_source_callback): + if use_client_cert_env == "false": + expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) + expected_client_cert_source = None + else: + expected_host = client.DEFAULT_MTLS_ENDPOINT + expected_client_cert_source = client_cert_source_callback + + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=expected_host, + scopes=None, + client_cert_source_for_mtls=expected_client_cert_source, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # Check the case client_cert_source and ADC client cert are not provided. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): + with mock.patch.object(transport_class, '__init__') as patched: + with mock.patch("google.auth.transport.mtls.has_default_client_cert_source", return_value=False): + patched.return_value = None + client = client_class(transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize("client_class", [ + TextToSpeechLongAudioSynthesizeClient, TextToSpeechLongAudioSynthesizeAsyncClient +]) +@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechLongAudioSynthesizeClient)) +@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechLongAudioSynthesizeAsyncClient)) +def test_text_to_speech_long_audio_synthesize_client_get_mtls_endpoint_and_cert_source(client_class): + mock_client_cert_source = mock.Mock() + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "true". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + mock_api_endpoint = "foo" + options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) + assert api_endpoint == mock_api_endpoint + assert cert_source == mock_client_cert_source + + # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "false". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): + mock_client_cert_source = mock.Mock() + mock_api_endpoint = "foo" + options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) + assert api_endpoint == mock_api_endpoint + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "always". + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert doesn't exist. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=False): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_ENDPOINT + assert cert_source is None + + # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert exists. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): + with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_client_cert_source): + api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() + assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + assert cert_source == mock_client_cert_source + + # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has + # unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): + with pytest.raises(MutualTLSChannelError) as excinfo: + client_class.get_mtls_endpoint_and_cert_source() + + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" + + # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): + with pytest.raises(ValueError) as excinfo: + client_class.get_mtls_endpoint_and_cert_source() + + assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" + +@pytest.mark.parametrize("client_class", [ + TextToSpeechLongAudioSynthesizeClient, TextToSpeechLongAudioSynthesizeAsyncClient +]) +@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) +@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) +def test_text_to_speech_long_audio_synthesize_client_client_api_endpoint(client_class): + mock_client_cert_source = client_cert_source_callback + api_override = "foo.com" + default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE + default_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) + mock_universe = "bar.com" + mock_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) + + # If ClientOptions.api_endpoint is set and GOOGLE_API_USE_CLIENT_CERTIFICATE="true", + # use ClientOptions.api_endpoint as the api endpoint regardless. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): + with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel"): + options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=api_override) + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == api_override + + # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="never", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + client = client_class(credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == default_endpoint + + # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="always", + # use the DEFAULT_MTLS_ENDPOINT as the api endpoint. + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): + client = client_class(credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT + + # If ClientOptions.api_endpoint is not set, GOOGLE_API_USE_MTLS_ENDPOINT="auto" (default), + # GOOGLE_API_USE_CLIENT_CERTIFICATE="false" (default), default cert source doesn't exist, + # and ClientOptions.universe_domain="bar.com", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with universe domain as the api endpoint. + options = client_options.ClientOptions() + universe_exists = hasattr(options, "universe_domain") + if universe_exists: + options = client_options.ClientOptions(universe_domain=mock_universe) + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + else: + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == (mock_endpoint if universe_exists else default_endpoint) + assert client.universe_domain == (mock_universe if universe_exists else default_universe) + + # If ClientOptions does not have a universe domain attribute and GOOGLE_API_USE_MTLS_ENDPOINT="never", + # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. + options = client_options.ClientOptions() + if hasattr(options, "universe_domain"): + delattr(options, "universe_domain") + with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): + client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) + assert client.api_endpoint == default_endpoint + + +@pytest.mark.parametrize("client_class,transport_class,transport_name", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio"), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), +]) +def test_text_to_speech_long_audio_synthesize_client_client_options_scopes(client_class, transport_class, transport_name): + # Check the case scopes are provided. + options = client_options.ClientOptions( + scopes=["1", "2"], + ) + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=["1", "2"], + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + +@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", grpc_helpers), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest", None), +]) +def test_text_to_speech_long_audio_synthesize_client_client_options_credentials_file(client_class, transport_class, transport_name, grpc_helpers): + # Check the case credentials file is provided. + options = client_options.ClientOptions( + credentials_file="credentials.json" + ) + + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file="credentials.json", + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + +def test_text_to_speech_long_audio_synthesize_client_client_options_from_dict(): + with mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeGrpcTransport.__init__') as grpc_transport: + grpc_transport.return_value = None + client = TextToSpeechLongAudioSynthesizeClient( + client_options={'api_endpoint': 'squid.clam.whelk'} + ) + grpc_transport.assert_called_once_with( + credentials=None, + credentials_file=None, + host="squid.clam.whelk", + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + +@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", grpc_helpers), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), +]) +def test_text_to_speech_long_audio_synthesize_client_create_channel_credentials_file(client_class, transport_class, transport_name, grpc_helpers): + # Check the case credentials file is provided. + options = client_options.ClientOptions( + credentials_file="credentials.json" + ) + + with mock.patch.object(transport_class, '__init__') as patched: + patched.return_value = None + client = client_class(client_options=options, transport=transport_name) + patched.assert_called_once_with( + credentials=None, + credentials_file="credentials.json", + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) + + # test that the credentials from file are saved and used as the credentials. + with mock.patch.object( + google.auth, "load_credentials_from_file", autospec=True + ) as load_creds, mock.patch.object( + google.auth, "default", autospec=True + ) as adc, mock.patch.object( + grpc_helpers, "create_channel" + ) as create_channel: + creds = ga_credentials.AnonymousCredentials() + file_creds = ga_credentials.AnonymousCredentials() + load_creds.return_value = (file_creds, None) + adc.return_value = (creds, None) + client = client_class(client_options=options, transport=transport_name) + create_channel.assert_called_with( + "texttospeech.googleapis.com:443", + credentials=file_creds, + credentials_file=None, + quota_project_id=None, + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + scopes=None, + default_host="texttospeech.googleapis.com", + ssl_credentials=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts_lrs.SynthesizeLongAudioRequest, + dict, +]) +def test_synthesize_long_audio(request_type, transport: str = 'grpc'): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation(name='operations/spam') + response = client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + request = cloud_tts_lrs.SynthesizeLongAudioRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, future.Future) + + +def test_synthesize_long_audio_non_empty_request_with_auto_populated_field(): + # This test is a coverage failsafe to make sure that UUID4 fields are + # automatically populated, according to AIP-4235, with non-empty requests. + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='grpc', + ) + + # Populate all string fields in the request which are not UUID4 + # since we want to check that UUID4 are populated automatically + # if they meet the requirements of AIP 4235. + request = cloud_tts_lrs.SynthesizeLongAudioRequest( + parent='parent_value', + output_gcs_uri='output_gcs_uri_value', + ) + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + call.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client.synthesize_long_audio(request=request) + call.assert_called() + _, args, _ = call.mock_calls[0] + assert args[0] == cloud_tts_lrs.SynthesizeLongAudioRequest( + parent='parent_value', + output_gcs_uri='output_gcs_uri_value', + ) + +def test_synthesize_long_audio_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.synthesize_long_audio in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.synthesize_long_audio] = mock_rpc + request = {} + client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + # Operation methods call wrapper_fn to build a cached + # client._transport.operations_client instance on first rpc call. + # Subsequent calls should use the cached wrapper + wrapper_fn.reset_mock() + + client.synthesize_long_audio(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_synthesize_long_audio_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._client._transport.synthesize_long_audio in client._client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.AsyncMock() + mock_rpc.return_value = mock.Mock() + client._client._transport._wrapped_methods[client._client._transport.synthesize_long_audio] = mock_rpc + + request = {} + await client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + # Operation methods call wrapper_fn to build a cached + # client._transport.operations_client instance on first rpc call. + # Subsequent calls should use the cached wrapper + wrapper_fn.reset_mock() + + await client.synthesize_long_audio(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + +@pytest.mark.asyncio +async def test_synthesize_long_audio_async(transport: str = 'grpc_asyncio', request_type=cloud_tts_lrs.SynthesizeLongAudioRequest): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = request_type() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation(name='operations/spam') + ) + response = await client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + request = cloud_tts_lrs.SynthesizeLongAudioRequest() + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, future.Future) + + +@pytest.mark.asyncio +async def test_synthesize_long_audio_async_from_dict(): + await test_synthesize_long_audio_async(request_type=dict) + +def test_synthesize_long_audio_field_headers(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = cloud_tts_lrs.SynthesizeLongAudioRequest() + + request.parent = 'parent_value' + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + call.return_value = operations_pb2.Operation(name='operations/op') + client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ( + 'x-goog-request-params', + 'parent=parent_value', + ) in kw['metadata'] + + +@pytest.mark.asyncio +async def test_synthesize_long_audio_field_headers_async(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = cloud_tts_lrs.SynthesizeLongAudioRequest() + + request.parent = 'parent_value' + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(operations_pb2.Operation(name='operations/op')) + await client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ( + 'x-goog-request-params', + 'parent=parent_value', + ) in kw['metadata'] + + +def test_synthesize_long_audio_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.synthesize_long_audio in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. + client._transport._wrapped_methods[client._transport.synthesize_long_audio] = mock_rpc + + request = {} + client.synthesize_long_audio(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + # Operation methods build a cached wrapper on first rpc call + # subsequent calls should use the cached wrapper + wrapper_fn.reset_mock() + + client.synthesize_long_audio(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_synthesize_long_audio_rest_required_fields(request_type=cloud_tts_lrs.SynthesizeLongAudioRequest): + transport_class = transports.TextToSpeechLongAudioSynthesizeRestTransport + + request_init = {} + request_init["output_gcs_uri"] = "" + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads(json_format.MessageToJson( + pb_request, + use_integers_for_enums=False + )) + + # verify fields with default values are dropped + + unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_long_audio._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + jsonified_request["outputGcsUri"] = 'output_gcs_uri_value' + + unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_long_audio._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + assert "outputGcsUri" in jsonified_request + assert jsonified_request["outputGcsUri"] == 'output_gcs_uri_value' + + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='rest', + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = operations_pb2.Operation(name='operations/spam') + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, 'request') as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, 'transcode') as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + 'uri': 'v1/sample_method', + 'method': "post", + 'query_params': pb_request, + } + transcode_result['body'] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode('UTF-8') + req.return_value = response_value + + response = client.synthesize_long_audio(request) + + expected_params = [ + ] + actual_params = req.call_args.kwargs['params'] + assert expected_params == actual_params + + +def test_synthesize_long_audio_rest_unset_required_fields(): + transport = transports.TextToSpeechLongAudioSynthesizeRestTransport(credentials=ga_credentials.AnonymousCredentials) + + unset_fields = transport.synthesize_long_audio._get_unset_required_fields({}) + assert set(unset_fields) == (set(()) & set(("input", "audioConfig", "outputGcsUri", "voice", ))) + + +def test_credentials_transport_error(): + # It is an error to provide credentials and a transport instance. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # It is an error to provide a credentials file and a transport instance. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = TextToSpeechLongAudioSynthesizeClient( + client_options={"credentials_file": "credentials.json"}, + transport=transport, + ) + + # It is an error to provide an api_key and a transport instance. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + options = client_options.ClientOptions() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = TextToSpeechLongAudioSynthesizeClient( + client_options=options, + transport=transport, + ) + + # It is an error to provide an api_key and a credential. + options = client_options.ClientOptions() + options.api_key = "api_key" + with pytest.raises(ValueError): + client = TextToSpeechLongAudioSynthesizeClient( + client_options=options, + credentials=ga_credentials.AnonymousCredentials() + ) + + # It is an error to provide scopes and a transport instance. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + with pytest.raises(ValueError): + client = TextToSpeechLongAudioSynthesizeClient( + client_options={"scopes": ["1", "2"]}, + transport=transport, + ) + + +def test_transport_instance(): + # A client may be instantiated with a custom transport instance. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + client = TextToSpeechLongAudioSynthesizeClient(transport=transport) + assert client.transport is transport + +def test_transport_get_channel(): + # A client may be instantiated with a custom transport instance. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + channel = transport.grpc_channel + assert channel + + transport = transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + channel = transport.grpc_channel + assert channel + +@pytest.mark.parametrize("transport_class", [ + transports.TextToSpeechLongAudioSynthesizeGrpcTransport, + transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, + transports.TextToSpeechLongAudioSynthesizeRestTransport, +]) +def test_transport_adc(transport_class): + # Test default credentials are used if not provided. + with mock.patch.object(google.auth, 'default') as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport_class() + adc.assert_called_once() + +def test_transport_kind_grpc(): + transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class("grpc")( + credentials=ga_credentials.AnonymousCredentials() + ) + assert transport.kind == "grpc" + + +def test_initialize_client_w_grpc(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_synthesize_long_audio_empty_call_grpc(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + call.return_value = operations_pb2.Operation(name='operations/op') + client.synthesize_long_audio(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts_lrs.SynthesizeLongAudioRequest() + + assert args[0] == request_msg + + +def test_transport_kind_grpc_asyncio(): + transport = TextToSpeechLongAudioSynthesizeAsyncClient.get_transport_class("grpc_asyncio")( + credentials=async_anonymous_credentials() + ) + assert transport.kind == "grpc_asyncio" + + +def test_initialize_client_w_grpc_asyncio(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +@pytest.mark.asyncio +async def test_synthesize_long_audio_empty_call_grpc_asyncio(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation(name='operations/spam') + ) + await client.synthesize_long_audio(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts_lrs.SynthesizeLongAudioRequest() + + assert args[0] == request_msg + + +def test_transport_kind_rest(): + transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class("rest")( + credentials=ga_credentials.AnonymousCredentials() + ) + assert transport.kind == "rest" + + +def test_synthesize_long_audio_rest_bad_request(request_type=cloud_tts_lrs.SynthesizeLongAudioRequest): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {'parent': 'projects/sample1/locations/sample2'} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + client.synthesize_long_audio(request) + + +@pytest.mark.parametrize("request_type", [ + cloud_tts_lrs.SynthesizeLongAudioRequest, + dict, +]) +def test_synthesize_long_audio_rest_call_success(request_type): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {'parent': 'projects/sample1/locations/sample2'} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), 'request') as req: + # Designate an appropriate value for the returned response. + return_value = operations_pb2.Operation(name='operations/spam') + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + req.return_value = response_value + response = client.synthesize_long_audio(request) + + # Establish that the response is the type that we expect. + json_return_value = json_format.MessageToJson(return_value) + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_synthesize_long_audio_rest_interceptors(null_interceptor): + transport = transports.TextToSpeechLongAudioSynthesizeRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None if null_interceptor else transports.TextToSpeechLongAudioSynthesizeRestInterceptor(), + ) + client = TextToSpeechLongAudioSynthesizeClient(transport=transport) + + with mock.patch.object(type(client.transport._session), "request") as req, \ + mock.patch.object(path_template, "transcode") as transcode, \ + mock.patch.object(operation.Operation, "_set_result_from_operation"), \ + mock.patch.object(transports.TextToSpeechLongAudioSynthesizeRestInterceptor, "post_synthesize_long_audio") as post, \ + mock.patch.object(transports.TextToSpeechLongAudioSynthesizeRestInterceptor, "pre_synthesize_long_audio") as pre: + pre.assert_not_called() + post.assert_not_called() + pb_message = cloud_tts_lrs.SynthesizeLongAudioRequest.pb(cloud_tts_lrs.SynthesizeLongAudioRequest()) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + return_value = json_format.MessageToJson(operations_pb2.Operation()) + req.return_value.content = return_value + + request = cloud_tts_lrs.SynthesizeLongAudioRequest() + metadata =[ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = operations_pb2.Operation() + + client.synthesize_long_audio(request, metadata=[("key", "val"), ("cephalopod", "squid"),]) + + pre.assert_called_once() + post.assert_called_once() + + +def test_get_operation_rest_bad_request(request_type=operations_pb2.GetOperationRequest): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type() + request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2/operations/sample3'}, request) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = Response() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = Request() + req.return_value = response_value + client.get_operation(request) + + +@pytest.mark.parametrize("request_type", [ + operations_pb2.GetOperationRequest, + dict, +]) +def test_get_operation_rest(request_type): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + request_init = {'name': 'projects/sample1/locations/sample2/operations/sample3'} + request = request_type(**request_init) + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, 'request') as req: + # Designate an appropriate value for the returned response. + return_value = operations_pb2.Operation() + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + + req.return_value = response_value + + response = client.get_operation(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.Operation) + + +def test_list_operations_rest_bad_request(request_type=operations_pb2.ListOperationsRequest): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type() + request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2'}, request) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): + # Wrap the value into a proper Response obj + response_value = Response() + json_return_value = '' + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = Request() + req.return_value = response_value + client.list_operations(request) + + +@pytest.mark.parametrize("request_type", [ + operations_pb2.ListOperationsRequest, + dict, +]) +def test_list_operations_rest(request_type): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + request_init = {'name': 'projects/sample1/locations/sample2'} + request = request_type(**request_init) + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, 'request') as req: + # Designate an appropriate value for the returned response. + return_value = operations_pb2.ListOperationsResponse() + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode('UTF-8') + + req.return_value = response_value + + response = client.list_operations(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.ListOperationsResponse) + +def test_initialize_client_w_rest(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + assert client is not None + + +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_synthesize_long_audio_empty_call_rest(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.synthesize_long_audio), + '__call__') as call: + client.synthesize_long_audio(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = cloud_tts_lrs.SynthesizeLongAudioRequest() + + assert args[0] == request_msg + + +def test_text_to_speech_long_audio_synthesize_rest_lro_client(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + transport = client.transport + + # Ensure that we have an api-core operations client. + assert isinstance( + transport.operations_client, +operations_v1.AbstractOperationsClient, + ) + + # Ensure that subsequent calls to the property send the exact same object. + assert transport.operations_client is transport.operations_client + +def test_transport_grpc_default(): + # A client should use the gRPC transport by default. + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + assert isinstance( + client.transport, + transports.TextToSpeechLongAudioSynthesizeGrpcTransport, + ) + +def test_text_to_speech_long_audio_synthesize_base_transport_error(): + # Passing both a credentials object and credentials_file should raise an error + with pytest.raises(core_exceptions.DuplicateCredentialArgs): + transport = transports.TextToSpeechLongAudioSynthesizeTransport( + credentials=ga_credentials.AnonymousCredentials(), + credentials_file="credentials.json" + ) + + +def test_text_to_speech_long_audio_synthesize_base_transport(): + # Instantiate the base transport. + with mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeTransport.__init__') as Transport: + Transport.return_value = None + transport = transports.TextToSpeechLongAudioSynthesizeTransport( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Every method on the transport should just blindly + # raise NotImplementedError. + methods = ( + 'synthesize_long_audio', + 'get_operation', + 'list_operations', + ) + for method in methods: + with pytest.raises(NotImplementedError): + getattr(transport, method)(request=object()) + + with pytest.raises(NotImplementedError): + transport.close() + + # Additionally, the LRO client (a property) should + # also raise NotImplementedError + with pytest.raises(NotImplementedError): + transport.operations_client + + # Catch all for all remaining methods and properties + remainder = [ + 'kind', + ] + for r in remainder: + with pytest.raises(NotImplementedError): + getattr(transport, r)() + + +def test_text_to_speech_long_audio_synthesize_base_transport_with_credentials_file(): + # Instantiate the base transport with a credentials file + with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeTransport._prep_wrapped_messages') as Transport: + Transport.return_value = None + load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) + transport = transports.TextToSpeechLongAudioSynthesizeTransport( + credentials_file="credentials.json", + quota_project_id="octopus", + ) + load_creds.assert_called_once_with("credentials.json", + scopes=None, + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + quota_project_id="octopus", + ) + + +def test_text_to_speech_long_audio_synthesize_base_transport_with_adc(): + # Test the default credentials are used if credentials and credentials_file are None. + with mock.patch.object(google.auth, 'default', autospec=True) as adc, mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeTransport._prep_wrapped_messages') as Transport: + Transport.return_value = None + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport = transports.TextToSpeechLongAudioSynthesizeTransport() + adc.assert_called_once() + + +def test_text_to_speech_long_audio_synthesize_auth_adc(): + # If no credentials are provided, we should use ADC credentials. + with mock.patch.object(google.auth, 'default', autospec=True) as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + TextToSpeechLongAudioSynthesizeClient() + adc.assert_called_once_with( + scopes=None, + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + quota_project_id=None, + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.TextToSpeechLongAudioSynthesizeGrpcTransport, + transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, + ], +) +def test_text_to_speech_long_audio_synthesize_transport_auth_adc(transport_class): + # If credentials and host are not provided, the transport class should use + # ADC credentials. + with mock.patch.object(google.auth, 'default', autospec=True) as adc: + adc.return_value = (ga_credentials.AnonymousCredentials(), None) + transport_class(quota_project_id="octopus", scopes=["1", "2"]) + adc.assert_called_once_with( + scopes=["1", "2"], + default_scopes=( 'https://www.googleapis.com/auth/cloud-platform',), + quota_project_id="octopus", + ) + + +@pytest.mark.parametrize( + "transport_class", + [ + transports.TextToSpeechLongAudioSynthesizeGrpcTransport, + transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, + transports.TextToSpeechLongAudioSynthesizeRestTransport, + ], +) +def test_text_to_speech_long_audio_synthesize_transport_auth_gdch_credentials(transport_class): + host = 'https://language.com' + api_audience_tests = [None, 'https://language2.com'] + api_audience_expect = [host, 'https://language2.com'] + for t, e in zip(api_audience_tests, api_audience_expect): + with mock.patch.object(google.auth, 'default', autospec=True) as adc: + gdch_mock = mock.MagicMock() + type(gdch_mock).with_gdch_audience = mock.PropertyMock(return_value=gdch_mock) + adc.return_value = (gdch_mock, None) + transport_class(host=host, api_audience=t) + gdch_mock.with_gdch_audience.assert_called_once_with( + e + ) + + +@pytest.mark.parametrize( + "transport_class,grpc_helpers", + [ + (transports.TextToSpeechLongAudioSynthesizeGrpcTransport, grpc_helpers), + (transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, grpc_helpers_async) + ], +) +def test_text_to_speech_long_audio_synthesize_transport_create_channel(transport_class, grpc_helpers): + # If credentials and host are not provided, the transport class should use + # ADC credentials. + with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch.object( + grpc_helpers, "create_channel", autospec=True + ) as create_channel: + creds = ga_credentials.AnonymousCredentials() + adc.return_value = (creds, None) + transport_class( + quota_project_id="octopus", + scopes=["1", "2"] + ) + + create_channel.assert_called_with( + "texttospeech.googleapis.com:443", + credentials=creds, + credentials_file=None, + quota_project_id="octopus", + default_scopes=( + 'https://www.googleapis.com/auth/cloud-platform', +), + scopes=["1", "2"], + default_host="texttospeech.googleapis.com", + ssl_credentials=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + +@pytest.mark.parametrize("transport_class", [transports.TextToSpeechLongAudioSynthesizeGrpcTransport, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport]) +def test_text_to_speech_long_audio_synthesize_grpc_transport_client_cert_source_for_mtls( + transport_class +): + cred = ga_credentials.AnonymousCredentials() + + # Check ssl_channel_credentials is used if provided. + with mock.patch.object(transport_class, "create_channel") as mock_create_channel: + mock_ssl_channel_creds = mock.Mock() + transport_class( + host="squid.clam.whelk", + credentials=cred, + ssl_channel_credentials=mock_ssl_channel_creds + ) + mock_create_channel.assert_called_once_with( + "squid.clam.whelk:443", + credentials=cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_channel_creds, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + + # Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls + # is used. + with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()): + with mock.patch("grpc.ssl_channel_credentials") as mock_ssl_cred: + transport_class( + credentials=cred, + client_cert_source_for_mtls=client_cert_source_callback + ) + expected_cert, expected_key = client_cert_source_callback() + mock_ssl_cred.assert_called_once_with( + certificate_chain=expected_cert, + private_key=expected_key + ) + +def test_text_to_speech_long_audio_synthesize_http_transport_client_cert_source_for_mtls(): + cred = ga_credentials.AnonymousCredentials() + with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel") as mock_configure_mtls_channel: + transports.TextToSpeechLongAudioSynthesizeRestTransport ( + credentials=cred, + client_cert_source_for_mtls=client_cert_source_callback + ) + mock_configure_mtls_channel.assert_called_once_with(client_cert_source_callback) + + +@pytest.mark.parametrize("transport_name", [ + "grpc", + "grpc_asyncio", + "rest", +]) +def test_text_to_speech_long_audio_synthesize_host_no_port(transport_name): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com'), + transport=transport_name, + ) + assert client.transport._host == ( + 'texttospeech.googleapis.com:443' + if transport_name in ['grpc', 'grpc_asyncio'] + else 'https://texttospeech.googleapis.com' + ) + +@pytest.mark.parametrize("transport_name", [ + "grpc", + "grpc_asyncio", + "rest", +]) +def test_text_to_speech_long_audio_synthesize_host_with_port(transport_name): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com:8000'), + transport=transport_name, + ) + assert client.transport._host == ( + 'texttospeech.googleapis.com:8000' + if transport_name in ['grpc', 'grpc_asyncio'] + else 'https://texttospeech.googleapis.com:8000' + ) + +@pytest.mark.parametrize("transport_name", [ + "rest", +]) +def test_text_to_speech_long_audio_synthesize_client_transport_session_collision(transport_name): + creds1 = ga_credentials.AnonymousCredentials() + creds2 = ga_credentials.AnonymousCredentials() + client1 = TextToSpeechLongAudioSynthesizeClient( + credentials=creds1, + transport=transport_name, + ) + client2 = TextToSpeechLongAudioSynthesizeClient( + credentials=creds2, + transport=transport_name, + ) + session1 = client1.transport.synthesize_long_audio._session + session2 = client2.transport.synthesize_long_audio._session + assert session1 != session2 +def test_text_to_speech_long_audio_synthesize_grpc_transport_channel(): + channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) + + # Check that channel is used if provided. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( + host="squid.clam.whelk", + channel=channel, + ) + assert transport.grpc_channel == channel + assert transport._host == "squid.clam.whelk:443" + assert transport._ssl_channel_credentials == None + + +def test_text_to_speech_long_audio_synthesize_grpc_asyncio_transport_channel(): + channel = aio.secure_channel('http://localhost/', grpc.local_channel_credentials()) + + # Check that channel is used if provided. + transport = transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport( + host="squid.clam.whelk", + channel=channel, + ) + assert transport.grpc_channel == channel + assert transport._host == "squid.clam.whelk:443" + assert transport._ssl_channel_credentials == None + + +# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are +# removed from grpc/grpc_asyncio transport constructor. +@pytest.mark.parametrize("transport_class", [transports.TextToSpeechLongAudioSynthesizeGrpcTransport, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport]) +def test_text_to_speech_long_audio_synthesize_transport_channel_mtls_with_client_cert_source( + transport_class +): + with mock.patch("grpc.ssl_channel_credentials", autospec=True) as grpc_ssl_channel_cred: + with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: + mock_ssl_cred = mock.Mock() + grpc_ssl_channel_cred.return_value = mock_ssl_cred + + mock_grpc_channel = mock.Mock() + grpc_create_channel.return_value = mock_grpc_channel + + cred = ga_credentials.AnonymousCredentials() + with pytest.warns(DeprecationWarning): + with mock.patch.object(google.auth, 'default') as adc: + adc.return_value = (cred, None) + transport = transport_class( + host="squid.clam.whelk", + api_mtls_endpoint="mtls.squid.clam.whelk", + client_cert_source=client_cert_source_callback, + ) + adc.assert_called_once() + + grpc_ssl_channel_cred.assert_called_once_with( + certificate_chain=b"cert bytes", private_key=b"key bytes" + ) + grpc_create_channel.assert_called_once_with( + "mtls.squid.clam.whelk:443", + credentials=cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_cred, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + assert transport.grpc_channel == mock_grpc_channel + assert transport._ssl_channel_credentials == mock_ssl_cred + + +# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are +# removed from grpc/grpc_asyncio transport constructor. +@pytest.mark.parametrize("transport_class", [transports.TextToSpeechLongAudioSynthesizeGrpcTransport, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport]) +def test_text_to_speech_long_audio_synthesize_transport_channel_mtls_with_adc( + transport_class +): + mock_ssl_cred = mock.Mock() + with mock.patch.multiple( + "google.auth.transport.grpc.SslCredentials", + __init__=mock.Mock(return_value=None), + ssl_credentials=mock.PropertyMock(return_value=mock_ssl_cred), + ): + with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: + mock_grpc_channel = mock.Mock() + grpc_create_channel.return_value = mock_grpc_channel + mock_cred = mock.Mock() + + with pytest.warns(DeprecationWarning): + transport = transport_class( + host="squid.clam.whelk", + credentials=mock_cred, + api_mtls_endpoint="mtls.squid.clam.whelk", + client_cert_source=None, + ) + + grpc_create_channel.assert_called_once_with( + "mtls.squid.clam.whelk:443", + credentials=mock_cred, + credentials_file=None, + scopes=None, + ssl_credentials=mock_ssl_cred, + quota_project_id=None, + options=[ + ("grpc.max_send_message_length", -1), + ("grpc.max_receive_message_length", -1), + ], + ) + assert transport.grpc_channel == mock_grpc_channel + + +def test_text_to_speech_long_audio_synthesize_grpc_lro_client(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='grpc', + ) + transport = client.transport + + # Ensure that we have a api-core operations client. + assert isinstance( + transport.operations_client, + operations_v1.OperationsClient, + ) + + # Ensure that subsequent calls to the property send the exact same object. + assert transport.operations_client is transport.operations_client + + +def test_text_to_speech_long_audio_synthesize_grpc_lro_async_client(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + transport='grpc_asyncio', + ) + transport = client.transport + + # Ensure that we have a api-core operations client. + assert isinstance( + transport.operations_client, + operations_v1.OperationsAsyncClient, + ) + + # Ensure that subsequent calls to the property send the exact same object. + assert transport.operations_client is transport.operations_client + + +def test_model_path(): + project = "squid" + location = "clam" + model = "whelk" + expected = "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) + actual = TextToSpeechLongAudioSynthesizeClient.model_path(project, location, model) + assert expected == actual + + +def test_parse_model_path(): + expected = { + "project": "octopus", + "location": "oyster", + "model": "nudibranch", + } + path = TextToSpeechLongAudioSynthesizeClient.model_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechLongAudioSynthesizeClient.parse_model_path(path) + assert expected == actual + +def test_common_billing_account_path(): + billing_account = "cuttlefish" + expected = "billingAccounts/{billing_account}".format(billing_account=billing_account, ) + actual = TextToSpeechLongAudioSynthesizeClient.common_billing_account_path(billing_account) + assert expected == actual + + +def test_parse_common_billing_account_path(): + expected = { + "billing_account": "mussel", + } + path = TextToSpeechLongAudioSynthesizeClient.common_billing_account_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechLongAudioSynthesizeClient.parse_common_billing_account_path(path) + assert expected == actual + +def test_common_folder_path(): + folder = "winkle" + expected = "folders/{folder}".format(folder=folder, ) + actual = TextToSpeechLongAudioSynthesizeClient.common_folder_path(folder) + assert expected == actual + + +def test_parse_common_folder_path(): + expected = { + "folder": "nautilus", + } + path = TextToSpeechLongAudioSynthesizeClient.common_folder_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechLongAudioSynthesizeClient.parse_common_folder_path(path) + assert expected == actual + +def test_common_organization_path(): + organization = "scallop" + expected = "organizations/{organization}".format(organization=organization, ) + actual = TextToSpeechLongAudioSynthesizeClient.common_organization_path(organization) + assert expected == actual + + +def test_parse_common_organization_path(): + expected = { + "organization": "abalone", + } + path = TextToSpeechLongAudioSynthesizeClient.common_organization_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechLongAudioSynthesizeClient.parse_common_organization_path(path) + assert expected == actual + +def test_common_project_path(): + project = "squid" + expected = "projects/{project}".format(project=project, ) + actual = TextToSpeechLongAudioSynthesizeClient.common_project_path(project) + assert expected == actual + + +def test_parse_common_project_path(): + expected = { + "project": "clam", + } + path = TextToSpeechLongAudioSynthesizeClient.common_project_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechLongAudioSynthesizeClient.parse_common_project_path(path) + assert expected == actual + +def test_common_location_path(): + project = "whelk" + location = "octopus" + expected = "projects/{project}/locations/{location}".format(project=project, location=location, ) + actual = TextToSpeechLongAudioSynthesizeClient.common_location_path(project, location) + assert expected == actual + + +def test_parse_common_location_path(): + expected = { + "project": "oyster", + "location": "nudibranch", + } + path = TextToSpeechLongAudioSynthesizeClient.common_location_path(**expected) + + # Check that the path construction is reversible. + actual = TextToSpeechLongAudioSynthesizeClient.parse_common_location_path(path) + assert expected == actual + + +def test_client_with_default_client_info(): + client_info = gapic_v1.client_info.ClientInfo() + + with mock.patch.object(transports.TextToSpeechLongAudioSynthesizeTransport, '_prep_wrapped_messages') as prep: + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, + ) + prep.assert_called_once_with(client_info) + + with mock.patch.object(transports.TextToSpeechLongAudioSynthesizeTransport, '_prep_wrapped_messages') as prep: + transport_class = TextToSpeechLongAudioSynthesizeClient.get_transport_class() + transport = transport_class( + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, + ) + prep.assert_called_once_with(client_info) + + +def test_get_operation(transport: str = "grpc"): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.GetOperationRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation() + response = client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.Operation) +@pytest.mark.asyncio +async def test_get_operation_async(transport: str = "grpc_asyncio"): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.GetOperationRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation() + ) + response = await client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.Operation) + +def test_get_operation_field_headers(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.GetOperationRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + call.return_value = operations_pb2.Operation() + + client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +@pytest.mark.asyncio +async def test_get_operation_field_headers_async(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.GetOperationRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation() + ) + await client.get_operation(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + +def test_get_operation_from_dict(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.Operation() + + response = client.get_operation( + request={ + "name": "locations", + } + ) + call.assert_called() +@pytest.mark.asyncio +async def test_get_operation_from_dict_async(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.get_operation), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.Operation() + ) + response = await client.get_operation( + request={ + "name": "locations", + } + ) + call.assert_called() + + +def test_list_operations(transport: str = "grpc"): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.ListOperationsRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.ListOperationsResponse() + response = client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.ListOperationsResponse) +@pytest.mark.asyncio +async def test_list_operations_async(transport: str = "grpc_asyncio"): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), transport=transport, + ) + + # Everything is optional in proto3 as far as the runtime is concerned, + # and we are mocking out the actual API, so just send an empty request. + request = operations_pb2.ListOperationsRequest() + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.ListOperationsResponse() + ) + response = await client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the response is the type that we expect. + assert isinstance(response, operations_pb2.ListOperationsResponse) + +def test_list_operations_field_headers(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.ListOperationsRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + call.return_value = operations_pb2.ListOperationsResponse() + + client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +@pytest.mark.asyncio +async def test_list_operations_field_headers_async(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + ) + + # Any value that is part of the HTTP/1.1 URI should be sent as + # a field header. Set these to a non-empty value. + request = operations_pb2.ListOperationsRequest() + request.name = "locations" + + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.ListOperationsResponse() + ) + await client.list_operations(request) + # Establish that the underlying gRPC stub method was called. + assert len(call.mock_calls) == 1 + _, args, _ = call.mock_calls[0] + assert args[0] == request + + # Establish that the field header was sent. + _, _, kw = call.mock_calls[0] + assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + +def test_list_operations_from_dict(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = operations_pb2.ListOperationsResponse() + + response = client.list_operations( + request={ + "name": "locations", + } + ) + call.assert_called() +@pytest.mark.asyncio +async def test_list_operations_from_dict_async(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + ) + # Mock the actual call within the gRPC stub, and fake the request. + with mock.patch.object(type(client.transport.list_operations), "__call__") as call: + # Designate an appropriate return value for the call. + call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( + operations_pb2.ListOperationsResponse() + ) + response = await client.list_operations( + request={ + "name": "locations", + } + ) + call.assert_called() + + +def test_transport_close_grpc(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc" + ) + with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +@pytest.mark.asyncio +async def test_transport_close_grpc_asyncio(): + client = TextToSpeechLongAudioSynthesizeAsyncClient( + credentials=async_anonymous_credentials(), + transport="grpc_asyncio" + ) + with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: + async with client: + close.assert_not_called() + close.assert_called_once() + + +def test_transport_close_rest(): + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest" + ) + with mock.patch.object(type(getattr(client.transport, "_session")), "close") as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +def test_client_ctx(): + transports = [ + 'rest', + 'grpc', + ] + for transport in transports: + client = TextToSpeechLongAudioSynthesizeClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport + ) + # Test client calls underlying transport. + with mock.patch.object(type(client.transport), "close") as close: + close.assert_not_called() + with client: + pass + close.assert_called() + +@pytest.mark.parametrize("client_class,transport_class", [ + (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport), + (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport), +]) +def test_api_key_credentials(client_class, transport_class): + with mock.patch.object( + google.auth._default, "get_api_key_credentials", create=True + ) as get_api_key_credentials: + mock_cred = mock.Mock() + get_api_key_credentials.return_value = mock_cred + options = client_options.ClientOptions() + options.api_key = "api_key" + with mock.patch.object(transport_class, "__init__") as patched: + patched.return_value = None + client = client_class(client_options=options) + patched.assert_called_once_with( + credentials=mock_cred, + credentials_file=None, + host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), + scopes=None, + client_cert_source_for_mtls=None, + quota_project_id=None, + client_info=transports.base.DEFAULT_CLIENT_INFO, + always_use_jwt_access=True, + api_audience=None, + ) From 7d67a1f3ca4240fe3a382efc74ae9c6b70dd87f5 Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Thu, 24 Oct 2024 21:59:46 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20po?= =?UTF-8?q?st-processor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --- .../google-cloud-texttospeech/v1/.coveragerc | 13 - .../google-cloud-texttospeech/v1/.flake8 | 33 - .../google-cloud-texttospeech/v1/MANIFEST.in | 2 - .../google-cloud-texttospeech/v1/README.rst | 49 - .../v1/docs/_static/custom.css | 3 - .../google-cloud-texttospeech/v1/docs/conf.py | 376 -- .../v1/docs/index.rst | 7 - .../v1/docs/texttospeech_v1/services_.rst | 7 - .../docs/texttospeech_v1/text_to_speech.rst | 6 - .../text_to_speech_long_audio_synthesize.rst | 6 - .../v1/docs/texttospeech_v1/types_.rst | 6 - .../v1/google/cloud/texttospeech/__init__.py | 75 - .../cloud/texttospeech/gapic_version.py | 16 - .../v1/google/cloud/texttospeech/py.typed | 2 - .../google/cloud/texttospeech_v1/__init__.py | 76 - .../cloud/texttospeech_v1/gapic_metadata.json | 107 - .../cloud/texttospeech_v1/gapic_version.py | 16 - .../v1/google/cloud/texttospeech_v1/py.typed | 2 - .../texttospeech_v1/services/__init__.py | 15 - .../services/text_to_speech/__init__.py | 22 - .../services/text_to_speech/async_client.py | 660 ---- .../services/text_to_speech/client.py | 1017 ------ .../text_to_speech/transports/README.rst | 9 - .../text_to_speech/transports/__init__.py | 38 - .../text_to_speech/transports/base.py | 211 -- .../text_to_speech/transports/grpc.py | 361 -- .../text_to_speech/transports/grpc_asyncio.py | 402 --- .../text_to_speech/transports/rest.py | 599 ---- .../text_to_speech/transports/rest_base.py | 220 -- .../__init__.py | 22 - .../async_client.py | 454 --- .../client.py | 813 ----- .../transports/README.rst | 9 - .../transports/__init__.py | 38 - .../transports/base.py | 189 - .../transports/grpc.py | 325 -- .../transports/grpc_asyncio.py | 356 -- .../transports/rest.py | 509 --- .../transports/rest_base.py | 188 - .../cloud/texttospeech_v1/types/__init__.py | 66 - .../cloud/texttospeech_v1/types/cloud_tts.py | 713 ---- .../texttospeech_v1/types/cloud_tts_lrs.py | 122 - .../google-cloud-texttospeech/v1/mypy.ini | 3 - .../google-cloud-texttospeech/v1/noxfile.py | 280 -- ...metadata_google.cloud.texttospeech.v1.json | 659 ---- ...erated_text_to_speech_list_voices_async.py | 51 - ...nerated_text_to_speech_list_voices_sync.py | 51 - ..._synthesize_synthesize_long_audio_async.py | 68 - ...o_synthesize_synthesize_long_audio_sync.py | 68 - ...xt_to_speech_streaming_synthesize_async.py | 66 - ...ext_to_speech_streaming_synthesize_sync.py | 66 - ..._text_to_speech_synthesize_speech_async.py | 63 - ...d_text_to_speech_synthesize_speech_sync.py | 63 - .../scripts/fixup_texttospeech_v1_keywords.py | 179 - .../google-cloud-texttospeech/v1/setup.py | 98 - .../v1/testing/constraints-3.10.txt | 6 - .../v1/testing/constraints-3.11.txt | 6 - .../v1/testing/constraints-3.12.txt | 6 - .../v1/testing/constraints-3.7.txt | 10 - .../v1/testing/constraints-3.8.txt | 6 - .../v1/testing/constraints-3.9.txt | 6 - .../v1/tests/__init__.py | 16 - .../v1/tests/unit/__init__.py | 16 - .../v1/tests/unit/gapic/__init__.py | 16 - .../unit/gapic/texttospeech_v1/__init__.py | 16 - .../texttospeech_v1/test_text_to_speech.py | 3141 ----------------- ...st_text_to_speech_long_audio_synthesize.py | 2433 ------------- .../v1beta1/.coveragerc | 13 - .../google-cloud-texttospeech/v1beta1/.flake8 | 33 - .../v1beta1/MANIFEST.in | 2 - .../v1beta1/README.rst | 49 - .../v1beta1/docs/_static/custom.css | 3 - .../v1beta1/docs/conf.py | 376 -- .../v1beta1/docs/index.rst | 7 - .../docs/texttospeech_v1beta1/services_.rst | 7 - .../texttospeech_v1beta1/text_to_speech.rst | 6 - .../text_to_speech_long_audio_synthesize.rst | 6 - .../docs/texttospeech_v1beta1/types_.rst | 6 - .../google/cloud/texttospeech/__init__.py | 79 - .../cloud/texttospeech/gapic_version.py | 16 - .../google/cloud/texttospeech/py.typed | 2 - .../cloud/texttospeech_v1beta1/__init__.py | 80 - .../texttospeech_v1beta1/gapic_metadata.json | 107 - .../texttospeech_v1beta1/gapic_version.py | 16 - .../cloud/texttospeech_v1beta1/py.typed | 2 - .../texttospeech_v1beta1/services/__init__.py | 15 - .../services/text_to_speech/__init__.py | 22 - .../services/text_to_speech/async_client.py | 660 ---- .../services/text_to_speech/client.py | 1017 ------ .../text_to_speech/transports/README.rst | 9 - .../text_to_speech/transports/__init__.py | 38 - .../text_to_speech/transports/base.py | 211 -- .../text_to_speech/transports/grpc.py | 361 -- .../text_to_speech/transports/grpc_asyncio.py | 402 --- .../text_to_speech/transports/rest.py | 599 ---- .../text_to_speech/transports/rest_base.py | 220 -- .../__init__.py | 22 - .../async_client.py | 454 --- .../client.py | 813 ----- .../transports/README.rst | 9 - .../transports/__init__.py | 38 - .../transports/base.py | 189 - .../transports/grpc.py | 325 -- .../transports/grpc_asyncio.py | 356 -- .../transports/rest.py | 509 --- .../transports/rest_base.py | 188 - .../texttospeech_v1beta1/types/__init__.py | 70 - .../texttospeech_v1beta1/types/cloud_tts.py | 826 ----- .../types/cloud_tts_lrs.py | 122 - .../v1beta1/mypy.ini | 3 - .../v1beta1/noxfile.py | 280 -- ...ata_google.cloud.texttospeech.v1beta1.json | 659 ---- ...erated_text_to_speech_list_voices_async.py | 51 - ...nerated_text_to_speech_list_voices_sync.py | 51 - ..._synthesize_synthesize_long_audio_async.py | 68 - ...o_synthesize_synthesize_long_audio_sync.py | 68 - ...xt_to_speech_streaming_synthesize_async.py | 66 - ...ext_to_speech_streaming_synthesize_sync.py | 66 - ..._text_to_speech_synthesize_speech_async.py | 63 - ...d_text_to_speech_synthesize_speech_sync.py | 63 - .../fixup_texttospeech_v1beta1_keywords.py | 179 - .../v1beta1/setup.py | 98 - .../v1beta1/testing/constraints-3.10.txt | 6 - .../v1beta1/testing/constraints-3.11.txt | 6 - .../v1beta1/testing/constraints-3.12.txt | 6 - .../v1beta1/testing/constraints-3.13.txt | 6 - .../v1beta1/testing/constraints-3.7.txt | 10 - .../v1beta1/testing/constraints-3.8.txt | 6 - .../v1beta1/testing/constraints-3.9.txt | 6 - .../v1beta1/tests/__init__.py | 16 - .../v1beta1/tests/unit/__init__.py | 16 - .../v1beta1/tests/unit/gapic/__init__.py | 16 - .../gapic/texttospeech_v1beta1/__init__.py | 16 - .../test_text_to_speech.py | 3141 ----------------- ...st_text_to_speech_long_audio_synthesize.py | 2433 ------------- packages/google-cloud-texttospeech/.flake8 | 2 +- .../CONTRIBUTING.rst | 10 +- .../google-cloud-texttospeech/MANIFEST.in | 2 +- .../google-cloud-texttospeech/docs/conf.py | 2 +- .../cloud/texttospeech/gapic_version.py | 2 +- .../cloud/texttospeech_v1/gapic_version.py | 2 +- .../text_to_speech/transports/rest.py | 2 +- .../transports/rest.py | 2 +- .../cloud/texttospeech_v1beta1/__init__.py | 2 + .../texttospeech_v1beta1/gapic_version.py | 2 +- .../text_to_speech/transports/rest.py | 2 +- .../transports/rest.py | 2 +- .../texttospeech_v1beta1/types/__init__.py | 2 + .../texttospeech_v1beta1/types/cloud_tts.py | 48 + packages/google-cloud-texttospeech/noxfile.py | 20 +- ...metadata_google.cloud.texttospeech.v1.json | 2 +- ...ata_google.cloud.texttospeech.v1beta1.json | 2 +- .../scripts/decrypt-secrets.sh | 2 +- packages/google-cloud-texttospeech/setup.py | 2 + .../testing/constraints-3.13.txt | 0 155 files changed, 87 insertions(+), 31260 deletions(-) delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/.coveragerc delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/.flake8 delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/MANIFEST.in delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/README.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/_static/custom.css delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/conf.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/index.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/services_.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech_long_audio_synthesize.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/types_.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/gapic_version.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/py.typed delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_metadata.json delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_version.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/py.typed delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/async_client.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/client.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/README.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/base.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc_asyncio.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest_base.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/async_client.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/client.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/README.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/base.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts_lrs.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/mypy.ini delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/noxfile.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_async.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_sync.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_async.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_sync.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_async.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_sync.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/scripts/fixup_texttospeech_v1_keywords.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/setup.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.10.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.11.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.12.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.7.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.8.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.9.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/tests/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech_long_audio_synthesize.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/.coveragerc delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/.flake8 delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/MANIFEST.in delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/README.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/_static/custom.css delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/conf.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/index.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/services_.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech_long_audio_synthesize.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/types_.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/gapic_version.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/py.typed delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_metadata.json delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_version.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/py.typed delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/async_client.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/client.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/README.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/base.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc_asyncio.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest_base.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/async_client.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/client.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/README.rst delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/base.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts_lrs.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/mypy.ini delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/noxfile.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_async.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_sync.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_async.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_sync.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_async.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_sync.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/scripts/fixup_texttospeech_v1beta1_keywords.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/setup.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.10.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.11.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.12.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.13.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.7.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.8.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.9.txt delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/__init__.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech.py delete mode 100644 owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech_long_audio_synthesize.py rename {owl-bot-staging/google-cloud-texttospeech/v1 => packages/google-cloud-texttospeech}/testing/constraints-3.13.txt (100%) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/.coveragerc b/owl-bot-staging/google-cloud-texttospeech/v1/.coveragerc deleted file mode 100644 index 8f3a0ab7f83b..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/.coveragerc +++ /dev/null @@ -1,13 +0,0 @@ -[run] -branch = True - -[report] -show_missing = True -omit = - google/cloud/texttospeech/__init__.py - google/cloud/texttospeech/gapic_version.py -exclude_lines = - # Re-enable the standard pragma - pragma: NO COVER - # Ignore debug-only repr - def __repr__ diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/.flake8 b/owl-bot-staging/google-cloud-texttospeech/v1/.flake8 deleted file mode 100644 index 29227d4cf419..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/.flake8 +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# -# 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 -# -# https://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. - -# Generated by synthtool. DO NOT EDIT! -[flake8] -ignore = E203, E266, E501, W503 -exclude = - # Exclude generated code. - **/proto/** - **/gapic/** - **/services/** - **/types/** - *_pb2.py - - # Standard linting exemptions. - **/.nox/** - __pycache__, - .git, - *.pyc, - conf.py diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/MANIFEST.in b/owl-bot-staging/google-cloud-texttospeech/v1/MANIFEST.in deleted file mode 100644 index 1e41d1d9a919..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/MANIFEST.in +++ /dev/null @@ -1,2 +0,0 @@ -recursive-include google/cloud/texttospeech *.py -recursive-include google/cloud/texttospeech_v1 *.py diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/README.rst b/owl-bot-staging/google-cloud-texttospeech/v1/README.rst deleted file mode 100644 index 25f53907ce0c..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/README.rst +++ /dev/null @@ -1,49 +0,0 @@ -Python Client for Google Cloud Texttospeech API -================================================= - -Quick Start ------------ - -In order to use this library, you first need to go through the following steps: - -1. `Select or create a Cloud Platform project.`_ -2. `Enable billing for your project.`_ -3. Enable the Google Cloud Texttospeech API. -4. `Setup Authentication.`_ - -.. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project -.. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html - -Installation -~~~~~~~~~~~~ - -Install this library in a `virtualenv`_ using pip. `virtualenv`_ is a tool to -create isolated Python environments. The basic problem it addresses is one of -dependencies and versions, and indirectly permissions. - -With `virtualenv`_, it's possible to install this library without needing system -install permissions, and without clashing with the installed system -dependencies. - -.. _`virtualenv`: https://virtualenv.pypa.io/en/latest/ - - -Mac/Linux -^^^^^^^^^ - -.. code-block:: console - - python3 -m venv - source /bin/activate - /bin/pip install /path/to/library - - -Windows -^^^^^^^ - -.. code-block:: console - - python3 -m venv - \Scripts\activate - \Scripts\pip.exe install \path\to\library diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/_static/custom.css b/owl-bot-staging/google-cloud-texttospeech/v1/docs/_static/custom.css deleted file mode 100644 index 06423be0b592..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/docs/_static/custom.css +++ /dev/null @@ -1,3 +0,0 @@ -dl.field-list > dt { - min-width: 100px -} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/conf.py b/owl-bot-staging/google-cloud-texttospeech/v1/docs/conf.py deleted file mode 100644 index 4e7d47829ddb..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/docs/conf.py +++ /dev/null @@ -1,376 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# -# google-cloud-texttospeech documentation build configuration file -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys -import os -import shlex - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -sys.path.insert(0, os.path.abspath("..")) - -__version__ = "0.1.0" - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -needs_sphinx = "4.0.1" - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.autosummary", - "sphinx.ext.intersphinx", - "sphinx.ext.coverage", - "sphinx.ext.napoleon", - "sphinx.ext.todo", - "sphinx.ext.viewcode", -] - -# autodoc/autosummary flags -autoclass_content = "both" -autodoc_default_flags = ["members"] -autosummary_generate = True - - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# Allow markdown includes (so releases.md can include CHANGLEOG.md) -# http://www.sphinx-doc.org/en/master/markdown.html -source_parsers = {".md": "recommonmark.parser.CommonMarkParser"} - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -source_suffix = [".rst", ".md"] - -# The encoding of source files. -# source_encoding = 'utf-8-sig' - -# The root toctree document. -root_doc = "index" - -# General information about the project. -project = u"google-cloud-texttospeech" -copyright = u"2023, Google, LLC" -author = u"Google APIs" # TODO: autogenerate this bit - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The full version, including alpha/beta/rc tags. -release = __version__ -# The short X.Y version. -version = ".".join(release.split(".")[0:2]) - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = 'en' - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -# today = '' -# Else, today_fmt is used as the format for a strftime call. -# today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ["_build"] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -# default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -# add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -# add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -# show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# A list of ignored prefixes for module index sorting. -# modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -# keep_warnings = False - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = "alabaster" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -html_theme_options = { - "description": "Google Cloud Client Libraries for Python", - "github_user": "googleapis", - "github_repo": "google-cloud-python", - "github_banner": True, - "font_family": "'Roboto', Georgia, sans", - "head_font_family": "'Roboto', Georgia, serif", - "code_font_family": "'Roboto Mono', 'Consolas', monospace", -} - -# Add any paths that contain custom themes here, relative to this directory. -# html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -# html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -# html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -# html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -# html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -# html_extra_path = [] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -# html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -# html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -# html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -# html_additional_pages = {} - -# If false, no module index is generated. -# html_domain_indices = True - -# If false, no index is generated. -# html_use_index = True - -# If true, the index is split into individual pages for each letter. -# html_split_index = False - -# If true, links to the reST sources are added to the pages. -# html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -# html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -# html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -# html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -# html_file_suffix = None - -# Language to be used for generating the HTML full-text search index. -# Sphinx supports the following languages: -# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' -# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' -# html_search_language = 'en' - -# A dictionary with options for the search language support, empty by default. -# Now only 'ja' uses this config value -# html_search_options = {'type': 'default'} - -# The name of a javascript file (relative to the configuration directory) that -# implements a search results scorer. If empty, the default will be used. -# html_search_scorer = 'scorer.js' - -# Output file base name for HTML help builder. -htmlhelp_basename = "google-cloud-texttospeech-doc" - -# -- Options for warnings ------------------------------------------------------ - - -suppress_warnings = [ - # Temporarily suppress this to avoid "more than one target found for - # cross-reference" warning, which are intractable for us to avoid while in - # a mono-repo. - # See https://github.com/sphinx-doc/sphinx/blob - # /2a65ffeef5c107c19084fabdd706cdff3f52d93c/sphinx/domains/python.py#L843 - "ref.python" -] - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # 'preamble': '', - # Latex figure (float) alignment - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - ( - root_doc, - "google-cloud-texttospeech.tex", - u"google-cloud-texttospeech Documentation", - author, - "manual", - ) -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -# latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -# latex_use_parts = False - -# If true, show page references after internal links. -# latex_show_pagerefs = False - -# If true, show URL addresses after external links. -# latex_show_urls = False - -# Documents to append as an appendix to all manuals. -# latex_appendices = [] - -# If false, no module index is generated. -# latex_domain_indices = True - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ( - root_doc, - "google-cloud-texttospeech", - u"Google Cloud Texttospeech Documentation", - [author], - 1, - ) -] - -# If true, show URL addresses after external links. -# man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - root_doc, - "google-cloud-texttospeech", - u"google-cloud-texttospeech Documentation", - author, - "google-cloud-texttospeech", - "GAPIC library for Google Cloud Texttospeech API", - "APIs", - ) -] - -# Documents to append as an appendix to all manuals. -# texinfo_appendices = [] - -# If false, no module index is generated. -# texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -# texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -# texinfo_no_detailmenu = False - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = { - "python": ("http://python.readthedocs.org/en/latest/", None), - "gax": ("https://gax-python.readthedocs.org/en/latest/", None), - "google-auth": ("https://google-auth.readthedocs.io/en/stable", None), - "google-gax": ("https://gax-python.readthedocs.io/en/latest/", None), - "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None), - "grpc": ("https://grpc.io/grpc/python/", None), - "requests": ("http://requests.kennethreitz.org/en/stable/", None), - "proto": ("https://proto-plus-python.readthedocs.io/en/stable", None), - "protobuf": ("https://googleapis.dev/python/protobuf/latest/", None), -} - - -# Napoleon settings -napoleon_google_docstring = True -napoleon_numpy_docstring = True -napoleon_include_private_with_doc = False -napoleon_include_special_with_doc = True -napoleon_use_admonition_for_examples = False -napoleon_use_admonition_for_notes = False -napoleon_use_admonition_for_references = False -napoleon_use_ivar = False -napoleon_use_param = True -napoleon_use_rtype = True diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/index.rst b/owl-bot-staging/google-cloud-texttospeech/v1/docs/index.rst deleted file mode 100644 index 7b4717a9c7d1..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/docs/index.rst +++ /dev/null @@ -1,7 +0,0 @@ -API Reference -------------- -.. toctree:: - :maxdepth: 2 - - texttospeech_v1/services_ - texttospeech_v1/types_ diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/services_.rst b/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/services_.rst deleted file mode 100644 index 71958842bafc..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/services_.rst +++ /dev/null @@ -1,7 +0,0 @@ -Services for Google Cloud Texttospeech v1 API -============================================= -.. toctree:: - :maxdepth: 2 - - text_to_speech - text_to_speech_long_audio_synthesize diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech.rst b/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech.rst deleted file mode 100644 index 2ad3a8e92df5..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech.rst +++ /dev/null @@ -1,6 +0,0 @@ -TextToSpeech ------------------------------- - -.. automodule:: google.cloud.texttospeech_v1.services.text_to_speech - :members: - :inherited-members: diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech_long_audio_synthesize.rst b/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech_long_audio_synthesize.rst deleted file mode 100644 index 2a202504277c..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/text_to_speech_long_audio_synthesize.rst +++ /dev/null @@ -1,6 +0,0 @@ -TextToSpeechLongAudioSynthesize -------------------------------------------------- - -.. automodule:: google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize - :members: - :inherited-members: diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/types_.rst b/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/types_.rst deleted file mode 100644 index bfe321928736..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/docs/texttospeech_v1/types_.rst +++ /dev/null @@ -1,6 +0,0 @@ -Types for Google Cloud Texttospeech v1 API -========================================== - -.. automodule:: google.cloud.texttospeech_v1.types - :members: - :show-inheritance: diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/__init__.py deleted file mode 100644 index f127771c97b0..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/__init__.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from google.cloud.texttospeech import gapic_version as package_version - -__version__ = package_version.__version__ - - -from google.cloud.texttospeech_v1.services.text_to_speech.client import TextToSpeechClient -from google.cloud.texttospeech_v1.services.text_to_speech.async_client import TextToSpeechAsyncClient -from google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize.client import TextToSpeechLongAudioSynthesizeClient -from google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize.async_client import TextToSpeechLongAudioSynthesizeAsyncClient - -from google.cloud.texttospeech_v1.types.cloud_tts import AdvancedVoiceOptions -from google.cloud.texttospeech_v1.types.cloud_tts import AudioConfig -from google.cloud.texttospeech_v1.types.cloud_tts import CustomPronunciationParams -from google.cloud.texttospeech_v1.types.cloud_tts import CustomPronunciations -from google.cloud.texttospeech_v1.types.cloud_tts import CustomVoiceParams -from google.cloud.texttospeech_v1.types.cloud_tts import ListVoicesRequest -from google.cloud.texttospeech_v1.types.cloud_tts import ListVoicesResponse -from google.cloud.texttospeech_v1.types.cloud_tts import StreamingSynthesisInput -from google.cloud.texttospeech_v1.types.cloud_tts import StreamingSynthesizeConfig -from google.cloud.texttospeech_v1.types.cloud_tts import StreamingSynthesizeRequest -from google.cloud.texttospeech_v1.types.cloud_tts import StreamingSynthesizeResponse -from google.cloud.texttospeech_v1.types.cloud_tts import SynthesisInput -from google.cloud.texttospeech_v1.types.cloud_tts import SynthesizeSpeechRequest -from google.cloud.texttospeech_v1.types.cloud_tts import SynthesizeSpeechResponse -from google.cloud.texttospeech_v1.types.cloud_tts import Voice -from google.cloud.texttospeech_v1.types.cloud_tts import VoiceCloneParams -from google.cloud.texttospeech_v1.types.cloud_tts import VoiceSelectionParams -from google.cloud.texttospeech_v1.types.cloud_tts import AudioEncoding -from google.cloud.texttospeech_v1.types.cloud_tts import SsmlVoiceGender -from google.cloud.texttospeech_v1.types.cloud_tts_lrs import SynthesizeLongAudioMetadata -from google.cloud.texttospeech_v1.types.cloud_tts_lrs import SynthesizeLongAudioRequest -from google.cloud.texttospeech_v1.types.cloud_tts_lrs import SynthesizeLongAudioResponse - -__all__ = ('TextToSpeechClient', - 'TextToSpeechAsyncClient', - 'TextToSpeechLongAudioSynthesizeClient', - 'TextToSpeechLongAudioSynthesizeAsyncClient', - 'AdvancedVoiceOptions', - 'AudioConfig', - 'CustomPronunciationParams', - 'CustomPronunciations', - 'CustomVoiceParams', - 'ListVoicesRequest', - 'ListVoicesResponse', - 'StreamingSynthesisInput', - 'StreamingSynthesizeConfig', - 'StreamingSynthesizeRequest', - 'StreamingSynthesizeResponse', - 'SynthesisInput', - 'SynthesizeSpeechRequest', - 'SynthesizeSpeechResponse', - 'Voice', - 'VoiceCloneParams', - 'VoiceSelectionParams', - 'AudioEncoding', - 'SsmlVoiceGender', - 'SynthesizeLongAudioMetadata', - 'SynthesizeLongAudioRequest', - 'SynthesizeLongAudioResponse', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/gapic_version.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/gapic_version.py deleted file mode 100644 index 558c8aab67c5..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/gapic_version.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -__version__ = "0.0.0" # {x-release-please-version} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/py.typed b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/py.typed deleted file mode 100644 index 9b87c1e1cbf9..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech/py.typed +++ /dev/null @@ -1,2 +0,0 @@ -# Marker file for PEP 561. -# The google-cloud-texttospeech package uses inline types. diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/__init__.py deleted file mode 100644 index 8e98d41f6a93..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/__init__.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from google.cloud.texttospeech_v1 import gapic_version as package_version - -__version__ = package_version.__version__ - - -from .services.text_to_speech import TextToSpeechClient -from .services.text_to_speech import TextToSpeechAsyncClient -from .services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeClient -from .services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeAsyncClient - -from .types.cloud_tts import AdvancedVoiceOptions -from .types.cloud_tts import AudioConfig -from .types.cloud_tts import CustomPronunciationParams -from .types.cloud_tts import CustomPronunciations -from .types.cloud_tts import CustomVoiceParams -from .types.cloud_tts import ListVoicesRequest -from .types.cloud_tts import ListVoicesResponse -from .types.cloud_tts import StreamingSynthesisInput -from .types.cloud_tts import StreamingSynthesizeConfig -from .types.cloud_tts import StreamingSynthesizeRequest -from .types.cloud_tts import StreamingSynthesizeResponse -from .types.cloud_tts import SynthesisInput -from .types.cloud_tts import SynthesizeSpeechRequest -from .types.cloud_tts import SynthesizeSpeechResponse -from .types.cloud_tts import Voice -from .types.cloud_tts import VoiceCloneParams -from .types.cloud_tts import VoiceSelectionParams -from .types.cloud_tts import AudioEncoding -from .types.cloud_tts import SsmlVoiceGender -from .types.cloud_tts_lrs import SynthesizeLongAudioMetadata -from .types.cloud_tts_lrs import SynthesizeLongAudioRequest -from .types.cloud_tts_lrs import SynthesizeLongAudioResponse - -__all__ = ( - 'TextToSpeechAsyncClient', - 'TextToSpeechLongAudioSynthesizeAsyncClient', -'AdvancedVoiceOptions', -'AudioConfig', -'AudioEncoding', -'CustomPronunciationParams', -'CustomPronunciations', -'CustomVoiceParams', -'ListVoicesRequest', -'ListVoicesResponse', -'SsmlVoiceGender', -'StreamingSynthesisInput', -'StreamingSynthesizeConfig', -'StreamingSynthesizeRequest', -'StreamingSynthesizeResponse', -'SynthesisInput', -'SynthesizeLongAudioMetadata', -'SynthesizeLongAudioRequest', -'SynthesizeLongAudioResponse', -'SynthesizeSpeechRequest', -'SynthesizeSpeechResponse', -'TextToSpeechClient', -'TextToSpeechLongAudioSynthesizeClient', -'Voice', -'VoiceCloneParams', -'VoiceSelectionParams', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_metadata.json b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_metadata.json deleted file mode 100644 index 9c20cbce6b46..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_metadata.json +++ /dev/null @@ -1,107 +0,0 @@ - { - "comment": "This file maps proto services/RPCs to the corresponding library clients/methods", - "language": "python", - "libraryPackage": "google.cloud.texttospeech_v1", - "protoPackage": "google.cloud.texttospeech.v1", - "schema": "1.0", - "services": { - "TextToSpeech": { - "clients": { - "grpc": { - "libraryClient": "TextToSpeechClient", - "rpcs": { - "ListVoices": { - "methods": [ - "list_voices" - ] - }, - "StreamingSynthesize": { - "methods": [ - "streaming_synthesize" - ] - }, - "SynthesizeSpeech": { - "methods": [ - "synthesize_speech" - ] - } - } - }, - "grpc-async": { - "libraryClient": "TextToSpeechAsyncClient", - "rpcs": { - "ListVoices": { - "methods": [ - "list_voices" - ] - }, - "StreamingSynthesize": { - "methods": [ - "streaming_synthesize" - ] - }, - "SynthesizeSpeech": { - "methods": [ - "synthesize_speech" - ] - } - } - }, - "rest": { - "libraryClient": "TextToSpeechClient", - "rpcs": { - "ListVoices": { - "methods": [ - "list_voices" - ] - }, - "StreamingSynthesize": { - "methods": [ - "streaming_synthesize" - ] - }, - "SynthesizeSpeech": { - "methods": [ - "synthesize_speech" - ] - } - } - } - } - }, - "TextToSpeechLongAudioSynthesize": { - "clients": { - "grpc": { - "libraryClient": "TextToSpeechLongAudioSynthesizeClient", - "rpcs": { - "SynthesizeLongAudio": { - "methods": [ - "synthesize_long_audio" - ] - } - } - }, - "grpc-async": { - "libraryClient": "TextToSpeechLongAudioSynthesizeAsyncClient", - "rpcs": { - "SynthesizeLongAudio": { - "methods": [ - "synthesize_long_audio" - ] - } - } - }, - "rest": { - "libraryClient": "TextToSpeechLongAudioSynthesizeClient", - "rpcs": { - "SynthesizeLongAudio": { - "methods": [ - "synthesize_long_audio" - ] - } - } - } - } - } - } -} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_version.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_version.py deleted file mode 100644 index 558c8aab67c5..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/gapic_version.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -__version__ = "0.0.0" # {x-release-please-version} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/py.typed b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/py.typed deleted file mode 100644 index 9b87c1e1cbf9..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/py.typed +++ /dev/null @@ -1,2 +0,0 @@ -# Marker file for PEP 561. -# The google-cloud-texttospeech package uses inline types. diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/__init__.py deleted file mode 100644 index 8f6cf068242c..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/__init__.py deleted file mode 100644 index fa16c00b5f6f..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from .client import TextToSpeechClient -from .async_client import TextToSpeechAsyncClient - -__all__ = ( - 'TextToSpeechClient', - 'TextToSpeechAsyncClient', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/async_client.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/async_client.py deleted file mode 100644 index 02f335b962fd..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/async_client.py +++ /dev/null @@ -1,660 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from collections import OrderedDict -import re -from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, AsyncIterable, Awaitable, AsyncIterator, Sequence, Tuple, Type, Union - -from google.cloud.texttospeech_v1 import gapic_version as package_version - -from google.api_core.client_options import ClientOptions -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import retry_async as retries -from google.auth import credentials as ga_credentials # type: ignore -from google.oauth2 import service_account # type: ignore - - -try: - OptionalRetry = Union[retries.AsyncRetry, gapic_v1.method._MethodDefault, None] -except AttributeError: # pragma: NO COVER - OptionalRetry = Union[retries.AsyncRetry, object, None] # type: ignore - -from google.cloud.texttospeech_v1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore -from .transports.base import TextToSpeechTransport, DEFAULT_CLIENT_INFO -from .transports.grpc_asyncio import TextToSpeechGrpcAsyncIOTransport -from .client import TextToSpeechClient - - -class TextToSpeechAsyncClient: - """Service that implements Google Cloud Text-to-Speech API.""" - - _client: TextToSpeechClient - - # Copy defaults from the synchronous client for use here. - # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. - DEFAULT_ENDPOINT = TextToSpeechClient.DEFAULT_ENDPOINT - DEFAULT_MTLS_ENDPOINT = TextToSpeechClient.DEFAULT_MTLS_ENDPOINT - _DEFAULT_ENDPOINT_TEMPLATE = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE - _DEFAULT_UNIVERSE = TextToSpeechClient._DEFAULT_UNIVERSE - - model_path = staticmethod(TextToSpeechClient.model_path) - parse_model_path = staticmethod(TextToSpeechClient.parse_model_path) - common_billing_account_path = staticmethod(TextToSpeechClient.common_billing_account_path) - parse_common_billing_account_path = staticmethod(TextToSpeechClient.parse_common_billing_account_path) - common_folder_path = staticmethod(TextToSpeechClient.common_folder_path) - parse_common_folder_path = staticmethod(TextToSpeechClient.parse_common_folder_path) - common_organization_path = staticmethod(TextToSpeechClient.common_organization_path) - parse_common_organization_path = staticmethod(TextToSpeechClient.parse_common_organization_path) - common_project_path = staticmethod(TextToSpeechClient.common_project_path) - parse_common_project_path = staticmethod(TextToSpeechClient.parse_common_project_path) - common_location_path = staticmethod(TextToSpeechClient.common_location_path) - parse_common_location_path = staticmethod(TextToSpeechClient.parse_common_location_path) - - @classmethod - def from_service_account_info(cls, info: dict, *args, **kwargs): - """Creates an instance of this client using the provided credentials - info. - - Args: - info (dict): The service account private key info. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechAsyncClient: The constructed client. - """ - return TextToSpeechClient.from_service_account_info.__func__(TextToSpeechAsyncClient, info, *args, **kwargs) # type: ignore - - @classmethod - def from_service_account_file(cls, filename: str, *args, **kwargs): - """Creates an instance of this client using the provided credentials - file. - - Args: - filename (str): The path to the service account private key json - file. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechAsyncClient: The constructed client. - """ - return TextToSpeechClient.from_service_account_file.__func__(TextToSpeechAsyncClient, filename, *args, **kwargs) # type: ignore - - from_service_account_json = from_service_account_file - - @classmethod - def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[ClientOptions] = None): - """Return the API endpoint and client cert source for mutual TLS. - - The client cert source is determined in the following order: - (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the - client cert source is None. - (2) if `client_options.client_cert_source` is provided, use the provided one; if the - default client cert source exists, use the default one; otherwise the client cert - source is None. - - The API endpoint is determined in the following order: - (1) if `client_options.api_endpoint` if provided, use the provided one. - (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the - default mTLS endpoint; if the environment variable is "never", use the default API - endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise - use the default API endpoint. - - More details can be found at https://google.aip.dev/auth/4114. - - Args: - client_options (google.api_core.client_options.ClientOptions): Custom options for the - client. Only the `api_endpoint` and `client_cert_source` properties may be used - in this method. - - Returns: - Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the - client cert source to use. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If any errors happen. - """ - return TextToSpeechClient.get_mtls_endpoint_and_cert_source(client_options) # type: ignore - - @property - def transport(self) -> TextToSpeechTransport: - """Returns the transport used by the client instance. - - Returns: - TextToSpeechTransport: The transport used by the client instance. - """ - return self._client.transport - - @property - def api_endpoint(self): - """Return the API endpoint used by the client instance. - - Returns: - str: The API endpoint used by the client instance. - """ - return self._client._api_endpoint - - @property - def universe_domain(self) -> str: - """Return the universe domain used by the client instance. - - Returns: - str: The universe domain used - by the client instance. - """ - return self._client._universe_domain - - get_transport_class = TextToSpeechClient.get_transport_class - - def __init__(self, *, - credentials: Optional[ga_credentials.Credentials] = None, - transport: Optional[Union[str, TextToSpeechTransport, Callable[..., TextToSpeechTransport]]] = "grpc_asyncio", - client_options: Optional[ClientOptions] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - ) -> None: - """Instantiates the text to speech async client. - - Args: - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - transport (Optional[Union[str,TextToSpeechTransport,Callable[..., TextToSpeechTransport]]]): - The transport to use, or a Callable that constructs and returns a new transport to use. - If a Callable is given, it will be called with the same set of initialization - arguments as used in the TextToSpeechTransport constructor. - If set to None, a transport is chosen automatically. - NOTE: "rest" transport functionality is currently in a - beta state (preview). We welcome your feedback via an - issue in this library's source repository. - client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): - Custom options for the client. - - 1. The ``api_endpoint`` property can be used to override the - default endpoint provided by the client when ``transport`` is - not explicitly provided. Only if this property is not set and - ``transport`` was not explicitly provided, the endpoint is - determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment - variable, which have one of the following values: - "always" (always use the default mTLS endpoint), "never" (always - use the default regular endpoint) and "auto" (auto-switch to the - default mTLS endpoint if client certificate is present; this is - the default value). - - 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable - is "true", then the ``client_cert_source`` property can be used - to provide a client certificate for mTLS transport. If - not provided, the default SSL client certificate will be used if - present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not - set, no client certificate will be used. - - 3. The ``universe_domain`` property can be used to override the - default "googleapis.com" universe. Note that ``api_endpoint`` - property still takes precedence; and ``universe_domain`` is - currently not supported for mTLS. - - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - - Raises: - google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport - creation failed for any reason. - """ - self._client = TextToSpeechClient( - credentials=credentials, - transport=transport, - client_options=client_options, - client_info=client_info, - - ) - - async def list_voices(self, - request: Optional[Union[cloud_tts.ListVoicesRequest, dict]] = None, - *, - language_code: Optional[str] = None, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> cloud_tts.ListVoicesResponse: - r"""Returns a list of Voice supported for synthesis. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1 - - async def sample_list_voices(): - # Create a client - client = texttospeech_v1.TextToSpeechAsyncClient() - - # Initialize request argument(s) - request = texttospeech_v1.ListVoicesRequest( - ) - - # Make the request - response = await client.list_voices(request=request) - - # Handle the response - print(response) - - Args: - request (Optional[Union[google.cloud.texttospeech_v1.types.ListVoicesRequest, dict]]): - The request object. The top-level message sent by the client for the - ``ListVoices`` method. - language_code (:class:`str`): - Optional. Recommended. - `BCP-47 `__ - language tag. If not specified, the API will return all - supported voices. If specified, the ListVoices call will - only return voices that can be used to synthesize this - language_code. For example, if you specify ``"en-NZ"``, - all ``"en-NZ"`` voices will be returned. If you specify - ``"no"``, both ``"no-\*"`` (Norwegian) and ``"nb-\*"`` - (Norwegian Bokmal) voices will be returned. - - This corresponds to the ``language_code`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - google.cloud.texttospeech_v1.types.ListVoicesResponse: - The message returned to the client by the ListVoices - method. - - """ - # Create or coerce a protobuf request object. - # - Quick check: If we got a request object, we should *not* have - # gotten any keyword arguments that map to the request. - has_flattened_params = any([language_code]) - if request is not None and has_flattened_params: - raise ValueError("If the `request` argument is set, then none of " - "the individual field arguments should be set.") - - # - Use the request object if provided (there's no risk of modifying the input as - # there are no flattened fields), or create one. - if not isinstance(request, cloud_tts.ListVoicesRequest): - request = cloud_tts.ListVoicesRequest(request) - - # If we have keyword arguments corresponding to fields on the - # request, apply these. - if language_code is not None: - request.language_code = language_code - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._client._transport._wrapped_methods[self._client._transport.list_voices] - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Done; return the response. - return response - - async def synthesize_speech(self, - request: Optional[Union[cloud_tts.SynthesizeSpeechRequest, dict]] = None, - *, - input: Optional[cloud_tts.SynthesisInput] = None, - voice: Optional[cloud_tts.VoiceSelectionParams] = None, - audio_config: Optional[cloud_tts.AudioConfig] = None, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> cloud_tts.SynthesizeSpeechResponse: - r"""Synthesizes speech synchronously: receive results - after all text input has been processed. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1 - - async def sample_synthesize_speech(): - # Create a client - client = texttospeech_v1.TextToSpeechAsyncClient() - - # Initialize request argument(s) - input = texttospeech_v1.SynthesisInput() - input.text = "text_value" - - voice = texttospeech_v1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - audio_config = texttospeech_v1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - request = texttospeech_v1.SynthesizeSpeechRequest( - input=input, - voice=voice, - audio_config=audio_config, - ) - - # Make the request - response = await client.synthesize_speech(request=request) - - # Handle the response - print(response) - - Args: - request (Optional[Union[google.cloud.texttospeech_v1.types.SynthesizeSpeechRequest, dict]]): - The request object. The top-level message sent by the client for the - ``SynthesizeSpeech`` method. - input (:class:`google.cloud.texttospeech_v1.types.SynthesisInput`): - Required. The Synthesizer requires - either plain text or SSML as input. - - This corresponds to the ``input`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - voice (:class:`google.cloud.texttospeech_v1.types.VoiceSelectionParams`): - Required. The desired voice of the - synthesized audio. - - This corresponds to the ``voice`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - audio_config (:class:`google.cloud.texttospeech_v1.types.AudioConfig`): - Required. The configuration of the - synthesized audio. - - This corresponds to the ``audio_config`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - google.cloud.texttospeech_v1.types.SynthesizeSpeechResponse: - The message returned to the client by the - SynthesizeSpeech method. - - """ - # Create or coerce a protobuf request object. - # - Quick check: If we got a request object, we should *not* have - # gotten any keyword arguments that map to the request. - has_flattened_params = any([input, voice, audio_config]) - if request is not None and has_flattened_params: - raise ValueError("If the `request` argument is set, then none of " - "the individual field arguments should be set.") - - # - Use the request object if provided (there's no risk of modifying the input as - # there are no flattened fields), or create one. - if not isinstance(request, cloud_tts.SynthesizeSpeechRequest): - request = cloud_tts.SynthesizeSpeechRequest(request) - - # If we have keyword arguments corresponding to fields on the - # request, apply these. - if input is not None: - request.input = input - if voice is not None: - request.voice = voice - if audio_config is not None: - request.audio_config = audio_config - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._client._transport._wrapped_methods[self._client._transport.synthesize_speech] - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Done; return the response. - return response - - def streaming_synthesize(self, - requests: Optional[AsyncIterator[cloud_tts.StreamingSynthesizeRequest]] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> Awaitable[AsyncIterable[cloud_tts.StreamingSynthesizeResponse]]: - r"""Performs bidirectional streaming speech synthesis: - receive audio while sending text. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1 - - async def sample_streaming_synthesize(): - # Create a client - client = texttospeech_v1.TextToSpeechAsyncClient() - - # Initialize request argument(s) - streaming_config = texttospeech_v1.StreamingSynthesizeConfig() - streaming_config.voice.language_code = "language_code_value" - - request = texttospeech_v1.StreamingSynthesizeRequest( - streaming_config=streaming_config, - ) - - # This method expects an iterator which contains - # 'texttospeech_v1.StreamingSynthesizeRequest' objects - # Here we create a generator that yields a single `request` for - # demonstrative purposes. - requests = [request] - - def request_generator(): - for request in requests: - yield request - - # Make the request - stream = await client.streaming_synthesize(requests=request_generator()) - - # Handle the response - async for response in stream: - print(response) - - Args: - requests (AsyncIterator[`google.cloud.texttospeech_v1.types.StreamingSynthesizeRequest`]): - The request object AsyncIterator. Request message for the ``StreamingSynthesize`` method. - Multiple ``StreamingSynthesizeRequest`` messages are - sent in one call. The first message must contain a - ``streaming_config`` that fully specifies the request - configuration and must not contain ``input``. All - subsequent messages must only have ``input`` set. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - AsyncIterable[google.cloud.texttospeech_v1.types.StreamingSynthesizeResponse]: - StreamingSynthesizeResponse is the only message returned to the - client by StreamingSynthesize method. A series of - zero or more StreamingSynthesizeResponse messages are - streamed back to the client. - - """ - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._client._transport._wrapped_methods[self._client._transport.streaming_synthesize] - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = rpc( - requests, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Done; return the response. - return response - - async def list_operations( - self, - request: Optional[operations_pb2.ListOperationsRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.ListOperationsResponse: - r"""Lists operations that match the specified filter in the request. - - Args: - request (:class:`~.operations_pb2.ListOperationsRequest`): - The request object. Request message for - `ListOperations` method. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.ListOperationsResponse: - Response message for ``ListOperations`` method. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.ListOperationsRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self.transport._wrapped_methods[self._client._transport.list_operations] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - async def get_operation( - self, - request: Optional[operations_pb2.GetOperationRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.Operation: - r"""Gets the latest state of a long-running operation. - - Args: - request (:class:`~.operations_pb2.GetOperationRequest`): - The request object. Request message for - `GetOperation` method. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.Operation: - An ``Operation`` object. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.GetOperationRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self.transport._wrapped_methods[self._client._transport.get_operation] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - async def __aenter__(self) -> "TextToSpeechAsyncClient": - return self - - async def __aexit__(self, exc_type, exc, tb): - await self.transport.close() - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) - - -__all__ = ( - "TextToSpeechAsyncClient", -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/client.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/client.py deleted file mode 100644 index 287906098e25..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/client.py +++ /dev/null @@ -1,1017 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from collections import OrderedDict -import os -import re -from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Iterable, Iterator, Sequence, Tuple, Type, Union, cast -import warnings - -from google.cloud.texttospeech_v1 import gapic_version as package_version - -from google.api_core import client_options as client_options_lib -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import retry as retries -from google.auth import credentials as ga_credentials # type: ignore -from google.auth.transport import mtls # type: ignore -from google.auth.transport.grpc import SslCredentials # type: ignore -from google.auth.exceptions import MutualTLSChannelError # type: ignore -from google.oauth2 import service_account # type: ignore - -try: - OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] -except AttributeError: # pragma: NO COVER - OptionalRetry = Union[retries.Retry, object, None] # type: ignore - -from google.cloud.texttospeech_v1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore -from .transports.base import TextToSpeechTransport, DEFAULT_CLIENT_INFO -from .transports.grpc import TextToSpeechGrpcTransport -from .transports.grpc_asyncio import TextToSpeechGrpcAsyncIOTransport -from .transports.rest import TextToSpeechRestTransport - - -class TextToSpeechClientMeta(type): - """Metaclass for the TextToSpeech client. - - This provides class-level methods for building and retrieving - support objects (e.g. transport) without polluting the client instance - objects. - """ - _transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechTransport]] - _transport_registry["grpc"] = TextToSpeechGrpcTransport - _transport_registry["grpc_asyncio"] = TextToSpeechGrpcAsyncIOTransport - _transport_registry["rest"] = TextToSpeechRestTransport - - def get_transport_class(cls, - label: Optional[str] = None, - ) -> Type[TextToSpeechTransport]: - """Returns an appropriate transport class. - - Args: - label: The name of the desired transport. If none is - provided, then the first transport in the registry is used. - - Returns: - The transport class to use. - """ - # If a specific transport is requested, return that one. - if label: - return cls._transport_registry[label] - - # No transport is requested; return the default (that is, the first one - # in the dictionary). - return next(iter(cls._transport_registry.values())) - - -class TextToSpeechClient(metaclass=TextToSpeechClientMeta): - """Service that implements Google Cloud Text-to-Speech API.""" - - @staticmethod - def _get_default_mtls_endpoint(api_endpoint): - """Converts api endpoint to mTLS endpoint. - - Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to - "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively. - Args: - api_endpoint (Optional[str]): the api endpoint to convert. - Returns: - str: converted mTLS api endpoint. - """ - if not api_endpoint: - return api_endpoint - - mtls_endpoint_re = re.compile( - r"(?P[^.]+)(?P\.mtls)?(?P\.sandbox)?(?P\.googleapis\.com)?" - ) - - m = mtls_endpoint_re.match(api_endpoint) - name, mtls, sandbox, googledomain = m.groups() - if mtls or not googledomain: - return api_endpoint - - if sandbox: - return api_endpoint.replace( - "sandbox.googleapis.com", "mtls.sandbox.googleapis.com" - ) - - return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com") - - # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. - DEFAULT_ENDPOINT = "texttospeech.googleapis.com" - DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore - DEFAULT_ENDPOINT - ) - - _DEFAULT_ENDPOINT_TEMPLATE = "texttospeech.{UNIVERSE_DOMAIN}" - _DEFAULT_UNIVERSE = "googleapis.com" - - @classmethod - def from_service_account_info(cls, info: dict, *args, **kwargs): - """Creates an instance of this client using the provided credentials - info. - - Args: - info (dict): The service account private key info. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechClient: The constructed client. - """ - credentials = service_account.Credentials.from_service_account_info(info) - kwargs["credentials"] = credentials - return cls(*args, **kwargs) - - @classmethod - def from_service_account_file(cls, filename: str, *args, **kwargs): - """Creates an instance of this client using the provided credentials - file. - - Args: - filename (str): The path to the service account private key json - file. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechClient: The constructed client. - """ - credentials = service_account.Credentials.from_service_account_file( - filename) - kwargs["credentials"] = credentials - return cls(*args, **kwargs) - - from_service_account_json = from_service_account_file - - @property - def transport(self) -> TextToSpeechTransport: - """Returns the transport used by the client instance. - - Returns: - TextToSpeechTransport: The transport used by the client - instance. - """ - return self._transport - - @staticmethod - def model_path(project: str,location: str,model: str,) -> str: - """Returns a fully-qualified model string.""" - return "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) - - @staticmethod - def parse_model_path(path: str) -> Dict[str,str]: - """Parses a model path into its component segments.""" - m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)/models/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_billing_account_path(billing_account: str, ) -> str: - """Returns a fully-qualified billing_account string.""" - return "billingAccounts/{billing_account}".format(billing_account=billing_account, ) - - @staticmethod - def parse_common_billing_account_path(path: str) -> Dict[str,str]: - """Parse a billing_account path into its component segments.""" - m = re.match(r"^billingAccounts/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_folder_path(folder: str, ) -> str: - """Returns a fully-qualified folder string.""" - return "folders/{folder}".format(folder=folder, ) - - @staticmethod - def parse_common_folder_path(path: str) -> Dict[str,str]: - """Parse a folder path into its component segments.""" - m = re.match(r"^folders/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_organization_path(organization: str, ) -> str: - """Returns a fully-qualified organization string.""" - return "organizations/{organization}".format(organization=organization, ) - - @staticmethod - def parse_common_organization_path(path: str) -> Dict[str,str]: - """Parse a organization path into its component segments.""" - m = re.match(r"^organizations/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_project_path(project: str, ) -> str: - """Returns a fully-qualified project string.""" - return "projects/{project}".format(project=project, ) - - @staticmethod - def parse_common_project_path(path: str) -> Dict[str,str]: - """Parse a project path into its component segments.""" - m = re.match(r"^projects/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_location_path(project: str, location: str, ) -> str: - """Returns a fully-qualified location string.""" - return "projects/{project}/locations/{location}".format(project=project, location=location, ) - - @staticmethod - def parse_common_location_path(path: str) -> Dict[str,str]: - """Parse a location path into its component segments.""" - m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path) - return m.groupdict() if m else {} - - @classmethod - def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[client_options_lib.ClientOptions] = None): - """Deprecated. Return the API endpoint and client cert source for mutual TLS. - - The client cert source is determined in the following order: - (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the - client cert source is None. - (2) if `client_options.client_cert_source` is provided, use the provided one; if the - default client cert source exists, use the default one; otherwise the client cert - source is None. - - The API endpoint is determined in the following order: - (1) if `client_options.api_endpoint` if provided, use the provided one. - (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the - default mTLS endpoint; if the environment variable is "never", use the default API - endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise - use the default API endpoint. - - More details can be found at https://google.aip.dev/auth/4114. - - Args: - client_options (google.api_core.client_options.ClientOptions): Custom options for the - client. Only the `api_endpoint` and `client_cert_source` properties may be used - in this method. - - Returns: - Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the - client cert source to use. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If any errors happen. - """ - - warnings.warn("get_mtls_endpoint_and_cert_source is deprecated. Use the api_endpoint property instead.", - DeprecationWarning) - if client_options is None: - client_options = client_options_lib.ClientOptions() - use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") - use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") - if use_client_cert not in ("true", "false"): - raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") - if use_mtls_endpoint not in ("auto", "never", "always"): - raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") - - # Figure out the client cert source to use. - client_cert_source = None - if use_client_cert == "true": - if client_options.client_cert_source: - client_cert_source = client_options.client_cert_source - elif mtls.has_default_client_cert_source(): - client_cert_source = mtls.default_client_cert_source() - - # Figure out which api endpoint to use. - if client_options.api_endpoint is not None: - api_endpoint = client_options.api_endpoint - elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): - api_endpoint = cls.DEFAULT_MTLS_ENDPOINT - else: - api_endpoint = cls.DEFAULT_ENDPOINT - - return api_endpoint, client_cert_source - - @staticmethod - def _read_environment_variables(): - """Returns the environment variables used by the client. - - Returns: - Tuple[bool, str, str]: returns the GOOGLE_API_USE_CLIENT_CERTIFICATE, - GOOGLE_API_USE_MTLS_ENDPOINT, and GOOGLE_CLOUD_UNIVERSE_DOMAIN environment variables. - - Raises: - ValueError: If GOOGLE_API_USE_CLIENT_CERTIFICATE is not - any of ["true", "false"]. - google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT - is not any of ["auto", "never", "always"]. - """ - use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false").lower() - use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower() - universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN") - if use_client_cert not in ("true", "false"): - raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") - if use_mtls_endpoint not in ("auto", "never", "always"): - raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") - return use_client_cert == "true", use_mtls_endpoint, universe_domain_env - - @staticmethod - def _get_client_cert_source(provided_cert_source, use_cert_flag): - """Return the client cert source to be used by the client. - - Args: - provided_cert_source (bytes): The client certificate source provided. - use_cert_flag (bool): A flag indicating whether to use the client certificate. - - Returns: - bytes or None: The client cert source to be used by the client. - """ - client_cert_source = None - if use_cert_flag: - if provided_cert_source: - client_cert_source = provided_cert_source - elif mtls.has_default_client_cert_source(): - client_cert_source = mtls.default_client_cert_source() - return client_cert_source - - @staticmethod - def _get_api_endpoint(api_override, client_cert_source, universe_domain, use_mtls_endpoint): - """Return the API endpoint used by the client. - - Args: - api_override (str): The API endpoint override. If specified, this is always - the return value of this function and the other arguments are not used. - client_cert_source (bytes): The client certificate source used by the client. - universe_domain (str): The universe domain used by the client. - use_mtls_endpoint (str): How to use the mTLS endpoint, which depends also on the other parameters. - Possible values are "always", "auto", or "never". - - Returns: - str: The API endpoint to be used by the client. - """ - if api_override is not None: - api_endpoint = api_override - elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): - _default_universe = TextToSpeechClient._DEFAULT_UNIVERSE - if universe_domain != _default_universe: - raise MutualTLSChannelError(f"mTLS is not supported in any universe other than {_default_universe}.") - api_endpoint = TextToSpeechClient.DEFAULT_MTLS_ENDPOINT - else: - api_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=universe_domain) - return api_endpoint - - @staticmethod - def _get_universe_domain(client_universe_domain: Optional[str], universe_domain_env: Optional[str]) -> str: - """Return the universe domain used by the client. - - Args: - client_universe_domain (Optional[str]): The universe domain configured via the client options. - universe_domain_env (Optional[str]): The universe domain configured via the "GOOGLE_CLOUD_UNIVERSE_DOMAIN" environment variable. - - Returns: - str: The universe domain to be used by the client. - - Raises: - ValueError: If the universe domain is an empty string. - """ - universe_domain = TextToSpeechClient._DEFAULT_UNIVERSE - if client_universe_domain is not None: - universe_domain = client_universe_domain - elif universe_domain_env is not None: - universe_domain = universe_domain_env - if len(universe_domain.strip()) == 0: - raise ValueError("Universe Domain cannot be an empty string.") - return universe_domain - - @staticmethod - def _compare_universes(client_universe: str, - credentials: ga_credentials.Credentials) -> bool: - """Returns True iff the universe domains used by the client and credentials match. - - Args: - client_universe (str): The universe domain configured via the client options. - credentials (ga_credentials.Credentials): The credentials being used in the client. - - Returns: - bool: True iff client_universe matches the universe in credentials. - - Raises: - ValueError: when client_universe does not match the universe in credentials. - """ - - default_universe = TextToSpeechClient._DEFAULT_UNIVERSE - credentials_universe = getattr(credentials, "universe_domain", default_universe) - - if client_universe != credentials_universe: - raise ValueError("The configured universe domain " - f"({client_universe}) does not match the universe domain " - f"found in the credentials ({credentials_universe}). " - "If you haven't configured the universe domain explicitly, " - f"`{default_universe}` is the default.") - return True - - def _validate_universe_domain(self): - """Validates client's and credentials' universe domains are consistent. - - Returns: - bool: True iff the configured universe domain is valid. - - Raises: - ValueError: If the configured universe domain is not valid. - """ - self._is_universe_domain_valid = (self._is_universe_domain_valid or - TextToSpeechClient._compare_universes(self.universe_domain, self.transport._credentials)) - return self._is_universe_domain_valid - - @property - def api_endpoint(self): - """Return the API endpoint used by the client instance. - - Returns: - str: The API endpoint used by the client instance. - """ - return self._api_endpoint - - @property - def universe_domain(self) -> str: - """Return the universe domain used by the client instance. - - Returns: - str: The universe domain used by the client instance. - """ - return self._universe_domain - - def __init__(self, *, - credentials: Optional[ga_credentials.Credentials] = None, - transport: Optional[Union[str, TextToSpeechTransport, Callable[..., TextToSpeechTransport]]] = None, - client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - ) -> None: - """Instantiates the text to speech client. - - Args: - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - transport (Optional[Union[str,TextToSpeechTransport,Callable[..., TextToSpeechTransport]]]): - The transport to use, or a Callable that constructs and returns a new transport. - If a Callable is given, it will be called with the same set of initialization - arguments as used in the TextToSpeechTransport constructor. - If set to None, a transport is chosen automatically. - NOTE: "rest" transport functionality is currently in a - beta state (preview). We welcome your feedback via an - issue in this library's source repository. - client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): - Custom options for the client. - - 1. The ``api_endpoint`` property can be used to override the - default endpoint provided by the client when ``transport`` is - not explicitly provided. Only if this property is not set and - ``transport`` was not explicitly provided, the endpoint is - determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment - variable, which have one of the following values: - "always" (always use the default mTLS endpoint), "never" (always - use the default regular endpoint) and "auto" (auto-switch to the - default mTLS endpoint if client certificate is present; this is - the default value). - - 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable - is "true", then the ``client_cert_source`` property can be used - to provide a client certificate for mTLS transport. If - not provided, the default SSL client certificate will be used if - present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not - set, no client certificate will be used. - - 3. The ``universe_domain`` property can be used to override the - default "googleapis.com" universe. Note that the ``api_endpoint`` - property still takes precedence; and ``universe_domain`` is - currently not supported for mTLS. - - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport - creation failed for any reason. - """ - self._client_options = client_options - if isinstance(self._client_options, dict): - self._client_options = client_options_lib.from_dict(self._client_options) - if self._client_options is None: - self._client_options = client_options_lib.ClientOptions() - self._client_options = cast(client_options_lib.ClientOptions, self._client_options) - - universe_domain_opt = getattr(self._client_options, 'universe_domain', None) - - self._use_client_cert, self._use_mtls_endpoint, self._universe_domain_env = TextToSpeechClient._read_environment_variables() - self._client_cert_source = TextToSpeechClient._get_client_cert_source(self._client_options.client_cert_source, self._use_client_cert) - self._universe_domain = TextToSpeechClient._get_universe_domain(universe_domain_opt, self._universe_domain_env) - self._api_endpoint = None # updated below, depending on `transport` - - # Initialize the universe domain validation. - self._is_universe_domain_valid = False - - api_key_value = getattr(self._client_options, "api_key", None) - if api_key_value and credentials: - raise ValueError("client_options.api_key and credentials are mutually exclusive") - - # Save or instantiate the transport. - # Ordinarily, we provide the transport, but allowing a custom transport - # instance provides an extensibility point for unusual situations. - transport_provided = isinstance(transport, TextToSpeechTransport) - if transport_provided: - # transport is a TextToSpeechTransport instance. - if credentials or self._client_options.credentials_file or api_key_value: - raise ValueError("When providing a transport instance, " - "provide its credentials directly.") - if self._client_options.scopes: - raise ValueError( - "When providing a transport instance, provide its scopes " - "directly." - ) - self._transport = cast(TextToSpeechTransport, transport) - self._api_endpoint = self._transport.host - - self._api_endpoint = (self._api_endpoint or - TextToSpeechClient._get_api_endpoint( - self._client_options.api_endpoint, - self._client_cert_source, - self._universe_domain, - self._use_mtls_endpoint)) - - if not transport_provided: - import google.auth._default # type: ignore - - if api_key_value and hasattr(google.auth._default, "get_api_key_credentials"): - credentials = google.auth._default.get_api_key_credentials(api_key_value) - - transport_init: Union[Type[TextToSpeechTransport], Callable[..., TextToSpeechTransport]] = ( - TextToSpeechClient.get_transport_class(transport) - if isinstance(transport, str) or transport is None - else cast(Callable[..., TextToSpeechTransport], transport) - ) - # initialize with the provided callable or the passed in class - self._transport = transport_init( - credentials=credentials, - credentials_file=self._client_options.credentials_file, - host=self._api_endpoint, - scopes=self._client_options.scopes, - client_cert_source_for_mtls=self._client_cert_source, - quota_project_id=self._client_options.quota_project_id, - client_info=client_info, - always_use_jwt_access=True, - api_audience=self._client_options.api_audience, - ) - - def list_voices(self, - request: Optional[Union[cloud_tts.ListVoicesRequest, dict]] = None, - *, - language_code: Optional[str] = None, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> cloud_tts.ListVoicesResponse: - r"""Returns a list of Voice supported for synthesis. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1 - - def sample_list_voices(): - # Create a client - client = texttospeech_v1.TextToSpeechClient() - - # Initialize request argument(s) - request = texttospeech_v1.ListVoicesRequest( - ) - - # Make the request - response = client.list_voices(request=request) - - # Handle the response - print(response) - - Args: - request (Union[google.cloud.texttospeech_v1.types.ListVoicesRequest, dict]): - The request object. The top-level message sent by the client for the - ``ListVoices`` method. - language_code (str): - Optional. Recommended. - `BCP-47 `__ - language tag. If not specified, the API will return all - supported voices. If specified, the ListVoices call will - only return voices that can be used to synthesize this - language_code. For example, if you specify ``"en-NZ"``, - all ``"en-NZ"`` voices will be returned. If you specify - ``"no"``, both ``"no-\*"`` (Norwegian) and ``"nb-\*"`` - (Norwegian Bokmal) voices will be returned. - - This corresponds to the ``language_code`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - google.cloud.texttospeech_v1.types.ListVoicesResponse: - The message returned to the client by the ListVoices - method. - - """ - # Create or coerce a protobuf request object. - # - Quick check: If we got a request object, we should *not* have - # gotten any keyword arguments that map to the request. - has_flattened_params = any([language_code]) - if request is not None and has_flattened_params: - raise ValueError('If the `request` argument is set, then none of ' - 'the individual field arguments should be set.') - - # - Use the request object if provided (there's no risk of modifying the input as - # there are no flattened fields), or create one. - if not isinstance(request, cloud_tts.ListVoicesRequest): - request = cloud_tts.ListVoicesRequest(request) - # If we have keyword arguments corresponding to fields on the - # request, apply these. - if language_code is not None: - request.language_code = language_code - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.list_voices] - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Done; return the response. - return response - - def synthesize_speech(self, - request: Optional[Union[cloud_tts.SynthesizeSpeechRequest, dict]] = None, - *, - input: Optional[cloud_tts.SynthesisInput] = None, - voice: Optional[cloud_tts.VoiceSelectionParams] = None, - audio_config: Optional[cloud_tts.AudioConfig] = None, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> cloud_tts.SynthesizeSpeechResponse: - r"""Synthesizes speech synchronously: receive results - after all text input has been processed. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1 - - def sample_synthesize_speech(): - # Create a client - client = texttospeech_v1.TextToSpeechClient() - - # Initialize request argument(s) - input = texttospeech_v1.SynthesisInput() - input.text = "text_value" - - voice = texttospeech_v1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - audio_config = texttospeech_v1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - request = texttospeech_v1.SynthesizeSpeechRequest( - input=input, - voice=voice, - audio_config=audio_config, - ) - - # Make the request - response = client.synthesize_speech(request=request) - - # Handle the response - print(response) - - Args: - request (Union[google.cloud.texttospeech_v1.types.SynthesizeSpeechRequest, dict]): - The request object. The top-level message sent by the client for the - ``SynthesizeSpeech`` method. - input (google.cloud.texttospeech_v1.types.SynthesisInput): - Required. The Synthesizer requires - either plain text or SSML as input. - - This corresponds to the ``input`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - voice (google.cloud.texttospeech_v1.types.VoiceSelectionParams): - Required. The desired voice of the - synthesized audio. - - This corresponds to the ``voice`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - audio_config (google.cloud.texttospeech_v1.types.AudioConfig): - Required. The configuration of the - synthesized audio. - - This corresponds to the ``audio_config`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - google.cloud.texttospeech_v1.types.SynthesizeSpeechResponse: - The message returned to the client by the - SynthesizeSpeech method. - - """ - # Create or coerce a protobuf request object. - # - Quick check: If we got a request object, we should *not* have - # gotten any keyword arguments that map to the request. - has_flattened_params = any([input, voice, audio_config]) - if request is not None and has_flattened_params: - raise ValueError('If the `request` argument is set, then none of ' - 'the individual field arguments should be set.') - - # - Use the request object if provided (there's no risk of modifying the input as - # there are no flattened fields), or create one. - if not isinstance(request, cloud_tts.SynthesizeSpeechRequest): - request = cloud_tts.SynthesizeSpeechRequest(request) - # If we have keyword arguments corresponding to fields on the - # request, apply these. - if input is not None: - request.input = input - if voice is not None: - request.voice = voice - if audio_config is not None: - request.audio_config = audio_config - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.synthesize_speech] - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Done; return the response. - return response - - def streaming_synthesize(self, - requests: Optional[Iterator[cloud_tts.StreamingSynthesizeRequest]] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> Iterable[cloud_tts.StreamingSynthesizeResponse]: - r"""Performs bidirectional streaming speech synthesis: - receive audio while sending text. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1 - - def sample_streaming_synthesize(): - # Create a client - client = texttospeech_v1.TextToSpeechClient() - - # Initialize request argument(s) - streaming_config = texttospeech_v1.StreamingSynthesizeConfig() - streaming_config.voice.language_code = "language_code_value" - - request = texttospeech_v1.StreamingSynthesizeRequest( - streaming_config=streaming_config, - ) - - # This method expects an iterator which contains - # 'texttospeech_v1.StreamingSynthesizeRequest' objects - # Here we create a generator that yields a single `request` for - # demonstrative purposes. - requests = [request] - - def request_generator(): - for request in requests: - yield request - - # Make the request - stream = client.streaming_synthesize(requests=request_generator()) - - # Handle the response - for response in stream: - print(response) - - Args: - requests (Iterator[google.cloud.texttospeech_v1.types.StreamingSynthesizeRequest]): - The request object iterator. Request message for the ``StreamingSynthesize`` method. - Multiple ``StreamingSynthesizeRequest`` messages are - sent in one call. The first message must contain a - ``streaming_config`` that fully specifies the request - configuration and must not contain ``input``. All - subsequent messages must only have ``input`` set. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - Iterable[google.cloud.texttospeech_v1.types.StreamingSynthesizeResponse]: - StreamingSynthesizeResponse is the only message returned to the - client by StreamingSynthesize method. A series of - zero or more StreamingSynthesizeResponse messages are - streamed back to the client. - - """ - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.streaming_synthesize] - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - requests, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Done; return the response. - return response - - def __enter__(self) -> "TextToSpeechClient": - return self - - def __exit__(self, type, value, traceback): - """Releases underlying transport's resources. - - .. warning:: - ONLY use as a context manager if the transport is NOT shared - with other clients! Exiting the with block will CLOSE the transport - and may cause errors in other clients! - """ - self.transport.close() - - def list_operations( - self, - request: Optional[operations_pb2.ListOperationsRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.ListOperationsResponse: - r"""Lists operations that match the specified filter in the request. - - Args: - request (:class:`~.operations_pb2.ListOperationsRequest`): - The request object. Request message for - `ListOperations` method. - retry (google.api_core.retry.Retry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.ListOperationsResponse: - Response message for ``ListOperations`` method. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.ListOperationsRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.list_operations] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - def get_operation( - self, - request: Optional[operations_pb2.GetOperationRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.Operation: - r"""Gets the latest state of a long-running operation. - - Args: - request (:class:`~.operations_pb2.GetOperationRequest`): - The request object. Request message for - `GetOperation` method. - retry (google.api_core.retry.Retry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.Operation: - An ``Operation`` object. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.GetOperationRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.get_operation] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - - - - - - - - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) - - -__all__ = ( - "TextToSpeechClient", -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/README.rst b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/README.rst deleted file mode 100644 index 37ce873b979b..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/README.rst +++ /dev/null @@ -1,9 +0,0 @@ - -transport inheritance structure -_______________________________ - -`TextToSpeechTransport` is the ABC for all transports. -- public child `TextToSpeechGrpcTransport` for sync gRPC transport (defined in `grpc.py`). -- public child `TextToSpeechGrpcAsyncIOTransport` for async gRPC transport (defined in `grpc_asyncio.py`). -- private child `_BaseTextToSpeechRestTransport` for base REST transport with inner classes `_BaseMETHOD` (defined in `rest_base.py`). -- public child `TextToSpeechRestTransport` for sync REST transport with inner classes `METHOD` derived from the parent's corresponding `_BaseMETHOD` classes (defined in `rest.py`). diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/__init__.py deleted file mode 100644 index 84d107252aae..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from collections import OrderedDict -from typing import Dict, Type - -from .base import TextToSpeechTransport -from .grpc import TextToSpeechGrpcTransport -from .grpc_asyncio import TextToSpeechGrpcAsyncIOTransport -from .rest import TextToSpeechRestTransport -from .rest import TextToSpeechRestInterceptor - - -# Compile a registry of transports. -_transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechTransport]] -_transport_registry['grpc'] = TextToSpeechGrpcTransport -_transport_registry['grpc_asyncio'] = TextToSpeechGrpcAsyncIOTransport -_transport_registry['rest'] = TextToSpeechRestTransport - -__all__ = ( - 'TextToSpeechTransport', - 'TextToSpeechGrpcTransport', - 'TextToSpeechGrpcAsyncIOTransport', - 'TextToSpeechRestTransport', - 'TextToSpeechRestInterceptor', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/base.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/base.py deleted file mode 100644 index f9387a118e4d..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/base.py +++ /dev/null @@ -1,211 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 abc -from typing import Awaitable, Callable, Dict, Optional, Sequence, Union - -from google.cloud.texttospeech_v1 import gapic_version as package_version - -import google.auth # type: ignore -import google.api_core -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import retry as retries -from google.auth import credentials as ga_credentials # type: ignore -from google.oauth2 import service_account # type: ignore - -from google.cloud.texttospeech_v1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) - - -class TextToSpeechTransport(abc.ABC): - """Abstract transport class for TextToSpeech.""" - - AUTH_SCOPES = ( - 'https://www.googleapis.com/auth/cloud-platform', - ) - - DEFAULT_HOST: str = 'texttospeech.googleapis.com' - def __init__( - self, *, - host: str = DEFAULT_HOST, - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - api_audience: Optional[str] = None, - **kwargs, - ) -> None: - """Instantiate the transport. - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is mutually exclusive with credentials. - scopes (Optional[Sequence[str]]): A list of scopes. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - """ - - scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} - - # Save the scopes. - self._scopes = scopes - if not hasattr(self, "_ignore_credentials"): - self._ignore_credentials: bool = False - - # If no credentials are provided, then determine the appropriate - # defaults. - if credentials and credentials_file: - raise core_exceptions.DuplicateCredentialArgs("'credentials_file' and 'credentials' are mutually exclusive") - - if credentials_file is not None: - credentials, _ = google.auth.load_credentials_from_file( - credentials_file, - **scopes_kwargs, - quota_project_id=quota_project_id - ) - elif credentials is None and not self._ignore_credentials: - credentials, _ = google.auth.default(**scopes_kwargs, quota_project_id=quota_project_id) - # Don't apply audience if the credentials file passed from user. - if hasattr(credentials, "with_gdch_audience"): - credentials = credentials.with_gdch_audience(api_audience if api_audience else host) - - # If the credentials are service account credentials, then always try to use self signed JWT. - if always_use_jwt_access and isinstance(credentials, service_account.Credentials) and hasattr(service_account.Credentials, "with_always_use_jwt_access"): - credentials = credentials.with_always_use_jwt_access(True) - - # Save the credentials. - self._credentials = credentials - - # Save the hostname. Default to port 443 (HTTPS) if none is specified. - if ':' not in host: - host += ':443' - self._host = host - - @property - def host(self): - return self._host - - def _prep_wrapped_messages(self, client_info): - # Precompute the wrapped methods. - self._wrapped_methods = { - self.list_voices: gapic_v1.method.wrap_method( - self.list_voices, - default_timeout=None, - client_info=client_info, - ), - self.synthesize_speech: gapic_v1.method.wrap_method( - self.synthesize_speech, - default_timeout=None, - client_info=client_info, - ), - self.streaming_synthesize: gapic_v1.method.wrap_method( - self.streaming_synthesize, - default_timeout=None, - client_info=client_info, - ), - self.get_operation: gapic_v1.method.wrap_method( - self.get_operation, - default_timeout=None, - client_info=client_info, - ), - self.list_operations: gapic_v1.method.wrap_method( - self.list_operations, - default_timeout=None, - client_info=client_info, - ), - } - - def close(self): - """Closes resources associated with the transport. - - .. warning:: - Only call this method if the transport is NOT shared - with other clients - this may cause errors in other clients! - """ - raise NotImplementedError() - - @property - def list_voices(self) -> Callable[ - [cloud_tts.ListVoicesRequest], - Union[ - cloud_tts.ListVoicesResponse, - Awaitable[cloud_tts.ListVoicesResponse] - ]]: - raise NotImplementedError() - - @property - def synthesize_speech(self) -> Callable[ - [cloud_tts.SynthesizeSpeechRequest], - Union[ - cloud_tts.SynthesizeSpeechResponse, - Awaitable[cloud_tts.SynthesizeSpeechResponse] - ]]: - raise NotImplementedError() - - @property - def streaming_synthesize(self) -> Callable[ - [cloud_tts.StreamingSynthesizeRequest], - Union[ - cloud_tts.StreamingSynthesizeResponse, - Awaitable[cloud_tts.StreamingSynthesizeResponse] - ]]: - raise NotImplementedError() - - @property - def list_operations( - self, - ) -> Callable[ - [operations_pb2.ListOperationsRequest], - Union[operations_pb2.ListOperationsResponse, Awaitable[operations_pb2.ListOperationsResponse]], - ]: - raise NotImplementedError() - - @property - def get_operation( - self, - ) -> Callable[ - [operations_pb2.GetOperationRequest], - Union[operations_pb2.Operation, Awaitable[operations_pb2.Operation]], - ]: - raise NotImplementedError() - - @property - def kind(self) -> str: - raise NotImplementedError() - - -__all__ = ( - 'TextToSpeechTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc.py deleted file mode 100644 index 125165f8ff9a..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc.py +++ /dev/null @@ -1,361 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 warnings -from typing import Callable, Dict, Optional, Sequence, Tuple, Union - -from google.api_core import grpc_helpers -from google.api_core import gapic_v1 -import google.auth # type: ignore -from google.auth import credentials as ga_credentials # type: ignore -from google.auth.transport.grpc import SslCredentials # type: ignore - -import grpc # type: ignore - -from google.cloud.texttospeech_v1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore -from .base import TextToSpeechTransport, DEFAULT_CLIENT_INFO - - -class TextToSpeechGrpcTransport(TextToSpeechTransport): - """gRPC backend transport for TextToSpeech. - - Service that implements Google Cloud Text-to-Speech API. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends protocol buffers over the wire using gRPC (which is built on - top of HTTP/2); the ``grpcio`` package must be installed. - """ - _stubs: Dict[str, Callable] - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - channel: Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]] = None, - api_mtls_endpoint: Optional[str] = None, - client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, - client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - This argument is ignored if a ``channel`` instance is provided. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is ignored if a ``channel`` instance is provided. - scopes (Optional(Sequence[str])): A list of scopes. This argument is - ignored if a ``channel`` instance is provided. - channel (Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]]): - A ``Channel`` instance through which to make calls, or a Callable - that constructs and returns one. If set to None, ``self.create_channel`` - is used to create the channel. If a Callable is given, it will be called - with the same arguments as used in ``self.create_channel``. - api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. - If provided, it overrides the ``host`` argument and tries to create - a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or application default SSL credentials. - client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): - Deprecated. A callback to provide client SSL certificate bytes and - private key bytes, both in PEM format. It is ignored if - ``api_mtls_endpoint`` is None. - ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for the grpc channel. It is ignored if a ``channel`` instance is provided. - client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): - A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure a mutual TLS channel. It is - ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport - creation failed for any reason. - google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` - and ``credentials_file`` are passed. - """ - self._grpc_channel = None - self._ssl_channel_credentials = ssl_channel_credentials - self._stubs: Dict[str, Callable] = {} - - if api_mtls_endpoint: - warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) - if client_cert_source: - warnings.warn("client_cert_source is deprecated", DeprecationWarning) - - if isinstance(channel, grpc.Channel): - # Ignore credentials if a channel was passed. - credentials = None - self._ignore_credentials = True - # If a channel was explicitly provided, set it. - self._grpc_channel = channel - self._ssl_channel_credentials = None - - else: - if api_mtls_endpoint: - host = api_mtls_endpoint - - # Create SSL credentials with client_cert_source or application - # default SSL credentials. - if client_cert_source: - cert, key = client_cert_source() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - else: - self._ssl_channel_credentials = SslCredentials().ssl_credentials - - else: - if client_cert_source_for_mtls and not ssl_channel_credentials: - cert, key = client_cert_source_for_mtls() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - - # The base transport sets the host, credentials and scopes - super().__init__( - host=host, - credentials=credentials, - credentials_file=credentials_file, - scopes=scopes, - quota_project_id=quota_project_id, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - api_audience=api_audience, - ) - - if not self._grpc_channel: - # initialize with the provided callable or the default channel - channel_init = channel or type(self).create_channel - self._grpc_channel = channel_init( - self._host, - # use the credentials which are saved - credentials=self._credentials, - # Set ``credentials_file`` to ``None`` here as - # the credentials that we saved earlier should be used. - credentials_file=None, - scopes=self._scopes, - ssl_credentials=self._ssl_channel_credentials, - quota_project_id=quota_project_id, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - # Wrap messages. This must be done after self._grpc_channel exists - self._prep_wrapped_messages(client_info) - - @classmethod - def create_channel(cls, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - quota_project_id: Optional[str] = None, - **kwargs) -> grpc.Channel: - """Create and return a gRPC channel object. - Args: - host (Optional[str]): The host for the channel to use. - credentials (Optional[~.Credentials]): The - authorization credentials to attach to requests. These - credentials identify this application to the service. If - none are specified, the client will attempt to ascertain - the credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is mutually exclusive with credentials. - scopes (Optional[Sequence[str]]): A optional list of scopes needed for this - service. These are only used when credentials are not specified and - are passed to :func:`google.auth.default`. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - kwargs (Optional[dict]): Keyword arguments, which are passed to the - channel creation. - Returns: - grpc.Channel: A gRPC channel object. - - Raises: - google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` - and ``credentials_file`` are passed. - """ - - return grpc_helpers.create_channel( - host, - credentials=credentials, - credentials_file=credentials_file, - quota_project_id=quota_project_id, - default_scopes=cls.AUTH_SCOPES, - scopes=scopes, - default_host=cls.DEFAULT_HOST, - **kwargs - ) - - @property - def grpc_channel(self) -> grpc.Channel: - """Return the channel designed to connect to this service. - """ - return self._grpc_channel - - @property - def list_voices(self) -> Callable[ - [cloud_tts.ListVoicesRequest], - cloud_tts.ListVoicesResponse]: - r"""Return a callable for the list voices method over gRPC. - - Returns a list of Voice supported for synthesis. - - Returns: - Callable[[~.ListVoicesRequest], - ~.ListVoicesResponse]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'list_voices' not in self._stubs: - self._stubs['list_voices'] = self.grpc_channel.unary_unary( - '/google.cloud.texttospeech.v1.TextToSpeech/ListVoices', - request_serializer=cloud_tts.ListVoicesRequest.serialize, - response_deserializer=cloud_tts.ListVoicesResponse.deserialize, - ) - return self._stubs['list_voices'] - - @property - def synthesize_speech(self) -> Callable[ - [cloud_tts.SynthesizeSpeechRequest], - cloud_tts.SynthesizeSpeechResponse]: - r"""Return a callable for the synthesize speech method over gRPC. - - Synthesizes speech synchronously: receive results - after all text input has been processed. - - Returns: - Callable[[~.SynthesizeSpeechRequest], - ~.SynthesizeSpeechResponse]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'synthesize_speech' not in self._stubs: - self._stubs['synthesize_speech'] = self.grpc_channel.unary_unary( - '/google.cloud.texttospeech.v1.TextToSpeech/SynthesizeSpeech', - request_serializer=cloud_tts.SynthesizeSpeechRequest.serialize, - response_deserializer=cloud_tts.SynthesizeSpeechResponse.deserialize, - ) - return self._stubs['synthesize_speech'] - - @property - def streaming_synthesize(self) -> Callable[ - [cloud_tts.StreamingSynthesizeRequest], - cloud_tts.StreamingSynthesizeResponse]: - r"""Return a callable for the streaming synthesize method over gRPC. - - Performs bidirectional streaming speech synthesis: - receive audio while sending text. - - Returns: - Callable[[~.StreamingSynthesizeRequest], - ~.StreamingSynthesizeResponse]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'streaming_synthesize' not in self._stubs: - self._stubs['streaming_synthesize'] = self.grpc_channel.stream_stream( - '/google.cloud.texttospeech.v1.TextToSpeech/StreamingSynthesize', - request_serializer=cloud_tts.StreamingSynthesizeRequest.serialize, - response_deserializer=cloud_tts.StreamingSynthesizeResponse.deserialize, - ) - return self._stubs['streaming_synthesize'] - - def close(self): - self.grpc_channel.close() - - @property - def get_operation( - self, - ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: - r"""Return a callable for the get_operation method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "get_operation" not in self._stubs: - self._stubs["get_operation"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/GetOperation", - request_serializer=operations_pb2.GetOperationRequest.SerializeToString, - response_deserializer=operations_pb2.Operation.FromString, - ) - return self._stubs["get_operation"] - - @property - def list_operations( - self, - ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: - r"""Return a callable for the list_operations method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "list_operations" not in self._stubs: - self._stubs["list_operations"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/ListOperations", - request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, - response_deserializer=operations_pb2.ListOperationsResponse.FromString, - ) - return self._stubs["list_operations"] - - @property - def kind(self) -> str: - return "grpc" - - -__all__ = ( - 'TextToSpeechGrpcTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc_asyncio.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc_asyncio.py deleted file mode 100644 index 86d190bff1a2..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/grpc_asyncio.py +++ /dev/null @@ -1,402 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 inspect -import warnings -from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union - -from google.api_core import gapic_v1 -from google.api_core import grpc_helpers_async -from google.api_core import exceptions as core_exceptions -from google.api_core import retry_async as retries -from google.auth import credentials as ga_credentials # type: ignore -from google.auth.transport.grpc import SslCredentials # type: ignore - -import grpc # type: ignore -from grpc.experimental import aio # type: ignore - -from google.cloud.texttospeech_v1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore -from .base import TextToSpeechTransport, DEFAULT_CLIENT_INFO -from .grpc import TextToSpeechGrpcTransport - - -class TextToSpeechGrpcAsyncIOTransport(TextToSpeechTransport): - """gRPC AsyncIO backend transport for TextToSpeech. - - Service that implements Google Cloud Text-to-Speech API. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends protocol buffers over the wire using gRPC (which is built on - top of HTTP/2); the ``grpcio`` package must be installed. - """ - - _grpc_channel: aio.Channel - _stubs: Dict[str, Callable] = {} - - @classmethod - def create_channel(cls, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - quota_project_id: Optional[str] = None, - **kwargs) -> aio.Channel: - """Create and return a gRPC AsyncIO channel object. - Args: - host (Optional[str]): The host for the channel to use. - credentials (Optional[~.Credentials]): The - authorization credentials to attach to requests. These - credentials identify this application to the service. If - none are specified, the client will attempt to ascertain - the credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - scopes (Optional[Sequence[str]]): A optional list of scopes needed for this - service. These are only used when credentials are not specified and - are passed to :func:`google.auth.default`. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - kwargs (Optional[dict]): Keyword arguments, which are passed to the - channel creation. - Returns: - aio.Channel: A gRPC AsyncIO channel object. - """ - - return grpc_helpers_async.create_channel( - host, - credentials=credentials, - credentials_file=credentials_file, - quota_project_id=quota_project_id, - default_scopes=cls.AUTH_SCOPES, - scopes=scopes, - default_host=cls.DEFAULT_HOST, - **kwargs - ) - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - channel: Optional[Union[aio.Channel, Callable[..., aio.Channel]]] = None, - api_mtls_endpoint: Optional[str] = None, - client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, - client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - This argument is ignored if a ``channel`` instance is provided. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is ignored if a ``channel`` instance is provided. - scopes (Optional[Sequence[str]]): A optional list of scopes needed for this - service. These are only used when credentials are not specified and - are passed to :func:`google.auth.default`. - channel (Optional[Union[aio.Channel, Callable[..., aio.Channel]]]): - A ``Channel`` instance through which to make calls, or a Callable - that constructs and returns one. If set to None, ``self.create_channel`` - is used to create the channel. If a Callable is given, it will be called - with the same arguments as used in ``self.create_channel``. - api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. - If provided, it overrides the ``host`` argument and tries to create - a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or application default SSL credentials. - client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): - Deprecated. A callback to provide client SSL certificate bytes and - private key bytes, both in PEM format. It is ignored if - ``api_mtls_endpoint`` is None. - ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for the grpc channel. It is ignored if a ``channel`` instance is provided. - client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): - A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure a mutual TLS channel. It is - ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - - Raises: - google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport - creation failed for any reason. - google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` - and ``credentials_file`` are passed. - """ - self._grpc_channel = None - self._ssl_channel_credentials = ssl_channel_credentials - self._stubs: Dict[str, Callable] = {} - - if api_mtls_endpoint: - warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) - if client_cert_source: - warnings.warn("client_cert_source is deprecated", DeprecationWarning) - - if isinstance(channel, aio.Channel): - # Ignore credentials if a channel was passed. - credentials = None - self._ignore_credentials = True - # If a channel was explicitly provided, set it. - self._grpc_channel = channel - self._ssl_channel_credentials = None - else: - if api_mtls_endpoint: - host = api_mtls_endpoint - - # Create SSL credentials with client_cert_source or application - # default SSL credentials. - if client_cert_source: - cert, key = client_cert_source() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - else: - self._ssl_channel_credentials = SslCredentials().ssl_credentials - - else: - if client_cert_source_for_mtls and not ssl_channel_credentials: - cert, key = client_cert_source_for_mtls() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - - # The base transport sets the host, credentials and scopes - super().__init__( - host=host, - credentials=credentials, - credentials_file=credentials_file, - scopes=scopes, - quota_project_id=quota_project_id, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - api_audience=api_audience, - ) - - if not self._grpc_channel: - # initialize with the provided callable or the default channel - channel_init = channel or type(self).create_channel - self._grpc_channel = channel_init( - self._host, - # use the credentials which are saved - credentials=self._credentials, - # Set ``credentials_file`` to ``None`` here as - # the credentials that we saved earlier should be used. - credentials_file=None, - scopes=self._scopes, - ssl_credentials=self._ssl_channel_credentials, - quota_project_id=quota_project_id, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - # Wrap messages. This must be done after self._grpc_channel exists - self._wrap_with_kind = "kind" in inspect.signature(gapic_v1.method_async.wrap_method).parameters - self._prep_wrapped_messages(client_info) - - @property - def grpc_channel(self) -> aio.Channel: - """Create the channel designed to connect to this service. - - This property caches on the instance; repeated calls return - the same channel. - """ - # Return the channel from cache. - return self._grpc_channel - - @property - def list_voices(self) -> Callable[ - [cloud_tts.ListVoicesRequest], - Awaitable[cloud_tts.ListVoicesResponse]]: - r"""Return a callable for the list voices method over gRPC. - - Returns a list of Voice supported for synthesis. - - Returns: - Callable[[~.ListVoicesRequest], - Awaitable[~.ListVoicesResponse]]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'list_voices' not in self._stubs: - self._stubs['list_voices'] = self.grpc_channel.unary_unary( - '/google.cloud.texttospeech.v1.TextToSpeech/ListVoices', - request_serializer=cloud_tts.ListVoicesRequest.serialize, - response_deserializer=cloud_tts.ListVoicesResponse.deserialize, - ) - return self._stubs['list_voices'] - - @property - def synthesize_speech(self) -> Callable[ - [cloud_tts.SynthesizeSpeechRequest], - Awaitable[cloud_tts.SynthesizeSpeechResponse]]: - r"""Return a callable for the synthesize speech method over gRPC. - - Synthesizes speech synchronously: receive results - after all text input has been processed. - - Returns: - Callable[[~.SynthesizeSpeechRequest], - Awaitable[~.SynthesizeSpeechResponse]]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'synthesize_speech' not in self._stubs: - self._stubs['synthesize_speech'] = self.grpc_channel.unary_unary( - '/google.cloud.texttospeech.v1.TextToSpeech/SynthesizeSpeech', - request_serializer=cloud_tts.SynthesizeSpeechRequest.serialize, - response_deserializer=cloud_tts.SynthesizeSpeechResponse.deserialize, - ) - return self._stubs['synthesize_speech'] - - @property - def streaming_synthesize(self) -> Callable[ - [cloud_tts.StreamingSynthesizeRequest], - Awaitable[cloud_tts.StreamingSynthesizeResponse]]: - r"""Return a callable for the streaming synthesize method over gRPC. - - Performs bidirectional streaming speech synthesis: - receive audio while sending text. - - Returns: - Callable[[~.StreamingSynthesizeRequest], - Awaitable[~.StreamingSynthesizeResponse]]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'streaming_synthesize' not in self._stubs: - self._stubs['streaming_synthesize'] = self.grpc_channel.stream_stream( - '/google.cloud.texttospeech.v1.TextToSpeech/StreamingSynthesize', - request_serializer=cloud_tts.StreamingSynthesizeRequest.serialize, - response_deserializer=cloud_tts.StreamingSynthesizeResponse.deserialize, - ) - return self._stubs['streaming_synthesize'] - - def _prep_wrapped_messages(self, client_info): - """ Precompute the wrapped methods, overriding the base class method to use async wrappers.""" - self._wrapped_methods = { - self.list_voices: self._wrap_method( - self.list_voices, - default_timeout=None, - client_info=client_info, - ), - self.synthesize_speech: self._wrap_method( - self.synthesize_speech, - default_timeout=None, - client_info=client_info, - ), - self.streaming_synthesize: self._wrap_method( - self.streaming_synthesize, - default_timeout=None, - client_info=client_info, - ), - self.get_operation: self._wrap_method( - self.get_operation, - default_timeout=None, - client_info=client_info, - ), - self.list_operations: self._wrap_method( - self.list_operations, - default_timeout=None, - client_info=client_info, - ), - } - - def _wrap_method(self, func, *args, **kwargs): - if self._wrap_with_kind: # pragma: NO COVER - kwargs["kind"] = self.kind - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - - def close(self): - return self.grpc_channel.close() - - @property - def kind(self) -> str: - return "grpc_asyncio" - - @property - def get_operation( - self, - ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: - r"""Return a callable for the get_operation method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "get_operation" not in self._stubs: - self._stubs["get_operation"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/GetOperation", - request_serializer=operations_pb2.GetOperationRequest.SerializeToString, - response_deserializer=operations_pb2.Operation.FromString, - ) - return self._stubs["get_operation"] - - @property - def list_operations( - self, - ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: - r"""Return a callable for the list_operations method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "list_operations" not in self._stubs: - self._stubs["list_operations"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/ListOperations", - request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, - response_deserializer=operations_pb2.ListOperationsResponse.FromString, - ) - return self._stubs["list_operations"] - - -__all__ = ( - 'TextToSpeechGrpcAsyncIOTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py deleted file mode 100644 index 102259de19e3..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py +++ /dev/null @@ -1,599 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# - -from google.auth.transport.requests import AuthorizedSession # type: ignore -import json # type: ignore -from google.auth import credentials as ga_credentials # type: ignore -from google.api_core import exceptions as core_exceptions -from google.api_core import retry as retries -from google.api_core import rest_helpers -from google.api_core import rest_streaming -from google.api_core import gapic_v1 - -from google.protobuf import json_format - -from requests import __version__ as requests_version -import dataclasses -from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union -import warnings - - -from google.cloud.texttospeech_v1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore - - -from .rest_base import _BaseTextToSpeechRestTransport -from .base import DEFAULT_CLIENT_INFO as BASE_DEFAULT_CLIENT_INFO - -try: - OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] -except AttributeError: # pragma: NO COVER - OptionalRetry = Union[retries.Retry, object, None] # type: ignore - - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, - grpc_version=None, - rest_version=f"requests@{requests_version}", -) - - -class TextToSpeechRestInterceptor: - """Interceptor for TextToSpeech. - - Interceptors are used to manipulate requests, request metadata, and responses - in arbitrary ways. - Example use cases include: - * Logging - * Verifying requests according to service or custom semantics - * Stripping extraneous information from responses - - These use cases and more can be enabled by injecting an - instance of a custom subclass when constructing the TextToSpeechRestTransport. - - .. code-block:: python - class MyCustomTextToSpeechInterceptor(TextToSpeechRestInterceptor): - def pre_list_voices(self, request, metadata): - logging.log(f"Received request: {request}") - return request, metadata - - def post_list_voices(self, response): - logging.log(f"Received response: {response}") - return response - - def pre_synthesize_speech(self, request, metadata): - logging.log(f"Received request: {request}") - return request, metadata - - def post_synthesize_speech(self, response): - logging.log(f"Received response: {response}") - return response - - transport = TextToSpeechRestTransport(interceptor=MyCustomTextToSpeechInterceptor()) - client = TextToSpeechClient(transport=transport) - - - """ - def pre_list_voices(self, request: cloud_tts.ListVoicesRequest, metadata: Sequence[Tuple[str, str]]) -> Tuple[cloud_tts.ListVoicesRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for list_voices - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeech server. - """ - return request, metadata - - def post_list_voices(self, response: cloud_tts.ListVoicesResponse) -> cloud_tts.ListVoicesResponse: - """Post-rpc interceptor for list_voices - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeech server but before - it is returned to user code. - """ - return response - - def pre_synthesize_speech(self, request: cloud_tts.SynthesizeSpeechRequest, metadata: Sequence[Tuple[str, str]]) -> Tuple[cloud_tts.SynthesizeSpeechRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for synthesize_speech - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeech server. - """ - return request, metadata - - def post_synthesize_speech(self, response: cloud_tts.SynthesizeSpeechResponse) -> cloud_tts.SynthesizeSpeechResponse: - """Post-rpc interceptor for synthesize_speech - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeech server but before - it is returned to user code. - """ - return response - - def pre_get_operation( - self, request: operations_pb2.GetOperationRequest, metadata: Sequence[Tuple[str, str]] - ) -> Tuple[operations_pb2.GetOperationRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for get_operation - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeech server. - """ - return request, metadata - - def post_get_operation( - self, response: operations_pb2.Operation - ) -> operations_pb2.Operation: - """Post-rpc interceptor for get_operation - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeech server but before - it is returned to user code. - """ - return response - - def pre_list_operations( - self, request: operations_pb2.ListOperationsRequest, metadata: Sequence[Tuple[str, str]] - ) -> Tuple[operations_pb2.ListOperationsRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for list_operations - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeech server. - """ - return request, metadata - - def post_list_operations( - self, response: operations_pb2.ListOperationsResponse - ) -> operations_pb2.ListOperationsResponse: - """Post-rpc interceptor for list_operations - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeech server but before - it is returned to user code. - """ - return response - - -@dataclasses.dataclass -class TextToSpeechRestStub: - _session: AuthorizedSession - _host: str - _interceptor: TextToSpeechRestInterceptor - - -class TextToSpeechRestTransport(_BaseTextToSpeechRestTransport): - """REST backend synchronous transport for TextToSpeech. - - Service that implements Google Cloud Text-to-Speech API. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends JSON representations of protocol buffers over HTTP/1.1 - """ - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - client_cert_source_for_mtls: Optional[Callable[[ - ], Tuple[bytes, bytes]]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - url_scheme: str = 'https', - interceptor: Optional[TextToSpeechRestInterceptor] = None, - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - - NOTE: This REST transport functionality is currently in a beta - state (preview). We welcome your feedback via a GitHub issue in - this library's repository. Thank you! - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is ignored if ``channel`` is provided. - scopes (Optional(Sequence[str])): A list of scopes. This argument is - ignored if ``channel`` is provided. - client_cert_source_for_mtls (Callable[[], Tuple[bytes, bytes]]): Client - certificate to configure mutual TLS HTTP channel. It is ignored - if ``channel`` is provided. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you are developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - url_scheme: the protocol scheme for the API endpoint. Normally - "https", but for testing or local servers, - "http" can be specified. - """ - # Run the base constructor - # TODO(yon-mg): resolve other ctor params i.e. scopes, quota, etc. - # TODO: When custom host (api_endpoint) is set, `scopes` must *also* be set on the - # credentials object - super().__init__( - host=host, - credentials=credentials, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - url_scheme=url_scheme, - api_audience=api_audience - ) - self._session = AuthorizedSession( - self._credentials, default_host=self.DEFAULT_HOST) - if client_cert_source_for_mtls: - self._session.configure_mtls_channel(client_cert_source_for_mtls) - self._interceptor = interceptor or TextToSpeechRestInterceptor() - self._prep_wrapped_messages(client_info) - - class _ListVoices(_BaseTextToSpeechRestTransport._BaseListVoices, TextToSpeechRestStub): - def __hash__(self): - return hash("TextToSpeechRestTransport.ListVoices") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - ) - return response - - def __call__(self, - request: cloud_tts.ListVoicesRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> cloud_tts.ListVoicesResponse: - r"""Call the list voices method over HTTP. - - Args: - request (~.cloud_tts.ListVoicesRequest): - The request object. The top-level message sent by the client for the - ``ListVoices`` method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - ~.cloud_tts.ListVoicesResponse: - The message returned to the client by the ``ListVoices`` - method. - - """ - - http_options = _BaseTextToSpeechRestTransport._BaseListVoices._get_http_options() - request, metadata = self._interceptor.pre_list_voices(request, metadata) - transcoded_request = _BaseTextToSpeechRestTransport._BaseListVoices._get_transcoded_request(http_options, request) - - # Jsonify the query params - query_params = _BaseTextToSpeechRestTransport._BaseListVoices._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechRestTransport._ListVoices._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - # Return the response - resp = cloud_tts.ListVoicesResponse() - pb_resp = cloud_tts.ListVoicesResponse.pb(resp) - - json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) - resp = self._interceptor.post_list_voices(resp) - return resp - - class _StreamingSynthesize(_BaseTextToSpeechRestTransport._BaseStreamingSynthesize, TextToSpeechRestStub): - def __hash__(self): - return hash("TextToSpeechRestTransport.StreamingSynthesize") - - def __call__(self, - request: cloud_tts.StreamingSynthesizeRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> rest_streaming.ResponseIterator: - raise NotImplementedError( - "Method StreamingSynthesize is not available over REST transport" - ) - class _SynthesizeSpeech(_BaseTextToSpeechRestTransport._BaseSynthesizeSpeech, TextToSpeechRestStub): - def __hash__(self): - return hash("TextToSpeechRestTransport.SynthesizeSpeech") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - data=body, - ) - return response - - def __call__(self, - request: cloud_tts.SynthesizeSpeechRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> cloud_tts.SynthesizeSpeechResponse: - r"""Call the synthesize speech method over HTTP. - - Args: - request (~.cloud_tts.SynthesizeSpeechRequest): - The request object. The top-level message sent by the client for the - ``SynthesizeSpeech`` method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - ~.cloud_tts.SynthesizeSpeechResponse: - The message returned to the client by the - ``SynthesizeSpeech`` method. - - """ - - http_options = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_http_options() - request, metadata = self._interceptor.pre_synthesize_speech(request, metadata) - transcoded_request = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_transcoded_request(http_options, request) - - body = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_request_body_json(transcoded_request) - - # Jsonify the query params - query_params = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechRestTransport._SynthesizeSpeech._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request, body) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - # Return the response - resp = cloud_tts.SynthesizeSpeechResponse() - pb_resp = cloud_tts.SynthesizeSpeechResponse.pb(resp) - - json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) - resp = self._interceptor.post_synthesize_speech(resp) - return resp - - @property - def list_voices(self) -> Callable[ - [cloud_tts.ListVoicesRequest], - cloud_tts.ListVoicesResponse]: - # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. - # In C++ this would require a dynamic_cast - return self._ListVoices(self._session, self._host, self._interceptor) # type: ignore - - @property - def streaming_synthesize(self) -> Callable[ - [cloud_tts.StreamingSynthesizeRequest], - cloud_tts.StreamingSynthesizeResponse]: - # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. - # In C++ this would require a dynamic_cast - return self._StreamingSynthesize(self._session, self._host, self._interceptor) # type: ignore - - @property - def synthesize_speech(self) -> Callable[ - [cloud_tts.SynthesizeSpeechRequest], - cloud_tts.SynthesizeSpeechResponse]: - # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. - # In C++ this would require a dynamic_cast - return self._SynthesizeSpeech(self._session, self._host, self._interceptor) # type: ignore - - @property - def get_operation(self): - return self._GetOperation(self._session, self._host, self._interceptor) # type: ignore - - class _GetOperation(_BaseTextToSpeechRestTransport._BaseGetOperation, TextToSpeechRestStub): - def __hash__(self): - return hash("TextToSpeechRestTransport.GetOperation") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - ) - return response - - def __call__(self, - request: operations_pb2.GetOperationRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> operations_pb2.Operation: - - r"""Call the get operation method over HTTP. - - Args: - request (operations_pb2.GetOperationRequest): - The request object for GetOperation method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - operations_pb2.Operation: Response from GetOperation method. - """ - - http_options = _BaseTextToSpeechRestTransport._BaseGetOperation._get_http_options() - request, metadata = self._interceptor.pre_get_operation(request, metadata) - transcoded_request = _BaseTextToSpeechRestTransport._BaseGetOperation._get_transcoded_request(http_options, request) - - # Jsonify the query params - query_params = _BaseTextToSpeechRestTransport._BaseGetOperation._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechRestTransport._GetOperation._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - content = response.content.decode("utf-8") - resp = operations_pb2.Operation() - resp = json_format.Parse(content, resp) - resp = self._interceptor.post_get_operation(resp) - return resp - - @property - def list_operations(self): - return self._ListOperations(self._session, self._host, self._interceptor) # type: ignore - - class _ListOperations(_BaseTextToSpeechRestTransport._BaseListOperations, TextToSpeechRestStub): - def __hash__(self): - return hash("TextToSpeechRestTransport.ListOperations") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - ) - return response - - def __call__(self, - request: operations_pb2.ListOperationsRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> operations_pb2.ListOperationsResponse: - - r"""Call the list operations method over HTTP. - - Args: - request (operations_pb2.ListOperationsRequest): - The request object for ListOperations method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - operations_pb2.ListOperationsResponse: Response from ListOperations method. - """ - - http_options = _BaseTextToSpeechRestTransport._BaseListOperations._get_http_options() - request, metadata = self._interceptor.pre_list_operations(request, metadata) - transcoded_request = _BaseTextToSpeechRestTransport._BaseListOperations._get_transcoded_request(http_options, request) - - # Jsonify the query params - query_params = _BaseTextToSpeechRestTransport._BaseListOperations._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechRestTransport._ListOperations._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - content = response.content.decode("utf-8") - resp = operations_pb2.ListOperationsResponse() - resp = json_format.Parse(content, resp) - resp = self._interceptor.post_list_operations(resp) - return resp - - @property - def kind(self) -> str: - return "rest" - - def close(self): - self._session.close() - - -__all__=( - 'TextToSpeechRestTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest_base.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest_base.py deleted file mode 100644 index 60910d87e1cc..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest_base.py +++ /dev/null @@ -1,220 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 json # type: ignore -from google.api_core import path_template -from google.api_core import gapic_v1 - -from google.protobuf import json_format -from .base import TextToSpeechTransport, DEFAULT_CLIENT_INFO - -import re -from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union - - -from google.cloud.texttospeech_v1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore - - -class _BaseTextToSpeechRestTransport(TextToSpeechTransport): - """Base REST backend transport for TextToSpeech. - - Note: This class is not meant to be used directly. Use its sync and - async sub-classes instead. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends JSON representations of protocol buffers over HTTP/1.1 - """ - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[Any] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - url_scheme: str = 'https', - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[Any]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you are developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - url_scheme: the protocol scheme for the API endpoint. Normally - "https", but for testing or local servers, - "http" can be specified. - """ - # Run the base constructor - maybe_url_match = re.match("^(?Phttp(?:s)?://)?(?P.*)$", host) - if maybe_url_match is None: - raise ValueError(f"Unexpected hostname structure: {host}") # pragma: NO COVER - - url_match_items = maybe_url_match.groupdict() - - host = f"{url_scheme}://{host}" if not url_match_items["scheme"] else host - - super().__init__( - host=host, - credentials=credentials, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - api_audience=api_audience - ) - - class _BaseListVoices: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'get', - 'uri': '/v1/voices', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - pb_request = cloud_tts.ListVoicesRequest.pb(request) - transcoded_request = path_template.transcode(http_options, pb_request) - return transcoded_request - - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json_format.MessageToJson( - transcoded_request['query_params'], - use_integers_for_enums=False, - )) - - return query_params - - class _BaseStreamingSynthesize: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - class _BaseSynthesizeSpeech: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = { - } - - @classmethod - def _get_unset_required_fields(cls, message_dict): - return {k: v for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() if k not in message_dict} - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'post', - 'uri': '/v1/text:synthesize', - 'body': '*', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - pb_request = cloud_tts.SynthesizeSpeechRequest.pb(request) - transcoded_request = path_template.transcode(http_options, pb_request) - return transcoded_request - - @staticmethod - def _get_request_body_json(transcoded_request): - # Jsonify the request body - - body = json_format.MessageToJson( - transcoded_request['body'], - use_integers_for_enums=False - ) - return body - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json_format.MessageToJson( - transcoded_request['query_params'], - use_integers_for_enums=False, - )) - query_params.update(_BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_unset_required_fields(query_params)) - - return query_params - - class _BaseGetOperation: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'get', - 'uri': '/v1/{name=projects/*/locations/*/operations/*}', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - request_kwargs = json_format.MessageToDict(request) - transcoded_request = path_template.transcode( - http_options, **request_kwargs) - return transcoded_request - - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json.dumps(transcoded_request['query_params'])) - return query_params - - class _BaseListOperations: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'get', - 'uri': '/v1/{name=projects/*/locations/*}/operations', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - request_kwargs = json_format.MessageToDict(request) - transcoded_request = path_template.transcode( - http_options, **request_kwargs) - return transcoded_request - - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json.dumps(transcoded_request['query_params'])) - return query_params - - -__all__=( - '_BaseTextToSpeechRestTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/__init__.py deleted file mode 100644 index 9a4b4f08eb08..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from .client import TextToSpeechLongAudioSynthesizeClient -from .async_client import TextToSpeechLongAudioSynthesizeAsyncClient - -__all__ = ( - 'TextToSpeechLongAudioSynthesizeClient', - 'TextToSpeechLongAudioSynthesizeAsyncClient', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/async_client.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/async_client.py deleted file mode 100644 index 5da410f8e638..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/async_client.py +++ /dev/null @@ -1,454 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from collections import OrderedDict -import re -from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union - -from google.cloud.texttospeech_v1 import gapic_version as package_version - -from google.api_core.client_options import ClientOptions -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import retry_async as retries -from google.auth import credentials as ga_credentials # type: ignore -from google.oauth2 import service_account # type: ignore - - -try: - OptionalRetry = Union[retries.AsyncRetry, gapic_v1.method._MethodDefault, None] -except AttributeError: # pragma: NO COVER - OptionalRetry = Union[retries.AsyncRetry, object, None] # type: ignore - -from google.api_core import operation # type: ignore -from google.api_core import operation_async # type: ignore -from google.cloud.texttospeech_v1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore -from .transports.base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO -from .transports.grpc_asyncio import TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport -from .client import TextToSpeechLongAudioSynthesizeClient - - -class TextToSpeechLongAudioSynthesizeAsyncClient: - """Service that implements Google Cloud Text-to-Speech API.""" - - _client: TextToSpeechLongAudioSynthesizeClient - - # Copy defaults from the synchronous client for use here. - # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. - DEFAULT_ENDPOINT = TextToSpeechLongAudioSynthesizeClient.DEFAULT_ENDPOINT - DEFAULT_MTLS_ENDPOINT = TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT - _DEFAULT_ENDPOINT_TEMPLATE = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE - _DEFAULT_UNIVERSE = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - - model_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.model_path) - parse_model_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_model_path) - common_billing_account_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_billing_account_path) - parse_common_billing_account_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_billing_account_path) - common_folder_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_folder_path) - parse_common_folder_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_folder_path) - common_organization_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_organization_path) - parse_common_organization_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_organization_path) - common_project_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_project_path) - parse_common_project_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_project_path) - common_location_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_location_path) - parse_common_location_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_location_path) - - @classmethod - def from_service_account_info(cls, info: dict, *args, **kwargs): - """Creates an instance of this client using the provided credentials - info. - - Args: - info (dict): The service account private key info. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechLongAudioSynthesizeAsyncClient: The constructed client. - """ - return TextToSpeechLongAudioSynthesizeClient.from_service_account_info.__func__(TextToSpeechLongAudioSynthesizeAsyncClient, info, *args, **kwargs) # type: ignore - - @classmethod - def from_service_account_file(cls, filename: str, *args, **kwargs): - """Creates an instance of this client using the provided credentials - file. - - Args: - filename (str): The path to the service account private key json - file. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechLongAudioSynthesizeAsyncClient: The constructed client. - """ - return TextToSpeechLongAudioSynthesizeClient.from_service_account_file.__func__(TextToSpeechLongAudioSynthesizeAsyncClient, filename, *args, **kwargs) # type: ignore - - from_service_account_json = from_service_account_file - - @classmethod - def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[ClientOptions] = None): - """Return the API endpoint and client cert source for mutual TLS. - - The client cert source is determined in the following order: - (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the - client cert source is None. - (2) if `client_options.client_cert_source` is provided, use the provided one; if the - default client cert source exists, use the default one; otherwise the client cert - source is None. - - The API endpoint is determined in the following order: - (1) if `client_options.api_endpoint` if provided, use the provided one. - (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the - default mTLS endpoint; if the environment variable is "never", use the default API - endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise - use the default API endpoint. - - More details can be found at https://google.aip.dev/auth/4114. - - Args: - client_options (google.api_core.client_options.ClientOptions): Custom options for the - client. Only the `api_endpoint` and `client_cert_source` properties may be used - in this method. - - Returns: - Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the - client cert source to use. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If any errors happen. - """ - return TextToSpeechLongAudioSynthesizeClient.get_mtls_endpoint_and_cert_source(client_options) # type: ignore - - @property - def transport(self) -> TextToSpeechLongAudioSynthesizeTransport: - """Returns the transport used by the client instance. - - Returns: - TextToSpeechLongAudioSynthesizeTransport: The transport used by the client instance. - """ - return self._client.transport - - @property - def api_endpoint(self): - """Return the API endpoint used by the client instance. - - Returns: - str: The API endpoint used by the client instance. - """ - return self._client._api_endpoint - - @property - def universe_domain(self) -> str: - """Return the universe domain used by the client instance. - - Returns: - str: The universe domain used - by the client instance. - """ - return self._client._universe_domain - - get_transport_class = TextToSpeechLongAudioSynthesizeClient.get_transport_class - - def __init__(self, *, - credentials: Optional[ga_credentials.Credentials] = None, - transport: Optional[Union[str, TextToSpeechLongAudioSynthesizeTransport, Callable[..., TextToSpeechLongAudioSynthesizeTransport]]] = "grpc_asyncio", - client_options: Optional[ClientOptions] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - ) -> None: - """Instantiates the text to speech long audio synthesize async client. - - Args: - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - transport (Optional[Union[str,TextToSpeechLongAudioSynthesizeTransport,Callable[..., TextToSpeechLongAudioSynthesizeTransport]]]): - The transport to use, or a Callable that constructs and returns a new transport to use. - If a Callable is given, it will be called with the same set of initialization - arguments as used in the TextToSpeechLongAudioSynthesizeTransport constructor. - If set to None, a transport is chosen automatically. - NOTE: "rest" transport functionality is currently in a - beta state (preview). We welcome your feedback via an - issue in this library's source repository. - client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): - Custom options for the client. - - 1. The ``api_endpoint`` property can be used to override the - default endpoint provided by the client when ``transport`` is - not explicitly provided. Only if this property is not set and - ``transport`` was not explicitly provided, the endpoint is - determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment - variable, which have one of the following values: - "always" (always use the default mTLS endpoint), "never" (always - use the default regular endpoint) and "auto" (auto-switch to the - default mTLS endpoint if client certificate is present; this is - the default value). - - 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable - is "true", then the ``client_cert_source`` property can be used - to provide a client certificate for mTLS transport. If - not provided, the default SSL client certificate will be used if - present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not - set, no client certificate will be used. - - 3. The ``universe_domain`` property can be used to override the - default "googleapis.com" universe. Note that ``api_endpoint`` - property still takes precedence; and ``universe_domain`` is - currently not supported for mTLS. - - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - - Raises: - google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport - creation failed for any reason. - """ - self._client = TextToSpeechLongAudioSynthesizeClient( - credentials=credentials, - transport=transport, - client_options=client_options, - client_info=client_info, - - ) - - async def synthesize_long_audio(self, - request: Optional[Union[cloud_tts_lrs.SynthesizeLongAudioRequest, dict]] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operation_async.AsyncOperation: - r"""Synthesizes long form text asynchronously. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1 - - async def sample_synthesize_long_audio(): - # Create a client - client = texttospeech_v1.TextToSpeechLongAudioSynthesizeAsyncClient() - - # Initialize request argument(s) - input = texttospeech_v1.SynthesisInput() - input.text = "text_value" - - audio_config = texttospeech_v1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - voice = texttospeech_v1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - request = texttospeech_v1.SynthesizeLongAudioRequest( - input=input, - audio_config=audio_config, - output_gcs_uri="output_gcs_uri_value", - voice=voice, - ) - - # Make the request - operation = client.synthesize_long_audio(request=request) - - print("Waiting for operation to complete...") - - response = (await operation).result() - - # Handle the response - print(response) - - Args: - request (Optional[Union[google.cloud.texttospeech_v1.types.SynthesizeLongAudioRequest, dict]]): - The request object. The top-level message sent by the client for the - ``SynthesizeLongAudio`` method. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - google.api_core.operation_async.AsyncOperation: - An object representing a long-running operation. - - The result type for the operation will be - :class:`google.cloud.texttospeech_v1.types.SynthesizeLongAudioResponse` - The message returned to the client by the - SynthesizeLongAudio method. - - """ - # Create or coerce a protobuf request object. - # - Use the request object if provided (there's no risk of modifying the input as - # there are no flattened fields), or create one. - if not isinstance(request, cloud_tts_lrs.SynthesizeLongAudioRequest): - request = cloud_tts_lrs.SynthesizeLongAudioRequest(request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._client._transport._wrapped_methods[self._client._transport.synthesize_long_audio] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata(( - ("parent", request.parent), - )), - ) - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Wrap the response in an operation future. - response = operation_async.from_gapic( - response, - self._client._transport.operations_client, - cloud_tts_lrs.SynthesizeLongAudioResponse, - metadata_type=cloud_tts_lrs.SynthesizeLongAudioMetadata, - ) - - # Done; return the response. - return response - - async def list_operations( - self, - request: Optional[operations_pb2.ListOperationsRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.ListOperationsResponse: - r"""Lists operations that match the specified filter in the request. - - Args: - request (:class:`~.operations_pb2.ListOperationsRequest`): - The request object. Request message for - `ListOperations` method. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.ListOperationsResponse: - Response message for ``ListOperations`` method. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.ListOperationsRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self.transport._wrapped_methods[self._client._transport.list_operations] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - async def get_operation( - self, - request: Optional[operations_pb2.GetOperationRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.Operation: - r"""Gets the latest state of a long-running operation. - - Args: - request (:class:`~.operations_pb2.GetOperationRequest`): - The request object. Request message for - `GetOperation` method. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.Operation: - An ``Operation`` object. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.GetOperationRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self.transport._wrapped_methods[self._client._transport.get_operation] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - async def __aenter__(self) -> "TextToSpeechLongAudioSynthesizeAsyncClient": - return self - - async def __aexit__(self, exc_type, exc, tb): - await self.transport.close() - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) - - -__all__ = ( - "TextToSpeechLongAudioSynthesizeAsyncClient", -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/client.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/client.py deleted file mode 100644 index 4306be692472..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/client.py +++ /dev/null @@ -1,813 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from collections import OrderedDict -import os -import re -from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union, cast -import warnings - -from google.cloud.texttospeech_v1 import gapic_version as package_version - -from google.api_core import client_options as client_options_lib -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import retry as retries -from google.auth import credentials as ga_credentials # type: ignore -from google.auth.transport import mtls # type: ignore -from google.auth.transport.grpc import SslCredentials # type: ignore -from google.auth.exceptions import MutualTLSChannelError # type: ignore -from google.oauth2 import service_account # type: ignore - -try: - OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] -except AttributeError: # pragma: NO COVER - OptionalRetry = Union[retries.Retry, object, None] # type: ignore - -from google.api_core import operation # type: ignore -from google.api_core import operation_async # type: ignore -from google.cloud.texttospeech_v1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore -from .transports.base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO -from .transports.grpc import TextToSpeechLongAudioSynthesizeGrpcTransport -from .transports.grpc_asyncio import TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport -from .transports.rest import TextToSpeechLongAudioSynthesizeRestTransport - - -class TextToSpeechLongAudioSynthesizeClientMeta(type): - """Metaclass for the TextToSpeechLongAudioSynthesize client. - - This provides class-level methods for building and retrieving - support objects (e.g. transport) without polluting the client instance - objects. - """ - _transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechLongAudioSynthesizeTransport]] - _transport_registry["grpc"] = TextToSpeechLongAudioSynthesizeGrpcTransport - _transport_registry["grpc_asyncio"] = TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport - _transport_registry["rest"] = TextToSpeechLongAudioSynthesizeRestTransport - - def get_transport_class(cls, - label: Optional[str] = None, - ) -> Type[TextToSpeechLongAudioSynthesizeTransport]: - """Returns an appropriate transport class. - - Args: - label: The name of the desired transport. If none is - provided, then the first transport in the registry is used. - - Returns: - The transport class to use. - """ - # If a specific transport is requested, return that one. - if label: - return cls._transport_registry[label] - - # No transport is requested; return the default (that is, the first one - # in the dictionary). - return next(iter(cls._transport_registry.values())) - - -class TextToSpeechLongAudioSynthesizeClient(metaclass=TextToSpeechLongAudioSynthesizeClientMeta): - """Service that implements Google Cloud Text-to-Speech API.""" - - @staticmethod - def _get_default_mtls_endpoint(api_endpoint): - """Converts api endpoint to mTLS endpoint. - - Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to - "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively. - Args: - api_endpoint (Optional[str]): the api endpoint to convert. - Returns: - str: converted mTLS api endpoint. - """ - if not api_endpoint: - return api_endpoint - - mtls_endpoint_re = re.compile( - r"(?P[^.]+)(?P\.mtls)?(?P\.sandbox)?(?P\.googleapis\.com)?" - ) - - m = mtls_endpoint_re.match(api_endpoint) - name, mtls, sandbox, googledomain = m.groups() - if mtls or not googledomain: - return api_endpoint - - if sandbox: - return api_endpoint.replace( - "sandbox.googleapis.com", "mtls.sandbox.googleapis.com" - ) - - return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com") - - # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. - DEFAULT_ENDPOINT = "texttospeech.googleapis.com" - DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore - DEFAULT_ENDPOINT - ) - - _DEFAULT_ENDPOINT_TEMPLATE = "texttospeech.{UNIVERSE_DOMAIN}" - _DEFAULT_UNIVERSE = "googleapis.com" - - @classmethod - def from_service_account_info(cls, info: dict, *args, **kwargs): - """Creates an instance of this client using the provided credentials - info. - - Args: - info (dict): The service account private key info. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechLongAudioSynthesizeClient: The constructed client. - """ - credentials = service_account.Credentials.from_service_account_info(info) - kwargs["credentials"] = credentials - return cls(*args, **kwargs) - - @classmethod - def from_service_account_file(cls, filename: str, *args, **kwargs): - """Creates an instance of this client using the provided credentials - file. - - Args: - filename (str): The path to the service account private key json - file. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechLongAudioSynthesizeClient: The constructed client. - """ - credentials = service_account.Credentials.from_service_account_file( - filename) - kwargs["credentials"] = credentials - return cls(*args, **kwargs) - - from_service_account_json = from_service_account_file - - @property - def transport(self) -> TextToSpeechLongAudioSynthesizeTransport: - """Returns the transport used by the client instance. - - Returns: - TextToSpeechLongAudioSynthesizeTransport: The transport used by the client - instance. - """ - return self._transport - - @staticmethod - def model_path(project: str,location: str,model: str,) -> str: - """Returns a fully-qualified model string.""" - return "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) - - @staticmethod - def parse_model_path(path: str) -> Dict[str,str]: - """Parses a model path into its component segments.""" - m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)/models/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_billing_account_path(billing_account: str, ) -> str: - """Returns a fully-qualified billing_account string.""" - return "billingAccounts/{billing_account}".format(billing_account=billing_account, ) - - @staticmethod - def parse_common_billing_account_path(path: str) -> Dict[str,str]: - """Parse a billing_account path into its component segments.""" - m = re.match(r"^billingAccounts/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_folder_path(folder: str, ) -> str: - """Returns a fully-qualified folder string.""" - return "folders/{folder}".format(folder=folder, ) - - @staticmethod - def parse_common_folder_path(path: str) -> Dict[str,str]: - """Parse a folder path into its component segments.""" - m = re.match(r"^folders/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_organization_path(organization: str, ) -> str: - """Returns a fully-qualified organization string.""" - return "organizations/{organization}".format(organization=organization, ) - - @staticmethod - def parse_common_organization_path(path: str) -> Dict[str,str]: - """Parse a organization path into its component segments.""" - m = re.match(r"^organizations/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_project_path(project: str, ) -> str: - """Returns a fully-qualified project string.""" - return "projects/{project}".format(project=project, ) - - @staticmethod - def parse_common_project_path(path: str) -> Dict[str,str]: - """Parse a project path into its component segments.""" - m = re.match(r"^projects/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_location_path(project: str, location: str, ) -> str: - """Returns a fully-qualified location string.""" - return "projects/{project}/locations/{location}".format(project=project, location=location, ) - - @staticmethod - def parse_common_location_path(path: str) -> Dict[str,str]: - """Parse a location path into its component segments.""" - m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path) - return m.groupdict() if m else {} - - @classmethod - def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[client_options_lib.ClientOptions] = None): - """Deprecated. Return the API endpoint and client cert source for mutual TLS. - - The client cert source is determined in the following order: - (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the - client cert source is None. - (2) if `client_options.client_cert_source` is provided, use the provided one; if the - default client cert source exists, use the default one; otherwise the client cert - source is None. - - The API endpoint is determined in the following order: - (1) if `client_options.api_endpoint` if provided, use the provided one. - (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the - default mTLS endpoint; if the environment variable is "never", use the default API - endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise - use the default API endpoint. - - More details can be found at https://google.aip.dev/auth/4114. - - Args: - client_options (google.api_core.client_options.ClientOptions): Custom options for the - client. Only the `api_endpoint` and `client_cert_source` properties may be used - in this method. - - Returns: - Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the - client cert source to use. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If any errors happen. - """ - - warnings.warn("get_mtls_endpoint_and_cert_source is deprecated. Use the api_endpoint property instead.", - DeprecationWarning) - if client_options is None: - client_options = client_options_lib.ClientOptions() - use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") - use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") - if use_client_cert not in ("true", "false"): - raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") - if use_mtls_endpoint not in ("auto", "never", "always"): - raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") - - # Figure out the client cert source to use. - client_cert_source = None - if use_client_cert == "true": - if client_options.client_cert_source: - client_cert_source = client_options.client_cert_source - elif mtls.has_default_client_cert_source(): - client_cert_source = mtls.default_client_cert_source() - - # Figure out which api endpoint to use. - if client_options.api_endpoint is not None: - api_endpoint = client_options.api_endpoint - elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): - api_endpoint = cls.DEFAULT_MTLS_ENDPOINT - else: - api_endpoint = cls.DEFAULT_ENDPOINT - - return api_endpoint, client_cert_source - - @staticmethod - def _read_environment_variables(): - """Returns the environment variables used by the client. - - Returns: - Tuple[bool, str, str]: returns the GOOGLE_API_USE_CLIENT_CERTIFICATE, - GOOGLE_API_USE_MTLS_ENDPOINT, and GOOGLE_CLOUD_UNIVERSE_DOMAIN environment variables. - - Raises: - ValueError: If GOOGLE_API_USE_CLIENT_CERTIFICATE is not - any of ["true", "false"]. - google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT - is not any of ["auto", "never", "always"]. - """ - use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false").lower() - use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower() - universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN") - if use_client_cert not in ("true", "false"): - raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") - if use_mtls_endpoint not in ("auto", "never", "always"): - raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") - return use_client_cert == "true", use_mtls_endpoint, universe_domain_env - - @staticmethod - def _get_client_cert_source(provided_cert_source, use_cert_flag): - """Return the client cert source to be used by the client. - - Args: - provided_cert_source (bytes): The client certificate source provided. - use_cert_flag (bool): A flag indicating whether to use the client certificate. - - Returns: - bytes or None: The client cert source to be used by the client. - """ - client_cert_source = None - if use_cert_flag: - if provided_cert_source: - client_cert_source = provided_cert_source - elif mtls.has_default_client_cert_source(): - client_cert_source = mtls.default_client_cert_source() - return client_cert_source - - @staticmethod - def _get_api_endpoint(api_override, client_cert_source, universe_domain, use_mtls_endpoint): - """Return the API endpoint used by the client. - - Args: - api_override (str): The API endpoint override. If specified, this is always - the return value of this function and the other arguments are not used. - client_cert_source (bytes): The client certificate source used by the client. - universe_domain (str): The universe domain used by the client. - use_mtls_endpoint (str): How to use the mTLS endpoint, which depends also on the other parameters. - Possible values are "always", "auto", or "never". - - Returns: - str: The API endpoint to be used by the client. - """ - if api_override is not None: - api_endpoint = api_override - elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): - _default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - if universe_domain != _default_universe: - raise MutualTLSChannelError(f"mTLS is not supported in any universe other than {_default_universe}.") - api_endpoint = TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT - else: - api_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=universe_domain) - return api_endpoint - - @staticmethod - def _get_universe_domain(client_universe_domain: Optional[str], universe_domain_env: Optional[str]) -> str: - """Return the universe domain used by the client. - - Args: - client_universe_domain (Optional[str]): The universe domain configured via the client options. - universe_domain_env (Optional[str]): The universe domain configured via the "GOOGLE_CLOUD_UNIVERSE_DOMAIN" environment variable. - - Returns: - str: The universe domain to be used by the client. - - Raises: - ValueError: If the universe domain is an empty string. - """ - universe_domain = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - if client_universe_domain is not None: - universe_domain = client_universe_domain - elif universe_domain_env is not None: - universe_domain = universe_domain_env - if len(universe_domain.strip()) == 0: - raise ValueError("Universe Domain cannot be an empty string.") - return universe_domain - - @staticmethod - def _compare_universes(client_universe: str, - credentials: ga_credentials.Credentials) -> bool: - """Returns True iff the universe domains used by the client and credentials match. - - Args: - client_universe (str): The universe domain configured via the client options. - credentials (ga_credentials.Credentials): The credentials being used in the client. - - Returns: - bool: True iff client_universe matches the universe in credentials. - - Raises: - ValueError: when client_universe does not match the universe in credentials. - """ - - default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - credentials_universe = getattr(credentials, "universe_domain", default_universe) - - if client_universe != credentials_universe: - raise ValueError("The configured universe domain " - f"({client_universe}) does not match the universe domain " - f"found in the credentials ({credentials_universe}). " - "If you haven't configured the universe domain explicitly, " - f"`{default_universe}` is the default.") - return True - - def _validate_universe_domain(self): - """Validates client's and credentials' universe domains are consistent. - - Returns: - bool: True iff the configured universe domain is valid. - - Raises: - ValueError: If the configured universe domain is not valid. - """ - self._is_universe_domain_valid = (self._is_universe_domain_valid or - TextToSpeechLongAudioSynthesizeClient._compare_universes(self.universe_domain, self.transport._credentials)) - return self._is_universe_domain_valid - - @property - def api_endpoint(self): - """Return the API endpoint used by the client instance. - - Returns: - str: The API endpoint used by the client instance. - """ - return self._api_endpoint - - @property - def universe_domain(self) -> str: - """Return the universe domain used by the client instance. - - Returns: - str: The universe domain used by the client instance. - """ - return self._universe_domain - - def __init__(self, *, - credentials: Optional[ga_credentials.Credentials] = None, - transport: Optional[Union[str, TextToSpeechLongAudioSynthesizeTransport, Callable[..., TextToSpeechLongAudioSynthesizeTransport]]] = None, - client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - ) -> None: - """Instantiates the text to speech long audio synthesize client. - - Args: - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - transport (Optional[Union[str,TextToSpeechLongAudioSynthesizeTransport,Callable[..., TextToSpeechLongAudioSynthesizeTransport]]]): - The transport to use, or a Callable that constructs and returns a new transport. - If a Callable is given, it will be called with the same set of initialization - arguments as used in the TextToSpeechLongAudioSynthesizeTransport constructor. - If set to None, a transport is chosen automatically. - NOTE: "rest" transport functionality is currently in a - beta state (preview). We welcome your feedback via an - issue in this library's source repository. - client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): - Custom options for the client. - - 1. The ``api_endpoint`` property can be used to override the - default endpoint provided by the client when ``transport`` is - not explicitly provided. Only if this property is not set and - ``transport`` was not explicitly provided, the endpoint is - determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment - variable, which have one of the following values: - "always" (always use the default mTLS endpoint), "never" (always - use the default regular endpoint) and "auto" (auto-switch to the - default mTLS endpoint if client certificate is present; this is - the default value). - - 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable - is "true", then the ``client_cert_source`` property can be used - to provide a client certificate for mTLS transport. If - not provided, the default SSL client certificate will be used if - present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not - set, no client certificate will be used. - - 3. The ``universe_domain`` property can be used to override the - default "googleapis.com" universe. Note that the ``api_endpoint`` - property still takes precedence; and ``universe_domain`` is - currently not supported for mTLS. - - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport - creation failed for any reason. - """ - self._client_options = client_options - if isinstance(self._client_options, dict): - self._client_options = client_options_lib.from_dict(self._client_options) - if self._client_options is None: - self._client_options = client_options_lib.ClientOptions() - self._client_options = cast(client_options_lib.ClientOptions, self._client_options) - - universe_domain_opt = getattr(self._client_options, 'universe_domain', None) - - self._use_client_cert, self._use_mtls_endpoint, self._universe_domain_env = TextToSpeechLongAudioSynthesizeClient._read_environment_variables() - self._client_cert_source = TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(self._client_options.client_cert_source, self._use_client_cert) - self._universe_domain = TextToSpeechLongAudioSynthesizeClient._get_universe_domain(universe_domain_opt, self._universe_domain_env) - self._api_endpoint = None # updated below, depending on `transport` - - # Initialize the universe domain validation. - self._is_universe_domain_valid = False - - api_key_value = getattr(self._client_options, "api_key", None) - if api_key_value and credentials: - raise ValueError("client_options.api_key and credentials are mutually exclusive") - - # Save or instantiate the transport. - # Ordinarily, we provide the transport, but allowing a custom transport - # instance provides an extensibility point for unusual situations. - transport_provided = isinstance(transport, TextToSpeechLongAudioSynthesizeTransport) - if transport_provided: - # transport is a TextToSpeechLongAudioSynthesizeTransport instance. - if credentials or self._client_options.credentials_file or api_key_value: - raise ValueError("When providing a transport instance, " - "provide its credentials directly.") - if self._client_options.scopes: - raise ValueError( - "When providing a transport instance, provide its scopes " - "directly." - ) - self._transport = cast(TextToSpeechLongAudioSynthesizeTransport, transport) - self._api_endpoint = self._transport.host - - self._api_endpoint = (self._api_endpoint or - TextToSpeechLongAudioSynthesizeClient._get_api_endpoint( - self._client_options.api_endpoint, - self._client_cert_source, - self._universe_domain, - self._use_mtls_endpoint)) - - if not transport_provided: - import google.auth._default # type: ignore - - if api_key_value and hasattr(google.auth._default, "get_api_key_credentials"): - credentials = google.auth._default.get_api_key_credentials(api_key_value) - - transport_init: Union[Type[TextToSpeechLongAudioSynthesizeTransport], Callable[..., TextToSpeechLongAudioSynthesizeTransport]] = ( - TextToSpeechLongAudioSynthesizeClient.get_transport_class(transport) - if isinstance(transport, str) or transport is None - else cast(Callable[..., TextToSpeechLongAudioSynthesizeTransport], transport) - ) - # initialize with the provided callable or the passed in class - self._transport = transport_init( - credentials=credentials, - credentials_file=self._client_options.credentials_file, - host=self._api_endpoint, - scopes=self._client_options.scopes, - client_cert_source_for_mtls=self._client_cert_source, - quota_project_id=self._client_options.quota_project_id, - client_info=client_info, - always_use_jwt_access=True, - api_audience=self._client_options.api_audience, - ) - - def synthesize_long_audio(self, - request: Optional[Union[cloud_tts_lrs.SynthesizeLongAudioRequest, dict]] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operation.Operation: - r"""Synthesizes long form text asynchronously. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1 - - def sample_synthesize_long_audio(): - # Create a client - client = texttospeech_v1.TextToSpeechLongAudioSynthesizeClient() - - # Initialize request argument(s) - input = texttospeech_v1.SynthesisInput() - input.text = "text_value" - - audio_config = texttospeech_v1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - voice = texttospeech_v1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - request = texttospeech_v1.SynthesizeLongAudioRequest( - input=input, - audio_config=audio_config, - output_gcs_uri="output_gcs_uri_value", - voice=voice, - ) - - # Make the request - operation = client.synthesize_long_audio(request=request) - - print("Waiting for operation to complete...") - - response = operation.result() - - # Handle the response - print(response) - - Args: - request (Union[google.cloud.texttospeech_v1.types.SynthesizeLongAudioRequest, dict]): - The request object. The top-level message sent by the client for the - ``SynthesizeLongAudio`` method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - google.api_core.operation.Operation: - An object representing a long-running operation. - - The result type for the operation will be - :class:`google.cloud.texttospeech_v1.types.SynthesizeLongAudioResponse` - The message returned to the client by the - SynthesizeLongAudio method. - - """ - # Create or coerce a protobuf request object. - # - Use the request object if provided (there's no risk of modifying the input as - # there are no flattened fields), or create one. - if not isinstance(request, cloud_tts_lrs.SynthesizeLongAudioRequest): - request = cloud_tts_lrs.SynthesizeLongAudioRequest(request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.synthesize_long_audio] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata(( - ("parent", request.parent), - )), - ) - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Wrap the response in an operation future. - response = operation.from_gapic( - response, - self._transport.operations_client, - cloud_tts_lrs.SynthesizeLongAudioResponse, - metadata_type=cloud_tts_lrs.SynthesizeLongAudioMetadata, - ) - - # Done; return the response. - return response - - def __enter__(self) -> "TextToSpeechLongAudioSynthesizeClient": - return self - - def __exit__(self, type, value, traceback): - """Releases underlying transport's resources. - - .. warning:: - ONLY use as a context manager if the transport is NOT shared - with other clients! Exiting the with block will CLOSE the transport - and may cause errors in other clients! - """ - self.transport.close() - - def list_operations( - self, - request: Optional[operations_pb2.ListOperationsRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.ListOperationsResponse: - r"""Lists operations that match the specified filter in the request. - - Args: - request (:class:`~.operations_pb2.ListOperationsRequest`): - The request object. Request message for - `ListOperations` method. - retry (google.api_core.retry.Retry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.ListOperationsResponse: - Response message for ``ListOperations`` method. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.ListOperationsRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.list_operations] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - def get_operation( - self, - request: Optional[operations_pb2.GetOperationRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.Operation: - r"""Gets the latest state of a long-running operation. - - Args: - request (:class:`~.operations_pb2.GetOperationRequest`): - The request object. Request message for - `GetOperation` method. - retry (google.api_core.retry.Retry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.Operation: - An ``Operation`` object. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.GetOperationRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.get_operation] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - - - - - - - - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) - - -__all__ = ( - "TextToSpeechLongAudioSynthesizeClient", -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/README.rst b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/README.rst deleted file mode 100644 index 44ada032f342..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/README.rst +++ /dev/null @@ -1,9 +0,0 @@ - -transport inheritance structure -_______________________________ - -`TextToSpeechLongAudioSynthesizeTransport` is the ABC for all transports. -- public child `TextToSpeechLongAudioSynthesizeGrpcTransport` for sync gRPC transport (defined in `grpc.py`). -- public child `TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport` for async gRPC transport (defined in `grpc_asyncio.py`). -- private child `_BaseTextToSpeechLongAudioSynthesizeRestTransport` for base REST transport with inner classes `_BaseMETHOD` (defined in `rest_base.py`). -- public child `TextToSpeechLongAudioSynthesizeRestTransport` for sync REST transport with inner classes `METHOD` derived from the parent's corresponding `_BaseMETHOD` classes (defined in `rest.py`). diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/__init__.py deleted file mode 100644 index b9316b7eeac3..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from collections import OrderedDict -from typing import Dict, Type - -from .base import TextToSpeechLongAudioSynthesizeTransport -from .grpc import TextToSpeechLongAudioSynthesizeGrpcTransport -from .grpc_asyncio import TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport -from .rest import TextToSpeechLongAudioSynthesizeRestTransport -from .rest import TextToSpeechLongAudioSynthesizeRestInterceptor - - -# Compile a registry of transports. -_transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechLongAudioSynthesizeTransport]] -_transport_registry['grpc'] = TextToSpeechLongAudioSynthesizeGrpcTransport -_transport_registry['grpc_asyncio'] = TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport -_transport_registry['rest'] = TextToSpeechLongAudioSynthesizeRestTransport - -__all__ = ( - 'TextToSpeechLongAudioSynthesizeTransport', - 'TextToSpeechLongAudioSynthesizeGrpcTransport', - 'TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport', - 'TextToSpeechLongAudioSynthesizeRestTransport', - 'TextToSpeechLongAudioSynthesizeRestInterceptor', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/base.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/base.py deleted file mode 100644 index b3776f9c7d09..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/base.py +++ /dev/null @@ -1,189 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 abc -from typing import Awaitable, Callable, Dict, Optional, Sequence, Union - -from google.cloud.texttospeech_v1 import gapic_version as package_version - -import google.auth # type: ignore -import google.api_core -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import retry as retries -from google.api_core import operations_v1 -from google.auth import credentials as ga_credentials # type: ignore -from google.oauth2 import service_account # type: ignore - -from google.cloud.texttospeech_v1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) - - -class TextToSpeechLongAudioSynthesizeTransport(abc.ABC): - """Abstract transport class for TextToSpeechLongAudioSynthesize.""" - - AUTH_SCOPES = ( - 'https://www.googleapis.com/auth/cloud-platform', - ) - - DEFAULT_HOST: str = 'texttospeech.googleapis.com' - def __init__( - self, *, - host: str = DEFAULT_HOST, - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - api_audience: Optional[str] = None, - **kwargs, - ) -> None: - """Instantiate the transport. - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is mutually exclusive with credentials. - scopes (Optional[Sequence[str]]): A list of scopes. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - """ - - scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} - - # Save the scopes. - self._scopes = scopes - if not hasattr(self, "_ignore_credentials"): - self._ignore_credentials: bool = False - - # If no credentials are provided, then determine the appropriate - # defaults. - if credentials and credentials_file: - raise core_exceptions.DuplicateCredentialArgs("'credentials_file' and 'credentials' are mutually exclusive") - - if credentials_file is not None: - credentials, _ = google.auth.load_credentials_from_file( - credentials_file, - **scopes_kwargs, - quota_project_id=quota_project_id - ) - elif credentials is None and not self._ignore_credentials: - credentials, _ = google.auth.default(**scopes_kwargs, quota_project_id=quota_project_id) - # Don't apply audience if the credentials file passed from user. - if hasattr(credentials, "with_gdch_audience"): - credentials = credentials.with_gdch_audience(api_audience if api_audience else host) - - # If the credentials are service account credentials, then always try to use self signed JWT. - if always_use_jwt_access and isinstance(credentials, service_account.Credentials) and hasattr(service_account.Credentials, "with_always_use_jwt_access"): - credentials = credentials.with_always_use_jwt_access(True) - - # Save the credentials. - self._credentials = credentials - - # Save the hostname. Default to port 443 (HTTPS) if none is specified. - if ':' not in host: - host += ':443' - self._host = host - - @property - def host(self): - return self._host - - def _prep_wrapped_messages(self, client_info): - # Precompute the wrapped methods. - self._wrapped_methods = { - self.synthesize_long_audio: gapic_v1.method.wrap_method( - self.synthesize_long_audio, - default_timeout=5000.0, - client_info=client_info, - ), - self.get_operation: gapic_v1.method.wrap_method( - self.get_operation, - default_timeout=None, - client_info=client_info, - ), - self.list_operations: gapic_v1.method.wrap_method( - self.list_operations, - default_timeout=None, - client_info=client_info, - ), - } - - def close(self): - """Closes resources associated with the transport. - - .. warning:: - Only call this method if the transport is NOT shared - with other clients - this may cause errors in other clients! - """ - raise NotImplementedError() - - @property - def operations_client(self): - """Return the client designed to process long-running operations.""" - raise NotImplementedError() - - @property - def synthesize_long_audio(self) -> Callable[ - [cloud_tts_lrs.SynthesizeLongAudioRequest], - Union[ - operations_pb2.Operation, - Awaitable[operations_pb2.Operation] - ]]: - raise NotImplementedError() - - @property - def list_operations( - self, - ) -> Callable[ - [operations_pb2.ListOperationsRequest], - Union[operations_pb2.ListOperationsResponse, Awaitable[operations_pb2.ListOperationsResponse]], - ]: - raise NotImplementedError() - - @property - def get_operation( - self, - ) -> Callable[ - [operations_pb2.GetOperationRequest], - Union[operations_pb2.Operation, Awaitable[operations_pb2.Operation]], - ]: - raise NotImplementedError() - - @property - def kind(self) -> str: - raise NotImplementedError() - - -__all__ = ( - 'TextToSpeechLongAudioSynthesizeTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc.py deleted file mode 100644 index 2cafb36fa6df..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc.py +++ /dev/null @@ -1,325 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 warnings -from typing import Callable, Dict, Optional, Sequence, Tuple, Union - -from google.api_core import grpc_helpers -from google.api_core import operations_v1 -from google.api_core import gapic_v1 -import google.auth # type: ignore -from google.auth import credentials as ga_credentials # type: ignore -from google.auth.transport.grpc import SslCredentials # type: ignore - -import grpc # type: ignore - -from google.cloud.texttospeech_v1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore -from .base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO - - -class TextToSpeechLongAudioSynthesizeGrpcTransport(TextToSpeechLongAudioSynthesizeTransport): - """gRPC backend transport for TextToSpeechLongAudioSynthesize. - - Service that implements Google Cloud Text-to-Speech API. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends protocol buffers over the wire using gRPC (which is built on - top of HTTP/2); the ``grpcio`` package must be installed. - """ - _stubs: Dict[str, Callable] - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - channel: Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]] = None, - api_mtls_endpoint: Optional[str] = None, - client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, - client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - This argument is ignored if a ``channel`` instance is provided. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is ignored if a ``channel`` instance is provided. - scopes (Optional(Sequence[str])): A list of scopes. This argument is - ignored if a ``channel`` instance is provided. - channel (Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]]): - A ``Channel`` instance through which to make calls, or a Callable - that constructs and returns one. If set to None, ``self.create_channel`` - is used to create the channel. If a Callable is given, it will be called - with the same arguments as used in ``self.create_channel``. - api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. - If provided, it overrides the ``host`` argument and tries to create - a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or application default SSL credentials. - client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): - Deprecated. A callback to provide client SSL certificate bytes and - private key bytes, both in PEM format. It is ignored if - ``api_mtls_endpoint`` is None. - ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for the grpc channel. It is ignored if a ``channel`` instance is provided. - client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): - A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure a mutual TLS channel. It is - ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport - creation failed for any reason. - google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` - and ``credentials_file`` are passed. - """ - self._grpc_channel = None - self._ssl_channel_credentials = ssl_channel_credentials - self._stubs: Dict[str, Callable] = {} - self._operations_client: Optional[operations_v1.OperationsClient] = None - - if api_mtls_endpoint: - warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) - if client_cert_source: - warnings.warn("client_cert_source is deprecated", DeprecationWarning) - - if isinstance(channel, grpc.Channel): - # Ignore credentials if a channel was passed. - credentials = None - self._ignore_credentials = True - # If a channel was explicitly provided, set it. - self._grpc_channel = channel - self._ssl_channel_credentials = None - - else: - if api_mtls_endpoint: - host = api_mtls_endpoint - - # Create SSL credentials with client_cert_source or application - # default SSL credentials. - if client_cert_source: - cert, key = client_cert_source() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - else: - self._ssl_channel_credentials = SslCredentials().ssl_credentials - - else: - if client_cert_source_for_mtls and not ssl_channel_credentials: - cert, key = client_cert_source_for_mtls() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - - # The base transport sets the host, credentials and scopes - super().__init__( - host=host, - credentials=credentials, - credentials_file=credentials_file, - scopes=scopes, - quota_project_id=quota_project_id, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - api_audience=api_audience, - ) - - if not self._grpc_channel: - # initialize with the provided callable or the default channel - channel_init = channel or type(self).create_channel - self._grpc_channel = channel_init( - self._host, - # use the credentials which are saved - credentials=self._credentials, - # Set ``credentials_file`` to ``None`` here as - # the credentials that we saved earlier should be used. - credentials_file=None, - scopes=self._scopes, - ssl_credentials=self._ssl_channel_credentials, - quota_project_id=quota_project_id, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - # Wrap messages. This must be done after self._grpc_channel exists - self._prep_wrapped_messages(client_info) - - @classmethod - def create_channel(cls, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - quota_project_id: Optional[str] = None, - **kwargs) -> grpc.Channel: - """Create and return a gRPC channel object. - Args: - host (Optional[str]): The host for the channel to use. - credentials (Optional[~.Credentials]): The - authorization credentials to attach to requests. These - credentials identify this application to the service. If - none are specified, the client will attempt to ascertain - the credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is mutually exclusive with credentials. - scopes (Optional[Sequence[str]]): A optional list of scopes needed for this - service. These are only used when credentials are not specified and - are passed to :func:`google.auth.default`. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - kwargs (Optional[dict]): Keyword arguments, which are passed to the - channel creation. - Returns: - grpc.Channel: A gRPC channel object. - - Raises: - google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` - and ``credentials_file`` are passed. - """ - - return grpc_helpers.create_channel( - host, - credentials=credentials, - credentials_file=credentials_file, - quota_project_id=quota_project_id, - default_scopes=cls.AUTH_SCOPES, - scopes=scopes, - default_host=cls.DEFAULT_HOST, - **kwargs - ) - - @property - def grpc_channel(self) -> grpc.Channel: - """Return the channel designed to connect to this service. - """ - return self._grpc_channel - - @property - def operations_client(self) -> operations_v1.OperationsClient: - """Create the client designed to process long-running operations. - - This property caches on the instance; repeated calls return the same - client. - """ - # Quick check: Only create a new client if we do not already have one. - if self._operations_client is None: - self._operations_client = operations_v1.OperationsClient( - self.grpc_channel - ) - - # Return the client from cache. - return self._operations_client - - @property - def synthesize_long_audio(self) -> Callable[ - [cloud_tts_lrs.SynthesizeLongAudioRequest], - operations_pb2.Operation]: - r"""Return a callable for the synthesize long audio method over gRPC. - - Synthesizes long form text asynchronously. - - Returns: - Callable[[~.SynthesizeLongAudioRequest], - ~.Operation]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'synthesize_long_audio' not in self._stubs: - self._stubs['synthesize_long_audio'] = self.grpc_channel.unary_unary( - '/google.cloud.texttospeech.v1.TextToSpeechLongAudioSynthesize/SynthesizeLongAudio', - request_serializer=cloud_tts_lrs.SynthesizeLongAudioRequest.serialize, - response_deserializer=operations_pb2.Operation.FromString, - ) - return self._stubs['synthesize_long_audio'] - - def close(self): - self.grpc_channel.close() - - @property - def get_operation( - self, - ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: - r"""Return a callable for the get_operation method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "get_operation" not in self._stubs: - self._stubs["get_operation"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/GetOperation", - request_serializer=operations_pb2.GetOperationRequest.SerializeToString, - response_deserializer=operations_pb2.Operation.FromString, - ) - return self._stubs["get_operation"] - - @property - def list_operations( - self, - ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: - r"""Return a callable for the list_operations method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "list_operations" not in self._stubs: - self._stubs["list_operations"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/ListOperations", - request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, - response_deserializer=operations_pb2.ListOperationsResponse.FromString, - ) - return self._stubs["list_operations"] - - @property - def kind(self) -> str: - return "grpc" - - -__all__ = ( - 'TextToSpeechLongAudioSynthesizeGrpcTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py deleted file mode 100644 index 449ead9e3a40..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py +++ /dev/null @@ -1,356 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 inspect -import warnings -from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union - -from google.api_core import gapic_v1 -from google.api_core import grpc_helpers_async -from google.api_core import exceptions as core_exceptions -from google.api_core import retry_async as retries -from google.api_core import operations_v1 -from google.auth import credentials as ga_credentials # type: ignore -from google.auth.transport.grpc import SslCredentials # type: ignore - -import grpc # type: ignore -from grpc.experimental import aio # type: ignore - -from google.cloud.texttospeech_v1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore -from .base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO -from .grpc import TextToSpeechLongAudioSynthesizeGrpcTransport - - -class TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport(TextToSpeechLongAudioSynthesizeTransport): - """gRPC AsyncIO backend transport for TextToSpeechLongAudioSynthesize. - - Service that implements Google Cloud Text-to-Speech API. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends protocol buffers over the wire using gRPC (which is built on - top of HTTP/2); the ``grpcio`` package must be installed. - """ - - _grpc_channel: aio.Channel - _stubs: Dict[str, Callable] = {} - - @classmethod - def create_channel(cls, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - quota_project_id: Optional[str] = None, - **kwargs) -> aio.Channel: - """Create and return a gRPC AsyncIO channel object. - Args: - host (Optional[str]): The host for the channel to use. - credentials (Optional[~.Credentials]): The - authorization credentials to attach to requests. These - credentials identify this application to the service. If - none are specified, the client will attempt to ascertain - the credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - scopes (Optional[Sequence[str]]): A optional list of scopes needed for this - service. These are only used when credentials are not specified and - are passed to :func:`google.auth.default`. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - kwargs (Optional[dict]): Keyword arguments, which are passed to the - channel creation. - Returns: - aio.Channel: A gRPC AsyncIO channel object. - """ - - return grpc_helpers_async.create_channel( - host, - credentials=credentials, - credentials_file=credentials_file, - quota_project_id=quota_project_id, - default_scopes=cls.AUTH_SCOPES, - scopes=scopes, - default_host=cls.DEFAULT_HOST, - **kwargs - ) - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - channel: Optional[Union[aio.Channel, Callable[..., aio.Channel]]] = None, - api_mtls_endpoint: Optional[str] = None, - client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, - client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - This argument is ignored if a ``channel`` instance is provided. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is ignored if a ``channel`` instance is provided. - scopes (Optional[Sequence[str]]): A optional list of scopes needed for this - service. These are only used when credentials are not specified and - are passed to :func:`google.auth.default`. - channel (Optional[Union[aio.Channel, Callable[..., aio.Channel]]]): - A ``Channel`` instance through which to make calls, or a Callable - that constructs and returns one. If set to None, ``self.create_channel`` - is used to create the channel. If a Callable is given, it will be called - with the same arguments as used in ``self.create_channel``. - api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. - If provided, it overrides the ``host`` argument and tries to create - a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or application default SSL credentials. - client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): - Deprecated. A callback to provide client SSL certificate bytes and - private key bytes, both in PEM format. It is ignored if - ``api_mtls_endpoint`` is None. - ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for the grpc channel. It is ignored if a ``channel`` instance is provided. - client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): - A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure a mutual TLS channel. It is - ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - - Raises: - google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport - creation failed for any reason. - google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` - and ``credentials_file`` are passed. - """ - self._grpc_channel = None - self._ssl_channel_credentials = ssl_channel_credentials - self._stubs: Dict[str, Callable] = {} - self._operations_client: Optional[operations_v1.OperationsAsyncClient] = None - - if api_mtls_endpoint: - warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) - if client_cert_source: - warnings.warn("client_cert_source is deprecated", DeprecationWarning) - - if isinstance(channel, aio.Channel): - # Ignore credentials if a channel was passed. - credentials = None - self._ignore_credentials = True - # If a channel was explicitly provided, set it. - self._grpc_channel = channel - self._ssl_channel_credentials = None - else: - if api_mtls_endpoint: - host = api_mtls_endpoint - - # Create SSL credentials with client_cert_source or application - # default SSL credentials. - if client_cert_source: - cert, key = client_cert_source() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - else: - self._ssl_channel_credentials = SslCredentials().ssl_credentials - - else: - if client_cert_source_for_mtls and not ssl_channel_credentials: - cert, key = client_cert_source_for_mtls() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - - # The base transport sets the host, credentials and scopes - super().__init__( - host=host, - credentials=credentials, - credentials_file=credentials_file, - scopes=scopes, - quota_project_id=quota_project_id, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - api_audience=api_audience, - ) - - if not self._grpc_channel: - # initialize with the provided callable or the default channel - channel_init = channel or type(self).create_channel - self._grpc_channel = channel_init( - self._host, - # use the credentials which are saved - credentials=self._credentials, - # Set ``credentials_file`` to ``None`` here as - # the credentials that we saved earlier should be used. - credentials_file=None, - scopes=self._scopes, - ssl_credentials=self._ssl_channel_credentials, - quota_project_id=quota_project_id, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - # Wrap messages. This must be done after self._grpc_channel exists - self._wrap_with_kind = "kind" in inspect.signature(gapic_v1.method_async.wrap_method).parameters - self._prep_wrapped_messages(client_info) - - @property - def grpc_channel(self) -> aio.Channel: - """Create the channel designed to connect to this service. - - This property caches on the instance; repeated calls return - the same channel. - """ - # Return the channel from cache. - return self._grpc_channel - - @property - def operations_client(self) -> operations_v1.OperationsAsyncClient: - """Create the client designed to process long-running operations. - - This property caches on the instance; repeated calls return the same - client. - """ - # Quick check: Only create a new client if we do not already have one. - if self._operations_client is None: - self._operations_client = operations_v1.OperationsAsyncClient( - self.grpc_channel - ) - - # Return the client from cache. - return self._operations_client - - @property - def synthesize_long_audio(self) -> Callable[ - [cloud_tts_lrs.SynthesizeLongAudioRequest], - Awaitable[operations_pb2.Operation]]: - r"""Return a callable for the synthesize long audio method over gRPC. - - Synthesizes long form text asynchronously. - - Returns: - Callable[[~.SynthesizeLongAudioRequest], - Awaitable[~.Operation]]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'synthesize_long_audio' not in self._stubs: - self._stubs['synthesize_long_audio'] = self.grpc_channel.unary_unary( - '/google.cloud.texttospeech.v1.TextToSpeechLongAudioSynthesize/SynthesizeLongAudio', - request_serializer=cloud_tts_lrs.SynthesizeLongAudioRequest.serialize, - response_deserializer=operations_pb2.Operation.FromString, - ) - return self._stubs['synthesize_long_audio'] - - def _prep_wrapped_messages(self, client_info): - """ Precompute the wrapped methods, overriding the base class method to use async wrappers.""" - self._wrapped_methods = { - self.synthesize_long_audio: self._wrap_method( - self.synthesize_long_audio, - default_timeout=5000.0, - client_info=client_info, - ), - self.get_operation: self._wrap_method( - self.get_operation, - default_timeout=None, - client_info=client_info, - ), - self.list_operations: self._wrap_method( - self.list_operations, - default_timeout=None, - client_info=client_info, - ), - } - - def _wrap_method(self, func, *args, **kwargs): - if self._wrap_with_kind: # pragma: NO COVER - kwargs["kind"] = self.kind - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - - def close(self): - return self.grpc_channel.close() - - @property - def kind(self) -> str: - return "grpc_asyncio" - - @property - def get_operation( - self, - ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: - r"""Return a callable for the get_operation method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "get_operation" not in self._stubs: - self._stubs["get_operation"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/GetOperation", - request_serializer=operations_pb2.GetOperationRequest.SerializeToString, - response_deserializer=operations_pb2.Operation.FromString, - ) - return self._stubs["get_operation"] - - @property - def list_operations( - self, - ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: - r"""Return a callable for the list_operations method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "list_operations" not in self._stubs: - self._stubs["list_operations"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/ListOperations", - request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, - response_deserializer=operations_pb2.ListOperationsResponse.FromString, - ) - return self._stubs["list_operations"] - - -__all__ = ( - 'TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py deleted file mode 100644 index e8b0059786af..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py +++ /dev/null @@ -1,509 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# - -from google.auth.transport.requests import AuthorizedSession # type: ignore -import json # type: ignore -from google.auth import credentials as ga_credentials # type: ignore -from google.api_core import exceptions as core_exceptions -from google.api_core import retry as retries -from google.api_core import rest_helpers -from google.api_core import rest_streaming -from google.api_core import gapic_v1 - -from google.protobuf import json_format -from google.api_core import operations_v1 - -from requests import __version__ as requests_version -import dataclasses -from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union -import warnings - - -from google.cloud.texttospeech_v1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore - - -from .rest_base import _BaseTextToSpeechLongAudioSynthesizeRestTransport -from .base import DEFAULT_CLIENT_INFO as BASE_DEFAULT_CLIENT_INFO - -try: - OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] -except AttributeError: # pragma: NO COVER - OptionalRetry = Union[retries.Retry, object, None] # type: ignore - - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, - grpc_version=None, - rest_version=f"requests@{requests_version}", -) - - -class TextToSpeechLongAudioSynthesizeRestInterceptor: - """Interceptor for TextToSpeechLongAudioSynthesize. - - Interceptors are used to manipulate requests, request metadata, and responses - in arbitrary ways. - Example use cases include: - * Logging - * Verifying requests according to service or custom semantics - * Stripping extraneous information from responses - - These use cases and more can be enabled by injecting an - instance of a custom subclass when constructing the TextToSpeechLongAudioSynthesizeRestTransport. - - .. code-block:: python - class MyCustomTextToSpeechLongAudioSynthesizeInterceptor(TextToSpeechLongAudioSynthesizeRestInterceptor): - def pre_synthesize_long_audio(self, request, metadata): - logging.log(f"Received request: {request}") - return request, metadata - - def post_synthesize_long_audio(self, response): - logging.log(f"Received response: {response}") - return response - - transport = TextToSpeechLongAudioSynthesizeRestTransport(interceptor=MyCustomTextToSpeechLongAudioSynthesizeInterceptor()) - client = TextToSpeechLongAudioSynthesizeClient(transport=transport) - - - """ - def pre_synthesize_long_audio(self, request: cloud_tts_lrs.SynthesizeLongAudioRequest, metadata: Sequence[Tuple[str, str]]) -> Tuple[cloud_tts_lrs.SynthesizeLongAudioRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for synthesize_long_audio - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeechLongAudioSynthesize server. - """ - return request, metadata - - def post_synthesize_long_audio(self, response: operations_pb2.Operation) -> operations_pb2.Operation: - """Post-rpc interceptor for synthesize_long_audio - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeechLongAudioSynthesize server but before - it is returned to user code. - """ - return response - - def pre_get_operation( - self, request: operations_pb2.GetOperationRequest, metadata: Sequence[Tuple[str, str]] - ) -> Tuple[operations_pb2.GetOperationRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for get_operation - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeechLongAudioSynthesize server. - """ - return request, metadata - - def post_get_operation( - self, response: operations_pb2.Operation - ) -> operations_pb2.Operation: - """Post-rpc interceptor for get_operation - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeechLongAudioSynthesize server but before - it is returned to user code. - """ - return response - - def pre_list_operations( - self, request: operations_pb2.ListOperationsRequest, metadata: Sequence[Tuple[str, str]] - ) -> Tuple[operations_pb2.ListOperationsRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for list_operations - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeechLongAudioSynthesize server. - """ - return request, metadata - - def post_list_operations( - self, response: operations_pb2.ListOperationsResponse - ) -> operations_pb2.ListOperationsResponse: - """Post-rpc interceptor for list_operations - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeechLongAudioSynthesize server but before - it is returned to user code. - """ - return response - - -@dataclasses.dataclass -class TextToSpeechLongAudioSynthesizeRestStub: - _session: AuthorizedSession - _host: str - _interceptor: TextToSpeechLongAudioSynthesizeRestInterceptor - - -class TextToSpeechLongAudioSynthesizeRestTransport(_BaseTextToSpeechLongAudioSynthesizeRestTransport): - """REST backend synchronous transport for TextToSpeechLongAudioSynthesize. - - Service that implements Google Cloud Text-to-Speech API. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends JSON representations of protocol buffers over HTTP/1.1 - """ - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - client_cert_source_for_mtls: Optional[Callable[[ - ], Tuple[bytes, bytes]]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - url_scheme: str = 'https', - interceptor: Optional[TextToSpeechLongAudioSynthesizeRestInterceptor] = None, - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - - NOTE: This REST transport functionality is currently in a beta - state (preview). We welcome your feedback via a GitHub issue in - this library's repository. Thank you! - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is ignored if ``channel`` is provided. - scopes (Optional(Sequence[str])): A list of scopes. This argument is - ignored if ``channel`` is provided. - client_cert_source_for_mtls (Callable[[], Tuple[bytes, bytes]]): Client - certificate to configure mutual TLS HTTP channel. It is ignored - if ``channel`` is provided. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you are developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - url_scheme: the protocol scheme for the API endpoint. Normally - "https", but for testing or local servers, - "http" can be specified. - """ - # Run the base constructor - # TODO(yon-mg): resolve other ctor params i.e. scopes, quota, etc. - # TODO: When custom host (api_endpoint) is set, `scopes` must *also* be set on the - # credentials object - super().__init__( - host=host, - credentials=credentials, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - url_scheme=url_scheme, - api_audience=api_audience - ) - self._session = AuthorizedSession( - self._credentials, default_host=self.DEFAULT_HOST) - self._operations_client: Optional[operations_v1.AbstractOperationsClient] = None - if client_cert_source_for_mtls: - self._session.configure_mtls_channel(client_cert_source_for_mtls) - self._interceptor = interceptor or TextToSpeechLongAudioSynthesizeRestInterceptor() - self._prep_wrapped_messages(client_info) - - @property - def operations_client(self) -> operations_v1.AbstractOperationsClient: - """Create the client designed to process long-running operations. - - This property caches on the instance; repeated calls return the same - client. - """ - # Only create a new client if we do not already have one. - if self._operations_client is None: - http_options: Dict[str, List[Dict[str, str]]] = { - 'google.longrunning.Operations.GetOperation': [ - { - 'method': 'get', - 'uri': '/v1/{name=projects/*/locations/*/operations/*}', - }, - ], - 'google.longrunning.Operations.ListOperations': [ - { - 'method': 'get', - 'uri': '/v1/{name=projects/*/locations/*}/operations', - }, - ], - } - - rest_transport = operations_v1.OperationsRestTransport( - host=self._host, - # use the credentials which are saved - credentials=self._credentials, - scopes=self._scopes, - http_options=http_options, - path_prefix="v1") - - self._operations_client = operations_v1.AbstractOperationsClient(transport=rest_transport) - - # Return the client from cache. - return self._operations_client - - class _SynthesizeLongAudio(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio, TextToSpeechLongAudioSynthesizeRestStub): - def __hash__(self): - return hash("TextToSpeechLongAudioSynthesizeRestTransport.SynthesizeLongAudio") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - data=body, - ) - return response - - def __call__(self, - request: cloud_tts_lrs.SynthesizeLongAudioRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> operations_pb2.Operation: - r"""Call the synthesize long audio method over HTTP. - - Args: - request (~.cloud_tts_lrs.SynthesizeLongAudioRequest): - The request object. The top-level message sent by the client for the - ``SynthesizeLongAudio`` method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - ~.operations_pb2.Operation: - This resource represents a - long-running operation that is the - result of a network API call. - - """ - - http_options = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_http_options() - request, metadata = self._interceptor.pre_synthesize_long_audio(request, metadata) - transcoded_request = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_transcoded_request(http_options, request) - - body = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_request_body_json(transcoded_request) - - # Jsonify the query params - query_params = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechLongAudioSynthesizeRestTransport._SynthesizeLongAudio._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request, body) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - # Return the response - resp = operations_pb2.Operation() - json_format.Parse(response.content, resp, ignore_unknown_fields=True) - resp = self._interceptor.post_synthesize_long_audio(resp) - return resp - - @property - def synthesize_long_audio(self) -> Callable[ - [cloud_tts_lrs.SynthesizeLongAudioRequest], - operations_pb2.Operation]: - # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. - # In C++ this would require a dynamic_cast - return self._SynthesizeLongAudio(self._session, self._host, self._interceptor) # type: ignore - - @property - def get_operation(self): - return self._GetOperation(self._session, self._host, self._interceptor) # type: ignore - - class _GetOperation(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation, TextToSpeechLongAudioSynthesizeRestStub): - def __hash__(self): - return hash("TextToSpeechLongAudioSynthesizeRestTransport.GetOperation") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - ) - return response - - def __call__(self, - request: operations_pb2.GetOperationRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> operations_pb2.Operation: - - r"""Call the get operation method over HTTP. - - Args: - request (operations_pb2.GetOperationRequest): - The request object for GetOperation method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - operations_pb2.Operation: Response from GetOperation method. - """ - - http_options = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation._get_http_options() - request, metadata = self._interceptor.pre_get_operation(request, metadata) - transcoded_request = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation._get_transcoded_request(http_options, request) - - # Jsonify the query params - query_params = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechLongAudioSynthesizeRestTransport._GetOperation._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - content = response.content.decode("utf-8") - resp = operations_pb2.Operation() - resp = json_format.Parse(content, resp) - resp = self._interceptor.post_get_operation(resp) - return resp - - @property - def list_operations(self): - return self._ListOperations(self._session, self._host, self._interceptor) # type: ignore - - class _ListOperations(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations, TextToSpeechLongAudioSynthesizeRestStub): - def __hash__(self): - return hash("TextToSpeechLongAudioSynthesizeRestTransport.ListOperations") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - ) - return response - - def __call__(self, - request: operations_pb2.ListOperationsRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> operations_pb2.ListOperationsResponse: - - r"""Call the list operations method over HTTP. - - Args: - request (operations_pb2.ListOperationsRequest): - The request object for ListOperations method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - operations_pb2.ListOperationsResponse: Response from ListOperations method. - """ - - http_options = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations._get_http_options() - request, metadata = self._interceptor.pre_list_operations(request, metadata) - transcoded_request = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations._get_transcoded_request(http_options, request) - - # Jsonify the query params - query_params = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechLongAudioSynthesizeRestTransport._ListOperations._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - content = response.content.decode("utf-8") - resp = operations_pb2.ListOperationsResponse() - resp = json_format.Parse(content, resp) - resp = self._interceptor.post_list_operations(resp) - return resp - - @property - def kind(self) -> str: - return "rest" - - def close(self): - self._session.close() - - -__all__=( - 'TextToSpeechLongAudioSynthesizeRestTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py deleted file mode 100644 index 8859c1b35e44..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py +++ /dev/null @@ -1,188 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 json # type: ignore -from google.api_core import path_template -from google.api_core import gapic_v1 - -from google.protobuf import json_format -from .base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO - -import re -from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union - - -from google.cloud.texttospeech_v1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore - - -class _BaseTextToSpeechLongAudioSynthesizeRestTransport(TextToSpeechLongAudioSynthesizeTransport): - """Base REST backend transport for TextToSpeechLongAudioSynthesize. - - Note: This class is not meant to be used directly. Use its sync and - async sub-classes instead. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends JSON representations of protocol buffers over HTTP/1.1 - """ - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[Any] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - url_scheme: str = 'https', - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[Any]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you are developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - url_scheme: the protocol scheme for the API endpoint. Normally - "https", but for testing or local servers, - "http" can be specified. - """ - # Run the base constructor - maybe_url_match = re.match("^(?Phttp(?:s)?://)?(?P.*)$", host) - if maybe_url_match is None: - raise ValueError(f"Unexpected hostname structure: {host}") # pragma: NO COVER - - url_match_items = maybe_url_match.groupdict() - - host = f"{url_scheme}://{host}" if not url_match_items["scheme"] else host - - super().__init__( - host=host, - credentials=credentials, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - api_audience=api_audience - ) - - class _BaseSynthesizeLongAudio: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = { - } - - @classmethod - def _get_unset_required_fields(cls, message_dict): - return {k: v for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() if k not in message_dict} - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'post', - 'uri': '/v1/{parent=projects/*/locations/*}:synthesizeLongAudio', - 'body': '*', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - pb_request = cloud_tts_lrs.SynthesizeLongAudioRequest.pb(request) - transcoded_request = path_template.transcode(http_options, pb_request) - return transcoded_request - - @staticmethod - def _get_request_body_json(transcoded_request): - # Jsonify the request body - - body = json_format.MessageToJson( - transcoded_request['body'], - use_integers_for_enums=False - ) - return body - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json_format.MessageToJson( - transcoded_request['query_params'], - use_integers_for_enums=False, - )) - query_params.update(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_unset_required_fields(query_params)) - - return query_params - - class _BaseGetOperation: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'get', - 'uri': '/v1/{name=projects/*/locations/*/operations/*}', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - request_kwargs = json_format.MessageToDict(request) - transcoded_request = path_template.transcode( - http_options, **request_kwargs) - return transcoded_request - - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json.dumps(transcoded_request['query_params'])) - return query_params - - class _BaseListOperations: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'get', - 'uri': '/v1/{name=projects/*/locations/*}/operations', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - request_kwargs = json_format.MessageToDict(request) - transcoded_request = path_template.transcode( - http_options, **request_kwargs) - return transcoded_request - - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json.dumps(transcoded_request['query_params'])) - return query_params - - -__all__=( - '_BaseTextToSpeechLongAudioSynthesizeRestTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/__init__.py deleted file mode 100644 index 2af1e44bc6c6..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/__init__.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from .cloud_tts import ( - AdvancedVoiceOptions, - AudioConfig, - CustomPronunciationParams, - CustomPronunciations, - CustomVoiceParams, - ListVoicesRequest, - ListVoicesResponse, - StreamingSynthesisInput, - StreamingSynthesizeConfig, - StreamingSynthesizeRequest, - StreamingSynthesizeResponse, - SynthesisInput, - SynthesizeSpeechRequest, - SynthesizeSpeechResponse, - Voice, - VoiceCloneParams, - VoiceSelectionParams, - AudioEncoding, - SsmlVoiceGender, -) -from .cloud_tts_lrs import ( - SynthesizeLongAudioMetadata, - SynthesizeLongAudioRequest, - SynthesizeLongAudioResponse, -) - -__all__ = ( - 'AdvancedVoiceOptions', - 'AudioConfig', - 'CustomPronunciationParams', - 'CustomPronunciations', - 'CustomVoiceParams', - 'ListVoicesRequest', - 'ListVoicesResponse', - 'StreamingSynthesisInput', - 'StreamingSynthesizeConfig', - 'StreamingSynthesizeRequest', - 'StreamingSynthesizeResponse', - 'SynthesisInput', - 'SynthesizeSpeechRequest', - 'SynthesizeSpeechResponse', - 'Voice', - 'VoiceCloneParams', - 'VoiceSelectionParams', - 'AudioEncoding', - 'SsmlVoiceGender', - 'SynthesizeLongAudioMetadata', - 'SynthesizeLongAudioRequest', - 'SynthesizeLongAudioResponse', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts.py deleted file mode 100644 index dd8938a27c81..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts.py +++ /dev/null @@ -1,713 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from __future__ import annotations - -from typing import MutableMapping, MutableSequence - -import proto # type: ignore - - -__protobuf__ = proto.module( - package='google.cloud.texttospeech.v1', - manifest={ - 'SsmlVoiceGender', - 'AudioEncoding', - 'ListVoicesRequest', - 'ListVoicesResponse', - 'Voice', - 'AdvancedVoiceOptions', - 'SynthesizeSpeechRequest', - 'CustomPronunciationParams', - 'CustomPronunciations', - 'SynthesisInput', - 'VoiceSelectionParams', - 'AudioConfig', - 'CustomVoiceParams', - 'VoiceCloneParams', - 'SynthesizeSpeechResponse', - 'StreamingSynthesizeConfig', - 'StreamingSynthesisInput', - 'StreamingSynthesizeRequest', - 'StreamingSynthesizeResponse', - }, -) - - -class SsmlVoiceGender(proto.Enum): - r"""Gender of the voice as described in `SSML voice - element `__. - - Values: - SSML_VOICE_GENDER_UNSPECIFIED (0): - An unspecified gender. - In VoiceSelectionParams, this means that the - client doesn't care which gender the selected - voice will have. In the Voice field of - ListVoicesResponse, this may mean that the voice - doesn't fit any of the other categories in this - enum, or that the gender of the voice isn't - known. - MALE (1): - A male voice. - FEMALE (2): - A female voice. - NEUTRAL (3): - A gender-neutral voice. This voice is not yet - supported. - """ - SSML_VOICE_GENDER_UNSPECIFIED = 0 - MALE = 1 - FEMALE = 2 - NEUTRAL = 3 - - -class AudioEncoding(proto.Enum): - r"""Configuration to set up audio encoder. The encoding - determines the output audio format that we'd like. - - Values: - AUDIO_ENCODING_UNSPECIFIED (0): - Not specified. Will return result - [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. - LINEAR16 (1): - Uncompressed 16-bit signed little-endian - samples (Linear PCM). Audio content returned as - LINEAR16 also contains a WAV header. - MP3 (2): - MP3 audio at 32kbps. - OGG_OPUS (3): - Opus encoded audio wrapped in an ogg - container. The result will be a file which can - be played natively on Android, and in browsers - (at least Chrome and Firefox). The quality of - the encoding is considerably higher than MP3 - while using approximately the same bitrate. - MULAW (5): - 8-bit samples that compand 14-bit audio - samples using G.711 PCMU/mu-law. Audio content - returned as MULAW also contains a WAV header. - ALAW (6): - 8-bit samples that compand 14-bit audio - samples using G.711 PCMU/A-law. Audio content - returned as ALAW also contains a WAV header. - """ - AUDIO_ENCODING_UNSPECIFIED = 0 - LINEAR16 = 1 - MP3 = 2 - OGG_OPUS = 3 - MULAW = 5 - ALAW = 6 - - -class ListVoicesRequest(proto.Message): - r"""The top-level message sent by the client for the ``ListVoices`` - method. - - Attributes: - language_code (str): - Optional. Recommended. - `BCP-47 `__ - language tag. If not specified, the API will return all - supported voices. If specified, the ListVoices call will - only return voices that can be used to synthesize this - language_code. For example, if you specify ``"en-NZ"``, all - ``"en-NZ"`` voices will be returned. If you specify - ``"no"``, both ``"no-\*"`` (Norwegian) and ``"nb-\*"`` - (Norwegian Bokmal) voices will be returned. - """ - - language_code: str = proto.Field( - proto.STRING, - number=1, - ) - - -class ListVoicesResponse(proto.Message): - r"""The message returned to the client by the ``ListVoices`` method. - - Attributes: - voices (MutableSequence[google.cloud.texttospeech_v1.types.Voice]): - The list of voices. - """ - - voices: MutableSequence['Voice'] = proto.RepeatedField( - proto.MESSAGE, - number=1, - message='Voice', - ) - - -class Voice(proto.Message): - r"""Description of a voice supported by the TTS service. - - Attributes: - language_codes (MutableSequence[str]): - The languages that this voice supports, expressed as - `BCP-47 `__ - language tags (e.g. "en-US", "es-419", "cmn-tw"). - name (str): - The name of this voice. Each distinct voice - has a unique name. - ssml_gender (google.cloud.texttospeech_v1.types.SsmlVoiceGender): - The gender of this voice. - natural_sample_rate_hertz (int): - The natural sample rate (in hertz) for this - voice. - """ - - language_codes: MutableSequence[str] = proto.RepeatedField( - proto.STRING, - number=1, - ) - name: str = proto.Field( - proto.STRING, - number=2, - ) - ssml_gender: 'SsmlVoiceGender' = proto.Field( - proto.ENUM, - number=3, - enum='SsmlVoiceGender', - ) - natural_sample_rate_hertz: int = proto.Field( - proto.INT32, - number=4, - ) - - -class AdvancedVoiceOptions(proto.Message): - r"""Used for advanced voice options. - - .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields - - Attributes: - low_latency_journey_synthesis (bool): - Only for Journey voices. If false, the - synthesis will be context aware and have higher - latency. - - This field is a member of `oneof`_ ``_low_latency_journey_synthesis``. - """ - - low_latency_journey_synthesis: bool = proto.Field( - proto.BOOL, - number=1, - optional=True, - ) - - -class SynthesizeSpeechRequest(proto.Message): - r"""The top-level message sent by the client for the - ``SynthesizeSpeech`` method. - - - .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields - - Attributes: - input (google.cloud.texttospeech_v1.types.SynthesisInput): - Required. The Synthesizer requires either - plain text or SSML as input. - voice (google.cloud.texttospeech_v1.types.VoiceSelectionParams): - Required. The desired voice of the - synthesized audio. - audio_config (google.cloud.texttospeech_v1.types.AudioConfig): - Required. The configuration of the - synthesized audio. - advanced_voice_options (google.cloud.texttospeech_v1.types.AdvancedVoiceOptions): - Advanced voice options. - - This field is a member of `oneof`_ ``_advanced_voice_options``. - """ - - input: 'SynthesisInput' = proto.Field( - proto.MESSAGE, - number=1, - message='SynthesisInput', - ) - voice: 'VoiceSelectionParams' = proto.Field( - proto.MESSAGE, - number=2, - message='VoiceSelectionParams', - ) - audio_config: 'AudioConfig' = proto.Field( - proto.MESSAGE, - number=3, - message='AudioConfig', - ) - advanced_voice_options: 'AdvancedVoiceOptions' = proto.Field( - proto.MESSAGE, - number=8, - optional=True, - message='AdvancedVoiceOptions', - ) - - -class CustomPronunciationParams(proto.Message): - r"""Pronunciation customization for a phrase. - - .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields - - Attributes: - phrase (str): - The phrase to which the customization will be - applied. The phrase can be multiple words (in - the case of proper nouns etc), but should not - span to a whole sentence. - - This field is a member of `oneof`_ ``_phrase``. - phonetic_encoding (google.cloud.texttospeech_v1.types.CustomPronunciationParams.PhoneticEncoding): - The phonetic encoding of the phrase. - - This field is a member of `oneof`_ ``_phonetic_encoding``. - pronunciation (str): - The pronunciation of the phrase. This must be - in the phonetic encoding specified above. - - This field is a member of `oneof`_ ``_pronunciation``. - """ - class PhoneticEncoding(proto.Enum): - r"""The phonetic encoding of the phrase. - - Values: - PHONETIC_ENCODING_UNSPECIFIED (0): - Not specified. - PHONETIC_ENCODING_IPA (1): - IPA. (e.g. apple -> ˈæpəl ) - https://en.wikipedia.org/wiki/International_Phonetic_Alphabet - PHONETIC_ENCODING_X_SAMPA (2): - X-SAMPA (e.g. apple -> "{p@l" ) - https://en.wikipedia.org/wiki/X-SAMPA - """ - PHONETIC_ENCODING_UNSPECIFIED = 0 - PHONETIC_ENCODING_IPA = 1 - PHONETIC_ENCODING_X_SAMPA = 2 - - phrase: str = proto.Field( - proto.STRING, - number=1, - optional=True, - ) - phonetic_encoding: PhoneticEncoding = proto.Field( - proto.ENUM, - number=2, - optional=True, - enum=PhoneticEncoding, - ) - pronunciation: str = proto.Field( - proto.STRING, - number=3, - optional=True, - ) - - -class CustomPronunciations(proto.Message): - r"""A collection of pronunciation customizations. - - Attributes: - pronunciations (MutableSequence[google.cloud.texttospeech_v1.types.CustomPronunciationParams]): - The pronunciation customizations to be - applied. - """ - - pronunciations: MutableSequence['CustomPronunciationParams'] = proto.RepeatedField( - proto.MESSAGE, - number=1, - message='CustomPronunciationParams', - ) - - -class SynthesisInput(proto.Message): - r"""Contains text input to be synthesized. Either ``text`` or ``ssml`` - must be supplied. Supplying both or neither returns - [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. - The input size is limited to 5000 bytes. - - This message has `oneof`_ fields (mutually exclusive fields). - For each oneof, at most one member field can be set at the same time. - Setting any member of the oneof automatically clears all other - members. - - .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields - - Attributes: - text (str): - The raw text to be synthesized. - - This field is a member of `oneof`_ ``input_source``. - ssml (str): - The SSML document to be synthesized. The SSML document must - be valid and well-formed. Otherwise the RPC will fail and - return - [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. - For more information, see - `SSML `__. - - This field is a member of `oneof`_ ``input_source``. - custom_pronunciations (google.cloud.texttospeech_v1.types.CustomPronunciations): - Optional. The pronunciation customizations to - be applied to the input. If this is set, the - input will be synthesized using the given - pronunciation customizations. - - The initial support will be for EFIGS (English, - French, Italian, German, Spanish) languages, as - provided in VoiceSelectionParams. Journey and - Instant Clone voices are not supported yet. - - In order to customize the pronunciation of a - phrase, there must be an exact match of the - phrase in the input types. If using SSML, the - phrase must not be inside a phoneme tag - (entirely or partially). - """ - - text: str = proto.Field( - proto.STRING, - number=1, - oneof='input_source', - ) - ssml: str = proto.Field( - proto.STRING, - number=2, - oneof='input_source', - ) - custom_pronunciations: 'CustomPronunciations' = proto.Field( - proto.MESSAGE, - number=3, - message='CustomPronunciations', - ) - - -class VoiceSelectionParams(proto.Message): - r"""Description of which voice to use for a synthesis request. - - Attributes: - language_code (str): - Required. The language (and potentially also the region) of - the voice expressed as a - `BCP-47 `__ - language tag, e.g. "en-US". This should not include a script - tag (e.g. use "cmn-cn" rather than "cmn-Hant-cn"), because - the script will be inferred from the input provided in the - SynthesisInput. The TTS service will use this parameter to - help choose an appropriate voice. Note that the TTS service - may choose a voice with a slightly different language code - than the one selected; it may substitute a different region - (e.g. using en-US rather than en-CA if there isn't a - Canadian voice available), or even a different language, - e.g. using "nb" (Norwegian Bokmal) instead of "no" - (Norwegian)". - name (str): - The name of the voice. If both the name and the gender are - not set, the service will choose a voice based on the other - parameters such as language_code. - ssml_gender (google.cloud.texttospeech_v1.types.SsmlVoiceGender): - The preferred gender of the voice. If not set, the service - will choose a voice based on the other parameters such as - language_code and name. Note that this is only a preference, - not requirement; if a voice of the appropriate gender is not - available, the synthesizer should substitute a voice with a - different gender rather than failing the request. - custom_voice (google.cloud.texttospeech_v1.types.CustomVoiceParams): - The configuration for a custom voice. If - [CustomVoiceParams.model] is set, the service will choose - the custom voice matching the specified configuration. - voice_clone (google.cloud.texttospeech_v1.types.VoiceCloneParams): - Optional. The configuration for a voice clone. If - [VoiceCloneParams.voice_clone_key] is set, the service will - choose the voice clone matching the specified configuration. - """ - - language_code: str = proto.Field( - proto.STRING, - number=1, - ) - name: str = proto.Field( - proto.STRING, - number=2, - ) - ssml_gender: 'SsmlVoiceGender' = proto.Field( - proto.ENUM, - number=3, - enum='SsmlVoiceGender', - ) - custom_voice: 'CustomVoiceParams' = proto.Field( - proto.MESSAGE, - number=4, - message='CustomVoiceParams', - ) - voice_clone: 'VoiceCloneParams' = proto.Field( - proto.MESSAGE, - number=5, - message='VoiceCloneParams', - ) - - -class AudioConfig(proto.Message): - r"""Description of audio data to be synthesized. - - Attributes: - audio_encoding (google.cloud.texttospeech_v1.types.AudioEncoding): - Required. The format of the audio byte - stream. - speaking_rate (float): - Optional. Input only. Speaking rate/speed, in the range - [0.25, 4.0]. 1.0 is the normal native speed supported by the - specific voice. 2.0 is twice as fast, and 0.5 is half as - fast. If unset(0.0), defaults to the native 1.0 speed. Any - other values < 0.25 or > 4.0 will return an error. - pitch (float): - Optional. Input only. Speaking pitch, in the range [-20.0, - 20.0]. 20 means increase 20 semitones from the original - pitch. -20 means decrease 20 semitones from the original - pitch. - volume_gain_db (float): - Optional. Input only. Volume gain (in dB) of the normal - native volume supported by the specific voice, in the range - [-96.0, 16.0]. If unset, or set to a value of 0.0 (dB), will - play at normal native signal amplitude. A value of -6.0 (dB) - will play at approximately half the amplitude of the normal - native signal amplitude. A value of +6.0 (dB) will play at - approximately twice the amplitude of the normal native - signal amplitude. Strongly recommend not to exceed +10 (dB) - as there's usually no effective increase in loudness for any - value greater than that. - sample_rate_hertz (int): - Optional. The synthesis sample rate (in hertz) for this - audio. When this is specified in SynthesizeSpeechRequest, if - this is different from the voice's natural sample rate, then - the synthesizer will honor this request by converting to the - desired sample rate (which might result in worse audio - quality), unless the specified sample rate is not supported - for the encoding chosen, in which case it will fail the - request and return - [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. - effects_profile_id (MutableSequence[str]): - Optional. Input only. An identifier which selects 'audio - effects' profiles that are applied on (post synthesized) - text to speech. Effects are applied on top of each other in - the order they are given. See `audio - profiles `__ - for current supported profile ids. - """ - - audio_encoding: 'AudioEncoding' = proto.Field( - proto.ENUM, - number=1, - enum='AudioEncoding', - ) - speaking_rate: float = proto.Field( - proto.DOUBLE, - number=2, - ) - pitch: float = proto.Field( - proto.DOUBLE, - number=3, - ) - volume_gain_db: float = proto.Field( - proto.DOUBLE, - number=4, - ) - sample_rate_hertz: int = proto.Field( - proto.INT32, - number=5, - ) - effects_profile_id: MutableSequence[str] = proto.RepeatedField( - proto.STRING, - number=6, - ) - - -class CustomVoiceParams(proto.Message): - r"""Description of the custom voice to be synthesized. - - Attributes: - model (str): - Required. The name of the AutoML model that - synthesizes the custom voice. - reported_usage (google.cloud.texttospeech_v1.types.CustomVoiceParams.ReportedUsage): - Optional. Deprecated. The usage of the - synthesized audio to be reported. - """ - class ReportedUsage(proto.Enum): - r"""Deprecated. The usage of the synthesized audio. Usage does - not affect billing. - - Values: - REPORTED_USAGE_UNSPECIFIED (0): - Request with reported usage unspecified will - be rejected. - REALTIME (1): - For scenarios where the synthesized audio is - not downloadable and can only be used once. For - example, real-time request in IVR system. - OFFLINE (2): - For scenarios where the synthesized audio is - downloadable and can be reused. For example, the - synthesized audio is downloaded, stored in - customer service system and played repeatedly. - """ - REPORTED_USAGE_UNSPECIFIED = 0 - REALTIME = 1 - OFFLINE = 2 - - model: str = proto.Field( - proto.STRING, - number=1, - ) - reported_usage: ReportedUsage = proto.Field( - proto.ENUM, - number=3, - enum=ReportedUsage, - ) - - -class VoiceCloneParams(proto.Message): - r"""The configuration of Voice Clone feature. - - Attributes: - voice_cloning_key (str): - Required. Created by GenerateVoiceCloningKey. - """ - - voice_cloning_key: str = proto.Field( - proto.STRING, - number=1, - ) - - -class SynthesizeSpeechResponse(proto.Message): - r"""The message returned to the client by the ``SynthesizeSpeech`` - method. - - Attributes: - audio_content (bytes): - The audio data bytes encoded as specified in the request, - including the header for encodings that are wrapped in - containers (e.g. MP3, OGG_OPUS). For LINEAR16 audio, we - include the WAV header. Note: as with all bytes fields, - protobuffers use a pure binary representation, whereas JSON - representations use base64. - """ - - audio_content: bytes = proto.Field( - proto.BYTES, - number=1, - ) - - -class StreamingSynthesizeConfig(proto.Message): - r"""Provides configuration information for the - StreamingSynthesize request. - - Attributes: - voice (google.cloud.texttospeech_v1.types.VoiceSelectionParams): - Required. The desired voice of the - synthesized audio. - """ - - voice: 'VoiceSelectionParams' = proto.Field( - proto.MESSAGE, - number=1, - message='VoiceSelectionParams', - ) - - -class StreamingSynthesisInput(proto.Message): - r"""Input to be synthesized. - - .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields - - Attributes: - text (str): - The raw text to be synthesized. It is - recommended that each input contains complete, - terminating sentences, as this will likely - result in better prosody in the output audio. - That being said, users are free to input text - however they please. - - This field is a member of `oneof`_ ``input_source``. - """ - - text: str = proto.Field( - proto.STRING, - number=1, - oneof='input_source', - ) - - -class StreamingSynthesizeRequest(proto.Message): - r"""Request message for the ``StreamingSynthesize`` method. Multiple - ``StreamingSynthesizeRequest`` messages are sent in one call. The - first message must contain a ``streaming_config`` that fully - specifies the request configuration and must not contain ``input``. - All subsequent messages must only have ``input`` set. - - This message has `oneof`_ fields (mutually exclusive fields). - For each oneof, at most one member field can be set at the same time. - Setting any member of the oneof automatically clears all other - members. - - .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields - - Attributes: - streaming_config (google.cloud.texttospeech_v1.types.StreamingSynthesizeConfig): - StreamingSynthesizeConfig to be used in this streaming - attempt. Only specified in the first message sent in a - ``StreamingSynthesize`` call. - - This field is a member of `oneof`_ ``streaming_request``. - input (google.cloud.texttospeech_v1.types.StreamingSynthesisInput): - Input to synthesize. Specified in all messages but the first - in a ``StreamingSynthesize`` call. - - This field is a member of `oneof`_ ``streaming_request``. - """ - - streaming_config: 'StreamingSynthesizeConfig' = proto.Field( - proto.MESSAGE, - number=1, - oneof='streaming_request', - message='StreamingSynthesizeConfig', - ) - input: 'StreamingSynthesisInput' = proto.Field( - proto.MESSAGE, - number=2, - oneof='streaming_request', - message='StreamingSynthesisInput', - ) - - -class StreamingSynthesizeResponse(proto.Message): - r"""``StreamingSynthesizeResponse`` is the only message returned to the - client by ``StreamingSynthesize`` method. A series of zero or more - ``StreamingSynthesizeResponse`` messages are streamed back to the - client. - - Attributes: - audio_content (bytes): - The audio data bytes encoded as specified in - the request. This is headerless LINEAR16 audio - with a sample rate of 24000. - """ - - audio_content: bytes = proto.Field( - proto.BYTES, - number=1, - ) - - -__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts_lrs.py b/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts_lrs.py deleted file mode 100644 index ba1d8809c246..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/google/cloud/texttospeech_v1/types/cloud_tts_lrs.py +++ /dev/null @@ -1,122 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from __future__ import annotations - -from typing import MutableMapping, MutableSequence - -import proto # type: ignore - -from google.cloud.texttospeech_v1.types import cloud_tts -from google.protobuf import timestamp_pb2 # type: ignore - - -__protobuf__ = proto.module( - package='google.cloud.texttospeech.v1', - manifest={ - 'SynthesizeLongAudioRequest', - 'SynthesizeLongAudioResponse', - 'SynthesizeLongAudioMetadata', - }, -) - - -class SynthesizeLongAudioRequest(proto.Message): - r"""The top-level message sent by the client for the - ``SynthesizeLongAudio`` method. - - Attributes: - parent (str): - The resource states of the request in the form of - ``projects/*/locations/*``. - input (google.cloud.texttospeech_v1.types.SynthesisInput): - Required. The Synthesizer requires either - plain text or SSML as input. - audio_config (google.cloud.texttospeech_v1.types.AudioConfig): - Required. The configuration of the - synthesized audio. - output_gcs_uri (str): - Required. Specifies a Cloud Storage URI for the synthesis - results. Must be specified in the format: - ``gs://bucket_name/object_name``, and the bucket must - already exist. - voice (google.cloud.texttospeech_v1.types.VoiceSelectionParams): - Required. The desired voice of the - synthesized audio. - """ - - parent: str = proto.Field( - proto.STRING, - number=1, - ) - input: cloud_tts.SynthesisInput = proto.Field( - proto.MESSAGE, - number=2, - message=cloud_tts.SynthesisInput, - ) - audio_config: cloud_tts.AudioConfig = proto.Field( - proto.MESSAGE, - number=3, - message=cloud_tts.AudioConfig, - ) - output_gcs_uri: str = proto.Field( - proto.STRING, - number=4, - ) - voice: cloud_tts.VoiceSelectionParams = proto.Field( - proto.MESSAGE, - number=5, - message=cloud_tts.VoiceSelectionParams, - ) - - -class SynthesizeLongAudioResponse(proto.Message): - r"""The message returned to the client by the ``SynthesizeLongAudio`` - method. - - """ - - -class SynthesizeLongAudioMetadata(proto.Message): - r"""Metadata for response returned by the ``SynthesizeLongAudio`` - method. - - Attributes: - start_time (google.protobuf.timestamp_pb2.Timestamp): - Time when the request was received. - last_update_time (google.protobuf.timestamp_pb2.Timestamp): - Deprecated. Do not use. - progress_percentage (float): - The progress of the most recent processing - update in percentage, ie. 70.0%. - """ - - start_time: timestamp_pb2.Timestamp = proto.Field( - proto.MESSAGE, - number=1, - message=timestamp_pb2.Timestamp, - ) - last_update_time: timestamp_pb2.Timestamp = proto.Field( - proto.MESSAGE, - number=2, - message=timestamp_pb2.Timestamp, - ) - progress_percentage: float = proto.Field( - proto.DOUBLE, - number=3, - ) - - -__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/mypy.ini b/owl-bot-staging/google-cloud-texttospeech/v1/mypy.ini deleted file mode 100644 index 574c5aed394b..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/mypy.ini +++ /dev/null @@ -1,3 +0,0 @@ -[mypy] -python_version = 3.7 -namespace_packages = True diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/noxfile.py b/owl-bot-staging/google-cloud-texttospeech/v1/noxfile.py deleted file mode 100644 index bb238d6c6872..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/noxfile.py +++ /dev/null @@ -1,280 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 pathlib -import re -import shutil -import subprocess -import sys - - -import nox # type: ignore - -ALL_PYTHON = [ - "3.7", - "3.8", - "3.9", - "3.10", - "3.11", - "3.12", - "3.13", -] - -CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() - -LOWER_BOUND_CONSTRAINTS_FILE = CURRENT_DIRECTORY / "constraints.txt" -PACKAGE_NAME = 'google-cloud-texttospeech' - -BLACK_VERSION = "black==22.3.0" -BLACK_PATHS = ["docs", "google", "tests", "samples", "noxfile.py", "setup.py"] -DEFAULT_PYTHON_VERSION = "3.13" - -nox.sessions = [ - "unit", - "cover", - "mypy", - "check_lower_bounds" - # exclude update_lower_bounds from default - "docs", - "blacken", - "lint", - "prerelease_deps", -] - -@nox.session(python=ALL_PYTHON) -@nox.parametrize( - "protobuf_implementation", - [ "python", "upb", "cpp" ], -) -def unit(session, protobuf_implementation): - """Run the unit test suite.""" - - if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): - session.skip("cpp implementation is not supported in python 3.11+") - - session.install('coverage', 'pytest', 'pytest-cov', 'pytest-asyncio', 'asyncmock; python_version < "3.8"') - session.install('-e', '.', "-c", f"testing/constraints-{session.python}.txt") - - # Remove the 'cpp' implementation once support for Protobuf 3.x is dropped. - # The 'cpp' implementation requires Protobuf<4. - if protobuf_implementation == "cpp": - session.install("protobuf<4") - - session.run( - 'py.test', - '--quiet', - '--cov=google/cloud/texttospeech_v1/', - '--cov=tests/', - '--cov-config=.coveragerc', - '--cov-report=term', - '--cov-report=html', - os.path.join('tests', 'unit', ''.join(session.posargs)), - env={ - "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, - }, - ) - -@nox.session(python=ALL_PYTHON[-1]) -@nox.parametrize( - "protobuf_implementation", - [ "python", "upb", "cpp" ], -) -def prerelease_deps(session, protobuf_implementation): - """Run the unit test suite against pre-release versions of dependencies.""" - - if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): - session.skip("cpp implementation is not supported in python 3.11+") - - # Install test environment dependencies - session.install('coverage', 'pytest', 'pytest-cov', 'pytest-asyncio', 'asyncmock; python_version < "3.8"') - - # Install the package without dependencies - session.install('-e', '.', '--no-deps') - - # We test the minimum dependency versions using the minimum Python - # version so the lowest python runtime that we test has a corresponding constraints - # file, located at `testing/constraints--.txt`, which contains all of the - # dependencies and extras. - with open( - CURRENT_DIRECTORY - / "testing" - / f"constraints-{ALL_PYTHON[0]}.txt", - encoding="utf-8", - ) as constraints_file: - constraints_text = constraints_file.read() - - # Ignore leading whitespace and comment lines. - constraints_deps = [ - match.group(1) - for match in re.finditer( - r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE - ) - ] - - session.install(*constraints_deps) - - prerel_deps = [ - "googleapis-common-protos", - "google-api-core", - "google-auth", - # Exclude grpcio!=1.67.0rc1 which does not support python 3.13 - "grpcio!=1.67.0rc1", - "grpcio-status", - "protobuf", - "proto-plus", - ] - - for dep in prerel_deps: - session.install("--pre", "--no-deps", "--upgrade", dep) - - # Remaining dependencies - other_deps = [ - "requests", - ] - session.install(*other_deps) - - # Print out prerelease package versions - - session.run("python", "-c", "import google.api_core; print(google.api_core.__version__)") - session.run("python", "-c", "import google.auth; print(google.auth.__version__)") - session.run("python", "-c", "import grpc; print(grpc.__version__)") - session.run( - "python", "-c", "import google.protobuf; print(google.protobuf.__version__)" - ) - session.run( - "python", "-c", "import proto; print(proto.__version__)" - ) - - session.run( - 'py.test', - '--quiet', - '--cov=google/cloud/texttospeech_v1/', - '--cov=tests/', - '--cov-config=.coveragerc', - '--cov-report=term', - '--cov-report=html', - os.path.join('tests', 'unit', ''.join(session.posargs)), - env={ - "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, - }, - ) - - -@nox.session(python=DEFAULT_PYTHON_VERSION) -def cover(session): - """Run the final coverage report. - This outputs the coverage report aggregating coverage from the unit - test runs (not system test runs), and then erases coverage data. - """ - session.install("coverage", "pytest-cov") - session.run("coverage", "report", "--show-missing", "--fail-under=100") - - session.run("coverage", "erase") - - -@nox.session(python=ALL_PYTHON) -def mypy(session): - """Run the type checker.""" - session.install( - 'mypy', - 'types-requests', - 'types-protobuf' - ) - session.install('.') - session.run( - 'mypy', - '-p', - 'google', - ) - - -@nox.session -def update_lower_bounds(session): - """Update lower bounds in constraints.txt to match setup.py""" - session.install('google-cloud-testutils') - session.install('.') - - session.run( - 'lower-bound-checker', - 'update', - '--package-name', - PACKAGE_NAME, - '--constraints-file', - str(LOWER_BOUND_CONSTRAINTS_FILE), - ) - - -@nox.session -def check_lower_bounds(session): - """Check lower bounds in setup.py are reflected in constraints file""" - session.install('google-cloud-testutils') - session.install('.') - - session.run( - 'lower-bound-checker', - 'check', - '--package-name', - PACKAGE_NAME, - '--constraints-file', - str(LOWER_BOUND_CONSTRAINTS_FILE), - ) - -@nox.session(python=DEFAULT_PYTHON_VERSION) -def docs(session): - """Build the docs for this library.""" - - session.install("-e", ".") - session.install("sphinx==7.0.1", "alabaster", "recommonmark") - - shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True) - session.run( - "sphinx-build", - "-W", # warnings as errors - "-T", # show full traceback on exception - "-N", # no colors - "-b", - "html", - "-d", - os.path.join("docs", "_build", "doctrees", ""), - os.path.join("docs", ""), - os.path.join("docs", "_build", "html", ""), - ) - - -@nox.session(python=DEFAULT_PYTHON_VERSION) -def lint(session): - """Run linters. - - Returns a failure if the linters find linting errors or sufficiently - serious code quality issues. - """ - session.install("flake8", BLACK_VERSION) - session.run( - "black", - "--check", - *BLACK_PATHS, - ) - session.run("flake8", "google", "tests", "samples") - - -@nox.session(python=DEFAULT_PYTHON_VERSION) -def blacken(session): - """Run black. Format code to uniform standard.""" - session.install(BLACK_VERSION) - session.run( - "black", - *BLACK_PATHS, - ) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json deleted file mode 100644 index f87785fcdd45..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json +++ /dev/null @@ -1,659 +0,0 @@ -{ - "clientLibrary": { - "apis": [ - { - "id": "google.cloud.texttospeech.v1", - "version": "v1" - } - ], - "language": "PYTHON", - "name": "google-cloud-texttospeech", - "version": "0.1.0" - }, - "snippets": [ - { - "canonical": true, - "clientMethod": { - "async": true, - "client": { - "fullName": "google.cloud.texttospeech_v1.TextToSpeechLongAudioSynthesizeAsyncClient", - "shortName": "TextToSpeechLongAudioSynthesizeAsyncClient" - }, - "fullName": "google.cloud.texttospeech_v1.TextToSpeechLongAudioSynthesizeAsyncClient.synthesize_long_audio", - "method": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeechLongAudioSynthesize.SynthesizeLongAudio", - "service": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeechLongAudioSynthesize", - "shortName": "TextToSpeechLongAudioSynthesize" - }, - "shortName": "SynthesizeLongAudio" - }, - "parameters": [ - { - "name": "request", - "type": "google.cloud.texttospeech_v1.types.SynthesizeLongAudioRequest" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "google.api_core.operation_async.AsyncOperation", - "shortName": "synthesize_long_audio" - }, - "description": "Sample for SynthesizeLongAudio", - "file": "texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_async", - "segments": [ - { - "end": 67, - "start": 27, - "type": "FULL" - }, - { - "end": 67, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 57, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 64, - "start": 58, - "type": "REQUEST_EXECUTION" - }, - { - "end": 68, - "start": 65, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py" - }, - { - "canonical": true, - "clientMethod": { - "client": { - "fullName": "google.cloud.texttospeech_v1.TextToSpeechLongAudioSynthesizeClient", - "shortName": "TextToSpeechLongAudioSynthesizeClient" - }, - "fullName": "google.cloud.texttospeech_v1.TextToSpeechLongAudioSynthesizeClient.synthesize_long_audio", - "method": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeechLongAudioSynthesize.SynthesizeLongAudio", - "service": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeechLongAudioSynthesize", - "shortName": "TextToSpeechLongAudioSynthesize" - }, - "shortName": "SynthesizeLongAudio" - }, - "parameters": [ - { - "name": "request", - "type": "google.cloud.texttospeech_v1.types.SynthesizeLongAudioRequest" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "google.api_core.operation.Operation", - "shortName": "synthesize_long_audio" - }, - "description": "Sample for SynthesizeLongAudio", - "file": "texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_sync", - "segments": [ - { - "end": 67, - "start": 27, - "type": "FULL" - }, - { - "end": 67, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 57, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 64, - "start": 58, - "type": "REQUEST_EXECUTION" - }, - { - "end": 68, - "start": 65, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py" - }, - { - "canonical": true, - "clientMethod": { - "async": true, - "client": { - "fullName": "google.cloud.texttospeech_v1.TextToSpeechAsyncClient", - "shortName": "TextToSpeechAsyncClient" - }, - "fullName": "google.cloud.texttospeech_v1.TextToSpeechAsyncClient.list_voices", - "method": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeech.ListVoices", - "service": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeech", - "shortName": "TextToSpeech" - }, - "shortName": "ListVoices" - }, - "parameters": [ - { - "name": "request", - "type": "google.cloud.texttospeech_v1.types.ListVoicesRequest" - }, - { - "name": "language_code", - "type": "str" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "google.cloud.texttospeech_v1.types.ListVoicesResponse", - "shortName": "list_voices" - }, - "description": "Sample for ListVoices", - "file": "texttospeech_v1_generated_text_to_speech_list_voices_async.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1_generated_TextToSpeech_ListVoices_async", - "segments": [ - { - "end": 50, - "start": 27, - "type": "FULL" - }, - { - "end": 50, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 44, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 47, - "start": 45, - "type": "REQUEST_EXECUTION" - }, - { - "end": 51, - "start": 48, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1_generated_text_to_speech_list_voices_async.py" - }, - { - "canonical": true, - "clientMethod": { - "client": { - "fullName": "google.cloud.texttospeech_v1.TextToSpeechClient", - "shortName": "TextToSpeechClient" - }, - "fullName": "google.cloud.texttospeech_v1.TextToSpeechClient.list_voices", - "method": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeech.ListVoices", - "service": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeech", - "shortName": "TextToSpeech" - }, - "shortName": "ListVoices" - }, - "parameters": [ - { - "name": "request", - "type": "google.cloud.texttospeech_v1.types.ListVoicesRequest" - }, - { - "name": "language_code", - "type": "str" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "google.cloud.texttospeech_v1.types.ListVoicesResponse", - "shortName": "list_voices" - }, - "description": "Sample for ListVoices", - "file": "texttospeech_v1_generated_text_to_speech_list_voices_sync.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1_generated_TextToSpeech_ListVoices_sync", - "segments": [ - { - "end": 50, - "start": 27, - "type": "FULL" - }, - { - "end": 50, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 44, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 47, - "start": 45, - "type": "REQUEST_EXECUTION" - }, - { - "end": 51, - "start": 48, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1_generated_text_to_speech_list_voices_sync.py" - }, - { - "canonical": true, - "clientMethod": { - "async": true, - "client": { - "fullName": "google.cloud.texttospeech_v1.TextToSpeechAsyncClient", - "shortName": "TextToSpeechAsyncClient" - }, - "fullName": "google.cloud.texttospeech_v1.TextToSpeechAsyncClient.streaming_synthesize", - "method": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeech.StreamingSynthesize", - "service": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeech", - "shortName": "TextToSpeech" - }, - "shortName": "StreamingSynthesize" - }, - "parameters": [ - { - "name": "requests", - "type": "Iterator[google.cloud.texttospeech_v1.types.StreamingSynthesizeRequest]" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "Iterable[google.cloud.texttospeech_v1.types.StreamingSynthesizeResponse]", - "shortName": "streaming_synthesize" - }, - "description": "Sample for StreamingSynthesize", - "file": "texttospeech_v1_generated_text_to_speech_streaming_synthesize_async.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1_generated_TextToSpeech_StreamingSynthesize_async", - "segments": [ - { - "end": 65, - "start": 27, - "type": "FULL" - }, - { - "end": 65, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 58, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 61, - "start": 59, - "type": "REQUEST_EXECUTION" - }, - { - "end": 66, - "start": 62, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1_generated_text_to_speech_streaming_synthesize_async.py" - }, - { - "canonical": true, - "clientMethod": { - "client": { - "fullName": "google.cloud.texttospeech_v1.TextToSpeechClient", - "shortName": "TextToSpeechClient" - }, - "fullName": "google.cloud.texttospeech_v1.TextToSpeechClient.streaming_synthesize", - "method": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeech.StreamingSynthesize", - "service": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeech", - "shortName": "TextToSpeech" - }, - "shortName": "StreamingSynthesize" - }, - "parameters": [ - { - "name": "requests", - "type": "Iterator[google.cloud.texttospeech_v1.types.StreamingSynthesizeRequest]" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "Iterable[google.cloud.texttospeech_v1.types.StreamingSynthesizeResponse]", - "shortName": "streaming_synthesize" - }, - "description": "Sample for StreamingSynthesize", - "file": "texttospeech_v1_generated_text_to_speech_streaming_synthesize_sync.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1_generated_TextToSpeech_StreamingSynthesize_sync", - "segments": [ - { - "end": 65, - "start": 27, - "type": "FULL" - }, - { - "end": 65, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 58, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 61, - "start": 59, - "type": "REQUEST_EXECUTION" - }, - { - "end": 66, - "start": 62, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1_generated_text_to_speech_streaming_synthesize_sync.py" - }, - { - "canonical": true, - "clientMethod": { - "async": true, - "client": { - "fullName": "google.cloud.texttospeech_v1.TextToSpeechAsyncClient", - "shortName": "TextToSpeechAsyncClient" - }, - "fullName": "google.cloud.texttospeech_v1.TextToSpeechAsyncClient.synthesize_speech", - "method": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeech.SynthesizeSpeech", - "service": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeech", - "shortName": "TextToSpeech" - }, - "shortName": "SynthesizeSpeech" - }, - "parameters": [ - { - "name": "request", - "type": "google.cloud.texttospeech_v1.types.SynthesizeSpeechRequest" - }, - { - "name": "input", - "type": "google.cloud.texttospeech_v1.types.SynthesisInput" - }, - { - "name": "voice", - "type": "google.cloud.texttospeech_v1.types.VoiceSelectionParams" - }, - { - "name": "audio_config", - "type": "google.cloud.texttospeech_v1.types.AudioConfig" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "google.cloud.texttospeech_v1.types.SynthesizeSpeechResponse", - "shortName": "synthesize_speech" - }, - "description": "Sample for SynthesizeSpeech", - "file": "texttospeech_v1_generated_text_to_speech_synthesize_speech_async.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1_generated_TextToSpeech_SynthesizeSpeech_async", - "segments": [ - { - "end": 62, - "start": 27, - "type": "FULL" - }, - { - "end": 62, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 56, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 59, - "start": 57, - "type": "REQUEST_EXECUTION" - }, - { - "end": 63, - "start": 60, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1_generated_text_to_speech_synthesize_speech_async.py" - }, - { - "canonical": true, - "clientMethod": { - "client": { - "fullName": "google.cloud.texttospeech_v1.TextToSpeechClient", - "shortName": "TextToSpeechClient" - }, - "fullName": "google.cloud.texttospeech_v1.TextToSpeechClient.synthesize_speech", - "method": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeech.SynthesizeSpeech", - "service": { - "fullName": "google.cloud.texttospeech.v1.TextToSpeech", - "shortName": "TextToSpeech" - }, - "shortName": "SynthesizeSpeech" - }, - "parameters": [ - { - "name": "request", - "type": "google.cloud.texttospeech_v1.types.SynthesizeSpeechRequest" - }, - { - "name": "input", - "type": "google.cloud.texttospeech_v1.types.SynthesisInput" - }, - { - "name": "voice", - "type": "google.cloud.texttospeech_v1.types.VoiceSelectionParams" - }, - { - "name": "audio_config", - "type": "google.cloud.texttospeech_v1.types.AudioConfig" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "google.cloud.texttospeech_v1.types.SynthesizeSpeechResponse", - "shortName": "synthesize_speech" - }, - "description": "Sample for SynthesizeSpeech", - "file": "texttospeech_v1_generated_text_to_speech_synthesize_speech_sync.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1_generated_TextToSpeech_SynthesizeSpeech_sync", - "segments": [ - { - "end": 62, - "start": 27, - "type": "FULL" - }, - { - "end": 62, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 56, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 59, - "start": 57, - "type": "REQUEST_EXECUTION" - }, - { - "end": 63, - "start": 60, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1_generated_text_to_speech_synthesize_speech_sync.py" - } - ] -} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_async.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_async.py deleted file mode 100644 index 3ea7da583ca0..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_async.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for ListVoices -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1_generated_TextToSpeech_ListVoices_async] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1 - - -async def sample_list_voices(): - # Create a client - client = texttospeech_v1.TextToSpeechAsyncClient() - - # Initialize request argument(s) - request = texttospeech_v1.ListVoicesRequest( - ) - - # Make the request - response = await client.list_voices(request=request) - - # Handle the response - print(response) - -# [END texttospeech_v1_generated_TextToSpeech_ListVoices_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_sync.py deleted file mode 100644 index bf57ff2a20fa..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_list_voices_sync.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for ListVoices -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1_generated_TextToSpeech_ListVoices_sync] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1 - - -def sample_list_voices(): - # Create a client - client = texttospeech_v1.TextToSpeechClient() - - # Initialize request argument(s) - request = texttospeech_v1.ListVoicesRequest( - ) - - # Make the request - response = client.list_voices(request=request) - - # Handle the response - print(response) - -# [END texttospeech_v1_generated_TextToSpeech_ListVoices_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py deleted file mode 100644 index 9a5f80c775f7..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for SynthesizeLongAudio -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_async] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1 - - -async def sample_synthesize_long_audio(): - # Create a client - client = texttospeech_v1.TextToSpeechLongAudioSynthesizeAsyncClient() - - # Initialize request argument(s) - input = texttospeech_v1.SynthesisInput() - input.text = "text_value" - - audio_config = texttospeech_v1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - voice = texttospeech_v1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - request = texttospeech_v1.SynthesizeLongAudioRequest( - input=input, - audio_config=audio_config, - output_gcs_uri="output_gcs_uri_value", - voice=voice, - ) - - # Make the request - operation = client.synthesize_long_audio(request=request) - - print("Waiting for operation to complete...") - - response = (await operation).result() - - # Handle the response - print(response) - -# [END texttospeech_v1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py deleted file mode 100644 index 3e903a4fa7c0..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for SynthesizeLongAudio -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_sync] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1 - - -def sample_synthesize_long_audio(): - # Create a client - client = texttospeech_v1.TextToSpeechLongAudioSynthesizeClient() - - # Initialize request argument(s) - input = texttospeech_v1.SynthesisInput() - input.text = "text_value" - - audio_config = texttospeech_v1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - voice = texttospeech_v1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - request = texttospeech_v1.SynthesizeLongAudioRequest( - input=input, - audio_config=audio_config, - output_gcs_uri="output_gcs_uri_value", - voice=voice, - ) - - # Make the request - operation = client.synthesize_long_audio(request=request) - - print("Waiting for operation to complete...") - - response = operation.result() - - # Handle the response - print(response) - -# [END texttospeech_v1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_async.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_async.py deleted file mode 100644 index ef666ea6b2a3..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_async.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for StreamingSynthesize -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1_generated_TextToSpeech_StreamingSynthesize_async] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1 - - -async def sample_streaming_synthesize(): - # Create a client - client = texttospeech_v1.TextToSpeechAsyncClient() - - # Initialize request argument(s) - streaming_config = texttospeech_v1.StreamingSynthesizeConfig() - streaming_config.voice.language_code = "language_code_value" - - request = texttospeech_v1.StreamingSynthesizeRequest( - streaming_config=streaming_config, - ) - - # This method expects an iterator which contains - # 'texttospeech_v1.StreamingSynthesizeRequest' objects - # Here we create a generator that yields a single `request` for - # demonstrative purposes. - requests = [request] - - def request_generator(): - for request in requests: - yield request - - # Make the request - stream = await client.streaming_synthesize(requests=request_generator()) - - # Handle the response - async for response in stream: - print(response) - -# [END texttospeech_v1_generated_TextToSpeech_StreamingSynthesize_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_sync.py deleted file mode 100644 index a0f24ef1a98b..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_streaming_synthesize_sync.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for StreamingSynthesize -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1_generated_TextToSpeech_StreamingSynthesize_sync] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1 - - -def sample_streaming_synthesize(): - # Create a client - client = texttospeech_v1.TextToSpeechClient() - - # Initialize request argument(s) - streaming_config = texttospeech_v1.StreamingSynthesizeConfig() - streaming_config.voice.language_code = "language_code_value" - - request = texttospeech_v1.StreamingSynthesizeRequest( - streaming_config=streaming_config, - ) - - # This method expects an iterator which contains - # 'texttospeech_v1.StreamingSynthesizeRequest' objects - # Here we create a generator that yields a single `request` for - # demonstrative purposes. - requests = [request] - - def request_generator(): - for request in requests: - yield request - - # Make the request - stream = client.streaming_synthesize(requests=request_generator()) - - # Handle the response - for response in stream: - print(response) - -# [END texttospeech_v1_generated_TextToSpeech_StreamingSynthesize_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_async.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_async.py deleted file mode 100644 index dd9255013bfd..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_async.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for SynthesizeSpeech -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1_generated_TextToSpeech_SynthesizeSpeech_async] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1 - - -async def sample_synthesize_speech(): - # Create a client - client = texttospeech_v1.TextToSpeechAsyncClient() - - # Initialize request argument(s) - input = texttospeech_v1.SynthesisInput() - input.text = "text_value" - - voice = texttospeech_v1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - audio_config = texttospeech_v1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - request = texttospeech_v1.SynthesizeSpeechRequest( - input=input, - voice=voice, - audio_config=audio_config, - ) - - # Make the request - response = await client.synthesize_speech(request=request) - - # Handle the response - print(response) - -# [END texttospeech_v1_generated_TextToSpeech_SynthesizeSpeech_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_sync.py deleted file mode 100644 index 8b8a0e8d59b1..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/samples/generated_samples/texttospeech_v1_generated_text_to_speech_synthesize_speech_sync.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for SynthesizeSpeech -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1_generated_TextToSpeech_SynthesizeSpeech_sync] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1 - - -def sample_synthesize_speech(): - # Create a client - client = texttospeech_v1.TextToSpeechClient() - - # Initialize request argument(s) - input = texttospeech_v1.SynthesisInput() - input.text = "text_value" - - voice = texttospeech_v1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - audio_config = texttospeech_v1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - request = texttospeech_v1.SynthesizeSpeechRequest( - input=input, - voice=voice, - audio_config=audio_config, - ) - - # Make the request - response = client.synthesize_speech(request=request) - - # Handle the response - print(response) - -# [END texttospeech_v1_generated_TextToSpeech_SynthesizeSpeech_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/scripts/fixup_texttospeech_v1_keywords.py b/owl-bot-staging/google-cloud-texttospeech/v1/scripts/fixup_texttospeech_v1_keywords.py deleted file mode 100644 index 10bbeee0c0cb..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/scripts/fixup_texttospeech_v1_keywords.py +++ /dev/null @@ -1,179 +0,0 @@ -#! /usr/bin/env python3 -# -*- coding: utf-8 -*- -# Copyright 2024 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 argparse -import os -import libcst as cst -import pathlib -import sys -from typing import (Any, Callable, Dict, List, Sequence, Tuple) - - -def partition( - predicate: Callable[[Any], bool], - iterator: Sequence[Any] -) -> Tuple[List[Any], List[Any]]: - """A stable, out-of-place partition.""" - results = ([], []) - - for i in iterator: - results[int(predicate(i))].append(i) - - # Returns trueList, falseList - return results[1], results[0] - - -class texttospeechCallTransformer(cst.CSTTransformer): - CTRL_PARAMS: Tuple[str] = ('retry', 'timeout', 'metadata') - METHOD_TO_PARAMS: Dict[str, Tuple[str]] = { - 'list_voices': ('language_code', ), - 'streaming_synthesize': ('streaming_config', 'input', ), - 'synthesize_long_audio': ('input', 'audio_config', 'output_gcs_uri', 'voice', 'parent', ), - 'synthesize_speech': ('input', 'voice', 'audio_config', 'advanced_voice_options', ), - } - - def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode: - try: - key = original.func.attr.value - kword_params = self.METHOD_TO_PARAMS[key] - except (AttributeError, KeyError): - # Either not a method from the API or too convoluted to be sure. - return updated - - # If the existing code is valid, keyword args come after positional args. - # Therefore, all positional args must map to the first parameters. - args, kwargs = partition(lambda a: not bool(a.keyword), updated.args) - if any(k.keyword.value == "request" for k in kwargs): - # We've already fixed this file, don't fix it again. - return updated - - kwargs, ctrl_kwargs = partition( - lambda a: a.keyword.value not in self.CTRL_PARAMS, - kwargs - ) - - args, ctrl_args = args[:len(kword_params)], args[len(kword_params):] - ctrl_kwargs.extend(cst.Arg(value=a.value, keyword=cst.Name(value=ctrl)) - for a, ctrl in zip(ctrl_args, self.CTRL_PARAMS)) - - request_arg = cst.Arg( - value=cst.Dict([ - cst.DictElement( - cst.SimpleString("'{}'".format(name)), -cst.Element(value=arg.value) - ) - # Note: the args + kwargs looks silly, but keep in mind that - # the control parameters had to be stripped out, and that - # those could have been passed positionally or by keyword. - for name, arg in zip(kword_params, args + kwargs)]), - keyword=cst.Name("request") - ) - - return updated.with_changes( - args=[request_arg] + ctrl_kwargs - ) - - -def fix_files( - in_dir: pathlib.Path, - out_dir: pathlib.Path, - *, - transformer=texttospeechCallTransformer(), -): - """Duplicate the input dir to the output dir, fixing file method calls. - - Preconditions: - * in_dir is a real directory - * out_dir is a real, empty directory - """ - pyfile_gen = ( - pathlib.Path(os.path.join(root, f)) - for root, _, files in os.walk(in_dir) - for f in files if os.path.splitext(f)[1] == ".py" - ) - - for fpath in pyfile_gen: - with open(fpath, 'r') as f: - src = f.read() - - # Parse the code and insert method call fixes. - tree = cst.parse_module(src) - updated = tree.visit(transformer) - - # Create the path and directory structure for the new file. - updated_path = out_dir.joinpath(fpath.relative_to(in_dir)) - updated_path.parent.mkdir(parents=True, exist_ok=True) - - # Generate the updated source file at the corresponding path. - with open(updated_path, 'w') as f: - f.write(updated.code) - - -if __name__ == '__main__': - parser = argparse.ArgumentParser( - description="""Fix up source that uses the texttospeech client library. - -The existing sources are NOT overwritten but are copied to output_dir with changes made. - -Note: This tool operates at a best-effort level at converting positional - parameters in client method calls to keyword based parameters. - Cases where it WILL FAIL include - A) * or ** expansion in a method call. - B) Calls via function or method alias (includes free function calls) - C) Indirect or dispatched calls (e.g. the method is looked up dynamically) - - These all constitute false negatives. The tool will also detect false - positives when an API method shares a name with another method. -""") - parser.add_argument( - '-d', - '--input-directory', - required=True, - dest='input_dir', - help='the input directory to walk for python files to fix up', - ) - parser.add_argument( - '-o', - '--output-directory', - required=True, - dest='output_dir', - help='the directory to output files fixed via un-flattening', - ) - args = parser.parse_args() - input_dir = pathlib.Path(args.input_dir) - output_dir = pathlib.Path(args.output_dir) - if not input_dir.is_dir(): - print( - f"input directory '{input_dir}' does not exist or is not a directory", - file=sys.stderr, - ) - sys.exit(-1) - - if not output_dir.is_dir(): - print( - f"output directory '{output_dir}' does not exist or is not a directory", - file=sys.stderr, - ) - sys.exit(-1) - - if os.listdir(output_dir): - print( - f"output directory '{output_dir}' is not empty", - file=sys.stderr, - ) - sys.exit(-1) - - fix_files(input_dir, output_dir) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/setup.py b/owl-bot-staging/google-cloud-texttospeech/v1/setup.py deleted file mode 100644 index d91c15741bbe..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/setup.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 io -import os -import re - -import setuptools # type: ignore - -package_root = os.path.abspath(os.path.dirname(__file__)) - -name = 'google-cloud-texttospeech' - - -description = "Google Cloud Texttospeech API client library" - -version = None - -with open(os.path.join(package_root, 'google/cloud/texttospeech/gapic_version.py')) as fp: - version_candidates = re.findall(r"(?<=\")\d+.\d+.\d+(?=\")", fp.read()) - assert (len(version_candidates) == 1) - version = version_candidates[0] - -if version[0] == "0": - release_status = "Development Status :: 4 - Beta" -else: - release_status = "Development Status :: 5 - Production/Stable" - -dependencies = [ - "google-api-core[grpc] >= 1.34.1, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*", - # Exclude incompatible versions of `google-auth` - # See https://github.com/googleapis/google-cloud-python/issues/12364 - "google-auth >= 2.14.1, <3.0.0dev,!=2.24.0,!=2.25.0", - "proto-plus >= 1.22.3, <2.0.0dev", - "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", - "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", -] -extras = { -} -url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-texttospeech" - -package_root = os.path.abspath(os.path.dirname(__file__)) - -readme_filename = os.path.join(package_root, "README.rst") -with io.open(readme_filename, encoding="utf-8") as readme_file: - readme = readme_file.read() - -packages = [ - package - for package in setuptools.find_namespace_packages() - if package.startswith("google") -] - -setuptools.setup( - name=name, - version=version, - description=description, - long_description=readme, - author="Google LLC", - author_email="googleapis-packages@google.com", - license="Apache 2.0", - url=url, - classifiers=[ - release_status, - "Intended Audience :: Developers", - "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Operating System :: OS Independent", - "Topic :: Internet", - ], - platforms="Posix; MacOS X; Windows", - packages=packages, - python_requires=">=3.7", - install_requires=dependencies, - extras_require=extras, - include_package_data=True, - zip_safe=False, -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.10.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.10.txt deleted file mode 100644 index ed7f9aed2559..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.10.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -proto-plus -protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.11.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.11.txt deleted file mode 100644 index ed7f9aed2559..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.11.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -proto-plus -protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.12.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.12.txt deleted file mode 100644 index ed7f9aed2559..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.12.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -proto-plus -protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.7.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.7.txt deleted file mode 100644 index fc812592b0ee..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.7.txt +++ /dev/null @@ -1,10 +0,0 @@ -# This constraints file is used to check that lower bounds -# are correct in setup.py -# List all library dependencies and extras in this file. -# Pin the version to the lower bound. -# e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0dev", -# Then this file should have google-cloud-foo==1.14.0 -google-api-core==1.34.1 -google-auth==2.14.1 -proto-plus==1.22.3 -protobuf==3.20.2 diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.8.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.8.txt deleted file mode 100644 index ed7f9aed2559..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.8.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -proto-plus -protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.9.txt b/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.9.txt deleted file mode 100644 index ed7f9aed2559..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.9.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -proto-plus -protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/tests/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/tests/__init__.py deleted file mode 100644 index 7b3de3117f38..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/tests/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ - -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/__init__.py deleted file mode 100644 index 7b3de3117f38..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ - -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/__init__.py deleted file mode 100644 index 7b3de3117f38..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ - -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/__init__.py deleted file mode 100644 index 7b3de3117f38..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ - -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech.py b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech.py deleted file mode 100644 index bfe7d7538132..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech.py +++ /dev/null @@ -1,3141 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 -# try/except added for compatibility with python < 3.8 -try: - from unittest import mock - from unittest.mock import AsyncMock # pragma: NO COVER -except ImportError: # pragma: NO COVER - import mock - -import grpc -from grpc.experimental import aio -from collections.abc import Iterable, AsyncIterable -from google.protobuf import json_format -import json -import math -import pytest -from google.api_core import api_core_version -from proto.marshal.rules.dates import DurationRule, TimestampRule -from proto.marshal.rules import wrappers -from requests import Response -from requests import Request, PreparedRequest -from requests.sessions import Session -from google.protobuf import json_format - -try: - from google.auth.aio import credentials as ga_credentials_async - HAS_GOOGLE_AUTH_AIO = True -except ImportError: # pragma: NO COVER - HAS_GOOGLE_AUTH_AIO = False - -from google.api_core import client_options -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import grpc_helpers -from google.api_core import grpc_helpers_async -from google.api_core import path_template -from google.api_core import retry as retries -from google.auth import credentials as ga_credentials -from google.auth.exceptions import MutualTLSChannelError -from google.cloud.texttospeech_v1.services.text_to_speech import TextToSpeechAsyncClient -from google.cloud.texttospeech_v1.services.text_to_speech import TextToSpeechClient -from google.cloud.texttospeech_v1.services.text_to_speech import transports -from google.cloud.texttospeech_v1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore -from google.oauth2 import service_account -import google.auth - - -async def mock_async_gen(data, chunk_size=1): - for i in range(0, len(data)): # pragma: NO COVER - chunk = data[i : i + chunk_size] - yield chunk.encode("utf-8") - -def client_cert_source_callback(): - return b"cert bytes", b"key bytes" - -# TODO: use async auth anon credentials by default once the minimum version of google-auth is upgraded. -# See related issue: https://github.com/googleapis/gapic-generator-python/issues/2107. -def async_anonymous_credentials(): - if HAS_GOOGLE_AUTH_AIO: - return ga_credentials_async.AnonymousCredentials() - return ga_credentials.AnonymousCredentials() - -# If default endpoint is localhost, then default mtls endpoint will be the same. -# This method modifies the default endpoint so the client can produce a different -# mtls endpoint for endpoint testing purposes. -def modify_default_endpoint(client): - return "foo.googleapis.com" if ("localhost" in client.DEFAULT_ENDPOINT) else client.DEFAULT_ENDPOINT - -# If default endpoint template is localhost, then default mtls endpoint will be the same. -# This method modifies the default endpoint template so the client can produce a different -# mtls endpoint for endpoint testing purposes. -def modify_default_endpoint_template(client): - return "test.{UNIVERSE_DOMAIN}" if ("localhost" in client._DEFAULT_ENDPOINT_TEMPLATE) else client._DEFAULT_ENDPOINT_TEMPLATE - - -def test__get_default_mtls_endpoint(): - api_endpoint = "example.googleapis.com" - api_mtls_endpoint = "example.mtls.googleapis.com" - sandbox_endpoint = "example.sandbox.googleapis.com" - sandbox_mtls_endpoint = "example.mtls.sandbox.googleapis.com" - non_googleapi = "api.example.com" - - assert TextToSpeechClient._get_default_mtls_endpoint(None) is None - assert TextToSpeechClient._get_default_mtls_endpoint(api_endpoint) == api_mtls_endpoint - assert TextToSpeechClient._get_default_mtls_endpoint(api_mtls_endpoint) == api_mtls_endpoint - assert TextToSpeechClient._get_default_mtls_endpoint(sandbox_endpoint) == sandbox_mtls_endpoint - assert TextToSpeechClient._get_default_mtls_endpoint(sandbox_mtls_endpoint) == sandbox_mtls_endpoint - assert TextToSpeechClient._get_default_mtls_endpoint(non_googleapi) == non_googleapi - -def test__read_environment_variables(): - assert TextToSpeechClient._read_environment_variables() == (False, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - assert TextToSpeechClient._read_environment_variables() == (True, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): - assert TextToSpeechClient._read_environment_variables() == (False, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): - with pytest.raises(ValueError) as excinfo: - TextToSpeechClient._read_environment_variables() - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - assert TextToSpeechClient._read_environment_variables() == (False, "never", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - assert TextToSpeechClient._read_environment_variables() == (False, "always", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}): - assert TextToSpeechClient._read_environment_variables() == (False, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): - with pytest.raises(MutualTLSChannelError) as excinfo: - TextToSpeechClient._read_environment_variables() - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" - - with mock.patch.dict(os.environ, {"GOOGLE_CLOUD_UNIVERSE_DOMAIN": "foo.com"}): - assert TextToSpeechClient._read_environment_variables() == (False, "auto", "foo.com") - -def test__get_client_cert_source(): - mock_provided_cert_source = mock.Mock() - mock_default_cert_source = mock.Mock() - - assert TextToSpeechClient._get_client_cert_source(None, False) is None - assert TextToSpeechClient._get_client_cert_source(mock_provided_cert_source, False) is None - assert TextToSpeechClient._get_client_cert_source(mock_provided_cert_source, True) == mock_provided_cert_source - - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): - with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_default_cert_source): - assert TextToSpeechClient._get_client_cert_source(None, True) is mock_default_cert_source - assert TextToSpeechClient._get_client_cert_source(mock_provided_cert_source, "true") is mock_provided_cert_source - -@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) -@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) -def test__get_api_endpoint(): - api_override = "foo.com" - mock_client_cert_source = mock.Mock() - default_universe = TextToSpeechClient._DEFAULT_UNIVERSE - default_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) - mock_universe = "bar.com" - mock_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) - - assert TextToSpeechClient._get_api_endpoint(api_override, mock_client_cert_source, default_universe, "always") == api_override - assert TextToSpeechClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "auto") == TextToSpeechClient.DEFAULT_MTLS_ENDPOINT - assert TextToSpeechClient._get_api_endpoint(None, None, default_universe, "auto") == default_endpoint - assert TextToSpeechClient._get_api_endpoint(None, None, default_universe, "always") == TextToSpeechClient.DEFAULT_MTLS_ENDPOINT - assert TextToSpeechClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "always") == TextToSpeechClient.DEFAULT_MTLS_ENDPOINT - assert TextToSpeechClient._get_api_endpoint(None, None, mock_universe, "never") == mock_endpoint - assert TextToSpeechClient._get_api_endpoint(None, None, default_universe, "never") == default_endpoint - - with pytest.raises(MutualTLSChannelError) as excinfo: - TextToSpeechClient._get_api_endpoint(None, mock_client_cert_source, mock_universe, "auto") - assert str(excinfo.value) == "mTLS is not supported in any universe other than googleapis.com." - - -def test__get_universe_domain(): - client_universe_domain = "foo.com" - universe_domain_env = "bar.com" - - assert TextToSpeechClient._get_universe_domain(client_universe_domain, universe_domain_env) == client_universe_domain - assert TextToSpeechClient._get_universe_domain(None, universe_domain_env) == universe_domain_env - assert TextToSpeechClient._get_universe_domain(None, None) == TextToSpeechClient._DEFAULT_UNIVERSE - - with pytest.raises(ValueError) as excinfo: - TextToSpeechClient._get_universe_domain("", None) - assert str(excinfo.value) == "Universe Domain cannot be an empty string." - -@pytest.mark.parametrize("client_class,transport_class,transport_name", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc"), - (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest"), -]) -def test__validate_universe_domain(client_class, transport_class, transport_name): - client = client_class( - transport=transport_class( - credentials=ga_credentials.AnonymousCredentials() - ) - ) - assert client._validate_universe_domain() == True - - # Test the case when universe is already validated. - assert client._validate_universe_domain() == True - - if transport_name == "grpc": - # Test the case where credentials are provided by the - # `local_channel_credentials`. The default universes in both match. - channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) - client = client_class(transport=transport_class(channel=channel)) - assert client._validate_universe_domain() == True - - # Test the case where credentials do not exist: e.g. a transport is provided - # with no credentials. Validation should still succeed because there is no - # mismatch with non-existent credentials. - channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) - transport=transport_class(channel=channel) - transport._credentials = None - client = client_class(transport=transport) - assert client._validate_universe_domain() == True - - # TODO: This is needed to cater for older versions of google-auth - # Make this test unconditional once the minimum supported version of - # google-auth becomes 2.23.0 or higher. - google_auth_major, google_auth_minor = [int(part) for part in google.auth.__version__.split(".")[0:2]] - if google_auth_major > 2 or (google_auth_major == 2 and google_auth_minor >= 23): - credentials = ga_credentials.AnonymousCredentials() - credentials._universe_domain = "foo.com" - # Test the case when there is a universe mismatch from the credentials. - client = client_class( - transport=transport_class(credentials=credentials) - ) - with pytest.raises(ValueError) as excinfo: - client._validate_universe_domain() - assert str(excinfo.value) == "The configured universe domain (googleapis.com) does not match the universe domain found in the credentials (foo.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." - - # Test the case when there is a universe mismatch from the client. - # - # TODO: Make this test unconditional once the minimum supported version of - # google-api-core becomes 2.15.0 or higher. - api_core_major, api_core_minor = [int(part) for part in api_core_version.__version__.split(".")[0:2]] - if api_core_major > 2 or (api_core_major == 2 and api_core_minor >= 15): - client = client_class(client_options={"universe_domain": "bar.com"}, transport=transport_class(credentials=ga_credentials.AnonymousCredentials(),)) - with pytest.raises(ValueError) as excinfo: - client._validate_universe_domain() - assert str(excinfo.value) == "The configured universe domain (bar.com) does not match the universe domain found in the credentials (googleapis.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." - - # Test that ValueError is raised if universe_domain is provided via client options and credentials is None - with pytest.raises(ValueError): - client._compare_universes("foo.bar", None) - - -@pytest.mark.parametrize("client_class,transport_name", [ - (TextToSpeechClient, "grpc"), - (TextToSpeechAsyncClient, "grpc_asyncio"), - (TextToSpeechClient, "rest"), -]) -def test_text_to_speech_client_from_service_account_info(client_class, transport_name): - creds = ga_credentials.AnonymousCredentials() - with mock.patch.object(service_account.Credentials, 'from_service_account_info') as factory: - factory.return_value = creds - info = {"valid": True} - client = client_class.from_service_account_info(info, transport=transport_name) - assert client.transport._credentials == creds - assert isinstance(client, client_class) - - assert client.transport._host == ( - 'texttospeech.googleapis.com:443' - if transport_name in ['grpc', 'grpc_asyncio'] - else - 'https://texttospeech.googleapis.com' - ) - - -@pytest.mark.parametrize("transport_class,transport_name", [ - (transports.TextToSpeechGrpcTransport, "grpc"), - (transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio"), - (transports.TextToSpeechRestTransport, "rest"), -]) -def test_text_to_speech_client_service_account_always_use_jwt(transport_class, transport_name): - with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: - creds = service_account.Credentials(None, None, None) - transport = transport_class(credentials=creds, always_use_jwt_access=True) - use_jwt.assert_called_once_with(True) - - with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: - creds = service_account.Credentials(None, None, None) - transport = transport_class(credentials=creds, always_use_jwt_access=False) - use_jwt.assert_not_called() - - -@pytest.mark.parametrize("client_class,transport_name", [ - (TextToSpeechClient, "grpc"), - (TextToSpeechAsyncClient, "grpc_asyncio"), - (TextToSpeechClient, "rest"), -]) -def test_text_to_speech_client_from_service_account_file(client_class, transport_name): - creds = ga_credentials.AnonymousCredentials() - with mock.patch.object(service_account.Credentials, 'from_service_account_file') as factory: - factory.return_value = creds - client = client_class.from_service_account_file("dummy/file/path.json", transport=transport_name) - assert client.transport._credentials == creds - assert isinstance(client, client_class) - - client = client_class.from_service_account_json("dummy/file/path.json", transport=transport_name) - assert client.transport._credentials == creds - assert isinstance(client, client_class) - - assert client.transport._host == ( - 'texttospeech.googleapis.com:443' - if transport_name in ['grpc', 'grpc_asyncio'] - else - 'https://texttospeech.googleapis.com' - ) - - -def test_text_to_speech_client_get_transport_class(): - transport = TextToSpeechClient.get_transport_class() - available_transports = [ - transports.TextToSpeechGrpcTransport, - transports.TextToSpeechRestTransport, - ] - assert transport in available_transports - - transport = TextToSpeechClient.get_transport_class("grpc") - assert transport == transports.TextToSpeechGrpcTransport - - -@pytest.mark.parametrize("client_class,transport_class,transport_name", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc"), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio"), - (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest"), -]) -@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) -@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) -def test_text_to_speech_client_client_options(client_class, transport_class, transport_name): - # Check that if channel is provided we won't create a new one. - with mock.patch.object(TextToSpeechClient, 'get_transport_class') as gtc: - transport = transport_class( - credentials=ga_credentials.AnonymousCredentials() - ) - client = client_class(transport=transport) - gtc.assert_not_called() - - # Check that if channel is provided via str we will create a new one. - with mock.patch.object(TextToSpeechClient, 'get_transport_class') as gtc: - client = client_class(transport=transport_name) - gtc.assert_called() - - # Check the case api_endpoint is provided. - options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(transport=transport_name, client_options=options) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host="squid.clam.whelk", - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is - # "never". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is - # "always". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client.DEFAULT_MTLS_ENDPOINT, - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has - # unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): - with pytest.raises(MutualTLSChannelError) as excinfo: - client = client_class(transport=transport_name) - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" - - # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): - with pytest.raises(ValueError) as excinfo: - client = client_class(transport=transport_name) - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - - # Check the case quota_project_id is provided - options = client_options.ClientOptions(quota_project_id="octopus") - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id="octopus", - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - # Check the case api_endpoint is provided - options = client_options.ClientOptions(api_audience="https://language.googleapis.com") - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience="https://language.googleapis.com" - ) - -@pytest.mark.parametrize("client_class,transport_class,transport_name,use_client_cert_env", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", "true"), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", "true"), - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", "false"), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", "false"), - (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest", "true"), - (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest", "false"), -]) -@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) -@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) -@mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}) -def test_text_to_speech_client_mtls_env_auto(client_class, transport_class, transport_name, use_client_cert_env): - # This tests the endpoint autoswitch behavior. Endpoint is autoswitched to the default - # mtls endpoint, if GOOGLE_API_USE_CLIENT_CERTIFICATE is "true" and client cert exists. - - # Check the case client_cert_source is provided. Whether client cert is used depends on - # GOOGLE_API_USE_CLIENT_CERTIFICATE value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): - options = client_options.ClientOptions(client_cert_source=client_cert_source_callback) - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - - if use_client_cert_env == "false": - expected_client_cert_source = None - expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) - else: - expected_client_cert_source = client_cert_source_callback - expected_host = client.DEFAULT_MTLS_ENDPOINT - - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=expected_host, - scopes=None, - client_cert_source_for_mtls=expected_client_cert_source, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case ADC client cert is provided. Whether client cert is used depends on - # GOOGLE_API_USE_CLIENT_CERTIFICATE value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): - with mock.patch.object(transport_class, '__init__') as patched: - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): - with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=client_cert_source_callback): - if use_client_cert_env == "false": - expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) - expected_client_cert_source = None - else: - expected_host = client.DEFAULT_MTLS_ENDPOINT - expected_client_cert_source = client_cert_source_callback - - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=expected_host, - scopes=None, - client_cert_source_for_mtls=expected_client_cert_source, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case client_cert_source and ADC client cert are not provided. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): - with mock.patch.object(transport_class, '__init__') as patched: - with mock.patch("google.auth.transport.mtls.has_default_client_cert_source", return_value=False): - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - -@pytest.mark.parametrize("client_class", [ - TextToSpeechClient, TextToSpeechAsyncClient -]) -@mock.patch.object(TextToSpeechClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechClient)) -@mock.patch.object(TextToSpeechAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechAsyncClient)) -def test_text_to_speech_client_get_mtls_endpoint_and_cert_source(client_class): - mock_client_cert_source = mock.Mock() - - # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "true". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - mock_api_endpoint = "foo" - options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) - assert api_endpoint == mock_api_endpoint - assert cert_source == mock_client_cert_source - - # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "false". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): - mock_client_cert_source = mock.Mock() - mock_api_endpoint = "foo" - options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) - assert api_endpoint == mock_api_endpoint - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_ENDPOINT - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "always". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert doesn't exist. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=False): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_ENDPOINT - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert exists. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): - with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_client_cert_source): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT - assert cert_source == mock_client_cert_source - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has - # unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): - with pytest.raises(MutualTLSChannelError) as excinfo: - client_class.get_mtls_endpoint_and_cert_source() - - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" - - # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): - with pytest.raises(ValueError) as excinfo: - client_class.get_mtls_endpoint_and_cert_source() - - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - -@pytest.mark.parametrize("client_class", [ - TextToSpeechClient, TextToSpeechAsyncClient -]) -@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) -@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) -def test_text_to_speech_client_client_api_endpoint(client_class): - mock_client_cert_source = client_cert_source_callback - api_override = "foo.com" - default_universe = TextToSpeechClient._DEFAULT_UNIVERSE - default_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) - mock_universe = "bar.com" - mock_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) - - # If ClientOptions.api_endpoint is set and GOOGLE_API_USE_CLIENT_CERTIFICATE="true", - # use ClientOptions.api_endpoint as the api endpoint regardless. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel"): - options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=api_override) - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == api_override - - # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="never", - # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - client = client_class(credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == default_endpoint - - # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="always", - # use the DEFAULT_MTLS_ENDPOINT as the api endpoint. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - client = client_class(credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT - - # If ClientOptions.api_endpoint is not set, GOOGLE_API_USE_MTLS_ENDPOINT="auto" (default), - # GOOGLE_API_USE_CLIENT_CERTIFICATE="false" (default), default cert source doesn't exist, - # and ClientOptions.universe_domain="bar.com", - # use the _DEFAULT_ENDPOINT_TEMPLATE populated with universe domain as the api endpoint. - options = client_options.ClientOptions() - universe_exists = hasattr(options, "universe_domain") - if universe_exists: - options = client_options.ClientOptions(universe_domain=mock_universe) - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - else: - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == (mock_endpoint if universe_exists else default_endpoint) - assert client.universe_domain == (mock_universe if universe_exists else default_universe) - - # If ClientOptions does not have a universe domain attribute and GOOGLE_API_USE_MTLS_ENDPOINT="never", - # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. - options = client_options.ClientOptions() - if hasattr(options, "universe_domain"): - delattr(options, "universe_domain") - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == default_endpoint - - -@pytest.mark.parametrize("client_class,transport_class,transport_name", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc"), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio"), - (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest"), -]) -def test_text_to_speech_client_client_options_scopes(client_class, transport_class, transport_name): - # Check the case scopes are provided. - options = client_options.ClientOptions( - scopes=["1", "2"], - ) - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=["1", "2"], - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - -@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", grpc_helpers), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), - (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest", None), -]) -def test_text_to_speech_client_client_options_credentials_file(client_class, transport_class, transport_name, grpc_helpers): - # Check the case credentials file is provided. - options = client_options.ClientOptions( - credentials_file="credentials.json" - ) - - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file="credentials.json", - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - -def test_text_to_speech_client_client_options_from_dict(): - with mock.patch('google.cloud.texttospeech_v1.services.text_to_speech.transports.TextToSpeechGrpcTransport.__init__') as grpc_transport: - grpc_transport.return_value = None - client = TextToSpeechClient( - client_options={'api_endpoint': 'squid.clam.whelk'} - ) - grpc_transport.assert_called_once_with( - credentials=None, - credentials_file=None, - host="squid.clam.whelk", - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - -@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", grpc_helpers), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), -]) -def test_text_to_speech_client_create_channel_credentials_file(client_class, transport_class, transport_name, grpc_helpers): - # Check the case credentials file is provided. - options = client_options.ClientOptions( - credentials_file="credentials.json" - ) - - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file="credentials.json", - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # test that the credentials from file are saved and used as the credentials. - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch.object( - google.auth, "default", autospec=True - ) as adc, mock.patch.object( - grpc_helpers, "create_channel" - ) as create_channel: - creds = ga_credentials.AnonymousCredentials() - file_creds = ga_credentials.AnonymousCredentials() - load_creds.return_value = (file_creds, None) - adc.return_value = (creds, None) - client = client_class(client_options=options, transport=transport_name) - create_channel.assert_called_with( - "texttospeech.googleapis.com:443", - credentials=file_creds, - credentials_file=None, - quota_project_id=None, - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - scopes=None, - default_host="texttospeech.googleapis.com", - ssl_credentials=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts.ListVoicesRequest, - dict, -]) -def test_list_voices(request_type, transport: str = 'grpc'): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = cloud_tts.ListVoicesResponse( - ) - response = client.list_voices(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - request = cloud_tts.ListVoicesRequest() - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, cloud_tts.ListVoicesResponse) - - -def test_list_voices_non_empty_request_with_auto_populated_field(): - # This test is a coverage failsafe to make sure that UUID4 fields are - # automatically populated, according to AIP-4235, with non-empty requests. - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='grpc', - ) - - # Populate all string fields in the request which are not UUID4 - # since we want to check that UUID4 are populated automatically - # if they meet the requirements of AIP 4235. - request = cloud_tts.ListVoicesRequest( - language_code='language_code_value', - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - call.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client.list_voices(request=request) - call.assert_called() - _, args, _ = call.mock_calls[0] - assert args[0] == cloud_tts.ListVoicesRequest( - language_code='language_code_value', - ) - -def test_list_voices_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.list_voices in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.list_voices] = mock_rpc - request = {} - client.list_voices(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - client.list_voices(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_list_voices_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._client._transport.list_voices in client._client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.AsyncMock() - mock_rpc.return_value = mock.Mock() - client._client._transport._wrapped_methods[client._client._transport.list_voices] = mock_rpc - - request = {} - await client.list_voices(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - await client.list_voices(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_list_voices_async(transport: str = 'grpc_asyncio', request_type=cloud_tts.ListVoicesRequest): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value =grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.ListVoicesResponse( - )) - response = await client.list_voices(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - request = cloud_tts.ListVoicesRequest() - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, cloud_tts.ListVoicesResponse) - - -@pytest.mark.asyncio -async def test_list_voices_async_from_dict(): - await test_list_voices_async(request_type=dict) - - -def test_list_voices_flattened(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = cloud_tts.ListVoicesResponse() - # Call the method with a truthy value for each flattened field, - # using the keyword arguments to the method. - client.list_voices( - language_code='language_code_value', - ) - - # Establish that the underlying call was made with the expected - # request object values. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - arg = args[0].language_code - mock_val = 'language_code_value' - assert arg == mock_val - - -def test_list_voices_flattened_error(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Attempting to call a method with both a request object and flattened - # fields is an error. - with pytest.raises(ValueError): - client.list_voices( - cloud_tts.ListVoicesRequest(), - language_code='language_code_value', - ) - -@pytest.mark.asyncio -async def test_list_voices_flattened_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = cloud_tts.ListVoicesResponse() - - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.ListVoicesResponse()) - # Call the method with a truthy value for each flattened field, - # using the keyword arguments to the method. - response = await client.list_voices( - language_code='language_code_value', - ) - - # Establish that the underlying call was made with the expected - # request object values. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - arg = args[0].language_code - mock_val = 'language_code_value' - assert arg == mock_val - -@pytest.mark.asyncio -async def test_list_voices_flattened_error_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Attempting to call a method with both a request object and flattened - # fields is an error. - with pytest.raises(ValueError): - await client.list_voices( - cloud_tts.ListVoicesRequest(), - language_code='language_code_value', - ) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts.SynthesizeSpeechRequest, - dict, -]) -def test_synthesize_speech(request_type, transport: str = 'grpc'): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = cloud_tts.SynthesizeSpeechResponse( - audio_content=b'audio_content_blob', - ) - response = client.synthesize_speech(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - request = cloud_tts.SynthesizeSpeechRequest() - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, cloud_tts.SynthesizeSpeechResponse) - assert response.audio_content == b'audio_content_blob' - - -def test_synthesize_speech_non_empty_request_with_auto_populated_field(): - # This test is a coverage failsafe to make sure that UUID4 fields are - # automatically populated, according to AIP-4235, with non-empty requests. - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='grpc', - ) - - # Populate all string fields in the request which are not UUID4 - # since we want to check that UUID4 are populated automatically - # if they meet the requirements of AIP 4235. - request = cloud_tts.SynthesizeSpeechRequest( - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - call.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client.synthesize_speech(request=request) - call.assert_called() - _, args, _ = call.mock_calls[0] - assert args[0] == cloud_tts.SynthesizeSpeechRequest( - ) - -def test_synthesize_speech_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.synthesize_speech in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.synthesize_speech] = mock_rpc - request = {} - client.synthesize_speech(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - client.synthesize_speech(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_synthesize_speech_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._client._transport.synthesize_speech in client._client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.AsyncMock() - mock_rpc.return_value = mock.Mock() - client._client._transport._wrapped_methods[client._client._transport.synthesize_speech] = mock_rpc - - request = {} - await client.synthesize_speech(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - await client.synthesize_speech(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_synthesize_speech_async(transport: str = 'grpc_asyncio', request_type=cloud_tts.SynthesizeSpeechRequest): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value =grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.SynthesizeSpeechResponse( - audio_content=b'audio_content_blob', - )) - response = await client.synthesize_speech(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - request = cloud_tts.SynthesizeSpeechRequest() - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, cloud_tts.SynthesizeSpeechResponse) - assert response.audio_content == b'audio_content_blob' - - -@pytest.mark.asyncio -async def test_synthesize_speech_async_from_dict(): - await test_synthesize_speech_async(request_type=dict) - - -def test_synthesize_speech_flattened(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = cloud_tts.SynthesizeSpeechResponse() - # Call the method with a truthy value for each flattened field, - # using the keyword arguments to the method. - client.synthesize_speech( - input=cloud_tts.SynthesisInput(text='text_value'), - voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), - audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), - ) - - # Establish that the underlying call was made with the expected - # request object values. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - arg = args[0].input - mock_val = cloud_tts.SynthesisInput(text='text_value') - assert arg == mock_val - arg = args[0].voice - mock_val = cloud_tts.VoiceSelectionParams(language_code='language_code_value') - assert arg == mock_val - arg = args[0].audio_config - mock_val = cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16) - assert arg == mock_val - - -def test_synthesize_speech_flattened_error(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Attempting to call a method with both a request object and flattened - # fields is an error. - with pytest.raises(ValueError): - client.synthesize_speech( - cloud_tts.SynthesizeSpeechRequest(), - input=cloud_tts.SynthesisInput(text='text_value'), - voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), - audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), - ) - -@pytest.mark.asyncio -async def test_synthesize_speech_flattened_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = cloud_tts.SynthesizeSpeechResponse() - - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.SynthesizeSpeechResponse()) - # Call the method with a truthy value for each flattened field, - # using the keyword arguments to the method. - response = await client.synthesize_speech( - input=cloud_tts.SynthesisInput(text='text_value'), - voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), - audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), - ) - - # Establish that the underlying call was made with the expected - # request object values. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - arg = args[0].input - mock_val = cloud_tts.SynthesisInput(text='text_value') - assert arg == mock_val - arg = args[0].voice - mock_val = cloud_tts.VoiceSelectionParams(language_code='language_code_value') - assert arg == mock_val - arg = args[0].audio_config - mock_val = cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16) - assert arg == mock_val - -@pytest.mark.asyncio -async def test_synthesize_speech_flattened_error_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Attempting to call a method with both a request object and flattened - # fields is an error. - with pytest.raises(ValueError): - await client.synthesize_speech( - cloud_tts.SynthesizeSpeechRequest(), - input=cloud_tts.SynthesisInput(text='text_value'), - voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), - audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), - ) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts.StreamingSynthesizeRequest, - dict, -]) -def test_streaming_synthesize(request_type, transport: str = 'grpc'): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - requests = [request] - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.streaming_synthesize), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = iter([cloud_tts.StreamingSynthesizeResponse()]) - response = client.streaming_synthesize(iter(requests)) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert next(args[0]) == request - - # Establish that the response is the type that we expect. - for message in response: - assert isinstance(message, cloud_tts.StreamingSynthesizeResponse) - - -def test_streaming_synthesize_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.streaming_synthesize in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.streaming_synthesize] = mock_rpc - request = [{}] - client.streaming_synthesize(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - client.streaming_synthesize(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_streaming_synthesize_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._client._transport.streaming_synthesize in client._client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.AsyncMock() - mock_rpc.return_value = mock.Mock() - client._client._transport._wrapped_methods[client._client._transport.streaming_synthesize] = mock_rpc - - request = [{}] - await client.streaming_synthesize(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - await client.streaming_synthesize(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_streaming_synthesize_async(transport: str = 'grpc_asyncio', request_type=cloud_tts.StreamingSynthesizeRequest): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - requests = [request] - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.streaming_synthesize), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = mock.Mock(aio.StreamStreamCall, autospec=True) - call.return_value.read = mock.AsyncMock(side_effect=[cloud_tts.StreamingSynthesizeResponse()]) - response = await client.streaming_synthesize(iter(requests)) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - assert next(args[0]) == request - - # Establish that the response is the type that we expect. - message = await response.read() - assert isinstance(message, cloud_tts.StreamingSynthesizeResponse) - - -@pytest.mark.asyncio -async def test_streaming_synthesize_async_from_dict(): - await test_streaming_synthesize_async(request_type=dict) - - -def test_list_voices_rest_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.list_voices in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.list_voices] = mock_rpc - - request = {} - client.list_voices(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - client.list_voices(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - - -def test_list_voices_rest_flattened(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Mock the http request call within the method and fake a response. - with mock.patch.object(type(client.transport._session), 'request') as req: - # Designate an appropriate value for the returned response. - return_value = cloud_tts.ListVoicesResponse() - - # get arguments that satisfy an http rule for this method - sample_request = {} - - # get truthy value for each flattened field - mock_args = dict( - language_code='language_code_value', - ) - mock_args.update(sample_request) - - # Wrap the value into a proper Response obj - response_value = Response() - response_value.status_code = 200 - # Convert return value to protobuf type - return_value = cloud_tts.ListVoicesResponse.pb(return_value) - json_return_value = json_format.MessageToJson(return_value) - response_value._content = json_return_value.encode('UTF-8') - req.return_value = response_value - - client.list_voices(**mock_args) - - # Establish that the underlying call was made with the expected - # request object values. - assert len(req.mock_calls) == 1 - _, args, _ = req.mock_calls[0] - assert path_template.validate("%s/v1/voices" % client.transport._host, args[1]) - - -def test_list_voices_rest_flattened_error(transport: str = 'rest'): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Attempting to call a method with both a request object and flattened - # fields is an error. - with pytest.raises(ValueError): - client.list_voices( - cloud_tts.ListVoicesRequest(), - language_code='language_code_value', - ) - - -def test_synthesize_speech_rest_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.synthesize_speech in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.synthesize_speech] = mock_rpc - - request = {} - client.synthesize_speech(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - client.synthesize_speech(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - - -def test_synthesize_speech_rest_required_fields(request_type=cloud_tts.SynthesizeSpeechRequest): - transport_class = transports.TextToSpeechRestTransport - - request_init = {} - request = request_type(**request_init) - pb_request = request_type.pb(request) - jsonified_request = json.loads(json_format.MessageToJson( - pb_request, - use_integers_for_enums=False - )) - - # verify fields with default values are dropped - - unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_speech._get_unset_required_fields(jsonified_request) - jsonified_request.update(unset_fields) - - # verify required fields with default values are now present - - unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_speech._get_unset_required_fields(jsonified_request) - jsonified_request.update(unset_fields) - - # verify required fields with non-default values are left alone - - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='rest', - ) - request = request_type(**request_init) - - # Designate an appropriate value for the returned response. - return_value = cloud_tts.SynthesizeSpeechResponse() - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, 'request') as req: - # We need to mock transcode() because providing default values - # for required fields will fail the real version if the http_options - # expect actual values for those fields. - with mock.patch.object(path_template, 'transcode') as transcode: - # A uri without fields and an empty body will force all the - # request fields to show up in the query_params. - pb_request = request_type.pb(request) - transcode_result = { - 'uri': 'v1/sample_method', - 'method': "post", - 'query_params': pb_request, - } - transcode_result['body'] = pb_request - transcode.return_value = transcode_result - - response_value = Response() - response_value.status_code = 200 - - # Convert return value to protobuf type - return_value = cloud_tts.SynthesizeSpeechResponse.pb(return_value) - json_return_value = json_format.MessageToJson(return_value) - - response_value._content = json_return_value.encode('UTF-8') - req.return_value = response_value - - response = client.synthesize_speech(request) - - expected_params = [ - ] - actual_params = req.call_args.kwargs['params'] - assert expected_params == actual_params - - -def test_synthesize_speech_rest_unset_required_fields(): - transport = transports.TextToSpeechRestTransport(credentials=ga_credentials.AnonymousCredentials) - - unset_fields = transport.synthesize_speech._get_unset_required_fields({}) - assert set(unset_fields) == (set(()) & set(("input", "voice", "audioConfig", ))) - - -def test_synthesize_speech_rest_flattened(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Mock the http request call within the method and fake a response. - with mock.patch.object(type(client.transport._session), 'request') as req: - # Designate an appropriate value for the returned response. - return_value = cloud_tts.SynthesizeSpeechResponse() - - # get arguments that satisfy an http rule for this method - sample_request = {} - - # get truthy value for each flattened field - mock_args = dict( - input=cloud_tts.SynthesisInput(text='text_value'), - voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), - audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), - ) - mock_args.update(sample_request) - - # Wrap the value into a proper Response obj - response_value = Response() - response_value.status_code = 200 - # Convert return value to protobuf type - return_value = cloud_tts.SynthesizeSpeechResponse.pb(return_value) - json_return_value = json_format.MessageToJson(return_value) - response_value._content = json_return_value.encode('UTF-8') - req.return_value = response_value - - client.synthesize_speech(**mock_args) - - # Establish that the underlying call was made with the expected - # request object values. - assert len(req.mock_calls) == 1 - _, args, _ = req.mock_calls[0] - assert path_template.validate("%s/v1/text:synthesize" % client.transport._host, args[1]) - - -def test_synthesize_speech_rest_flattened_error(transport: str = 'rest'): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Attempting to call a method with both a request object and flattened - # fields is an error. - with pytest.raises(ValueError): - client.synthesize_speech( - cloud_tts.SynthesizeSpeechRequest(), - input=cloud_tts.SynthesisInput(text='text_value'), - voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), - audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), - ) - - -def test_streaming_synthesize_rest_no_http_options(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - request = cloud_tts.StreamingSynthesizeRequest() - requests = [request] - with pytest.raises(RuntimeError): - client.streaming_synthesize(requests) - - -def test_streaming_synthesize_rest_error(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='rest' - ) - # Since a `google.api.http` annotation is required for using a rest transport - # method, this should error. - with pytest.raises(NotImplementedError) as not_implemented_error: - client.streaming_synthesize({}) - assert ( - "Method StreamingSynthesize is not available over REST transport" - in str(not_implemented_error.value) - ) - - -def test_credentials_transport_error(): - # It is an error to provide credentials and a transport instance. - transport = transports.TextToSpeechGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - with pytest.raises(ValueError): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # It is an error to provide a credentials file and a transport instance. - transport = transports.TextToSpeechGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - with pytest.raises(ValueError): - client = TextToSpeechClient( - client_options={"credentials_file": "credentials.json"}, - transport=transport, - ) - - # It is an error to provide an api_key and a transport instance. - transport = transports.TextToSpeechGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - options = client_options.ClientOptions() - options.api_key = "api_key" - with pytest.raises(ValueError): - client = TextToSpeechClient( - client_options=options, - transport=transport, - ) - - # It is an error to provide an api_key and a credential. - options = client_options.ClientOptions() - options.api_key = "api_key" - with pytest.raises(ValueError): - client = TextToSpeechClient( - client_options=options, - credentials=ga_credentials.AnonymousCredentials() - ) - - # It is an error to provide scopes and a transport instance. - transport = transports.TextToSpeechGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - with pytest.raises(ValueError): - client = TextToSpeechClient( - client_options={"scopes": ["1", "2"]}, - transport=transport, - ) - - -def test_transport_instance(): - # A client may be instantiated with a custom transport instance. - transport = transports.TextToSpeechGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - client = TextToSpeechClient(transport=transport) - assert client.transport is transport - -def test_transport_get_channel(): - # A client may be instantiated with a custom transport instance. - transport = transports.TextToSpeechGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - channel = transport.grpc_channel - assert channel - - transport = transports.TextToSpeechGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - channel = transport.grpc_channel - assert channel - -@pytest.mark.parametrize("transport_class", [ - transports.TextToSpeechGrpcTransport, - transports.TextToSpeechGrpcAsyncIOTransport, - transports.TextToSpeechRestTransport, -]) -def test_transport_adc(transport_class): - # Test default credentials are used if not provided. - with mock.patch.object(google.auth, 'default') as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class() - adc.assert_called_once() - -def test_transport_kind_grpc(): - transport = TextToSpeechClient.get_transport_class("grpc")( - credentials=ga_credentials.AnonymousCredentials() - ) - assert transport.kind == "grpc" - - -def test_initialize_client_w_grpc(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc" - ) - assert client is not None - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -def test_list_voices_empty_call_grpc(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - call.return_value = cloud_tts.ListVoicesResponse() - client.list_voices(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts.ListVoicesRequest() - - assert args[0] == request_msg - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -def test_synthesize_speech_empty_call_grpc(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - call.return_value = cloud_tts.SynthesizeSpeechResponse() - client.synthesize_speech(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts.SynthesizeSpeechRequest() - - assert args[0] == request_msg - - -def test_transport_kind_grpc_asyncio(): - transport = TextToSpeechAsyncClient.get_transport_class("grpc_asyncio")( - credentials=async_anonymous_credentials() - ) - assert transport.kind == "grpc_asyncio" - - -def test_initialize_client_w_grpc_asyncio(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio" - ) - assert client is not None - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -@pytest.mark.asyncio -async def test_list_voices_empty_call_grpc_asyncio(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.ListVoicesResponse( - )) - await client.list_voices(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts.ListVoicesRequest() - - assert args[0] == request_msg - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -@pytest.mark.asyncio -async def test_synthesize_speech_empty_call_grpc_asyncio(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.SynthesizeSpeechResponse( - audio_content=b'audio_content_blob', - )) - await client.synthesize_speech(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts.SynthesizeSpeechRequest() - - assert args[0] == request_msg - - -def test_transport_kind_rest(): - transport = TextToSpeechClient.get_transport_class("rest")( - credentials=ga_credentials.AnonymousCredentials() - ) - assert transport.kind == "rest" - - -def test_list_voices_rest_bad_request(request_type=cloud_tts.ListVoicesRequest): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - # send a request that will satisfy transcoding - request_init = {} - request = request_type(**request_init) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = mock.Mock() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = mock.Mock() - req.return_value = response_value - client.list_voices(request) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts.ListVoicesRequest, - dict, -]) -def test_list_voices_rest_call_success(request_type): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - - # send a request that will satisfy transcoding - request_init = {} - request = request_type(**request_init) - - # Mock the http request call within the method and fake a response. - with mock.patch.object(type(client.transport._session), 'request') as req: - # Designate an appropriate value for the returned response. - return_value = cloud_tts.ListVoicesResponse( - ) - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - - # Convert return value to protobuf type - return_value = cloud_tts.ListVoicesResponse.pb(return_value) - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - req.return_value = response_value - response = client.list_voices(request) - - # Establish that the response is the type that we expect. - assert isinstance(response, cloud_tts.ListVoicesResponse) - - -@pytest.mark.parametrize("null_interceptor", [True, False]) -def test_list_voices_rest_interceptors(null_interceptor): - transport = transports.TextToSpeechRestTransport( - credentials=ga_credentials.AnonymousCredentials(), - interceptor=None if null_interceptor else transports.TextToSpeechRestInterceptor(), - ) - client = TextToSpeechClient(transport=transport) - - with mock.patch.object(type(client.transport._session), "request") as req, \ - mock.patch.object(path_template, "transcode") as transcode, \ - mock.patch.object(transports.TextToSpeechRestInterceptor, "post_list_voices") as post, \ - mock.patch.object(transports.TextToSpeechRestInterceptor, "pre_list_voices") as pre: - pre.assert_not_called() - post.assert_not_called() - pb_message = cloud_tts.ListVoicesRequest.pb(cloud_tts.ListVoicesRequest()) - transcode.return_value = { - "method": "post", - "uri": "my_uri", - "body": pb_message, - "query_params": pb_message, - } - - req.return_value = mock.Mock() - req.return_value.status_code = 200 - return_value = cloud_tts.ListVoicesResponse.to_json(cloud_tts.ListVoicesResponse()) - req.return_value.content = return_value - - request = cloud_tts.ListVoicesRequest() - metadata =[ - ("key", "val"), - ("cephalopod", "squid"), - ] - pre.return_value = request, metadata - post.return_value = cloud_tts.ListVoicesResponse() - - client.list_voices(request, metadata=[("key", "val"), ("cephalopod", "squid"),]) - - pre.assert_called_once() - post.assert_called_once() - - -def test_synthesize_speech_rest_bad_request(request_type=cloud_tts.SynthesizeSpeechRequest): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - # send a request that will satisfy transcoding - request_init = {} - request = request_type(**request_init) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = mock.Mock() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = mock.Mock() - req.return_value = response_value - client.synthesize_speech(request) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts.SynthesizeSpeechRequest, - dict, -]) -def test_synthesize_speech_rest_call_success(request_type): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - - # send a request that will satisfy transcoding - request_init = {} - request = request_type(**request_init) - - # Mock the http request call within the method and fake a response. - with mock.patch.object(type(client.transport._session), 'request') as req: - # Designate an appropriate value for the returned response. - return_value = cloud_tts.SynthesizeSpeechResponse( - audio_content=b'audio_content_blob', - ) - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - - # Convert return value to protobuf type - return_value = cloud_tts.SynthesizeSpeechResponse.pb(return_value) - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - req.return_value = response_value - response = client.synthesize_speech(request) - - # Establish that the response is the type that we expect. - assert isinstance(response, cloud_tts.SynthesizeSpeechResponse) - assert response.audio_content == b'audio_content_blob' - - -@pytest.mark.parametrize("null_interceptor", [True, False]) -def test_synthesize_speech_rest_interceptors(null_interceptor): - transport = transports.TextToSpeechRestTransport( - credentials=ga_credentials.AnonymousCredentials(), - interceptor=None if null_interceptor else transports.TextToSpeechRestInterceptor(), - ) - client = TextToSpeechClient(transport=transport) - - with mock.patch.object(type(client.transport._session), "request") as req, \ - mock.patch.object(path_template, "transcode") as transcode, \ - mock.patch.object(transports.TextToSpeechRestInterceptor, "post_synthesize_speech") as post, \ - mock.patch.object(transports.TextToSpeechRestInterceptor, "pre_synthesize_speech") as pre: - pre.assert_not_called() - post.assert_not_called() - pb_message = cloud_tts.SynthesizeSpeechRequest.pb(cloud_tts.SynthesizeSpeechRequest()) - transcode.return_value = { - "method": "post", - "uri": "my_uri", - "body": pb_message, - "query_params": pb_message, - } - - req.return_value = mock.Mock() - req.return_value.status_code = 200 - return_value = cloud_tts.SynthesizeSpeechResponse.to_json(cloud_tts.SynthesizeSpeechResponse()) - req.return_value.content = return_value - - request = cloud_tts.SynthesizeSpeechRequest() - metadata =[ - ("key", "val"), - ("cephalopod", "squid"), - ] - pre.return_value = request, metadata - post.return_value = cloud_tts.SynthesizeSpeechResponse() - - client.synthesize_speech(request, metadata=[("key", "val"), ("cephalopod", "squid"),]) - - pre.assert_called_once() - post.assert_called_once() - - -def test_streaming_synthesize_rest_error(): - - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - - with pytest.raises(NotImplementedError) as not_implemented_error: - client.streaming_synthesize({}) - assert ( - "Method StreamingSynthesize is not available over REST transport" - in str(not_implemented_error.value) - ) - - -def test_get_operation_rest_bad_request(request_type=operations_pb2.GetOperationRequest): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - request = request_type() - request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2/operations/sample3'}, request) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = Response() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = Request() - req.return_value = response_value - client.get_operation(request) - - -@pytest.mark.parametrize("request_type", [ - operations_pb2.GetOperationRequest, - dict, -]) -def test_get_operation_rest(request_type): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - request_init = {'name': 'projects/sample1/locations/sample2/operations/sample3'} - request = request_type(**request_init) - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, 'request') as req: - # Designate an appropriate value for the returned response. - return_value = operations_pb2.Operation() - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - - req.return_value = response_value - - response = client.get_operation(request) - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.Operation) - - -def test_list_operations_rest_bad_request(request_type=operations_pb2.ListOperationsRequest): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - request = request_type() - request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2'}, request) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = Response() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = Request() - req.return_value = response_value - client.list_operations(request) - - -@pytest.mark.parametrize("request_type", [ - operations_pb2.ListOperationsRequest, - dict, -]) -def test_list_operations_rest(request_type): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - request_init = {'name': 'projects/sample1/locations/sample2'} - request = request_type(**request_init) - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, 'request') as req: - # Designate an appropriate value for the returned response. - return_value = operations_pb2.ListOperationsResponse() - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - - req.return_value = response_value - - response = client.list_operations(request) - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.ListOperationsResponse) - -def test_initialize_client_w_rest(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - assert client is not None - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -def test_list_voices_empty_call_rest(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - client.list_voices(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts.ListVoicesRequest() - - assert args[0] == request_msg - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -def test_synthesize_speech_empty_call_rest(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - client.synthesize_speech(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts.SynthesizeSpeechRequest() - - assert args[0] == request_msg - - -def test_transport_grpc_default(): - # A client should use the gRPC transport by default. - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - assert isinstance( - client.transport, - transports.TextToSpeechGrpcTransport, - ) - -def test_text_to_speech_base_transport_error(): - # Passing both a credentials object and credentials_file should raise an error - with pytest.raises(core_exceptions.DuplicateCredentialArgs): - transport = transports.TextToSpeechTransport( - credentials=ga_credentials.AnonymousCredentials(), - credentials_file="credentials.json" - ) - - -def test_text_to_speech_base_transport(): - # Instantiate the base transport. - with mock.patch('google.cloud.texttospeech_v1.services.text_to_speech.transports.TextToSpeechTransport.__init__') as Transport: - Transport.return_value = None - transport = transports.TextToSpeechTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Every method on the transport should just blindly - # raise NotImplementedError. - methods = ( - 'list_voices', - 'synthesize_speech', - 'streaming_synthesize', - 'get_operation', - 'list_operations', - ) - for method in methods: - with pytest.raises(NotImplementedError): - getattr(transport, method)(request=object()) - - with pytest.raises(NotImplementedError): - transport.close() - - # Catch all for all remaining methods and properties - remainder = [ - 'kind', - ] - for r in remainder: - with pytest.raises(NotImplementedError): - getattr(transport, r)() - - -def test_text_to_speech_base_transport_with_credentials_file(): - # Instantiate the base transport with a credentials file - with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('google.cloud.texttospeech_v1.services.text_to_speech.transports.TextToSpeechTransport._prep_wrapped_messages') as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.TextToSpeechTransport( - credentials_file="credentials.json", - quota_project_id="octopus", - ) - load_creds.assert_called_once_with("credentials.json", - scopes=None, - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - quota_project_id="octopus", - ) - - -def test_text_to_speech_base_transport_with_adc(): - # Test the default credentials are used if credentials and credentials_file are None. - with mock.patch.object(google.auth, 'default', autospec=True) as adc, mock.patch('google.cloud.texttospeech_v1.services.text_to_speech.transports.TextToSpeechTransport._prep_wrapped_messages') as Transport: - Transport.return_value = None - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.TextToSpeechTransport() - adc.assert_called_once() - - -def test_text_to_speech_auth_adc(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, 'default', autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - TextToSpeechClient() - adc.assert_called_once_with( - scopes=None, - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - quota_project_id=None, - ) - - -@pytest.mark.parametrize( - "transport_class", - [ - transports.TextToSpeechGrpcTransport, - transports.TextToSpeechGrpcAsyncIOTransport, - ], -) -def test_text_to_speech_transport_auth_adc(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, 'default', autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus", scopes=["1", "2"]) - adc.assert_called_once_with( - scopes=["1", "2"], - default_scopes=( 'https://www.googleapis.com/auth/cloud-platform',), - quota_project_id="octopus", - ) - - -@pytest.mark.parametrize( - "transport_class", - [ - transports.TextToSpeechGrpcTransport, - transports.TextToSpeechGrpcAsyncIOTransport, - transports.TextToSpeechRestTransport, - ], -) -def test_text_to_speech_transport_auth_gdch_credentials(transport_class): - host = 'https://language.com' - api_audience_tests = [None, 'https://language2.com'] - api_audience_expect = [host, 'https://language2.com'] - for t, e in zip(api_audience_tests, api_audience_expect): - with mock.patch.object(google.auth, 'default', autospec=True) as adc: - gdch_mock = mock.MagicMock() - type(gdch_mock).with_gdch_audience = mock.PropertyMock(return_value=gdch_mock) - adc.return_value = (gdch_mock, None) - transport_class(host=host, api_audience=t) - gdch_mock.with_gdch_audience.assert_called_once_with( - e - ) - - -@pytest.mark.parametrize( - "transport_class,grpc_helpers", - [ - (transports.TextToSpeechGrpcTransport, grpc_helpers), - (transports.TextToSpeechGrpcAsyncIOTransport, grpc_helpers_async) - ], -) -def test_text_to_speech_transport_create_channel(transport_class, grpc_helpers): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch.object( - grpc_helpers, "create_channel", autospec=True - ) as create_channel: - creds = ga_credentials.AnonymousCredentials() - adc.return_value = (creds, None) - transport_class( - quota_project_id="octopus", - scopes=["1", "2"] - ) - - create_channel.assert_called_with( - "texttospeech.googleapis.com:443", - credentials=creds, - credentials_file=None, - quota_project_id="octopus", - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - scopes=["1", "2"], - default_host="texttospeech.googleapis.com", - ssl_credentials=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - -@pytest.mark.parametrize("transport_class", [transports.TextToSpeechGrpcTransport, transports.TextToSpeechGrpcAsyncIOTransport]) -def test_text_to_speech_grpc_transport_client_cert_source_for_mtls( - transport_class -): - cred = ga_credentials.AnonymousCredentials() - - # Check ssl_channel_credentials is used if provided. - with mock.patch.object(transport_class, "create_channel") as mock_create_channel: - mock_ssl_channel_creds = mock.Mock() - transport_class( - host="squid.clam.whelk", - credentials=cred, - ssl_channel_credentials=mock_ssl_channel_creds - ) - mock_create_channel.assert_called_once_with( - "squid.clam.whelk:443", - credentials=cred, - credentials_file=None, - scopes=None, - ssl_credentials=mock_ssl_channel_creds, - quota_project_id=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - # Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls - # is used. - with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()): - with mock.patch("grpc.ssl_channel_credentials") as mock_ssl_cred: - transport_class( - credentials=cred, - client_cert_source_for_mtls=client_cert_source_callback - ) - expected_cert, expected_key = client_cert_source_callback() - mock_ssl_cred.assert_called_once_with( - certificate_chain=expected_cert, - private_key=expected_key - ) - -def test_text_to_speech_http_transport_client_cert_source_for_mtls(): - cred = ga_credentials.AnonymousCredentials() - with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel") as mock_configure_mtls_channel: - transports.TextToSpeechRestTransport ( - credentials=cred, - client_cert_source_for_mtls=client_cert_source_callback - ) - mock_configure_mtls_channel.assert_called_once_with(client_cert_source_callback) - - -@pytest.mark.parametrize("transport_name", [ - "grpc", - "grpc_asyncio", - "rest", -]) -def test_text_to_speech_host_no_port(transport_name): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com'), - transport=transport_name, - ) - assert client.transport._host == ( - 'texttospeech.googleapis.com:443' - if transport_name in ['grpc', 'grpc_asyncio'] - else 'https://texttospeech.googleapis.com' - ) - -@pytest.mark.parametrize("transport_name", [ - "grpc", - "grpc_asyncio", - "rest", -]) -def test_text_to_speech_host_with_port(transport_name): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com:8000'), - transport=transport_name, - ) - assert client.transport._host == ( - 'texttospeech.googleapis.com:8000' - if transport_name in ['grpc', 'grpc_asyncio'] - else 'https://texttospeech.googleapis.com:8000' - ) - -@pytest.mark.parametrize("transport_name", [ - "rest", -]) -def test_text_to_speech_client_transport_session_collision(transport_name): - creds1 = ga_credentials.AnonymousCredentials() - creds2 = ga_credentials.AnonymousCredentials() - client1 = TextToSpeechClient( - credentials=creds1, - transport=transport_name, - ) - client2 = TextToSpeechClient( - credentials=creds2, - transport=transport_name, - ) - session1 = client1.transport.list_voices._session - session2 = client2.transport.list_voices._session - assert session1 != session2 - session1 = client1.transport.synthesize_speech._session - session2 = client2.transport.synthesize_speech._session - assert session1 != session2 - session1 = client1.transport.streaming_synthesize._session - session2 = client2.transport.streaming_synthesize._session - assert session1 != session2 -def test_text_to_speech_grpc_transport_channel(): - channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) - - # Check that channel is used if provided. - transport = transports.TextToSpeechGrpcTransport( - host="squid.clam.whelk", - channel=channel, - ) - assert transport.grpc_channel == channel - assert transport._host == "squid.clam.whelk:443" - assert transport._ssl_channel_credentials == None - - -def test_text_to_speech_grpc_asyncio_transport_channel(): - channel = aio.secure_channel('http://localhost/', grpc.local_channel_credentials()) - - # Check that channel is used if provided. - transport = transports.TextToSpeechGrpcAsyncIOTransport( - host="squid.clam.whelk", - channel=channel, - ) - assert transport.grpc_channel == channel - assert transport._host == "squid.clam.whelk:443" - assert transport._ssl_channel_credentials == None - - -# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are -# removed from grpc/grpc_asyncio transport constructor. -@pytest.mark.parametrize("transport_class", [transports.TextToSpeechGrpcTransport, transports.TextToSpeechGrpcAsyncIOTransport]) -def test_text_to_speech_transport_channel_mtls_with_client_cert_source( - transport_class -): - with mock.patch("grpc.ssl_channel_credentials", autospec=True) as grpc_ssl_channel_cred: - with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: - mock_ssl_cred = mock.Mock() - grpc_ssl_channel_cred.return_value = mock_ssl_cred - - mock_grpc_channel = mock.Mock() - grpc_create_channel.return_value = mock_grpc_channel - - cred = ga_credentials.AnonymousCredentials() - with pytest.warns(DeprecationWarning): - with mock.patch.object(google.auth, 'default') as adc: - adc.return_value = (cred, None) - transport = transport_class( - host="squid.clam.whelk", - api_mtls_endpoint="mtls.squid.clam.whelk", - client_cert_source=client_cert_source_callback, - ) - adc.assert_called_once() - - grpc_ssl_channel_cred.assert_called_once_with( - certificate_chain=b"cert bytes", private_key=b"key bytes" - ) - grpc_create_channel.assert_called_once_with( - "mtls.squid.clam.whelk:443", - credentials=cred, - credentials_file=None, - scopes=None, - ssl_credentials=mock_ssl_cred, - quota_project_id=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - assert transport.grpc_channel == mock_grpc_channel - assert transport._ssl_channel_credentials == mock_ssl_cred - - -# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are -# removed from grpc/grpc_asyncio transport constructor. -@pytest.mark.parametrize("transport_class", [transports.TextToSpeechGrpcTransport, transports.TextToSpeechGrpcAsyncIOTransport]) -def test_text_to_speech_transport_channel_mtls_with_adc( - transport_class -): - mock_ssl_cred = mock.Mock() - with mock.patch.multiple( - "google.auth.transport.grpc.SslCredentials", - __init__=mock.Mock(return_value=None), - ssl_credentials=mock.PropertyMock(return_value=mock_ssl_cred), - ): - with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: - mock_grpc_channel = mock.Mock() - grpc_create_channel.return_value = mock_grpc_channel - mock_cred = mock.Mock() - - with pytest.warns(DeprecationWarning): - transport = transport_class( - host="squid.clam.whelk", - credentials=mock_cred, - api_mtls_endpoint="mtls.squid.clam.whelk", - client_cert_source=None, - ) - - grpc_create_channel.assert_called_once_with( - "mtls.squid.clam.whelk:443", - credentials=mock_cred, - credentials_file=None, - scopes=None, - ssl_credentials=mock_ssl_cred, - quota_project_id=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - assert transport.grpc_channel == mock_grpc_channel - - -def test_model_path(): - project = "squid" - location = "clam" - model = "whelk" - expected = "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) - actual = TextToSpeechClient.model_path(project, location, model) - assert expected == actual - - -def test_parse_model_path(): - expected = { - "project": "octopus", - "location": "oyster", - "model": "nudibranch", - } - path = TextToSpeechClient.model_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechClient.parse_model_path(path) - assert expected == actual - -def test_common_billing_account_path(): - billing_account = "cuttlefish" - expected = "billingAccounts/{billing_account}".format(billing_account=billing_account, ) - actual = TextToSpeechClient.common_billing_account_path(billing_account) - assert expected == actual - - -def test_parse_common_billing_account_path(): - expected = { - "billing_account": "mussel", - } - path = TextToSpeechClient.common_billing_account_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechClient.parse_common_billing_account_path(path) - assert expected == actual - -def test_common_folder_path(): - folder = "winkle" - expected = "folders/{folder}".format(folder=folder, ) - actual = TextToSpeechClient.common_folder_path(folder) - assert expected == actual - - -def test_parse_common_folder_path(): - expected = { - "folder": "nautilus", - } - path = TextToSpeechClient.common_folder_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechClient.parse_common_folder_path(path) - assert expected == actual - -def test_common_organization_path(): - organization = "scallop" - expected = "organizations/{organization}".format(organization=organization, ) - actual = TextToSpeechClient.common_organization_path(organization) - assert expected == actual - - -def test_parse_common_organization_path(): - expected = { - "organization": "abalone", - } - path = TextToSpeechClient.common_organization_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechClient.parse_common_organization_path(path) - assert expected == actual - -def test_common_project_path(): - project = "squid" - expected = "projects/{project}".format(project=project, ) - actual = TextToSpeechClient.common_project_path(project) - assert expected == actual - - -def test_parse_common_project_path(): - expected = { - "project": "clam", - } - path = TextToSpeechClient.common_project_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechClient.parse_common_project_path(path) - assert expected == actual - -def test_common_location_path(): - project = "whelk" - location = "octopus" - expected = "projects/{project}/locations/{location}".format(project=project, location=location, ) - actual = TextToSpeechClient.common_location_path(project, location) - assert expected == actual - - -def test_parse_common_location_path(): - expected = { - "project": "oyster", - "location": "nudibranch", - } - path = TextToSpeechClient.common_location_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechClient.parse_common_location_path(path) - assert expected == actual - - -def test_client_with_default_client_info(): - client_info = gapic_v1.client_info.ClientInfo() - - with mock.patch.object(transports.TextToSpeechTransport, '_prep_wrapped_messages') as prep: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - client_info=client_info, - ) - prep.assert_called_once_with(client_info) - - with mock.patch.object(transports.TextToSpeechTransport, '_prep_wrapped_messages') as prep: - transport_class = TextToSpeechClient.get_transport_class() - transport = transport_class( - credentials=ga_credentials.AnonymousCredentials(), - client_info=client_info, - ) - prep.assert_called_once_with(client_info) - - -def test_get_operation(transport: str = "grpc"): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.GetOperationRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.Operation() - response = client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.Operation) -@pytest.mark.asyncio -async def test_get_operation_async(transport: str = "grpc_asyncio"): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.GetOperationRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation() - ) - response = await client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.Operation) - -def test_get_operation_field_headers(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.GetOperationRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - call.return_value = operations_pb2.Operation() - - client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] -@pytest.mark.asyncio -async def test_get_operation_field_headers_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.GetOperationRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation() - ) - await client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] - -def test_get_operation_from_dict(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.Operation() - - response = client.get_operation( - request={ - "name": "locations", - } - ) - call.assert_called() -@pytest.mark.asyncio -async def test_get_operation_from_dict_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation() - ) - response = await client.get_operation( - request={ - "name": "locations", - } - ) - call.assert_called() - - -def test_list_operations(transport: str = "grpc"): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.ListOperationsRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.ListOperationsResponse() - response = client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.ListOperationsResponse) -@pytest.mark.asyncio -async def test_list_operations_async(transport: str = "grpc_asyncio"): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.ListOperationsRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.ListOperationsResponse() - ) - response = await client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.ListOperationsResponse) - -def test_list_operations_field_headers(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.ListOperationsRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - call.return_value = operations_pb2.ListOperationsResponse() - - client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] -@pytest.mark.asyncio -async def test_list_operations_field_headers_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.ListOperationsRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.ListOperationsResponse() - ) - await client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] - -def test_list_operations_from_dict(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.ListOperationsResponse() - - response = client.list_operations( - request={ - "name": "locations", - } - ) - call.assert_called() -@pytest.mark.asyncio -async def test_list_operations_from_dict_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.ListOperationsResponse() - ) - response = await client.list_operations( - request={ - "name": "locations", - } - ) - call.assert_called() - - -def test_transport_close_grpc(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc" - ) - with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: - with client: - close.assert_not_called() - close.assert_called_once() - - -@pytest.mark.asyncio -async def test_transport_close_grpc_asyncio(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio" - ) - with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: - async with client: - close.assert_not_called() - close.assert_called_once() - - -def test_transport_close_rest(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - with mock.patch.object(type(getattr(client.transport, "_session")), "close") as close: - with client: - close.assert_not_called() - close.assert_called_once() - - -def test_client_ctx(): - transports = [ - 'rest', - 'grpc', - ] - for transport in transports: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport - ) - # Test client calls underlying transport. - with mock.patch.object(type(client.transport), "close") as close: - close.assert_not_called() - with client: - pass - close.assert_called() - -@pytest.mark.parametrize("client_class,transport_class", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport), -]) -def test_api_key_credentials(client_class, transport_class): - with mock.patch.object( - google.auth._default, "get_api_key_credentials", create=True - ) as get_api_key_credentials: - mock_cred = mock.Mock() - get_api_key_credentials.return_value = mock_cred - options = client_options.ClientOptions() - options.api_key = "api_key" - with mock.patch.object(transport_class, "__init__") as patched: - patched.return_value = None - client = client_class(client_options=options) - patched.assert_called_once_with( - credentials=mock_cred, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech_long_audio_synthesize.py b/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech_long_audio_synthesize.py deleted file mode 100644 index 4a96f10d7cca..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1/tests/unit/gapic/texttospeech_v1/test_text_to_speech_long_audio_synthesize.py +++ /dev/null @@ -1,2433 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 -# try/except added for compatibility with python < 3.8 -try: - from unittest import mock - from unittest.mock import AsyncMock # pragma: NO COVER -except ImportError: # pragma: NO COVER - import mock - -import grpc -from grpc.experimental import aio -from collections.abc import Iterable, AsyncIterable -from google.protobuf import json_format -import json -import math -import pytest -from google.api_core import api_core_version -from proto.marshal.rules.dates import DurationRule, TimestampRule -from proto.marshal.rules import wrappers -from requests import Response -from requests import Request, PreparedRequest -from requests.sessions import Session -from google.protobuf import json_format - -try: - from google.auth.aio import credentials as ga_credentials_async - HAS_GOOGLE_AUTH_AIO = True -except ImportError: # pragma: NO COVER - HAS_GOOGLE_AUTH_AIO = False - -from google.api_core import client_options -from google.api_core import exceptions as core_exceptions -from google.api_core import future -from google.api_core import gapic_v1 -from google.api_core import grpc_helpers -from google.api_core import grpc_helpers_async -from google.api_core import operation -from google.api_core import operation_async # type: ignore -from google.api_core import operations_v1 -from google.api_core import path_template -from google.api_core import retry as retries -from google.auth import credentials as ga_credentials -from google.auth.exceptions import MutualTLSChannelError -from google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeAsyncClient -from google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeClient -from google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize import transports -from google.cloud.texttospeech_v1.types import cloud_tts -from google.cloud.texttospeech_v1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore -from google.oauth2 import service_account -import google.auth - - -async def mock_async_gen(data, chunk_size=1): - for i in range(0, len(data)): # pragma: NO COVER - chunk = data[i : i + chunk_size] - yield chunk.encode("utf-8") - -def client_cert_source_callback(): - return b"cert bytes", b"key bytes" - -# TODO: use async auth anon credentials by default once the minimum version of google-auth is upgraded. -# See related issue: https://github.com/googleapis/gapic-generator-python/issues/2107. -def async_anonymous_credentials(): - if HAS_GOOGLE_AUTH_AIO: - return ga_credentials_async.AnonymousCredentials() - return ga_credentials.AnonymousCredentials() - -# If default endpoint is localhost, then default mtls endpoint will be the same. -# This method modifies the default endpoint so the client can produce a different -# mtls endpoint for endpoint testing purposes. -def modify_default_endpoint(client): - return "foo.googleapis.com" if ("localhost" in client.DEFAULT_ENDPOINT) else client.DEFAULT_ENDPOINT - -# If default endpoint template is localhost, then default mtls endpoint will be the same. -# This method modifies the default endpoint template so the client can produce a different -# mtls endpoint for endpoint testing purposes. -def modify_default_endpoint_template(client): - return "test.{UNIVERSE_DOMAIN}" if ("localhost" in client._DEFAULT_ENDPOINT_TEMPLATE) else client._DEFAULT_ENDPOINT_TEMPLATE - - -def test__get_default_mtls_endpoint(): - api_endpoint = "example.googleapis.com" - api_mtls_endpoint = "example.mtls.googleapis.com" - sandbox_endpoint = "example.sandbox.googleapis.com" - sandbox_mtls_endpoint = "example.mtls.sandbox.googleapis.com" - non_googleapi = "api.example.com" - - assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(None) is None - assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(api_endpoint) == api_mtls_endpoint - assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(api_mtls_endpoint) == api_mtls_endpoint - assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(sandbox_endpoint) == sandbox_mtls_endpoint - assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(sandbox_mtls_endpoint) == sandbox_mtls_endpoint - assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(non_googleapi) == non_googleapi - -def test__read_environment_variables(): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (True, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): - with pytest.raises(ValueError) as excinfo: - TextToSpeechLongAudioSynthesizeClient._read_environment_variables() - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "never", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "always", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): - with pytest.raises(MutualTLSChannelError) as excinfo: - TextToSpeechLongAudioSynthesizeClient._read_environment_variables() - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" - - with mock.patch.dict(os.environ, {"GOOGLE_CLOUD_UNIVERSE_DOMAIN": "foo.com"}): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", "foo.com") - -def test__get_client_cert_source(): - mock_provided_cert_source = mock.Mock() - mock_default_cert_source = mock.Mock() - - assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(None, False) is None - assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(mock_provided_cert_source, False) is None - assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(mock_provided_cert_source, True) == mock_provided_cert_source - - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): - with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_default_cert_source): - assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(None, True) is mock_default_cert_source - assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(mock_provided_cert_source, "true") is mock_provided_cert_source - -@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) -@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) -def test__get_api_endpoint(): - api_override = "foo.com" - mock_client_cert_source = mock.Mock() - default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - default_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) - mock_universe = "bar.com" - mock_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) - - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(api_override, mock_client_cert_source, default_universe, "always") == api_override - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "auto") == TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, default_universe, "auto") == default_endpoint - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, default_universe, "always") == TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "always") == TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, mock_universe, "never") == mock_endpoint - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, default_universe, "never") == default_endpoint - - with pytest.raises(MutualTLSChannelError) as excinfo: - TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, mock_client_cert_source, mock_universe, "auto") - assert str(excinfo.value) == "mTLS is not supported in any universe other than googleapis.com." - - -def test__get_universe_domain(): - client_universe_domain = "foo.com" - universe_domain_env = "bar.com" - - assert TextToSpeechLongAudioSynthesizeClient._get_universe_domain(client_universe_domain, universe_domain_env) == client_universe_domain - assert TextToSpeechLongAudioSynthesizeClient._get_universe_domain(None, universe_domain_env) == universe_domain_env - assert TextToSpeechLongAudioSynthesizeClient._get_universe_domain(None, None) == TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - - with pytest.raises(ValueError) as excinfo: - TextToSpeechLongAudioSynthesizeClient._get_universe_domain("", None) - assert str(excinfo.value) == "Universe Domain cannot be an empty string." - -@pytest.mark.parametrize("client_class,transport_class,transport_name", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), -]) -def test__validate_universe_domain(client_class, transport_class, transport_name): - client = client_class( - transport=transport_class( - credentials=ga_credentials.AnonymousCredentials() - ) - ) - assert client._validate_universe_domain() == True - - # Test the case when universe is already validated. - assert client._validate_universe_domain() == True - - if transport_name == "grpc": - # Test the case where credentials are provided by the - # `local_channel_credentials`. The default universes in both match. - channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) - client = client_class(transport=transport_class(channel=channel)) - assert client._validate_universe_domain() == True - - # Test the case where credentials do not exist: e.g. a transport is provided - # with no credentials. Validation should still succeed because there is no - # mismatch with non-existent credentials. - channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) - transport=transport_class(channel=channel) - transport._credentials = None - client = client_class(transport=transport) - assert client._validate_universe_domain() == True - - # TODO: This is needed to cater for older versions of google-auth - # Make this test unconditional once the minimum supported version of - # google-auth becomes 2.23.0 or higher. - google_auth_major, google_auth_minor = [int(part) for part in google.auth.__version__.split(".")[0:2]] - if google_auth_major > 2 or (google_auth_major == 2 and google_auth_minor >= 23): - credentials = ga_credentials.AnonymousCredentials() - credentials._universe_domain = "foo.com" - # Test the case when there is a universe mismatch from the credentials. - client = client_class( - transport=transport_class(credentials=credentials) - ) - with pytest.raises(ValueError) as excinfo: - client._validate_universe_domain() - assert str(excinfo.value) == "The configured universe domain (googleapis.com) does not match the universe domain found in the credentials (foo.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." - - # Test the case when there is a universe mismatch from the client. - # - # TODO: Make this test unconditional once the minimum supported version of - # google-api-core becomes 2.15.0 or higher. - api_core_major, api_core_minor = [int(part) for part in api_core_version.__version__.split(".")[0:2]] - if api_core_major > 2 or (api_core_major == 2 and api_core_minor >= 15): - client = client_class(client_options={"universe_domain": "bar.com"}, transport=transport_class(credentials=ga_credentials.AnonymousCredentials(),)) - with pytest.raises(ValueError) as excinfo: - client._validate_universe_domain() - assert str(excinfo.value) == "The configured universe domain (bar.com) does not match the universe domain found in the credentials (googleapis.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." - - # Test that ValueError is raised if universe_domain is provided via client options and credentials is None - with pytest.raises(ValueError): - client._compare_universes("foo.bar", None) - - -@pytest.mark.parametrize("client_class,transport_name", [ - (TextToSpeechLongAudioSynthesizeClient, "grpc"), - (TextToSpeechLongAudioSynthesizeAsyncClient, "grpc_asyncio"), - (TextToSpeechLongAudioSynthesizeClient, "rest"), -]) -def test_text_to_speech_long_audio_synthesize_client_from_service_account_info(client_class, transport_name): - creds = ga_credentials.AnonymousCredentials() - with mock.patch.object(service_account.Credentials, 'from_service_account_info') as factory: - factory.return_value = creds - info = {"valid": True} - client = client_class.from_service_account_info(info, transport=transport_name) - assert client.transport._credentials == creds - assert isinstance(client, client_class) - - assert client.transport._host == ( - 'texttospeech.googleapis.com:443' - if transport_name in ['grpc', 'grpc_asyncio'] - else - 'https://texttospeech.googleapis.com' - ) - - -@pytest.mark.parametrize("transport_class,transport_name", [ - (transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), - (transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio"), - (transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), -]) -def test_text_to_speech_long_audio_synthesize_client_service_account_always_use_jwt(transport_class, transport_name): - with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: - creds = service_account.Credentials(None, None, None) - transport = transport_class(credentials=creds, always_use_jwt_access=True) - use_jwt.assert_called_once_with(True) - - with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: - creds = service_account.Credentials(None, None, None) - transport = transport_class(credentials=creds, always_use_jwt_access=False) - use_jwt.assert_not_called() - - -@pytest.mark.parametrize("client_class,transport_name", [ - (TextToSpeechLongAudioSynthesizeClient, "grpc"), - (TextToSpeechLongAudioSynthesizeAsyncClient, "grpc_asyncio"), - (TextToSpeechLongAudioSynthesizeClient, "rest"), -]) -def test_text_to_speech_long_audio_synthesize_client_from_service_account_file(client_class, transport_name): - creds = ga_credentials.AnonymousCredentials() - with mock.patch.object(service_account.Credentials, 'from_service_account_file') as factory: - factory.return_value = creds - client = client_class.from_service_account_file("dummy/file/path.json", transport=transport_name) - assert client.transport._credentials == creds - assert isinstance(client, client_class) - - client = client_class.from_service_account_json("dummy/file/path.json", transport=transport_name) - assert client.transport._credentials == creds - assert isinstance(client, client_class) - - assert client.transport._host == ( - 'texttospeech.googleapis.com:443' - if transport_name in ['grpc', 'grpc_asyncio'] - else - 'https://texttospeech.googleapis.com' - ) - - -def test_text_to_speech_long_audio_synthesize_client_get_transport_class(): - transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class() - available_transports = [ - transports.TextToSpeechLongAudioSynthesizeGrpcTransport, - transports.TextToSpeechLongAudioSynthesizeRestTransport, - ] - assert transport in available_transports - - transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class("grpc") - assert transport == transports.TextToSpeechLongAudioSynthesizeGrpcTransport - - -@pytest.mark.parametrize("client_class,transport_class,transport_name", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio"), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), -]) -@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) -@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) -def test_text_to_speech_long_audio_synthesize_client_client_options(client_class, transport_class, transport_name): - # Check that if channel is provided we won't create a new one. - with mock.patch.object(TextToSpeechLongAudioSynthesizeClient, 'get_transport_class') as gtc: - transport = transport_class( - credentials=ga_credentials.AnonymousCredentials() - ) - client = client_class(transport=transport) - gtc.assert_not_called() - - # Check that if channel is provided via str we will create a new one. - with mock.patch.object(TextToSpeechLongAudioSynthesizeClient, 'get_transport_class') as gtc: - client = client_class(transport=transport_name) - gtc.assert_called() - - # Check the case api_endpoint is provided. - options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(transport=transport_name, client_options=options) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host="squid.clam.whelk", - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is - # "never". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is - # "always". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client.DEFAULT_MTLS_ENDPOINT, - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has - # unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): - with pytest.raises(MutualTLSChannelError) as excinfo: - client = client_class(transport=transport_name) - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" - - # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): - with pytest.raises(ValueError) as excinfo: - client = client_class(transport=transport_name) - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - - # Check the case quota_project_id is provided - options = client_options.ClientOptions(quota_project_id="octopus") - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id="octopus", - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - # Check the case api_endpoint is provided - options = client_options.ClientOptions(api_audience="https://language.googleapis.com") - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience="https://language.googleapis.com" - ) - -@pytest.mark.parametrize("client_class,transport_class,transport_name,use_client_cert_env", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", "true"), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", "true"), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", "false"), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", "false"), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest", "true"), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest", "false"), -]) -@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) -@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) -@mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}) -def test_text_to_speech_long_audio_synthesize_client_mtls_env_auto(client_class, transport_class, transport_name, use_client_cert_env): - # This tests the endpoint autoswitch behavior. Endpoint is autoswitched to the default - # mtls endpoint, if GOOGLE_API_USE_CLIENT_CERTIFICATE is "true" and client cert exists. - - # Check the case client_cert_source is provided. Whether client cert is used depends on - # GOOGLE_API_USE_CLIENT_CERTIFICATE value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): - options = client_options.ClientOptions(client_cert_source=client_cert_source_callback) - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - - if use_client_cert_env == "false": - expected_client_cert_source = None - expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) - else: - expected_client_cert_source = client_cert_source_callback - expected_host = client.DEFAULT_MTLS_ENDPOINT - - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=expected_host, - scopes=None, - client_cert_source_for_mtls=expected_client_cert_source, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case ADC client cert is provided. Whether client cert is used depends on - # GOOGLE_API_USE_CLIENT_CERTIFICATE value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): - with mock.patch.object(transport_class, '__init__') as patched: - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): - with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=client_cert_source_callback): - if use_client_cert_env == "false": - expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) - expected_client_cert_source = None - else: - expected_host = client.DEFAULT_MTLS_ENDPOINT - expected_client_cert_source = client_cert_source_callback - - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=expected_host, - scopes=None, - client_cert_source_for_mtls=expected_client_cert_source, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case client_cert_source and ADC client cert are not provided. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): - with mock.patch.object(transport_class, '__init__') as patched: - with mock.patch("google.auth.transport.mtls.has_default_client_cert_source", return_value=False): - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - -@pytest.mark.parametrize("client_class", [ - TextToSpeechLongAudioSynthesizeClient, TextToSpeechLongAudioSynthesizeAsyncClient -]) -@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechLongAudioSynthesizeClient)) -@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechLongAudioSynthesizeAsyncClient)) -def test_text_to_speech_long_audio_synthesize_client_get_mtls_endpoint_and_cert_source(client_class): - mock_client_cert_source = mock.Mock() - - # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "true". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - mock_api_endpoint = "foo" - options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) - assert api_endpoint == mock_api_endpoint - assert cert_source == mock_client_cert_source - - # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "false". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): - mock_client_cert_source = mock.Mock() - mock_api_endpoint = "foo" - options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) - assert api_endpoint == mock_api_endpoint - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_ENDPOINT - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "always". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert doesn't exist. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=False): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_ENDPOINT - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert exists. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): - with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_client_cert_source): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT - assert cert_source == mock_client_cert_source - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has - # unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): - with pytest.raises(MutualTLSChannelError) as excinfo: - client_class.get_mtls_endpoint_and_cert_source() - - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" - - # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): - with pytest.raises(ValueError) as excinfo: - client_class.get_mtls_endpoint_and_cert_source() - - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - -@pytest.mark.parametrize("client_class", [ - TextToSpeechLongAudioSynthesizeClient, TextToSpeechLongAudioSynthesizeAsyncClient -]) -@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) -@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) -def test_text_to_speech_long_audio_synthesize_client_client_api_endpoint(client_class): - mock_client_cert_source = client_cert_source_callback - api_override = "foo.com" - default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - default_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) - mock_universe = "bar.com" - mock_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) - - # If ClientOptions.api_endpoint is set and GOOGLE_API_USE_CLIENT_CERTIFICATE="true", - # use ClientOptions.api_endpoint as the api endpoint regardless. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel"): - options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=api_override) - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == api_override - - # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="never", - # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - client = client_class(credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == default_endpoint - - # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="always", - # use the DEFAULT_MTLS_ENDPOINT as the api endpoint. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - client = client_class(credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT - - # If ClientOptions.api_endpoint is not set, GOOGLE_API_USE_MTLS_ENDPOINT="auto" (default), - # GOOGLE_API_USE_CLIENT_CERTIFICATE="false" (default), default cert source doesn't exist, - # and ClientOptions.universe_domain="bar.com", - # use the _DEFAULT_ENDPOINT_TEMPLATE populated with universe domain as the api endpoint. - options = client_options.ClientOptions() - universe_exists = hasattr(options, "universe_domain") - if universe_exists: - options = client_options.ClientOptions(universe_domain=mock_universe) - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - else: - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == (mock_endpoint if universe_exists else default_endpoint) - assert client.universe_domain == (mock_universe if universe_exists else default_universe) - - # If ClientOptions does not have a universe domain attribute and GOOGLE_API_USE_MTLS_ENDPOINT="never", - # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. - options = client_options.ClientOptions() - if hasattr(options, "universe_domain"): - delattr(options, "universe_domain") - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == default_endpoint - - -@pytest.mark.parametrize("client_class,transport_class,transport_name", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio"), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), -]) -def test_text_to_speech_long_audio_synthesize_client_client_options_scopes(client_class, transport_class, transport_name): - # Check the case scopes are provided. - options = client_options.ClientOptions( - scopes=["1", "2"], - ) - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=["1", "2"], - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - -@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", grpc_helpers), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest", None), -]) -def test_text_to_speech_long_audio_synthesize_client_client_options_credentials_file(client_class, transport_class, transport_name, grpc_helpers): - # Check the case credentials file is provided. - options = client_options.ClientOptions( - credentials_file="credentials.json" - ) - - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file="credentials.json", - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - -def test_text_to_speech_long_audio_synthesize_client_client_options_from_dict(): - with mock.patch('google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeGrpcTransport.__init__') as grpc_transport: - grpc_transport.return_value = None - client = TextToSpeechLongAudioSynthesizeClient( - client_options={'api_endpoint': 'squid.clam.whelk'} - ) - grpc_transport.assert_called_once_with( - credentials=None, - credentials_file=None, - host="squid.clam.whelk", - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - -@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", grpc_helpers), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), -]) -def test_text_to_speech_long_audio_synthesize_client_create_channel_credentials_file(client_class, transport_class, transport_name, grpc_helpers): - # Check the case credentials file is provided. - options = client_options.ClientOptions( - credentials_file="credentials.json" - ) - - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file="credentials.json", - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # test that the credentials from file are saved and used as the credentials. - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch.object( - google.auth, "default", autospec=True - ) as adc, mock.patch.object( - grpc_helpers, "create_channel" - ) as create_channel: - creds = ga_credentials.AnonymousCredentials() - file_creds = ga_credentials.AnonymousCredentials() - load_creds.return_value = (file_creds, None) - adc.return_value = (creds, None) - client = client_class(client_options=options, transport=transport_name) - create_channel.assert_called_with( - "texttospeech.googleapis.com:443", - credentials=file_creds, - credentials_file=None, - quota_project_id=None, - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - scopes=None, - default_host="texttospeech.googleapis.com", - ssl_credentials=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts_lrs.SynthesizeLongAudioRequest, - dict, -]) -def test_synthesize_long_audio(request_type, transport: str = 'grpc'): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.Operation(name='operations/spam') - response = client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - request = cloud_tts_lrs.SynthesizeLongAudioRequest() - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, future.Future) - - -def test_synthesize_long_audio_non_empty_request_with_auto_populated_field(): - # This test is a coverage failsafe to make sure that UUID4 fields are - # automatically populated, according to AIP-4235, with non-empty requests. - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='grpc', - ) - - # Populate all string fields in the request which are not UUID4 - # since we want to check that UUID4 are populated automatically - # if they meet the requirements of AIP 4235. - request = cloud_tts_lrs.SynthesizeLongAudioRequest( - parent='parent_value', - output_gcs_uri='output_gcs_uri_value', - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - call.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client.synthesize_long_audio(request=request) - call.assert_called() - _, args, _ = call.mock_calls[0] - assert args[0] == cloud_tts_lrs.SynthesizeLongAudioRequest( - parent='parent_value', - output_gcs_uri='output_gcs_uri_value', - ) - -def test_synthesize_long_audio_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.synthesize_long_audio in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.synthesize_long_audio] = mock_rpc - request = {} - client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - # Operation methods call wrapper_fn to build a cached - # client._transport.operations_client instance on first rpc call. - # Subsequent calls should use the cached wrapper - wrapper_fn.reset_mock() - - client.synthesize_long_audio(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_synthesize_long_audio_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._client._transport.synthesize_long_audio in client._client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.AsyncMock() - mock_rpc.return_value = mock.Mock() - client._client._transport._wrapped_methods[client._client._transport.synthesize_long_audio] = mock_rpc - - request = {} - await client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - # Operation methods call wrapper_fn to build a cached - # client._transport.operations_client instance on first rpc call. - # Subsequent calls should use the cached wrapper - wrapper_fn.reset_mock() - - await client.synthesize_long_audio(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_synthesize_long_audio_async(transport: str = 'grpc_asyncio', request_type=cloud_tts_lrs.SynthesizeLongAudioRequest): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation(name='operations/spam') - ) - response = await client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - request = cloud_tts_lrs.SynthesizeLongAudioRequest() - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, future.Future) - - -@pytest.mark.asyncio -async def test_synthesize_long_audio_async_from_dict(): - await test_synthesize_long_audio_async(request_type=dict) - -def test_synthesize_long_audio_field_headers(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = cloud_tts_lrs.SynthesizeLongAudioRequest() - - request.parent = 'parent_value' - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - call.return_value = operations_pb2.Operation(name='operations/op') - client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ( - 'x-goog-request-params', - 'parent=parent_value', - ) in kw['metadata'] - - -@pytest.mark.asyncio -async def test_synthesize_long_audio_field_headers_async(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = cloud_tts_lrs.SynthesizeLongAudioRequest() - - request.parent = 'parent_value' - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(operations_pb2.Operation(name='operations/op')) - await client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ( - 'x-goog-request-params', - 'parent=parent_value', - ) in kw['metadata'] - - -def test_synthesize_long_audio_rest_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.synthesize_long_audio in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.synthesize_long_audio] = mock_rpc - - request = {} - client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - # Operation methods build a cached wrapper on first rpc call - # subsequent calls should use the cached wrapper - wrapper_fn.reset_mock() - - client.synthesize_long_audio(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - - -def test_synthesize_long_audio_rest_required_fields(request_type=cloud_tts_lrs.SynthesizeLongAudioRequest): - transport_class = transports.TextToSpeechLongAudioSynthesizeRestTransport - - request_init = {} - request_init["output_gcs_uri"] = "" - request = request_type(**request_init) - pb_request = request_type.pb(request) - jsonified_request = json.loads(json_format.MessageToJson( - pb_request, - use_integers_for_enums=False - )) - - # verify fields with default values are dropped - - unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_long_audio._get_unset_required_fields(jsonified_request) - jsonified_request.update(unset_fields) - - # verify required fields with default values are now present - - jsonified_request["outputGcsUri"] = 'output_gcs_uri_value' - - unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_long_audio._get_unset_required_fields(jsonified_request) - jsonified_request.update(unset_fields) - - # verify required fields with non-default values are left alone - assert "outputGcsUri" in jsonified_request - assert jsonified_request["outputGcsUri"] == 'output_gcs_uri_value' - - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='rest', - ) - request = request_type(**request_init) - - # Designate an appropriate value for the returned response. - return_value = operations_pb2.Operation(name='operations/spam') - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, 'request') as req: - # We need to mock transcode() because providing default values - # for required fields will fail the real version if the http_options - # expect actual values for those fields. - with mock.patch.object(path_template, 'transcode') as transcode: - # A uri without fields and an empty body will force all the - # request fields to show up in the query_params. - pb_request = request_type.pb(request) - transcode_result = { - 'uri': 'v1/sample_method', - 'method': "post", - 'query_params': pb_request, - } - transcode_result['body'] = pb_request - transcode.return_value = transcode_result - - response_value = Response() - response_value.status_code = 200 - json_return_value = json_format.MessageToJson(return_value) - - response_value._content = json_return_value.encode('UTF-8') - req.return_value = response_value - - response = client.synthesize_long_audio(request) - - expected_params = [ - ] - actual_params = req.call_args.kwargs['params'] - assert expected_params == actual_params - - -def test_synthesize_long_audio_rest_unset_required_fields(): - transport = transports.TextToSpeechLongAudioSynthesizeRestTransport(credentials=ga_credentials.AnonymousCredentials) - - unset_fields = transport.synthesize_long_audio._get_unset_required_fields({}) - assert set(unset_fields) == (set(()) & set(("input", "audioConfig", "outputGcsUri", "voice", ))) - - -def test_credentials_transport_error(): - # It is an error to provide credentials and a transport instance. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - with pytest.raises(ValueError): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # It is an error to provide a credentials file and a transport instance. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - with pytest.raises(ValueError): - client = TextToSpeechLongAudioSynthesizeClient( - client_options={"credentials_file": "credentials.json"}, - transport=transport, - ) - - # It is an error to provide an api_key and a transport instance. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - options = client_options.ClientOptions() - options.api_key = "api_key" - with pytest.raises(ValueError): - client = TextToSpeechLongAudioSynthesizeClient( - client_options=options, - transport=transport, - ) - - # It is an error to provide an api_key and a credential. - options = client_options.ClientOptions() - options.api_key = "api_key" - with pytest.raises(ValueError): - client = TextToSpeechLongAudioSynthesizeClient( - client_options=options, - credentials=ga_credentials.AnonymousCredentials() - ) - - # It is an error to provide scopes and a transport instance. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - with pytest.raises(ValueError): - client = TextToSpeechLongAudioSynthesizeClient( - client_options={"scopes": ["1", "2"]}, - transport=transport, - ) - - -def test_transport_instance(): - # A client may be instantiated with a custom transport instance. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - client = TextToSpeechLongAudioSynthesizeClient(transport=transport) - assert client.transport is transport - -def test_transport_get_channel(): - # A client may be instantiated with a custom transport instance. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - channel = transport.grpc_channel - assert channel - - transport = transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - channel = transport.grpc_channel - assert channel - -@pytest.mark.parametrize("transport_class", [ - transports.TextToSpeechLongAudioSynthesizeGrpcTransport, - transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, - transports.TextToSpeechLongAudioSynthesizeRestTransport, -]) -def test_transport_adc(transport_class): - # Test default credentials are used if not provided. - with mock.patch.object(google.auth, 'default') as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class() - adc.assert_called_once() - -def test_transport_kind_grpc(): - transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class("grpc")( - credentials=ga_credentials.AnonymousCredentials() - ) - assert transport.kind == "grpc" - - -def test_initialize_client_w_grpc(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc" - ) - assert client is not None - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -def test_synthesize_long_audio_empty_call_grpc(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - call.return_value = operations_pb2.Operation(name='operations/op') - client.synthesize_long_audio(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts_lrs.SynthesizeLongAudioRequest() - - assert args[0] == request_msg - - -def test_transport_kind_grpc_asyncio(): - transport = TextToSpeechLongAudioSynthesizeAsyncClient.get_transport_class("grpc_asyncio")( - credentials=async_anonymous_credentials() - ) - assert transport.kind == "grpc_asyncio" - - -def test_initialize_client_w_grpc_asyncio(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio" - ) - assert client is not None - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -@pytest.mark.asyncio -async def test_synthesize_long_audio_empty_call_grpc_asyncio(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation(name='operations/spam') - ) - await client.synthesize_long_audio(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts_lrs.SynthesizeLongAudioRequest() - - assert args[0] == request_msg - - -def test_transport_kind_rest(): - transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class("rest")( - credentials=ga_credentials.AnonymousCredentials() - ) - assert transport.kind == "rest" - - -def test_synthesize_long_audio_rest_bad_request(request_type=cloud_tts_lrs.SynthesizeLongAudioRequest): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - # send a request that will satisfy transcoding - request_init = {'parent': 'projects/sample1/locations/sample2'} - request = request_type(**request_init) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = mock.Mock() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = mock.Mock() - req.return_value = response_value - client.synthesize_long_audio(request) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts_lrs.SynthesizeLongAudioRequest, - dict, -]) -def test_synthesize_long_audio_rest_call_success(request_type): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - - # send a request that will satisfy transcoding - request_init = {'parent': 'projects/sample1/locations/sample2'} - request = request_type(**request_init) - - # Mock the http request call within the method and fake a response. - with mock.patch.object(type(client.transport._session), 'request') as req: - # Designate an appropriate value for the returned response. - return_value = operations_pb2.Operation(name='operations/spam') - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - req.return_value = response_value - response = client.synthesize_long_audio(request) - - # Establish that the response is the type that we expect. - json_return_value = json_format.MessageToJson(return_value) - - -@pytest.mark.parametrize("null_interceptor", [True, False]) -def test_synthesize_long_audio_rest_interceptors(null_interceptor): - transport = transports.TextToSpeechLongAudioSynthesizeRestTransport( - credentials=ga_credentials.AnonymousCredentials(), - interceptor=None if null_interceptor else transports.TextToSpeechLongAudioSynthesizeRestInterceptor(), - ) - client = TextToSpeechLongAudioSynthesizeClient(transport=transport) - - with mock.patch.object(type(client.transport._session), "request") as req, \ - mock.patch.object(path_template, "transcode") as transcode, \ - mock.patch.object(operation.Operation, "_set_result_from_operation"), \ - mock.patch.object(transports.TextToSpeechLongAudioSynthesizeRestInterceptor, "post_synthesize_long_audio") as post, \ - mock.patch.object(transports.TextToSpeechLongAudioSynthesizeRestInterceptor, "pre_synthesize_long_audio") as pre: - pre.assert_not_called() - post.assert_not_called() - pb_message = cloud_tts_lrs.SynthesizeLongAudioRequest.pb(cloud_tts_lrs.SynthesizeLongAudioRequest()) - transcode.return_value = { - "method": "post", - "uri": "my_uri", - "body": pb_message, - "query_params": pb_message, - } - - req.return_value = mock.Mock() - req.return_value.status_code = 200 - return_value = json_format.MessageToJson(operations_pb2.Operation()) - req.return_value.content = return_value - - request = cloud_tts_lrs.SynthesizeLongAudioRequest() - metadata =[ - ("key", "val"), - ("cephalopod", "squid"), - ] - pre.return_value = request, metadata - post.return_value = operations_pb2.Operation() - - client.synthesize_long_audio(request, metadata=[("key", "val"), ("cephalopod", "squid"),]) - - pre.assert_called_once() - post.assert_called_once() - - -def test_get_operation_rest_bad_request(request_type=operations_pb2.GetOperationRequest): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - request = request_type() - request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2/operations/sample3'}, request) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = Response() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = Request() - req.return_value = response_value - client.get_operation(request) - - -@pytest.mark.parametrize("request_type", [ - operations_pb2.GetOperationRequest, - dict, -]) -def test_get_operation_rest(request_type): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - request_init = {'name': 'projects/sample1/locations/sample2/operations/sample3'} - request = request_type(**request_init) - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, 'request') as req: - # Designate an appropriate value for the returned response. - return_value = operations_pb2.Operation() - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - - req.return_value = response_value - - response = client.get_operation(request) - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.Operation) - - -def test_list_operations_rest_bad_request(request_type=operations_pb2.ListOperationsRequest): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - request = request_type() - request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2'}, request) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = Response() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = Request() - req.return_value = response_value - client.list_operations(request) - - -@pytest.mark.parametrize("request_type", [ - operations_pb2.ListOperationsRequest, - dict, -]) -def test_list_operations_rest(request_type): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - request_init = {'name': 'projects/sample1/locations/sample2'} - request = request_type(**request_init) - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, 'request') as req: - # Designate an appropriate value for the returned response. - return_value = operations_pb2.ListOperationsResponse() - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - - req.return_value = response_value - - response = client.list_operations(request) - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.ListOperationsResponse) - -def test_initialize_client_w_rest(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - assert client is not None - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -def test_synthesize_long_audio_empty_call_rest(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - client.synthesize_long_audio(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts_lrs.SynthesizeLongAudioRequest() - - assert args[0] == request_msg - - -def test_text_to_speech_long_audio_synthesize_rest_lro_client(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - transport = client.transport - - # Ensure that we have an api-core operations client. - assert isinstance( - transport.operations_client, -operations_v1.AbstractOperationsClient, - ) - - # Ensure that subsequent calls to the property send the exact same object. - assert transport.operations_client is transport.operations_client - -def test_transport_grpc_default(): - # A client should use the gRPC transport by default. - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - assert isinstance( - client.transport, - transports.TextToSpeechLongAudioSynthesizeGrpcTransport, - ) - -def test_text_to_speech_long_audio_synthesize_base_transport_error(): - # Passing both a credentials object and credentials_file should raise an error - with pytest.raises(core_exceptions.DuplicateCredentialArgs): - transport = transports.TextToSpeechLongAudioSynthesizeTransport( - credentials=ga_credentials.AnonymousCredentials(), - credentials_file="credentials.json" - ) - - -def test_text_to_speech_long_audio_synthesize_base_transport(): - # Instantiate the base transport. - with mock.patch('google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeTransport.__init__') as Transport: - Transport.return_value = None - transport = transports.TextToSpeechLongAudioSynthesizeTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Every method on the transport should just blindly - # raise NotImplementedError. - methods = ( - 'synthesize_long_audio', - 'get_operation', - 'list_operations', - ) - for method in methods: - with pytest.raises(NotImplementedError): - getattr(transport, method)(request=object()) - - with pytest.raises(NotImplementedError): - transport.close() - - # Additionally, the LRO client (a property) should - # also raise NotImplementedError - with pytest.raises(NotImplementedError): - transport.operations_client - - # Catch all for all remaining methods and properties - remainder = [ - 'kind', - ] - for r in remainder: - with pytest.raises(NotImplementedError): - getattr(transport, r)() - - -def test_text_to_speech_long_audio_synthesize_base_transport_with_credentials_file(): - # Instantiate the base transport with a credentials file - with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeTransport._prep_wrapped_messages') as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.TextToSpeechLongAudioSynthesizeTransport( - credentials_file="credentials.json", - quota_project_id="octopus", - ) - load_creds.assert_called_once_with("credentials.json", - scopes=None, - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - quota_project_id="octopus", - ) - - -def test_text_to_speech_long_audio_synthesize_base_transport_with_adc(): - # Test the default credentials are used if credentials and credentials_file are None. - with mock.patch.object(google.auth, 'default', autospec=True) as adc, mock.patch('google.cloud.texttospeech_v1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeTransport._prep_wrapped_messages') as Transport: - Transport.return_value = None - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.TextToSpeechLongAudioSynthesizeTransport() - adc.assert_called_once() - - -def test_text_to_speech_long_audio_synthesize_auth_adc(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, 'default', autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - TextToSpeechLongAudioSynthesizeClient() - adc.assert_called_once_with( - scopes=None, - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - quota_project_id=None, - ) - - -@pytest.mark.parametrize( - "transport_class", - [ - transports.TextToSpeechLongAudioSynthesizeGrpcTransport, - transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, - ], -) -def test_text_to_speech_long_audio_synthesize_transport_auth_adc(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, 'default', autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus", scopes=["1", "2"]) - adc.assert_called_once_with( - scopes=["1", "2"], - default_scopes=( 'https://www.googleapis.com/auth/cloud-platform',), - quota_project_id="octopus", - ) - - -@pytest.mark.parametrize( - "transport_class", - [ - transports.TextToSpeechLongAudioSynthesizeGrpcTransport, - transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, - transports.TextToSpeechLongAudioSynthesizeRestTransport, - ], -) -def test_text_to_speech_long_audio_synthesize_transport_auth_gdch_credentials(transport_class): - host = 'https://language.com' - api_audience_tests = [None, 'https://language2.com'] - api_audience_expect = [host, 'https://language2.com'] - for t, e in zip(api_audience_tests, api_audience_expect): - with mock.patch.object(google.auth, 'default', autospec=True) as adc: - gdch_mock = mock.MagicMock() - type(gdch_mock).with_gdch_audience = mock.PropertyMock(return_value=gdch_mock) - adc.return_value = (gdch_mock, None) - transport_class(host=host, api_audience=t) - gdch_mock.with_gdch_audience.assert_called_once_with( - e - ) - - -@pytest.mark.parametrize( - "transport_class,grpc_helpers", - [ - (transports.TextToSpeechLongAudioSynthesizeGrpcTransport, grpc_helpers), - (transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, grpc_helpers_async) - ], -) -def test_text_to_speech_long_audio_synthesize_transport_create_channel(transport_class, grpc_helpers): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch.object( - grpc_helpers, "create_channel", autospec=True - ) as create_channel: - creds = ga_credentials.AnonymousCredentials() - adc.return_value = (creds, None) - transport_class( - quota_project_id="octopus", - scopes=["1", "2"] - ) - - create_channel.assert_called_with( - "texttospeech.googleapis.com:443", - credentials=creds, - credentials_file=None, - quota_project_id="octopus", - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - scopes=["1", "2"], - default_host="texttospeech.googleapis.com", - ssl_credentials=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - -@pytest.mark.parametrize("transport_class", [transports.TextToSpeechLongAudioSynthesizeGrpcTransport, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport]) -def test_text_to_speech_long_audio_synthesize_grpc_transport_client_cert_source_for_mtls( - transport_class -): - cred = ga_credentials.AnonymousCredentials() - - # Check ssl_channel_credentials is used if provided. - with mock.patch.object(transport_class, "create_channel") as mock_create_channel: - mock_ssl_channel_creds = mock.Mock() - transport_class( - host="squid.clam.whelk", - credentials=cred, - ssl_channel_credentials=mock_ssl_channel_creds - ) - mock_create_channel.assert_called_once_with( - "squid.clam.whelk:443", - credentials=cred, - credentials_file=None, - scopes=None, - ssl_credentials=mock_ssl_channel_creds, - quota_project_id=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - # Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls - # is used. - with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()): - with mock.patch("grpc.ssl_channel_credentials") as mock_ssl_cred: - transport_class( - credentials=cred, - client_cert_source_for_mtls=client_cert_source_callback - ) - expected_cert, expected_key = client_cert_source_callback() - mock_ssl_cred.assert_called_once_with( - certificate_chain=expected_cert, - private_key=expected_key - ) - -def test_text_to_speech_long_audio_synthesize_http_transport_client_cert_source_for_mtls(): - cred = ga_credentials.AnonymousCredentials() - with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel") as mock_configure_mtls_channel: - transports.TextToSpeechLongAudioSynthesizeRestTransport ( - credentials=cred, - client_cert_source_for_mtls=client_cert_source_callback - ) - mock_configure_mtls_channel.assert_called_once_with(client_cert_source_callback) - - -@pytest.mark.parametrize("transport_name", [ - "grpc", - "grpc_asyncio", - "rest", -]) -def test_text_to_speech_long_audio_synthesize_host_no_port(transport_name): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com'), - transport=transport_name, - ) - assert client.transport._host == ( - 'texttospeech.googleapis.com:443' - if transport_name in ['grpc', 'grpc_asyncio'] - else 'https://texttospeech.googleapis.com' - ) - -@pytest.mark.parametrize("transport_name", [ - "grpc", - "grpc_asyncio", - "rest", -]) -def test_text_to_speech_long_audio_synthesize_host_with_port(transport_name): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com:8000'), - transport=transport_name, - ) - assert client.transport._host == ( - 'texttospeech.googleapis.com:8000' - if transport_name in ['grpc', 'grpc_asyncio'] - else 'https://texttospeech.googleapis.com:8000' - ) - -@pytest.mark.parametrize("transport_name", [ - "rest", -]) -def test_text_to_speech_long_audio_synthesize_client_transport_session_collision(transport_name): - creds1 = ga_credentials.AnonymousCredentials() - creds2 = ga_credentials.AnonymousCredentials() - client1 = TextToSpeechLongAudioSynthesizeClient( - credentials=creds1, - transport=transport_name, - ) - client2 = TextToSpeechLongAudioSynthesizeClient( - credentials=creds2, - transport=transport_name, - ) - session1 = client1.transport.synthesize_long_audio._session - session2 = client2.transport.synthesize_long_audio._session - assert session1 != session2 -def test_text_to_speech_long_audio_synthesize_grpc_transport_channel(): - channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) - - # Check that channel is used if provided. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - host="squid.clam.whelk", - channel=channel, - ) - assert transport.grpc_channel == channel - assert transport._host == "squid.clam.whelk:443" - assert transport._ssl_channel_credentials == None - - -def test_text_to_speech_long_audio_synthesize_grpc_asyncio_transport_channel(): - channel = aio.secure_channel('http://localhost/', grpc.local_channel_credentials()) - - # Check that channel is used if provided. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport( - host="squid.clam.whelk", - channel=channel, - ) - assert transport.grpc_channel == channel - assert transport._host == "squid.clam.whelk:443" - assert transport._ssl_channel_credentials == None - - -# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are -# removed from grpc/grpc_asyncio transport constructor. -@pytest.mark.parametrize("transport_class", [transports.TextToSpeechLongAudioSynthesizeGrpcTransport, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport]) -def test_text_to_speech_long_audio_synthesize_transport_channel_mtls_with_client_cert_source( - transport_class -): - with mock.patch("grpc.ssl_channel_credentials", autospec=True) as grpc_ssl_channel_cred: - with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: - mock_ssl_cred = mock.Mock() - grpc_ssl_channel_cred.return_value = mock_ssl_cred - - mock_grpc_channel = mock.Mock() - grpc_create_channel.return_value = mock_grpc_channel - - cred = ga_credentials.AnonymousCredentials() - with pytest.warns(DeprecationWarning): - with mock.patch.object(google.auth, 'default') as adc: - adc.return_value = (cred, None) - transport = transport_class( - host="squid.clam.whelk", - api_mtls_endpoint="mtls.squid.clam.whelk", - client_cert_source=client_cert_source_callback, - ) - adc.assert_called_once() - - grpc_ssl_channel_cred.assert_called_once_with( - certificate_chain=b"cert bytes", private_key=b"key bytes" - ) - grpc_create_channel.assert_called_once_with( - "mtls.squid.clam.whelk:443", - credentials=cred, - credentials_file=None, - scopes=None, - ssl_credentials=mock_ssl_cred, - quota_project_id=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - assert transport.grpc_channel == mock_grpc_channel - assert transport._ssl_channel_credentials == mock_ssl_cred - - -# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are -# removed from grpc/grpc_asyncio transport constructor. -@pytest.mark.parametrize("transport_class", [transports.TextToSpeechLongAudioSynthesizeGrpcTransport, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport]) -def test_text_to_speech_long_audio_synthesize_transport_channel_mtls_with_adc( - transport_class -): - mock_ssl_cred = mock.Mock() - with mock.patch.multiple( - "google.auth.transport.grpc.SslCredentials", - __init__=mock.Mock(return_value=None), - ssl_credentials=mock.PropertyMock(return_value=mock_ssl_cred), - ): - with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: - mock_grpc_channel = mock.Mock() - grpc_create_channel.return_value = mock_grpc_channel - mock_cred = mock.Mock() - - with pytest.warns(DeprecationWarning): - transport = transport_class( - host="squid.clam.whelk", - credentials=mock_cred, - api_mtls_endpoint="mtls.squid.clam.whelk", - client_cert_source=None, - ) - - grpc_create_channel.assert_called_once_with( - "mtls.squid.clam.whelk:443", - credentials=mock_cred, - credentials_file=None, - scopes=None, - ssl_credentials=mock_ssl_cred, - quota_project_id=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - assert transport.grpc_channel == mock_grpc_channel - - -def test_text_to_speech_long_audio_synthesize_grpc_lro_client(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='grpc', - ) - transport = client.transport - - # Ensure that we have a api-core operations client. - assert isinstance( - transport.operations_client, - operations_v1.OperationsClient, - ) - - # Ensure that subsequent calls to the property send the exact same object. - assert transport.operations_client is transport.operations_client - - -def test_text_to_speech_long_audio_synthesize_grpc_lro_async_client(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='grpc_asyncio', - ) - transport = client.transport - - # Ensure that we have a api-core operations client. - assert isinstance( - transport.operations_client, - operations_v1.OperationsAsyncClient, - ) - - # Ensure that subsequent calls to the property send the exact same object. - assert transport.operations_client is transport.operations_client - - -def test_model_path(): - project = "squid" - location = "clam" - model = "whelk" - expected = "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) - actual = TextToSpeechLongAudioSynthesizeClient.model_path(project, location, model) - assert expected == actual - - -def test_parse_model_path(): - expected = { - "project": "octopus", - "location": "oyster", - "model": "nudibranch", - } - path = TextToSpeechLongAudioSynthesizeClient.model_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechLongAudioSynthesizeClient.parse_model_path(path) - assert expected == actual - -def test_common_billing_account_path(): - billing_account = "cuttlefish" - expected = "billingAccounts/{billing_account}".format(billing_account=billing_account, ) - actual = TextToSpeechLongAudioSynthesizeClient.common_billing_account_path(billing_account) - assert expected == actual - - -def test_parse_common_billing_account_path(): - expected = { - "billing_account": "mussel", - } - path = TextToSpeechLongAudioSynthesizeClient.common_billing_account_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechLongAudioSynthesizeClient.parse_common_billing_account_path(path) - assert expected == actual - -def test_common_folder_path(): - folder = "winkle" - expected = "folders/{folder}".format(folder=folder, ) - actual = TextToSpeechLongAudioSynthesizeClient.common_folder_path(folder) - assert expected == actual - - -def test_parse_common_folder_path(): - expected = { - "folder": "nautilus", - } - path = TextToSpeechLongAudioSynthesizeClient.common_folder_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechLongAudioSynthesizeClient.parse_common_folder_path(path) - assert expected == actual - -def test_common_organization_path(): - organization = "scallop" - expected = "organizations/{organization}".format(organization=organization, ) - actual = TextToSpeechLongAudioSynthesizeClient.common_organization_path(organization) - assert expected == actual - - -def test_parse_common_organization_path(): - expected = { - "organization": "abalone", - } - path = TextToSpeechLongAudioSynthesizeClient.common_organization_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechLongAudioSynthesizeClient.parse_common_organization_path(path) - assert expected == actual - -def test_common_project_path(): - project = "squid" - expected = "projects/{project}".format(project=project, ) - actual = TextToSpeechLongAudioSynthesizeClient.common_project_path(project) - assert expected == actual - - -def test_parse_common_project_path(): - expected = { - "project": "clam", - } - path = TextToSpeechLongAudioSynthesizeClient.common_project_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechLongAudioSynthesizeClient.parse_common_project_path(path) - assert expected == actual - -def test_common_location_path(): - project = "whelk" - location = "octopus" - expected = "projects/{project}/locations/{location}".format(project=project, location=location, ) - actual = TextToSpeechLongAudioSynthesizeClient.common_location_path(project, location) - assert expected == actual - - -def test_parse_common_location_path(): - expected = { - "project": "oyster", - "location": "nudibranch", - } - path = TextToSpeechLongAudioSynthesizeClient.common_location_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechLongAudioSynthesizeClient.parse_common_location_path(path) - assert expected == actual - - -def test_client_with_default_client_info(): - client_info = gapic_v1.client_info.ClientInfo() - - with mock.patch.object(transports.TextToSpeechLongAudioSynthesizeTransport, '_prep_wrapped_messages') as prep: - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - client_info=client_info, - ) - prep.assert_called_once_with(client_info) - - with mock.patch.object(transports.TextToSpeechLongAudioSynthesizeTransport, '_prep_wrapped_messages') as prep: - transport_class = TextToSpeechLongAudioSynthesizeClient.get_transport_class() - transport = transport_class( - credentials=ga_credentials.AnonymousCredentials(), - client_info=client_info, - ) - prep.assert_called_once_with(client_info) - - -def test_get_operation(transport: str = "grpc"): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.GetOperationRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.Operation() - response = client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.Operation) -@pytest.mark.asyncio -async def test_get_operation_async(transport: str = "grpc_asyncio"): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.GetOperationRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation() - ) - response = await client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.Operation) - -def test_get_operation_field_headers(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.GetOperationRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - call.return_value = operations_pb2.Operation() - - client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] -@pytest.mark.asyncio -async def test_get_operation_field_headers_async(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.GetOperationRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation() - ) - await client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] - -def test_get_operation_from_dict(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.Operation() - - response = client.get_operation( - request={ - "name": "locations", - } - ) - call.assert_called() -@pytest.mark.asyncio -async def test_get_operation_from_dict_async(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation() - ) - response = await client.get_operation( - request={ - "name": "locations", - } - ) - call.assert_called() - - -def test_list_operations(transport: str = "grpc"): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.ListOperationsRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.ListOperationsResponse() - response = client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.ListOperationsResponse) -@pytest.mark.asyncio -async def test_list_operations_async(transport: str = "grpc_asyncio"): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.ListOperationsRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.ListOperationsResponse() - ) - response = await client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.ListOperationsResponse) - -def test_list_operations_field_headers(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.ListOperationsRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - call.return_value = operations_pb2.ListOperationsResponse() - - client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] -@pytest.mark.asyncio -async def test_list_operations_field_headers_async(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.ListOperationsRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.ListOperationsResponse() - ) - await client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] - -def test_list_operations_from_dict(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.ListOperationsResponse() - - response = client.list_operations( - request={ - "name": "locations", - } - ) - call.assert_called() -@pytest.mark.asyncio -async def test_list_operations_from_dict_async(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.ListOperationsResponse() - ) - response = await client.list_operations( - request={ - "name": "locations", - } - ) - call.assert_called() - - -def test_transport_close_grpc(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc" - ) - with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: - with client: - close.assert_not_called() - close.assert_called_once() - - -@pytest.mark.asyncio -async def test_transport_close_grpc_asyncio(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio" - ) - with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: - async with client: - close.assert_not_called() - close.assert_called_once() - - -def test_transport_close_rest(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - with mock.patch.object(type(getattr(client.transport, "_session")), "close") as close: - with client: - close.assert_not_called() - close.assert_called_once() - - -def test_client_ctx(): - transports = [ - 'rest', - 'grpc', - ] - for transport in transports: - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport - ) - # Test client calls underlying transport. - with mock.patch.object(type(client.transport), "close") as close: - close.assert_not_called() - with client: - pass - close.assert_called() - -@pytest.mark.parametrize("client_class,transport_class", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport), -]) -def test_api_key_credentials(client_class, transport_class): - with mock.patch.object( - google.auth._default, "get_api_key_credentials", create=True - ) as get_api_key_credentials: - mock_cred = mock.Mock() - get_api_key_credentials.return_value = mock_cred - options = client_options.ClientOptions() - options.api_key = "api_key" - with mock.patch.object(transport_class, "__init__") as patched: - patched.return_value = None - client = client_class(client_options=options) - patched.assert_called_once_with( - credentials=mock_cred, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/.coveragerc b/owl-bot-staging/google-cloud-texttospeech/v1beta1/.coveragerc deleted file mode 100644 index 8f3a0ab7f83b..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/.coveragerc +++ /dev/null @@ -1,13 +0,0 @@ -[run] -branch = True - -[report] -show_missing = True -omit = - google/cloud/texttospeech/__init__.py - google/cloud/texttospeech/gapic_version.py -exclude_lines = - # Re-enable the standard pragma - pragma: NO COVER - # Ignore debug-only repr - def __repr__ diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/.flake8 b/owl-bot-staging/google-cloud-texttospeech/v1beta1/.flake8 deleted file mode 100644 index 29227d4cf419..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/.flake8 +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# -# 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 -# -# https://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. - -# Generated by synthtool. DO NOT EDIT! -[flake8] -ignore = E203, E266, E501, W503 -exclude = - # Exclude generated code. - **/proto/** - **/gapic/** - **/services/** - **/types/** - *_pb2.py - - # Standard linting exemptions. - **/.nox/** - __pycache__, - .git, - *.pyc, - conf.py diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/MANIFEST.in b/owl-bot-staging/google-cloud-texttospeech/v1beta1/MANIFEST.in deleted file mode 100644 index 1cf382f027d1..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/MANIFEST.in +++ /dev/null @@ -1,2 +0,0 @@ -recursive-include google/cloud/texttospeech *.py -recursive-include google/cloud/texttospeech_v1beta1 *.py diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/README.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/README.rst deleted file mode 100644 index 25f53907ce0c..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/README.rst +++ /dev/null @@ -1,49 +0,0 @@ -Python Client for Google Cloud Texttospeech API -================================================= - -Quick Start ------------ - -In order to use this library, you first need to go through the following steps: - -1. `Select or create a Cloud Platform project.`_ -2. `Enable billing for your project.`_ -3. Enable the Google Cloud Texttospeech API. -4. `Setup Authentication.`_ - -.. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project -.. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project -.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html - -Installation -~~~~~~~~~~~~ - -Install this library in a `virtualenv`_ using pip. `virtualenv`_ is a tool to -create isolated Python environments. The basic problem it addresses is one of -dependencies and versions, and indirectly permissions. - -With `virtualenv`_, it's possible to install this library without needing system -install permissions, and without clashing with the installed system -dependencies. - -.. _`virtualenv`: https://virtualenv.pypa.io/en/latest/ - - -Mac/Linux -^^^^^^^^^ - -.. code-block:: console - - python3 -m venv - source /bin/activate - /bin/pip install /path/to/library - - -Windows -^^^^^^^ - -.. code-block:: console - - python3 -m venv - \Scripts\activate - \Scripts\pip.exe install \path\to\library diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/_static/custom.css b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/_static/custom.css deleted file mode 100644 index 06423be0b592..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/_static/custom.css +++ /dev/null @@ -1,3 +0,0 @@ -dl.field-list > dt { - min-width: 100px -} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/conf.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/conf.py deleted file mode 100644 index 4e7d47829ddb..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/conf.py +++ /dev/null @@ -1,376 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# -# google-cloud-texttospeech documentation build configuration file -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys -import os -import shlex - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -sys.path.insert(0, os.path.abspath("..")) - -__version__ = "0.1.0" - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -needs_sphinx = "4.0.1" - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.autosummary", - "sphinx.ext.intersphinx", - "sphinx.ext.coverage", - "sphinx.ext.napoleon", - "sphinx.ext.todo", - "sphinx.ext.viewcode", -] - -# autodoc/autosummary flags -autoclass_content = "both" -autodoc_default_flags = ["members"] -autosummary_generate = True - - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# Allow markdown includes (so releases.md can include CHANGLEOG.md) -# http://www.sphinx-doc.org/en/master/markdown.html -source_parsers = {".md": "recommonmark.parser.CommonMarkParser"} - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -source_suffix = [".rst", ".md"] - -# The encoding of source files. -# source_encoding = 'utf-8-sig' - -# The root toctree document. -root_doc = "index" - -# General information about the project. -project = u"google-cloud-texttospeech" -copyright = u"2023, Google, LLC" -author = u"Google APIs" # TODO: autogenerate this bit - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The full version, including alpha/beta/rc tags. -release = __version__ -# The short X.Y version. -version = ".".join(release.split(".")[0:2]) - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = 'en' - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -# today = '' -# Else, today_fmt is used as the format for a strftime call. -# today_fmt = '%B %d, %Y' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ["_build"] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -# default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -# add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -# add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -# show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# A list of ignored prefixes for module index sorting. -# modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -# keep_warnings = False - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = "alabaster" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -html_theme_options = { - "description": "Google Cloud Client Libraries for Python", - "github_user": "googleapis", - "github_repo": "google-cloud-python", - "github_banner": True, - "font_family": "'Roboto', Georgia, sans", - "head_font_family": "'Roboto', Georgia, serif", - "code_font_family": "'Roboto Mono', 'Consolas', monospace", -} - -# Add any paths that contain custom themes here, relative to this directory. -# html_theme_path = [] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -# html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -# html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -# html_logo = None - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -# html_favicon = None - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -# html_extra_path = [] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -# html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -# html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -# html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -# html_additional_pages = {} - -# If false, no module index is generated. -# html_domain_indices = True - -# If false, no index is generated. -# html_use_index = True - -# If true, the index is split into individual pages for each letter. -# html_split_index = False - -# If true, links to the reST sources are added to the pages. -# html_show_sourcelink = True - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -# html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -# html_show_copyright = True - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -# html_use_opensearch = '' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -# html_file_suffix = None - -# Language to be used for generating the HTML full-text search index. -# Sphinx supports the following languages: -# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' -# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' -# html_search_language = 'en' - -# A dictionary with options for the search language support, empty by default. -# Now only 'ja' uses this config value -# html_search_options = {'type': 'default'} - -# The name of a javascript file (relative to the configuration directory) that -# implements a search results scorer. If empty, the default will be used. -# html_search_scorer = 'scorer.js' - -# Output file base name for HTML help builder. -htmlhelp_basename = "google-cloud-texttospeech-doc" - -# -- Options for warnings ------------------------------------------------------ - - -suppress_warnings = [ - # Temporarily suppress this to avoid "more than one target found for - # cross-reference" warning, which are intractable for us to avoid while in - # a mono-repo. - # See https://github.com/sphinx-doc/sphinx/blob - # /2a65ffeef5c107c19084fabdd706cdff3f52d93c/sphinx/domains/python.py#L843 - "ref.python" -] - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # 'preamble': '', - # Latex figure (float) alignment - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - ( - root_doc, - "google-cloud-texttospeech.tex", - u"google-cloud-texttospeech Documentation", - author, - "manual", - ) -] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -# latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -# latex_use_parts = False - -# If true, show page references after internal links. -# latex_show_pagerefs = False - -# If true, show URL addresses after external links. -# latex_show_urls = False - -# Documents to append as an appendix to all manuals. -# latex_appendices = [] - -# If false, no module index is generated. -# latex_domain_indices = True - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - ( - root_doc, - "google-cloud-texttospeech", - u"Google Cloud Texttospeech Documentation", - [author], - 1, - ) -] - -# If true, show URL addresses after external links. -# man_show_urls = False - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - root_doc, - "google-cloud-texttospeech", - u"google-cloud-texttospeech Documentation", - author, - "google-cloud-texttospeech", - "GAPIC library for Google Cloud Texttospeech API", - "APIs", - ) -] - -# Documents to append as an appendix to all manuals. -# texinfo_appendices = [] - -# If false, no module index is generated. -# texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -# texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -# texinfo_no_detailmenu = False - - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = { - "python": ("http://python.readthedocs.org/en/latest/", None), - "gax": ("https://gax-python.readthedocs.org/en/latest/", None), - "google-auth": ("https://google-auth.readthedocs.io/en/stable", None), - "google-gax": ("https://gax-python.readthedocs.io/en/latest/", None), - "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None), - "grpc": ("https://grpc.io/grpc/python/", None), - "requests": ("http://requests.kennethreitz.org/en/stable/", None), - "proto": ("https://proto-plus-python.readthedocs.io/en/stable", None), - "protobuf": ("https://googleapis.dev/python/protobuf/latest/", None), -} - - -# Napoleon settings -napoleon_google_docstring = True -napoleon_numpy_docstring = True -napoleon_include_private_with_doc = False -napoleon_include_special_with_doc = True -napoleon_use_admonition_for_examples = False -napoleon_use_admonition_for_notes = False -napoleon_use_admonition_for_references = False -napoleon_use_ivar = False -napoleon_use_param = True -napoleon_use_rtype = True diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/index.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/index.rst deleted file mode 100644 index f591f479e77e..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/index.rst +++ /dev/null @@ -1,7 +0,0 @@ -API Reference -------------- -.. toctree:: - :maxdepth: 2 - - texttospeech_v1beta1/services_ - texttospeech_v1beta1/types_ diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/services_.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/services_.rst deleted file mode 100644 index 338598a60eb8..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/services_.rst +++ /dev/null @@ -1,7 +0,0 @@ -Services for Google Cloud Texttospeech v1beta1 API -================================================== -.. toctree:: - :maxdepth: 2 - - text_to_speech - text_to_speech_long_audio_synthesize diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech.rst deleted file mode 100644 index 8521daf8070a..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech.rst +++ /dev/null @@ -1,6 +0,0 @@ -TextToSpeech ------------------------------- - -.. automodule:: google.cloud.texttospeech_v1beta1.services.text_to_speech - :members: - :inherited-members: diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech_long_audio_synthesize.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech_long_audio_synthesize.rst deleted file mode 100644 index 50ef34c6c59f..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/text_to_speech_long_audio_synthesize.rst +++ /dev/null @@ -1,6 +0,0 @@ -TextToSpeechLongAudioSynthesize -------------------------------------------------- - -.. automodule:: google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize - :members: - :inherited-members: diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/types_.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/types_.rst deleted file mode 100644 index 57ba4be821d0..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/docs/texttospeech_v1beta1/types_.rst +++ /dev/null @@ -1,6 +0,0 @@ -Types for Google Cloud Texttospeech v1beta1 API -=============================================== - -.. automodule:: google.cloud.texttospeech_v1beta1.types - :members: - :show-inheritance: diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/__init__.py deleted file mode 100644 index 29429722d1c9..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/__init__.py +++ /dev/null @@ -1,79 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from google.cloud.texttospeech import gapic_version as package_version - -__version__ = package_version.__version__ - - -from google.cloud.texttospeech_v1beta1.services.text_to_speech.client import TextToSpeechClient -from google.cloud.texttospeech_v1beta1.services.text_to_speech.async_client import TextToSpeechAsyncClient -from google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize.client import TextToSpeechLongAudioSynthesizeClient -from google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize.async_client import TextToSpeechLongAudioSynthesizeAsyncClient - -from google.cloud.texttospeech_v1beta1.types.cloud_tts import AdvancedVoiceOptions -from google.cloud.texttospeech_v1beta1.types.cloud_tts import AudioConfig -from google.cloud.texttospeech_v1beta1.types.cloud_tts import CustomPronunciationParams -from google.cloud.texttospeech_v1beta1.types.cloud_tts import CustomPronunciations -from google.cloud.texttospeech_v1beta1.types.cloud_tts import CustomVoiceParams -from google.cloud.texttospeech_v1beta1.types.cloud_tts import ListVoicesRequest -from google.cloud.texttospeech_v1beta1.types.cloud_tts import ListVoicesResponse -from google.cloud.texttospeech_v1beta1.types.cloud_tts import MultiSpeakerMarkup -from google.cloud.texttospeech_v1beta1.types.cloud_tts import StreamingSynthesisInput -from google.cloud.texttospeech_v1beta1.types.cloud_tts import StreamingSynthesizeConfig -from google.cloud.texttospeech_v1beta1.types.cloud_tts import StreamingSynthesizeRequest -from google.cloud.texttospeech_v1beta1.types.cloud_tts import StreamingSynthesizeResponse -from google.cloud.texttospeech_v1beta1.types.cloud_tts import SynthesisInput -from google.cloud.texttospeech_v1beta1.types.cloud_tts import SynthesizeSpeechRequest -from google.cloud.texttospeech_v1beta1.types.cloud_tts import SynthesizeSpeechResponse -from google.cloud.texttospeech_v1beta1.types.cloud_tts import Timepoint -from google.cloud.texttospeech_v1beta1.types.cloud_tts import Voice -from google.cloud.texttospeech_v1beta1.types.cloud_tts import VoiceCloneParams -from google.cloud.texttospeech_v1beta1.types.cloud_tts import VoiceSelectionParams -from google.cloud.texttospeech_v1beta1.types.cloud_tts import AudioEncoding -from google.cloud.texttospeech_v1beta1.types.cloud_tts import SsmlVoiceGender -from google.cloud.texttospeech_v1beta1.types.cloud_tts_lrs import SynthesizeLongAudioMetadata -from google.cloud.texttospeech_v1beta1.types.cloud_tts_lrs import SynthesizeLongAudioRequest -from google.cloud.texttospeech_v1beta1.types.cloud_tts_lrs import SynthesizeLongAudioResponse - -__all__ = ('TextToSpeechClient', - 'TextToSpeechAsyncClient', - 'TextToSpeechLongAudioSynthesizeClient', - 'TextToSpeechLongAudioSynthesizeAsyncClient', - 'AdvancedVoiceOptions', - 'AudioConfig', - 'CustomPronunciationParams', - 'CustomPronunciations', - 'CustomVoiceParams', - 'ListVoicesRequest', - 'ListVoicesResponse', - 'MultiSpeakerMarkup', - 'StreamingSynthesisInput', - 'StreamingSynthesizeConfig', - 'StreamingSynthesizeRequest', - 'StreamingSynthesizeResponse', - 'SynthesisInput', - 'SynthesizeSpeechRequest', - 'SynthesizeSpeechResponse', - 'Timepoint', - 'Voice', - 'VoiceCloneParams', - 'VoiceSelectionParams', - 'AudioEncoding', - 'SsmlVoiceGender', - 'SynthesizeLongAudioMetadata', - 'SynthesizeLongAudioRequest', - 'SynthesizeLongAudioResponse', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/gapic_version.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/gapic_version.py deleted file mode 100644 index 558c8aab67c5..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/gapic_version.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -__version__ = "0.0.0" # {x-release-please-version} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/py.typed b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/py.typed deleted file mode 100644 index 9b87c1e1cbf9..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech/py.typed +++ /dev/null @@ -1,2 +0,0 @@ -# Marker file for PEP 561. -# The google-cloud-texttospeech package uses inline types. diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/__init__.py deleted file mode 100644 index 0cbc8b072416..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/__init__.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from google.cloud.texttospeech_v1beta1 import gapic_version as package_version - -__version__ = package_version.__version__ - - -from .services.text_to_speech import TextToSpeechClient -from .services.text_to_speech import TextToSpeechAsyncClient -from .services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeClient -from .services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeAsyncClient - -from .types.cloud_tts import AdvancedVoiceOptions -from .types.cloud_tts import AudioConfig -from .types.cloud_tts import CustomPronunciationParams -from .types.cloud_tts import CustomPronunciations -from .types.cloud_tts import CustomVoiceParams -from .types.cloud_tts import ListVoicesRequest -from .types.cloud_tts import ListVoicesResponse -from .types.cloud_tts import MultiSpeakerMarkup -from .types.cloud_tts import StreamingSynthesisInput -from .types.cloud_tts import StreamingSynthesizeConfig -from .types.cloud_tts import StreamingSynthesizeRequest -from .types.cloud_tts import StreamingSynthesizeResponse -from .types.cloud_tts import SynthesisInput -from .types.cloud_tts import SynthesizeSpeechRequest -from .types.cloud_tts import SynthesizeSpeechResponse -from .types.cloud_tts import Timepoint -from .types.cloud_tts import Voice -from .types.cloud_tts import VoiceCloneParams -from .types.cloud_tts import VoiceSelectionParams -from .types.cloud_tts import AudioEncoding -from .types.cloud_tts import SsmlVoiceGender -from .types.cloud_tts_lrs import SynthesizeLongAudioMetadata -from .types.cloud_tts_lrs import SynthesizeLongAudioRequest -from .types.cloud_tts_lrs import SynthesizeLongAudioResponse - -__all__ = ( - 'TextToSpeechAsyncClient', - 'TextToSpeechLongAudioSynthesizeAsyncClient', -'AdvancedVoiceOptions', -'AudioConfig', -'AudioEncoding', -'CustomPronunciationParams', -'CustomPronunciations', -'CustomVoiceParams', -'ListVoicesRequest', -'ListVoicesResponse', -'MultiSpeakerMarkup', -'SsmlVoiceGender', -'StreamingSynthesisInput', -'StreamingSynthesizeConfig', -'StreamingSynthesizeRequest', -'StreamingSynthesizeResponse', -'SynthesisInput', -'SynthesizeLongAudioMetadata', -'SynthesizeLongAudioRequest', -'SynthesizeLongAudioResponse', -'SynthesizeSpeechRequest', -'SynthesizeSpeechResponse', -'TextToSpeechClient', -'TextToSpeechLongAudioSynthesizeClient', -'Timepoint', -'Voice', -'VoiceCloneParams', -'VoiceSelectionParams', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_metadata.json b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_metadata.json deleted file mode 100644 index 174c6d86b5f4..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_metadata.json +++ /dev/null @@ -1,107 +0,0 @@ - { - "comment": "This file maps proto services/RPCs to the corresponding library clients/methods", - "language": "python", - "libraryPackage": "google.cloud.texttospeech_v1beta1", - "protoPackage": "google.cloud.texttospeech.v1beta1", - "schema": "1.0", - "services": { - "TextToSpeech": { - "clients": { - "grpc": { - "libraryClient": "TextToSpeechClient", - "rpcs": { - "ListVoices": { - "methods": [ - "list_voices" - ] - }, - "StreamingSynthesize": { - "methods": [ - "streaming_synthesize" - ] - }, - "SynthesizeSpeech": { - "methods": [ - "synthesize_speech" - ] - } - } - }, - "grpc-async": { - "libraryClient": "TextToSpeechAsyncClient", - "rpcs": { - "ListVoices": { - "methods": [ - "list_voices" - ] - }, - "StreamingSynthesize": { - "methods": [ - "streaming_synthesize" - ] - }, - "SynthesizeSpeech": { - "methods": [ - "synthesize_speech" - ] - } - } - }, - "rest": { - "libraryClient": "TextToSpeechClient", - "rpcs": { - "ListVoices": { - "methods": [ - "list_voices" - ] - }, - "StreamingSynthesize": { - "methods": [ - "streaming_synthesize" - ] - }, - "SynthesizeSpeech": { - "methods": [ - "synthesize_speech" - ] - } - } - } - } - }, - "TextToSpeechLongAudioSynthesize": { - "clients": { - "grpc": { - "libraryClient": "TextToSpeechLongAudioSynthesizeClient", - "rpcs": { - "SynthesizeLongAudio": { - "methods": [ - "synthesize_long_audio" - ] - } - } - }, - "grpc-async": { - "libraryClient": "TextToSpeechLongAudioSynthesizeAsyncClient", - "rpcs": { - "SynthesizeLongAudio": { - "methods": [ - "synthesize_long_audio" - ] - } - } - }, - "rest": { - "libraryClient": "TextToSpeechLongAudioSynthesizeClient", - "rpcs": { - "SynthesizeLongAudio": { - "methods": [ - "synthesize_long_audio" - ] - } - } - } - } - } - } -} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_version.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_version.py deleted file mode 100644 index 558c8aab67c5..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/gapic_version.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -__version__ = "0.0.0" # {x-release-please-version} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/py.typed b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/py.typed deleted file mode 100644 index 9b87c1e1cbf9..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/py.typed +++ /dev/null @@ -1,2 +0,0 @@ -# Marker file for PEP 561. -# The google-cloud-texttospeech package uses inline types. diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/__init__.py deleted file mode 100644 index 8f6cf068242c..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/__init__.py deleted file mode 100644 index fa16c00b5f6f..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from .client import TextToSpeechClient -from .async_client import TextToSpeechAsyncClient - -__all__ = ( - 'TextToSpeechClient', - 'TextToSpeechAsyncClient', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/async_client.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/async_client.py deleted file mode 100644 index 628c54182023..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/async_client.py +++ /dev/null @@ -1,660 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from collections import OrderedDict -import re -from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, AsyncIterable, Awaitable, AsyncIterator, Sequence, Tuple, Type, Union - -from google.cloud.texttospeech_v1beta1 import gapic_version as package_version - -from google.api_core.client_options import ClientOptions -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import retry_async as retries -from google.auth import credentials as ga_credentials # type: ignore -from google.oauth2 import service_account # type: ignore - - -try: - OptionalRetry = Union[retries.AsyncRetry, gapic_v1.method._MethodDefault, None] -except AttributeError: # pragma: NO COVER - OptionalRetry = Union[retries.AsyncRetry, object, None] # type: ignore - -from google.cloud.texttospeech_v1beta1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore -from .transports.base import TextToSpeechTransport, DEFAULT_CLIENT_INFO -from .transports.grpc_asyncio import TextToSpeechGrpcAsyncIOTransport -from .client import TextToSpeechClient - - -class TextToSpeechAsyncClient: - """Service that implements Google Cloud Text-to-Speech API.""" - - _client: TextToSpeechClient - - # Copy defaults from the synchronous client for use here. - # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. - DEFAULT_ENDPOINT = TextToSpeechClient.DEFAULT_ENDPOINT - DEFAULT_MTLS_ENDPOINT = TextToSpeechClient.DEFAULT_MTLS_ENDPOINT - _DEFAULT_ENDPOINT_TEMPLATE = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE - _DEFAULT_UNIVERSE = TextToSpeechClient._DEFAULT_UNIVERSE - - model_path = staticmethod(TextToSpeechClient.model_path) - parse_model_path = staticmethod(TextToSpeechClient.parse_model_path) - common_billing_account_path = staticmethod(TextToSpeechClient.common_billing_account_path) - parse_common_billing_account_path = staticmethod(TextToSpeechClient.parse_common_billing_account_path) - common_folder_path = staticmethod(TextToSpeechClient.common_folder_path) - parse_common_folder_path = staticmethod(TextToSpeechClient.parse_common_folder_path) - common_organization_path = staticmethod(TextToSpeechClient.common_organization_path) - parse_common_organization_path = staticmethod(TextToSpeechClient.parse_common_organization_path) - common_project_path = staticmethod(TextToSpeechClient.common_project_path) - parse_common_project_path = staticmethod(TextToSpeechClient.parse_common_project_path) - common_location_path = staticmethod(TextToSpeechClient.common_location_path) - parse_common_location_path = staticmethod(TextToSpeechClient.parse_common_location_path) - - @classmethod - def from_service_account_info(cls, info: dict, *args, **kwargs): - """Creates an instance of this client using the provided credentials - info. - - Args: - info (dict): The service account private key info. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechAsyncClient: The constructed client. - """ - return TextToSpeechClient.from_service_account_info.__func__(TextToSpeechAsyncClient, info, *args, **kwargs) # type: ignore - - @classmethod - def from_service_account_file(cls, filename: str, *args, **kwargs): - """Creates an instance of this client using the provided credentials - file. - - Args: - filename (str): The path to the service account private key json - file. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechAsyncClient: The constructed client. - """ - return TextToSpeechClient.from_service_account_file.__func__(TextToSpeechAsyncClient, filename, *args, **kwargs) # type: ignore - - from_service_account_json = from_service_account_file - - @classmethod - def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[ClientOptions] = None): - """Return the API endpoint and client cert source for mutual TLS. - - The client cert source is determined in the following order: - (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the - client cert source is None. - (2) if `client_options.client_cert_source` is provided, use the provided one; if the - default client cert source exists, use the default one; otherwise the client cert - source is None. - - The API endpoint is determined in the following order: - (1) if `client_options.api_endpoint` if provided, use the provided one. - (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the - default mTLS endpoint; if the environment variable is "never", use the default API - endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise - use the default API endpoint. - - More details can be found at https://google.aip.dev/auth/4114. - - Args: - client_options (google.api_core.client_options.ClientOptions): Custom options for the - client. Only the `api_endpoint` and `client_cert_source` properties may be used - in this method. - - Returns: - Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the - client cert source to use. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If any errors happen. - """ - return TextToSpeechClient.get_mtls_endpoint_and_cert_source(client_options) # type: ignore - - @property - def transport(self) -> TextToSpeechTransport: - """Returns the transport used by the client instance. - - Returns: - TextToSpeechTransport: The transport used by the client instance. - """ - return self._client.transport - - @property - def api_endpoint(self): - """Return the API endpoint used by the client instance. - - Returns: - str: The API endpoint used by the client instance. - """ - return self._client._api_endpoint - - @property - def universe_domain(self) -> str: - """Return the universe domain used by the client instance. - - Returns: - str: The universe domain used - by the client instance. - """ - return self._client._universe_domain - - get_transport_class = TextToSpeechClient.get_transport_class - - def __init__(self, *, - credentials: Optional[ga_credentials.Credentials] = None, - transport: Optional[Union[str, TextToSpeechTransport, Callable[..., TextToSpeechTransport]]] = "grpc_asyncio", - client_options: Optional[ClientOptions] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - ) -> None: - """Instantiates the text to speech async client. - - Args: - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - transport (Optional[Union[str,TextToSpeechTransport,Callable[..., TextToSpeechTransport]]]): - The transport to use, or a Callable that constructs and returns a new transport to use. - If a Callable is given, it will be called with the same set of initialization - arguments as used in the TextToSpeechTransport constructor. - If set to None, a transport is chosen automatically. - NOTE: "rest" transport functionality is currently in a - beta state (preview). We welcome your feedback via an - issue in this library's source repository. - client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): - Custom options for the client. - - 1. The ``api_endpoint`` property can be used to override the - default endpoint provided by the client when ``transport`` is - not explicitly provided. Only if this property is not set and - ``transport`` was not explicitly provided, the endpoint is - determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment - variable, which have one of the following values: - "always" (always use the default mTLS endpoint), "never" (always - use the default regular endpoint) and "auto" (auto-switch to the - default mTLS endpoint if client certificate is present; this is - the default value). - - 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable - is "true", then the ``client_cert_source`` property can be used - to provide a client certificate for mTLS transport. If - not provided, the default SSL client certificate will be used if - present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not - set, no client certificate will be used. - - 3. The ``universe_domain`` property can be used to override the - default "googleapis.com" universe. Note that ``api_endpoint`` - property still takes precedence; and ``universe_domain`` is - currently not supported for mTLS. - - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - - Raises: - google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport - creation failed for any reason. - """ - self._client = TextToSpeechClient( - credentials=credentials, - transport=transport, - client_options=client_options, - client_info=client_info, - - ) - - async def list_voices(self, - request: Optional[Union[cloud_tts.ListVoicesRequest, dict]] = None, - *, - language_code: Optional[str] = None, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> cloud_tts.ListVoicesResponse: - r"""Returns a list of Voice supported for synthesis. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1beta1 - - async def sample_list_voices(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechAsyncClient() - - # Initialize request argument(s) - request = texttospeech_v1beta1.ListVoicesRequest( - ) - - # Make the request - response = await client.list_voices(request=request) - - # Handle the response - print(response) - - Args: - request (Optional[Union[google.cloud.texttospeech_v1beta1.types.ListVoicesRequest, dict]]): - The request object. The top-level message sent by the client for the - ``ListVoices`` method. - language_code (:class:`str`): - Optional. Recommended. - `BCP-47 `__ - language tag. If not specified, the API will return all - supported voices. If specified, the ListVoices call will - only return voices that can be used to synthesize this - language_code. For example, if you specify ``"en-NZ"``, - all ``"en-NZ"`` voices will be returned. If you specify - ``"no"``, both ``"no-\*"`` (Norwegian) and ``"nb-\*"`` - (Norwegian Bokmal) voices will be returned. - - This corresponds to the ``language_code`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - google.cloud.texttospeech_v1beta1.types.ListVoicesResponse: - The message returned to the client by the ListVoices - method. - - """ - # Create or coerce a protobuf request object. - # - Quick check: If we got a request object, we should *not* have - # gotten any keyword arguments that map to the request. - has_flattened_params = any([language_code]) - if request is not None and has_flattened_params: - raise ValueError("If the `request` argument is set, then none of " - "the individual field arguments should be set.") - - # - Use the request object if provided (there's no risk of modifying the input as - # there are no flattened fields), or create one. - if not isinstance(request, cloud_tts.ListVoicesRequest): - request = cloud_tts.ListVoicesRequest(request) - - # If we have keyword arguments corresponding to fields on the - # request, apply these. - if language_code is not None: - request.language_code = language_code - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._client._transport._wrapped_methods[self._client._transport.list_voices] - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Done; return the response. - return response - - async def synthesize_speech(self, - request: Optional[Union[cloud_tts.SynthesizeSpeechRequest, dict]] = None, - *, - input: Optional[cloud_tts.SynthesisInput] = None, - voice: Optional[cloud_tts.VoiceSelectionParams] = None, - audio_config: Optional[cloud_tts.AudioConfig] = None, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> cloud_tts.SynthesizeSpeechResponse: - r"""Synthesizes speech synchronously: receive results - after all text input has been processed. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1beta1 - - async def sample_synthesize_speech(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechAsyncClient() - - # Initialize request argument(s) - input = texttospeech_v1beta1.SynthesisInput() - input.text = "text_value" - - voice = texttospeech_v1beta1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - audio_config = texttospeech_v1beta1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - request = texttospeech_v1beta1.SynthesizeSpeechRequest( - input=input, - voice=voice, - audio_config=audio_config, - ) - - # Make the request - response = await client.synthesize_speech(request=request) - - # Handle the response - print(response) - - Args: - request (Optional[Union[google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechRequest, dict]]): - The request object. The top-level message sent by the client for the - ``SynthesizeSpeech`` method. - input (:class:`google.cloud.texttospeech_v1beta1.types.SynthesisInput`): - Required. The Synthesizer requires - either plain text or SSML as input. - - This corresponds to the ``input`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - voice (:class:`google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams`): - Required. The desired voice of the - synthesized audio. - - This corresponds to the ``voice`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - audio_config (:class:`google.cloud.texttospeech_v1beta1.types.AudioConfig`): - Required. The configuration of the - synthesized audio. - - This corresponds to the ``audio_config`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechResponse: - The message returned to the client by the - SynthesizeSpeech method. - - """ - # Create or coerce a protobuf request object. - # - Quick check: If we got a request object, we should *not* have - # gotten any keyword arguments that map to the request. - has_flattened_params = any([input, voice, audio_config]) - if request is not None and has_flattened_params: - raise ValueError("If the `request` argument is set, then none of " - "the individual field arguments should be set.") - - # - Use the request object if provided (there's no risk of modifying the input as - # there are no flattened fields), or create one. - if not isinstance(request, cloud_tts.SynthesizeSpeechRequest): - request = cloud_tts.SynthesizeSpeechRequest(request) - - # If we have keyword arguments corresponding to fields on the - # request, apply these. - if input is not None: - request.input = input - if voice is not None: - request.voice = voice - if audio_config is not None: - request.audio_config = audio_config - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._client._transport._wrapped_methods[self._client._transport.synthesize_speech] - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Done; return the response. - return response - - def streaming_synthesize(self, - requests: Optional[AsyncIterator[cloud_tts.StreamingSynthesizeRequest]] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> Awaitable[AsyncIterable[cloud_tts.StreamingSynthesizeResponse]]: - r"""Performs bidirectional streaming speech synthesis: - receive audio while sending text. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1beta1 - - async def sample_streaming_synthesize(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechAsyncClient() - - # Initialize request argument(s) - streaming_config = texttospeech_v1beta1.StreamingSynthesizeConfig() - streaming_config.voice.language_code = "language_code_value" - - request = texttospeech_v1beta1.StreamingSynthesizeRequest( - streaming_config=streaming_config, - ) - - # This method expects an iterator which contains - # 'texttospeech_v1beta1.StreamingSynthesizeRequest' objects - # Here we create a generator that yields a single `request` for - # demonstrative purposes. - requests = [request] - - def request_generator(): - for request in requests: - yield request - - # Make the request - stream = await client.streaming_synthesize(requests=request_generator()) - - # Handle the response - async for response in stream: - print(response) - - Args: - requests (AsyncIterator[`google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeRequest`]): - The request object AsyncIterator. Request message for the ``StreamingSynthesize`` method. - Multiple ``StreamingSynthesizeRequest`` messages are - sent in one call. The first message must contain a - ``streaming_config`` that fully specifies the request - configuration and must not contain ``input``. All - subsequent messages must only have ``input`` set. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - AsyncIterable[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeResponse]: - StreamingSynthesizeResponse is the only message returned to the - client by StreamingSynthesize method. A series of - zero or more StreamingSynthesizeResponse messages are - streamed back to the client. - - """ - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._client._transport._wrapped_methods[self._client._transport.streaming_synthesize] - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = rpc( - requests, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Done; return the response. - return response - - async def list_operations( - self, - request: Optional[operations_pb2.ListOperationsRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.ListOperationsResponse: - r"""Lists operations that match the specified filter in the request. - - Args: - request (:class:`~.operations_pb2.ListOperationsRequest`): - The request object. Request message for - `ListOperations` method. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.ListOperationsResponse: - Response message for ``ListOperations`` method. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.ListOperationsRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self.transport._wrapped_methods[self._client._transport.list_operations] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - async def get_operation( - self, - request: Optional[operations_pb2.GetOperationRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.Operation: - r"""Gets the latest state of a long-running operation. - - Args: - request (:class:`~.operations_pb2.GetOperationRequest`): - The request object. Request message for - `GetOperation` method. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.Operation: - An ``Operation`` object. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.GetOperationRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self.transport._wrapped_methods[self._client._transport.get_operation] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - async def __aenter__(self) -> "TextToSpeechAsyncClient": - return self - - async def __aexit__(self, exc_type, exc, tb): - await self.transport.close() - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) - - -__all__ = ( - "TextToSpeechAsyncClient", -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/client.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/client.py deleted file mode 100644 index 8f581026e88a..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/client.py +++ /dev/null @@ -1,1017 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from collections import OrderedDict -import os -import re -from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Iterable, Iterator, Sequence, Tuple, Type, Union, cast -import warnings - -from google.cloud.texttospeech_v1beta1 import gapic_version as package_version - -from google.api_core import client_options as client_options_lib -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import retry as retries -from google.auth import credentials as ga_credentials # type: ignore -from google.auth.transport import mtls # type: ignore -from google.auth.transport.grpc import SslCredentials # type: ignore -from google.auth.exceptions import MutualTLSChannelError # type: ignore -from google.oauth2 import service_account # type: ignore - -try: - OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] -except AttributeError: # pragma: NO COVER - OptionalRetry = Union[retries.Retry, object, None] # type: ignore - -from google.cloud.texttospeech_v1beta1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore -from .transports.base import TextToSpeechTransport, DEFAULT_CLIENT_INFO -from .transports.grpc import TextToSpeechGrpcTransport -from .transports.grpc_asyncio import TextToSpeechGrpcAsyncIOTransport -from .transports.rest import TextToSpeechRestTransport - - -class TextToSpeechClientMeta(type): - """Metaclass for the TextToSpeech client. - - This provides class-level methods for building and retrieving - support objects (e.g. transport) without polluting the client instance - objects. - """ - _transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechTransport]] - _transport_registry["grpc"] = TextToSpeechGrpcTransport - _transport_registry["grpc_asyncio"] = TextToSpeechGrpcAsyncIOTransport - _transport_registry["rest"] = TextToSpeechRestTransport - - def get_transport_class(cls, - label: Optional[str] = None, - ) -> Type[TextToSpeechTransport]: - """Returns an appropriate transport class. - - Args: - label: The name of the desired transport. If none is - provided, then the first transport in the registry is used. - - Returns: - The transport class to use. - """ - # If a specific transport is requested, return that one. - if label: - return cls._transport_registry[label] - - # No transport is requested; return the default (that is, the first one - # in the dictionary). - return next(iter(cls._transport_registry.values())) - - -class TextToSpeechClient(metaclass=TextToSpeechClientMeta): - """Service that implements Google Cloud Text-to-Speech API.""" - - @staticmethod - def _get_default_mtls_endpoint(api_endpoint): - """Converts api endpoint to mTLS endpoint. - - Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to - "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively. - Args: - api_endpoint (Optional[str]): the api endpoint to convert. - Returns: - str: converted mTLS api endpoint. - """ - if not api_endpoint: - return api_endpoint - - mtls_endpoint_re = re.compile( - r"(?P[^.]+)(?P\.mtls)?(?P\.sandbox)?(?P\.googleapis\.com)?" - ) - - m = mtls_endpoint_re.match(api_endpoint) - name, mtls, sandbox, googledomain = m.groups() - if mtls or not googledomain: - return api_endpoint - - if sandbox: - return api_endpoint.replace( - "sandbox.googleapis.com", "mtls.sandbox.googleapis.com" - ) - - return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com") - - # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. - DEFAULT_ENDPOINT = "texttospeech.googleapis.com" - DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore - DEFAULT_ENDPOINT - ) - - _DEFAULT_ENDPOINT_TEMPLATE = "texttospeech.{UNIVERSE_DOMAIN}" - _DEFAULT_UNIVERSE = "googleapis.com" - - @classmethod - def from_service_account_info(cls, info: dict, *args, **kwargs): - """Creates an instance of this client using the provided credentials - info. - - Args: - info (dict): The service account private key info. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechClient: The constructed client. - """ - credentials = service_account.Credentials.from_service_account_info(info) - kwargs["credentials"] = credentials - return cls(*args, **kwargs) - - @classmethod - def from_service_account_file(cls, filename: str, *args, **kwargs): - """Creates an instance of this client using the provided credentials - file. - - Args: - filename (str): The path to the service account private key json - file. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechClient: The constructed client. - """ - credentials = service_account.Credentials.from_service_account_file( - filename) - kwargs["credentials"] = credentials - return cls(*args, **kwargs) - - from_service_account_json = from_service_account_file - - @property - def transport(self) -> TextToSpeechTransport: - """Returns the transport used by the client instance. - - Returns: - TextToSpeechTransport: The transport used by the client - instance. - """ - return self._transport - - @staticmethod - def model_path(project: str,location: str,model: str,) -> str: - """Returns a fully-qualified model string.""" - return "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) - - @staticmethod - def parse_model_path(path: str) -> Dict[str,str]: - """Parses a model path into its component segments.""" - m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)/models/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_billing_account_path(billing_account: str, ) -> str: - """Returns a fully-qualified billing_account string.""" - return "billingAccounts/{billing_account}".format(billing_account=billing_account, ) - - @staticmethod - def parse_common_billing_account_path(path: str) -> Dict[str,str]: - """Parse a billing_account path into its component segments.""" - m = re.match(r"^billingAccounts/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_folder_path(folder: str, ) -> str: - """Returns a fully-qualified folder string.""" - return "folders/{folder}".format(folder=folder, ) - - @staticmethod - def parse_common_folder_path(path: str) -> Dict[str,str]: - """Parse a folder path into its component segments.""" - m = re.match(r"^folders/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_organization_path(organization: str, ) -> str: - """Returns a fully-qualified organization string.""" - return "organizations/{organization}".format(organization=organization, ) - - @staticmethod - def parse_common_organization_path(path: str) -> Dict[str,str]: - """Parse a organization path into its component segments.""" - m = re.match(r"^organizations/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_project_path(project: str, ) -> str: - """Returns a fully-qualified project string.""" - return "projects/{project}".format(project=project, ) - - @staticmethod - def parse_common_project_path(path: str) -> Dict[str,str]: - """Parse a project path into its component segments.""" - m = re.match(r"^projects/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_location_path(project: str, location: str, ) -> str: - """Returns a fully-qualified location string.""" - return "projects/{project}/locations/{location}".format(project=project, location=location, ) - - @staticmethod - def parse_common_location_path(path: str) -> Dict[str,str]: - """Parse a location path into its component segments.""" - m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path) - return m.groupdict() if m else {} - - @classmethod - def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[client_options_lib.ClientOptions] = None): - """Deprecated. Return the API endpoint and client cert source for mutual TLS. - - The client cert source is determined in the following order: - (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the - client cert source is None. - (2) if `client_options.client_cert_source` is provided, use the provided one; if the - default client cert source exists, use the default one; otherwise the client cert - source is None. - - The API endpoint is determined in the following order: - (1) if `client_options.api_endpoint` if provided, use the provided one. - (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the - default mTLS endpoint; if the environment variable is "never", use the default API - endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise - use the default API endpoint. - - More details can be found at https://google.aip.dev/auth/4114. - - Args: - client_options (google.api_core.client_options.ClientOptions): Custom options for the - client. Only the `api_endpoint` and `client_cert_source` properties may be used - in this method. - - Returns: - Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the - client cert source to use. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If any errors happen. - """ - - warnings.warn("get_mtls_endpoint_and_cert_source is deprecated. Use the api_endpoint property instead.", - DeprecationWarning) - if client_options is None: - client_options = client_options_lib.ClientOptions() - use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") - use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") - if use_client_cert not in ("true", "false"): - raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") - if use_mtls_endpoint not in ("auto", "never", "always"): - raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") - - # Figure out the client cert source to use. - client_cert_source = None - if use_client_cert == "true": - if client_options.client_cert_source: - client_cert_source = client_options.client_cert_source - elif mtls.has_default_client_cert_source(): - client_cert_source = mtls.default_client_cert_source() - - # Figure out which api endpoint to use. - if client_options.api_endpoint is not None: - api_endpoint = client_options.api_endpoint - elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): - api_endpoint = cls.DEFAULT_MTLS_ENDPOINT - else: - api_endpoint = cls.DEFAULT_ENDPOINT - - return api_endpoint, client_cert_source - - @staticmethod - def _read_environment_variables(): - """Returns the environment variables used by the client. - - Returns: - Tuple[bool, str, str]: returns the GOOGLE_API_USE_CLIENT_CERTIFICATE, - GOOGLE_API_USE_MTLS_ENDPOINT, and GOOGLE_CLOUD_UNIVERSE_DOMAIN environment variables. - - Raises: - ValueError: If GOOGLE_API_USE_CLIENT_CERTIFICATE is not - any of ["true", "false"]. - google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT - is not any of ["auto", "never", "always"]. - """ - use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false").lower() - use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower() - universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN") - if use_client_cert not in ("true", "false"): - raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") - if use_mtls_endpoint not in ("auto", "never", "always"): - raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") - return use_client_cert == "true", use_mtls_endpoint, universe_domain_env - - @staticmethod - def _get_client_cert_source(provided_cert_source, use_cert_flag): - """Return the client cert source to be used by the client. - - Args: - provided_cert_source (bytes): The client certificate source provided. - use_cert_flag (bool): A flag indicating whether to use the client certificate. - - Returns: - bytes or None: The client cert source to be used by the client. - """ - client_cert_source = None - if use_cert_flag: - if provided_cert_source: - client_cert_source = provided_cert_source - elif mtls.has_default_client_cert_source(): - client_cert_source = mtls.default_client_cert_source() - return client_cert_source - - @staticmethod - def _get_api_endpoint(api_override, client_cert_source, universe_domain, use_mtls_endpoint): - """Return the API endpoint used by the client. - - Args: - api_override (str): The API endpoint override. If specified, this is always - the return value of this function and the other arguments are not used. - client_cert_source (bytes): The client certificate source used by the client. - universe_domain (str): The universe domain used by the client. - use_mtls_endpoint (str): How to use the mTLS endpoint, which depends also on the other parameters. - Possible values are "always", "auto", or "never". - - Returns: - str: The API endpoint to be used by the client. - """ - if api_override is not None: - api_endpoint = api_override - elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): - _default_universe = TextToSpeechClient._DEFAULT_UNIVERSE - if universe_domain != _default_universe: - raise MutualTLSChannelError(f"mTLS is not supported in any universe other than {_default_universe}.") - api_endpoint = TextToSpeechClient.DEFAULT_MTLS_ENDPOINT - else: - api_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=universe_domain) - return api_endpoint - - @staticmethod - def _get_universe_domain(client_universe_domain: Optional[str], universe_domain_env: Optional[str]) -> str: - """Return the universe domain used by the client. - - Args: - client_universe_domain (Optional[str]): The universe domain configured via the client options. - universe_domain_env (Optional[str]): The universe domain configured via the "GOOGLE_CLOUD_UNIVERSE_DOMAIN" environment variable. - - Returns: - str: The universe domain to be used by the client. - - Raises: - ValueError: If the universe domain is an empty string. - """ - universe_domain = TextToSpeechClient._DEFAULT_UNIVERSE - if client_universe_domain is not None: - universe_domain = client_universe_domain - elif universe_domain_env is not None: - universe_domain = universe_domain_env - if len(universe_domain.strip()) == 0: - raise ValueError("Universe Domain cannot be an empty string.") - return universe_domain - - @staticmethod - def _compare_universes(client_universe: str, - credentials: ga_credentials.Credentials) -> bool: - """Returns True iff the universe domains used by the client and credentials match. - - Args: - client_universe (str): The universe domain configured via the client options. - credentials (ga_credentials.Credentials): The credentials being used in the client. - - Returns: - bool: True iff client_universe matches the universe in credentials. - - Raises: - ValueError: when client_universe does not match the universe in credentials. - """ - - default_universe = TextToSpeechClient._DEFAULT_UNIVERSE - credentials_universe = getattr(credentials, "universe_domain", default_universe) - - if client_universe != credentials_universe: - raise ValueError("The configured universe domain " - f"({client_universe}) does not match the universe domain " - f"found in the credentials ({credentials_universe}). " - "If you haven't configured the universe domain explicitly, " - f"`{default_universe}` is the default.") - return True - - def _validate_universe_domain(self): - """Validates client's and credentials' universe domains are consistent. - - Returns: - bool: True iff the configured universe domain is valid. - - Raises: - ValueError: If the configured universe domain is not valid. - """ - self._is_universe_domain_valid = (self._is_universe_domain_valid or - TextToSpeechClient._compare_universes(self.universe_domain, self.transport._credentials)) - return self._is_universe_domain_valid - - @property - def api_endpoint(self): - """Return the API endpoint used by the client instance. - - Returns: - str: The API endpoint used by the client instance. - """ - return self._api_endpoint - - @property - def universe_domain(self) -> str: - """Return the universe domain used by the client instance. - - Returns: - str: The universe domain used by the client instance. - """ - return self._universe_domain - - def __init__(self, *, - credentials: Optional[ga_credentials.Credentials] = None, - transport: Optional[Union[str, TextToSpeechTransport, Callable[..., TextToSpeechTransport]]] = None, - client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - ) -> None: - """Instantiates the text to speech client. - - Args: - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - transport (Optional[Union[str,TextToSpeechTransport,Callable[..., TextToSpeechTransport]]]): - The transport to use, or a Callable that constructs and returns a new transport. - If a Callable is given, it will be called with the same set of initialization - arguments as used in the TextToSpeechTransport constructor. - If set to None, a transport is chosen automatically. - NOTE: "rest" transport functionality is currently in a - beta state (preview). We welcome your feedback via an - issue in this library's source repository. - client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): - Custom options for the client. - - 1. The ``api_endpoint`` property can be used to override the - default endpoint provided by the client when ``transport`` is - not explicitly provided. Only if this property is not set and - ``transport`` was not explicitly provided, the endpoint is - determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment - variable, which have one of the following values: - "always" (always use the default mTLS endpoint), "never" (always - use the default regular endpoint) and "auto" (auto-switch to the - default mTLS endpoint if client certificate is present; this is - the default value). - - 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable - is "true", then the ``client_cert_source`` property can be used - to provide a client certificate for mTLS transport. If - not provided, the default SSL client certificate will be used if - present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not - set, no client certificate will be used. - - 3. The ``universe_domain`` property can be used to override the - default "googleapis.com" universe. Note that the ``api_endpoint`` - property still takes precedence; and ``universe_domain`` is - currently not supported for mTLS. - - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport - creation failed for any reason. - """ - self._client_options = client_options - if isinstance(self._client_options, dict): - self._client_options = client_options_lib.from_dict(self._client_options) - if self._client_options is None: - self._client_options = client_options_lib.ClientOptions() - self._client_options = cast(client_options_lib.ClientOptions, self._client_options) - - universe_domain_opt = getattr(self._client_options, 'universe_domain', None) - - self._use_client_cert, self._use_mtls_endpoint, self._universe_domain_env = TextToSpeechClient._read_environment_variables() - self._client_cert_source = TextToSpeechClient._get_client_cert_source(self._client_options.client_cert_source, self._use_client_cert) - self._universe_domain = TextToSpeechClient._get_universe_domain(universe_domain_opt, self._universe_domain_env) - self._api_endpoint = None # updated below, depending on `transport` - - # Initialize the universe domain validation. - self._is_universe_domain_valid = False - - api_key_value = getattr(self._client_options, "api_key", None) - if api_key_value and credentials: - raise ValueError("client_options.api_key and credentials are mutually exclusive") - - # Save or instantiate the transport. - # Ordinarily, we provide the transport, but allowing a custom transport - # instance provides an extensibility point for unusual situations. - transport_provided = isinstance(transport, TextToSpeechTransport) - if transport_provided: - # transport is a TextToSpeechTransport instance. - if credentials or self._client_options.credentials_file or api_key_value: - raise ValueError("When providing a transport instance, " - "provide its credentials directly.") - if self._client_options.scopes: - raise ValueError( - "When providing a transport instance, provide its scopes " - "directly." - ) - self._transport = cast(TextToSpeechTransport, transport) - self._api_endpoint = self._transport.host - - self._api_endpoint = (self._api_endpoint or - TextToSpeechClient._get_api_endpoint( - self._client_options.api_endpoint, - self._client_cert_source, - self._universe_domain, - self._use_mtls_endpoint)) - - if not transport_provided: - import google.auth._default # type: ignore - - if api_key_value and hasattr(google.auth._default, "get_api_key_credentials"): - credentials = google.auth._default.get_api_key_credentials(api_key_value) - - transport_init: Union[Type[TextToSpeechTransport], Callable[..., TextToSpeechTransport]] = ( - TextToSpeechClient.get_transport_class(transport) - if isinstance(transport, str) or transport is None - else cast(Callable[..., TextToSpeechTransport], transport) - ) - # initialize with the provided callable or the passed in class - self._transport = transport_init( - credentials=credentials, - credentials_file=self._client_options.credentials_file, - host=self._api_endpoint, - scopes=self._client_options.scopes, - client_cert_source_for_mtls=self._client_cert_source, - quota_project_id=self._client_options.quota_project_id, - client_info=client_info, - always_use_jwt_access=True, - api_audience=self._client_options.api_audience, - ) - - def list_voices(self, - request: Optional[Union[cloud_tts.ListVoicesRequest, dict]] = None, - *, - language_code: Optional[str] = None, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> cloud_tts.ListVoicesResponse: - r"""Returns a list of Voice supported for synthesis. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1beta1 - - def sample_list_voices(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechClient() - - # Initialize request argument(s) - request = texttospeech_v1beta1.ListVoicesRequest( - ) - - # Make the request - response = client.list_voices(request=request) - - # Handle the response - print(response) - - Args: - request (Union[google.cloud.texttospeech_v1beta1.types.ListVoicesRequest, dict]): - The request object. The top-level message sent by the client for the - ``ListVoices`` method. - language_code (str): - Optional. Recommended. - `BCP-47 `__ - language tag. If not specified, the API will return all - supported voices. If specified, the ListVoices call will - only return voices that can be used to synthesize this - language_code. For example, if you specify ``"en-NZ"``, - all ``"en-NZ"`` voices will be returned. If you specify - ``"no"``, both ``"no-\*"`` (Norwegian) and ``"nb-\*"`` - (Norwegian Bokmal) voices will be returned. - - This corresponds to the ``language_code`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - google.cloud.texttospeech_v1beta1.types.ListVoicesResponse: - The message returned to the client by the ListVoices - method. - - """ - # Create or coerce a protobuf request object. - # - Quick check: If we got a request object, we should *not* have - # gotten any keyword arguments that map to the request. - has_flattened_params = any([language_code]) - if request is not None and has_flattened_params: - raise ValueError('If the `request` argument is set, then none of ' - 'the individual field arguments should be set.') - - # - Use the request object if provided (there's no risk of modifying the input as - # there are no flattened fields), or create one. - if not isinstance(request, cloud_tts.ListVoicesRequest): - request = cloud_tts.ListVoicesRequest(request) - # If we have keyword arguments corresponding to fields on the - # request, apply these. - if language_code is not None: - request.language_code = language_code - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.list_voices] - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Done; return the response. - return response - - def synthesize_speech(self, - request: Optional[Union[cloud_tts.SynthesizeSpeechRequest, dict]] = None, - *, - input: Optional[cloud_tts.SynthesisInput] = None, - voice: Optional[cloud_tts.VoiceSelectionParams] = None, - audio_config: Optional[cloud_tts.AudioConfig] = None, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> cloud_tts.SynthesizeSpeechResponse: - r"""Synthesizes speech synchronously: receive results - after all text input has been processed. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1beta1 - - def sample_synthesize_speech(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechClient() - - # Initialize request argument(s) - input = texttospeech_v1beta1.SynthesisInput() - input.text = "text_value" - - voice = texttospeech_v1beta1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - audio_config = texttospeech_v1beta1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - request = texttospeech_v1beta1.SynthesizeSpeechRequest( - input=input, - voice=voice, - audio_config=audio_config, - ) - - # Make the request - response = client.synthesize_speech(request=request) - - # Handle the response - print(response) - - Args: - request (Union[google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechRequest, dict]): - The request object. The top-level message sent by the client for the - ``SynthesizeSpeech`` method. - input (google.cloud.texttospeech_v1beta1.types.SynthesisInput): - Required. The Synthesizer requires - either plain text or SSML as input. - - This corresponds to the ``input`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - voice (google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams): - Required. The desired voice of the - synthesized audio. - - This corresponds to the ``voice`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - audio_config (google.cloud.texttospeech_v1beta1.types.AudioConfig): - Required. The configuration of the - synthesized audio. - - This corresponds to the ``audio_config`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechResponse: - The message returned to the client by the - SynthesizeSpeech method. - - """ - # Create or coerce a protobuf request object. - # - Quick check: If we got a request object, we should *not* have - # gotten any keyword arguments that map to the request. - has_flattened_params = any([input, voice, audio_config]) - if request is not None and has_flattened_params: - raise ValueError('If the `request` argument is set, then none of ' - 'the individual field arguments should be set.') - - # - Use the request object if provided (there's no risk of modifying the input as - # there are no flattened fields), or create one. - if not isinstance(request, cloud_tts.SynthesizeSpeechRequest): - request = cloud_tts.SynthesizeSpeechRequest(request) - # If we have keyword arguments corresponding to fields on the - # request, apply these. - if input is not None: - request.input = input - if voice is not None: - request.voice = voice - if audio_config is not None: - request.audio_config = audio_config - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.synthesize_speech] - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Done; return the response. - return response - - def streaming_synthesize(self, - requests: Optional[Iterator[cloud_tts.StreamingSynthesizeRequest]] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> Iterable[cloud_tts.StreamingSynthesizeResponse]: - r"""Performs bidirectional streaming speech synthesis: - receive audio while sending text. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1beta1 - - def sample_streaming_synthesize(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechClient() - - # Initialize request argument(s) - streaming_config = texttospeech_v1beta1.StreamingSynthesizeConfig() - streaming_config.voice.language_code = "language_code_value" - - request = texttospeech_v1beta1.StreamingSynthesizeRequest( - streaming_config=streaming_config, - ) - - # This method expects an iterator which contains - # 'texttospeech_v1beta1.StreamingSynthesizeRequest' objects - # Here we create a generator that yields a single `request` for - # demonstrative purposes. - requests = [request] - - def request_generator(): - for request in requests: - yield request - - # Make the request - stream = client.streaming_synthesize(requests=request_generator()) - - # Handle the response - for response in stream: - print(response) - - Args: - requests (Iterator[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeRequest]): - The request object iterator. Request message for the ``StreamingSynthesize`` method. - Multiple ``StreamingSynthesizeRequest`` messages are - sent in one call. The first message must contain a - ``streaming_config`` that fully specifies the request - configuration and must not contain ``input``. All - subsequent messages must only have ``input`` set. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - Iterable[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeResponse]: - StreamingSynthesizeResponse is the only message returned to the - client by StreamingSynthesize method. A series of - zero or more StreamingSynthesizeResponse messages are - streamed back to the client. - - """ - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.streaming_synthesize] - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - requests, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Done; return the response. - return response - - def __enter__(self) -> "TextToSpeechClient": - return self - - def __exit__(self, type, value, traceback): - """Releases underlying transport's resources. - - .. warning:: - ONLY use as a context manager if the transport is NOT shared - with other clients! Exiting the with block will CLOSE the transport - and may cause errors in other clients! - """ - self.transport.close() - - def list_operations( - self, - request: Optional[operations_pb2.ListOperationsRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.ListOperationsResponse: - r"""Lists operations that match the specified filter in the request. - - Args: - request (:class:`~.operations_pb2.ListOperationsRequest`): - The request object. Request message for - `ListOperations` method. - retry (google.api_core.retry.Retry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.ListOperationsResponse: - Response message for ``ListOperations`` method. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.ListOperationsRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.list_operations] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - def get_operation( - self, - request: Optional[operations_pb2.GetOperationRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.Operation: - r"""Gets the latest state of a long-running operation. - - Args: - request (:class:`~.operations_pb2.GetOperationRequest`): - The request object. Request message for - `GetOperation` method. - retry (google.api_core.retry.Retry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.Operation: - An ``Operation`` object. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.GetOperationRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.get_operation] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - - - - - - - - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) - - -__all__ = ( - "TextToSpeechClient", -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/README.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/README.rst deleted file mode 100644 index 37ce873b979b..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/README.rst +++ /dev/null @@ -1,9 +0,0 @@ - -transport inheritance structure -_______________________________ - -`TextToSpeechTransport` is the ABC for all transports. -- public child `TextToSpeechGrpcTransport` for sync gRPC transport (defined in `grpc.py`). -- public child `TextToSpeechGrpcAsyncIOTransport` for async gRPC transport (defined in `grpc_asyncio.py`). -- private child `_BaseTextToSpeechRestTransport` for base REST transport with inner classes `_BaseMETHOD` (defined in `rest_base.py`). -- public child `TextToSpeechRestTransport` for sync REST transport with inner classes `METHOD` derived from the parent's corresponding `_BaseMETHOD` classes (defined in `rest.py`). diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/__init__.py deleted file mode 100644 index 84d107252aae..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from collections import OrderedDict -from typing import Dict, Type - -from .base import TextToSpeechTransport -from .grpc import TextToSpeechGrpcTransport -from .grpc_asyncio import TextToSpeechGrpcAsyncIOTransport -from .rest import TextToSpeechRestTransport -from .rest import TextToSpeechRestInterceptor - - -# Compile a registry of transports. -_transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechTransport]] -_transport_registry['grpc'] = TextToSpeechGrpcTransport -_transport_registry['grpc_asyncio'] = TextToSpeechGrpcAsyncIOTransport -_transport_registry['rest'] = TextToSpeechRestTransport - -__all__ = ( - 'TextToSpeechTransport', - 'TextToSpeechGrpcTransport', - 'TextToSpeechGrpcAsyncIOTransport', - 'TextToSpeechRestTransport', - 'TextToSpeechRestInterceptor', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/base.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/base.py deleted file mode 100644 index fc9be644b7d0..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/base.py +++ /dev/null @@ -1,211 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 abc -from typing import Awaitable, Callable, Dict, Optional, Sequence, Union - -from google.cloud.texttospeech_v1beta1 import gapic_version as package_version - -import google.auth # type: ignore -import google.api_core -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import retry as retries -from google.auth import credentials as ga_credentials # type: ignore -from google.oauth2 import service_account # type: ignore - -from google.cloud.texttospeech_v1beta1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) - - -class TextToSpeechTransport(abc.ABC): - """Abstract transport class for TextToSpeech.""" - - AUTH_SCOPES = ( - 'https://www.googleapis.com/auth/cloud-platform', - ) - - DEFAULT_HOST: str = 'texttospeech.googleapis.com' - def __init__( - self, *, - host: str = DEFAULT_HOST, - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - api_audience: Optional[str] = None, - **kwargs, - ) -> None: - """Instantiate the transport. - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is mutually exclusive with credentials. - scopes (Optional[Sequence[str]]): A list of scopes. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - """ - - scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} - - # Save the scopes. - self._scopes = scopes - if not hasattr(self, "_ignore_credentials"): - self._ignore_credentials: bool = False - - # If no credentials are provided, then determine the appropriate - # defaults. - if credentials and credentials_file: - raise core_exceptions.DuplicateCredentialArgs("'credentials_file' and 'credentials' are mutually exclusive") - - if credentials_file is not None: - credentials, _ = google.auth.load_credentials_from_file( - credentials_file, - **scopes_kwargs, - quota_project_id=quota_project_id - ) - elif credentials is None and not self._ignore_credentials: - credentials, _ = google.auth.default(**scopes_kwargs, quota_project_id=quota_project_id) - # Don't apply audience if the credentials file passed from user. - if hasattr(credentials, "with_gdch_audience"): - credentials = credentials.with_gdch_audience(api_audience if api_audience else host) - - # If the credentials are service account credentials, then always try to use self signed JWT. - if always_use_jwt_access and isinstance(credentials, service_account.Credentials) and hasattr(service_account.Credentials, "with_always_use_jwt_access"): - credentials = credentials.with_always_use_jwt_access(True) - - # Save the credentials. - self._credentials = credentials - - # Save the hostname. Default to port 443 (HTTPS) if none is specified. - if ':' not in host: - host += ':443' - self._host = host - - @property - def host(self): - return self._host - - def _prep_wrapped_messages(self, client_info): - # Precompute the wrapped methods. - self._wrapped_methods = { - self.list_voices: gapic_v1.method.wrap_method( - self.list_voices, - default_timeout=None, - client_info=client_info, - ), - self.synthesize_speech: gapic_v1.method.wrap_method( - self.synthesize_speech, - default_timeout=None, - client_info=client_info, - ), - self.streaming_synthesize: gapic_v1.method.wrap_method( - self.streaming_synthesize, - default_timeout=None, - client_info=client_info, - ), - self.get_operation: gapic_v1.method.wrap_method( - self.get_operation, - default_timeout=None, - client_info=client_info, - ), - self.list_operations: gapic_v1.method.wrap_method( - self.list_operations, - default_timeout=None, - client_info=client_info, - ), - } - - def close(self): - """Closes resources associated with the transport. - - .. warning:: - Only call this method if the transport is NOT shared - with other clients - this may cause errors in other clients! - """ - raise NotImplementedError() - - @property - def list_voices(self) -> Callable[ - [cloud_tts.ListVoicesRequest], - Union[ - cloud_tts.ListVoicesResponse, - Awaitable[cloud_tts.ListVoicesResponse] - ]]: - raise NotImplementedError() - - @property - def synthesize_speech(self) -> Callable[ - [cloud_tts.SynthesizeSpeechRequest], - Union[ - cloud_tts.SynthesizeSpeechResponse, - Awaitable[cloud_tts.SynthesizeSpeechResponse] - ]]: - raise NotImplementedError() - - @property - def streaming_synthesize(self) -> Callable[ - [cloud_tts.StreamingSynthesizeRequest], - Union[ - cloud_tts.StreamingSynthesizeResponse, - Awaitable[cloud_tts.StreamingSynthesizeResponse] - ]]: - raise NotImplementedError() - - @property - def list_operations( - self, - ) -> Callable[ - [operations_pb2.ListOperationsRequest], - Union[operations_pb2.ListOperationsResponse, Awaitable[operations_pb2.ListOperationsResponse]], - ]: - raise NotImplementedError() - - @property - def get_operation( - self, - ) -> Callable[ - [operations_pb2.GetOperationRequest], - Union[operations_pb2.Operation, Awaitable[operations_pb2.Operation]], - ]: - raise NotImplementedError() - - @property - def kind(self) -> str: - raise NotImplementedError() - - -__all__ = ( - 'TextToSpeechTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc.py deleted file mode 100644 index b4efbccf737b..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc.py +++ /dev/null @@ -1,361 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 warnings -from typing import Callable, Dict, Optional, Sequence, Tuple, Union - -from google.api_core import grpc_helpers -from google.api_core import gapic_v1 -import google.auth # type: ignore -from google.auth import credentials as ga_credentials # type: ignore -from google.auth.transport.grpc import SslCredentials # type: ignore - -import grpc # type: ignore - -from google.cloud.texttospeech_v1beta1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore -from .base import TextToSpeechTransport, DEFAULT_CLIENT_INFO - - -class TextToSpeechGrpcTransport(TextToSpeechTransport): - """gRPC backend transport for TextToSpeech. - - Service that implements Google Cloud Text-to-Speech API. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends protocol buffers over the wire using gRPC (which is built on - top of HTTP/2); the ``grpcio`` package must be installed. - """ - _stubs: Dict[str, Callable] - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - channel: Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]] = None, - api_mtls_endpoint: Optional[str] = None, - client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, - client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - This argument is ignored if a ``channel`` instance is provided. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is ignored if a ``channel`` instance is provided. - scopes (Optional(Sequence[str])): A list of scopes. This argument is - ignored if a ``channel`` instance is provided. - channel (Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]]): - A ``Channel`` instance through which to make calls, or a Callable - that constructs and returns one. If set to None, ``self.create_channel`` - is used to create the channel. If a Callable is given, it will be called - with the same arguments as used in ``self.create_channel``. - api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. - If provided, it overrides the ``host`` argument and tries to create - a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or application default SSL credentials. - client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): - Deprecated. A callback to provide client SSL certificate bytes and - private key bytes, both in PEM format. It is ignored if - ``api_mtls_endpoint`` is None. - ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for the grpc channel. It is ignored if a ``channel`` instance is provided. - client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): - A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure a mutual TLS channel. It is - ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport - creation failed for any reason. - google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` - and ``credentials_file`` are passed. - """ - self._grpc_channel = None - self._ssl_channel_credentials = ssl_channel_credentials - self._stubs: Dict[str, Callable] = {} - - if api_mtls_endpoint: - warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) - if client_cert_source: - warnings.warn("client_cert_source is deprecated", DeprecationWarning) - - if isinstance(channel, grpc.Channel): - # Ignore credentials if a channel was passed. - credentials = None - self._ignore_credentials = True - # If a channel was explicitly provided, set it. - self._grpc_channel = channel - self._ssl_channel_credentials = None - - else: - if api_mtls_endpoint: - host = api_mtls_endpoint - - # Create SSL credentials with client_cert_source or application - # default SSL credentials. - if client_cert_source: - cert, key = client_cert_source() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - else: - self._ssl_channel_credentials = SslCredentials().ssl_credentials - - else: - if client_cert_source_for_mtls and not ssl_channel_credentials: - cert, key = client_cert_source_for_mtls() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - - # The base transport sets the host, credentials and scopes - super().__init__( - host=host, - credentials=credentials, - credentials_file=credentials_file, - scopes=scopes, - quota_project_id=quota_project_id, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - api_audience=api_audience, - ) - - if not self._grpc_channel: - # initialize with the provided callable or the default channel - channel_init = channel or type(self).create_channel - self._grpc_channel = channel_init( - self._host, - # use the credentials which are saved - credentials=self._credentials, - # Set ``credentials_file`` to ``None`` here as - # the credentials that we saved earlier should be used. - credentials_file=None, - scopes=self._scopes, - ssl_credentials=self._ssl_channel_credentials, - quota_project_id=quota_project_id, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - # Wrap messages. This must be done after self._grpc_channel exists - self._prep_wrapped_messages(client_info) - - @classmethod - def create_channel(cls, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - quota_project_id: Optional[str] = None, - **kwargs) -> grpc.Channel: - """Create and return a gRPC channel object. - Args: - host (Optional[str]): The host for the channel to use. - credentials (Optional[~.Credentials]): The - authorization credentials to attach to requests. These - credentials identify this application to the service. If - none are specified, the client will attempt to ascertain - the credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is mutually exclusive with credentials. - scopes (Optional[Sequence[str]]): A optional list of scopes needed for this - service. These are only used when credentials are not specified and - are passed to :func:`google.auth.default`. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - kwargs (Optional[dict]): Keyword arguments, which are passed to the - channel creation. - Returns: - grpc.Channel: A gRPC channel object. - - Raises: - google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` - and ``credentials_file`` are passed. - """ - - return grpc_helpers.create_channel( - host, - credentials=credentials, - credentials_file=credentials_file, - quota_project_id=quota_project_id, - default_scopes=cls.AUTH_SCOPES, - scopes=scopes, - default_host=cls.DEFAULT_HOST, - **kwargs - ) - - @property - def grpc_channel(self) -> grpc.Channel: - """Return the channel designed to connect to this service. - """ - return self._grpc_channel - - @property - def list_voices(self) -> Callable[ - [cloud_tts.ListVoicesRequest], - cloud_tts.ListVoicesResponse]: - r"""Return a callable for the list voices method over gRPC. - - Returns a list of Voice supported for synthesis. - - Returns: - Callable[[~.ListVoicesRequest], - ~.ListVoicesResponse]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'list_voices' not in self._stubs: - self._stubs['list_voices'] = self.grpc_channel.unary_unary( - '/google.cloud.texttospeech.v1beta1.TextToSpeech/ListVoices', - request_serializer=cloud_tts.ListVoicesRequest.serialize, - response_deserializer=cloud_tts.ListVoicesResponse.deserialize, - ) - return self._stubs['list_voices'] - - @property - def synthesize_speech(self) -> Callable[ - [cloud_tts.SynthesizeSpeechRequest], - cloud_tts.SynthesizeSpeechResponse]: - r"""Return a callable for the synthesize speech method over gRPC. - - Synthesizes speech synchronously: receive results - after all text input has been processed. - - Returns: - Callable[[~.SynthesizeSpeechRequest], - ~.SynthesizeSpeechResponse]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'synthesize_speech' not in self._stubs: - self._stubs['synthesize_speech'] = self.grpc_channel.unary_unary( - '/google.cloud.texttospeech.v1beta1.TextToSpeech/SynthesizeSpeech', - request_serializer=cloud_tts.SynthesizeSpeechRequest.serialize, - response_deserializer=cloud_tts.SynthesizeSpeechResponse.deserialize, - ) - return self._stubs['synthesize_speech'] - - @property - def streaming_synthesize(self) -> Callable[ - [cloud_tts.StreamingSynthesizeRequest], - cloud_tts.StreamingSynthesizeResponse]: - r"""Return a callable for the streaming synthesize method over gRPC. - - Performs bidirectional streaming speech synthesis: - receive audio while sending text. - - Returns: - Callable[[~.StreamingSynthesizeRequest], - ~.StreamingSynthesizeResponse]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'streaming_synthesize' not in self._stubs: - self._stubs['streaming_synthesize'] = self.grpc_channel.stream_stream( - '/google.cloud.texttospeech.v1beta1.TextToSpeech/StreamingSynthesize', - request_serializer=cloud_tts.StreamingSynthesizeRequest.serialize, - response_deserializer=cloud_tts.StreamingSynthesizeResponse.deserialize, - ) - return self._stubs['streaming_synthesize'] - - def close(self): - self.grpc_channel.close() - - @property - def get_operation( - self, - ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: - r"""Return a callable for the get_operation method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "get_operation" not in self._stubs: - self._stubs["get_operation"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/GetOperation", - request_serializer=operations_pb2.GetOperationRequest.SerializeToString, - response_deserializer=operations_pb2.Operation.FromString, - ) - return self._stubs["get_operation"] - - @property - def list_operations( - self, - ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: - r"""Return a callable for the list_operations method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "list_operations" not in self._stubs: - self._stubs["list_operations"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/ListOperations", - request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, - response_deserializer=operations_pb2.ListOperationsResponse.FromString, - ) - return self._stubs["list_operations"] - - @property - def kind(self) -> str: - return "grpc" - - -__all__ = ( - 'TextToSpeechGrpcTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc_asyncio.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc_asyncio.py deleted file mode 100644 index be218265087f..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/grpc_asyncio.py +++ /dev/null @@ -1,402 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 inspect -import warnings -from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union - -from google.api_core import gapic_v1 -from google.api_core import grpc_helpers_async -from google.api_core import exceptions as core_exceptions -from google.api_core import retry_async as retries -from google.auth import credentials as ga_credentials # type: ignore -from google.auth.transport.grpc import SslCredentials # type: ignore - -import grpc # type: ignore -from grpc.experimental import aio # type: ignore - -from google.cloud.texttospeech_v1beta1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore -from .base import TextToSpeechTransport, DEFAULT_CLIENT_INFO -from .grpc import TextToSpeechGrpcTransport - - -class TextToSpeechGrpcAsyncIOTransport(TextToSpeechTransport): - """gRPC AsyncIO backend transport for TextToSpeech. - - Service that implements Google Cloud Text-to-Speech API. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends protocol buffers over the wire using gRPC (which is built on - top of HTTP/2); the ``grpcio`` package must be installed. - """ - - _grpc_channel: aio.Channel - _stubs: Dict[str, Callable] = {} - - @classmethod - def create_channel(cls, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - quota_project_id: Optional[str] = None, - **kwargs) -> aio.Channel: - """Create and return a gRPC AsyncIO channel object. - Args: - host (Optional[str]): The host for the channel to use. - credentials (Optional[~.Credentials]): The - authorization credentials to attach to requests. These - credentials identify this application to the service. If - none are specified, the client will attempt to ascertain - the credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - scopes (Optional[Sequence[str]]): A optional list of scopes needed for this - service. These are only used when credentials are not specified and - are passed to :func:`google.auth.default`. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - kwargs (Optional[dict]): Keyword arguments, which are passed to the - channel creation. - Returns: - aio.Channel: A gRPC AsyncIO channel object. - """ - - return grpc_helpers_async.create_channel( - host, - credentials=credentials, - credentials_file=credentials_file, - quota_project_id=quota_project_id, - default_scopes=cls.AUTH_SCOPES, - scopes=scopes, - default_host=cls.DEFAULT_HOST, - **kwargs - ) - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - channel: Optional[Union[aio.Channel, Callable[..., aio.Channel]]] = None, - api_mtls_endpoint: Optional[str] = None, - client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, - client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - This argument is ignored if a ``channel`` instance is provided. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is ignored if a ``channel`` instance is provided. - scopes (Optional[Sequence[str]]): A optional list of scopes needed for this - service. These are only used when credentials are not specified and - are passed to :func:`google.auth.default`. - channel (Optional[Union[aio.Channel, Callable[..., aio.Channel]]]): - A ``Channel`` instance through which to make calls, or a Callable - that constructs and returns one. If set to None, ``self.create_channel`` - is used to create the channel. If a Callable is given, it will be called - with the same arguments as used in ``self.create_channel``. - api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. - If provided, it overrides the ``host`` argument and tries to create - a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or application default SSL credentials. - client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): - Deprecated. A callback to provide client SSL certificate bytes and - private key bytes, both in PEM format. It is ignored if - ``api_mtls_endpoint`` is None. - ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for the grpc channel. It is ignored if a ``channel`` instance is provided. - client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): - A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure a mutual TLS channel. It is - ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - - Raises: - google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport - creation failed for any reason. - google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` - and ``credentials_file`` are passed. - """ - self._grpc_channel = None - self._ssl_channel_credentials = ssl_channel_credentials - self._stubs: Dict[str, Callable] = {} - - if api_mtls_endpoint: - warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) - if client_cert_source: - warnings.warn("client_cert_source is deprecated", DeprecationWarning) - - if isinstance(channel, aio.Channel): - # Ignore credentials if a channel was passed. - credentials = None - self._ignore_credentials = True - # If a channel was explicitly provided, set it. - self._grpc_channel = channel - self._ssl_channel_credentials = None - else: - if api_mtls_endpoint: - host = api_mtls_endpoint - - # Create SSL credentials with client_cert_source or application - # default SSL credentials. - if client_cert_source: - cert, key = client_cert_source() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - else: - self._ssl_channel_credentials = SslCredentials().ssl_credentials - - else: - if client_cert_source_for_mtls and not ssl_channel_credentials: - cert, key = client_cert_source_for_mtls() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - - # The base transport sets the host, credentials and scopes - super().__init__( - host=host, - credentials=credentials, - credentials_file=credentials_file, - scopes=scopes, - quota_project_id=quota_project_id, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - api_audience=api_audience, - ) - - if not self._grpc_channel: - # initialize with the provided callable or the default channel - channel_init = channel or type(self).create_channel - self._grpc_channel = channel_init( - self._host, - # use the credentials which are saved - credentials=self._credentials, - # Set ``credentials_file`` to ``None`` here as - # the credentials that we saved earlier should be used. - credentials_file=None, - scopes=self._scopes, - ssl_credentials=self._ssl_channel_credentials, - quota_project_id=quota_project_id, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - # Wrap messages. This must be done after self._grpc_channel exists - self._wrap_with_kind = "kind" in inspect.signature(gapic_v1.method_async.wrap_method).parameters - self._prep_wrapped_messages(client_info) - - @property - def grpc_channel(self) -> aio.Channel: - """Create the channel designed to connect to this service. - - This property caches on the instance; repeated calls return - the same channel. - """ - # Return the channel from cache. - return self._grpc_channel - - @property - def list_voices(self) -> Callable[ - [cloud_tts.ListVoicesRequest], - Awaitable[cloud_tts.ListVoicesResponse]]: - r"""Return a callable for the list voices method over gRPC. - - Returns a list of Voice supported for synthesis. - - Returns: - Callable[[~.ListVoicesRequest], - Awaitable[~.ListVoicesResponse]]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'list_voices' not in self._stubs: - self._stubs['list_voices'] = self.grpc_channel.unary_unary( - '/google.cloud.texttospeech.v1beta1.TextToSpeech/ListVoices', - request_serializer=cloud_tts.ListVoicesRequest.serialize, - response_deserializer=cloud_tts.ListVoicesResponse.deserialize, - ) - return self._stubs['list_voices'] - - @property - def synthesize_speech(self) -> Callable[ - [cloud_tts.SynthesizeSpeechRequest], - Awaitable[cloud_tts.SynthesizeSpeechResponse]]: - r"""Return a callable for the synthesize speech method over gRPC. - - Synthesizes speech synchronously: receive results - after all text input has been processed. - - Returns: - Callable[[~.SynthesizeSpeechRequest], - Awaitable[~.SynthesizeSpeechResponse]]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'synthesize_speech' not in self._stubs: - self._stubs['synthesize_speech'] = self.grpc_channel.unary_unary( - '/google.cloud.texttospeech.v1beta1.TextToSpeech/SynthesizeSpeech', - request_serializer=cloud_tts.SynthesizeSpeechRequest.serialize, - response_deserializer=cloud_tts.SynthesizeSpeechResponse.deserialize, - ) - return self._stubs['synthesize_speech'] - - @property - def streaming_synthesize(self) -> Callable[ - [cloud_tts.StreamingSynthesizeRequest], - Awaitable[cloud_tts.StreamingSynthesizeResponse]]: - r"""Return a callable for the streaming synthesize method over gRPC. - - Performs bidirectional streaming speech synthesis: - receive audio while sending text. - - Returns: - Callable[[~.StreamingSynthesizeRequest], - Awaitable[~.StreamingSynthesizeResponse]]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'streaming_synthesize' not in self._stubs: - self._stubs['streaming_synthesize'] = self.grpc_channel.stream_stream( - '/google.cloud.texttospeech.v1beta1.TextToSpeech/StreamingSynthesize', - request_serializer=cloud_tts.StreamingSynthesizeRequest.serialize, - response_deserializer=cloud_tts.StreamingSynthesizeResponse.deserialize, - ) - return self._stubs['streaming_synthesize'] - - def _prep_wrapped_messages(self, client_info): - """ Precompute the wrapped methods, overriding the base class method to use async wrappers.""" - self._wrapped_methods = { - self.list_voices: self._wrap_method( - self.list_voices, - default_timeout=None, - client_info=client_info, - ), - self.synthesize_speech: self._wrap_method( - self.synthesize_speech, - default_timeout=None, - client_info=client_info, - ), - self.streaming_synthesize: self._wrap_method( - self.streaming_synthesize, - default_timeout=None, - client_info=client_info, - ), - self.get_operation: self._wrap_method( - self.get_operation, - default_timeout=None, - client_info=client_info, - ), - self.list_operations: self._wrap_method( - self.list_operations, - default_timeout=None, - client_info=client_info, - ), - } - - def _wrap_method(self, func, *args, **kwargs): - if self._wrap_with_kind: # pragma: NO COVER - kwargs["kind"] = self.kind - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - - def close(self): - return self.grpc_channel.close() - - @property - def kind(self) -> str: - return "grpc_asyncio" - - @property - def get_operation( - self, - ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: - r"""Return a callable for the get_operation method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "get_operation" not in self._stubs: - self._stubs["get_operation"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/GetOperation", - request_serializer=operations_pb2.GetOperationRequest.SerializeToString, - response_deserializer=operations_pb2.Operation.FromString, - ) - return self._stubs["get_operation"] - - @property - def list_operations( - self, - ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: - r"""Return a callable for the list_operations method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "list_operations" not in self._stubs: - self._stubs["list_operations"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/ListOperations", - request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, - response_deserializer=operations_pb2.ListOperationsResponse.FromString, - ) - return self._stubs["list_operations"] - - -__all__ = ( - 'TextToSpeechGrpcAsyncIOTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py deleted file mode 100644 index 0545222676ab..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py +++ /dev/null @@ -1,599 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# - -from google.auth.transport.requests import AuthorizedSession # type: ignore -import json # type: ignore -from google.auth import credentials as ga_credentials # type: ignore -from google.api_core import exceptions as core_exceptions -from google.api_core import retry as retries -from google.api_core import rest_helpers -from google.api_core import rest_streaming -from google.api_core import gapic_v1 - -from google.protobuf import json_format - -from requests import __version__ as requests_version -import dataclasses -from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union -import warnings - - -from google.cloud.texttospeech_v1beta1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore - - -from .rest_base import _BaseTextToSpeechRestTransport -from .base import DEFAULT_CLIENT_INFO as BASE_DEFAULT_CLIENT_INFO - -try: - OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] -except AttributeError: # pragma: NO COVER - OptionalRetry = Union[retries.Retry, object, None] # type: ignore - - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, - grpc_version=None, - rest_version=f"requests@{requests_version}", -) - - -class TextToSpeechRestInterceptor: - """Interceptor for TextToSpeech. - - Interceptors are used to manipulate requests, request metadata, and responses - in arbitrary ways. - Example use cases include: - * Logging - * Verifying requests according to service or custom semantics - * Stripping extraneous information from responses - - These use cases and more can be enabled by injecting an - instance of a custom subclass when constructing the TextToSpeechRestTransport. - - .. code-block:: python - class MyCustomTextToSpeechInterceptor(TextToSpeechRestInterceptor): - def pre_list_voices(self, request, metadata): - logging.log(f"Received request: {request}") - return request, metadata - - def post_list_voices(self, response): - logging.log(f"Received response: {response}") - return response - - def pre_synthesize_speech(self, request, metadata): - logging.log(f"Received request: {request}") - return request, metadata - - def post_synthesize_speech(self, response): - logging.log(f"Received response: {response}") - return response - - transport = TextToSpeechRestTransport(interceptor=MyCustomTextToSpeechInterceptor()) - client = TextToSpeechClient(transport=transport) - - - """ - def pre_list_voices(self, request: cloud_tts.ListVoicesRequest, metadata: Sequence[Tuple[str, str]]) -> Tuple[cloud_tts.ListVoicesRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for list_voices - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeech server. - """ - return request, metadata - - def post_list_voices(self, response: cloud_tts.ListVoicesResponse) -> cloud_tts.ListVoicesResponse: - """Post-rpc interceptor for list_voices - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeech server but before - it is returned to user code. - """ - return response - - def pre_synthesize_speech(self, request: cloud_tts.SynthesizeSpeechRequest, metadata: Sequence[Tuple[str, str]]) -> Tuple[cloud_tts.SynthesizeSpeechRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for synthesize_speech - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeech server. - """ - return request, metadata - - def post_synthesize_speech(self, response: cloud_tts.SynthesizeSpeechResponse) -> cloud_tts.SynthesizeSpeechResponse: - """Post-rpc interceptor for synthesize_speech - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeech server but before - it is returned to user code. - """ - return response - - def pre_get_operation( - self, request: operations_pb2.GetOperationRequest, metadata: Sequence[Tuple[str, str]] - ) -> Tuple[operations_pb2.GetOperationRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for get_operation - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeech server. - """ - return request, metadata - - def post_get_operation( - self, response: operations_pb2.Operation - ) -> operations_pb2.Operation: - """Post-rpc interceptor for get_operation - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeech server but before - it is returned to user code. - """ - return response - - def pre_list_operations( - self, request: operations_pb2.ListOperationsRequest, metadata: Sequence[Tuple[str, str]] - ) -> Tuple[operations_pb2.ListOperationsRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for list_operations - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeech server. - """ - return request, metadata - - def post_list_operations( - self, response: operations_pb2.ListOperationsResponse - ) -> operations_pb2.ListOperationsResponse: - """Post-rpc interceptor for list_operations - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeech server but before - it is returned to user code. - """ - return response - - -@dataclasses.dataclass -class TextToSpeechRestStub: - _session: AuthorizedSession - _host: str - _interceptor: TextToSpeechRestInterceptor - - -class TextToSpeechRestTransport(_BaseTextToSpeechRestTransport): - """REST backend synchronous transport for TextToSpeech. - - Service that implements Google Cloud Text-to-Speech API. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends JSON representations of protocol buffers over HTTP/1.1 - """ - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - client_cert_source_for_mtls: Optional[Callable[[ - ], Tuple[bytes, bytes]]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - url_scheme: str = 'https', - interceptor: Optional[TextToSpeechRestInterceptor] = None, - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - - NOTE: This REST transport functionality is currently in a beta - state (preview). We welcome your feedback via a GitHub issue in - this library's repository. Thank you! - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is ignored if ``channel`` is provided. - scopes (Optional(Sequence[str])): A list of scopes. This argument is - ignored if ``channel`` is provided. - client_cert_source_for_mtls (Callable[[], Tuple[bytes, bytes]]): Client - certificate to configure mutual TLS HTTP channel. It is ignored - if ``channel`` is provided. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you are developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - url_scheme: the protocol scheme for the API endpoint. Normally - "https", but for testing or local servers, - "http" can be specified. - """ - # Run the base constructor - # TODO(yon-mg): resolve other ctor params i.e. scopes, quota, etc. - # TODO: When custom host (api_endpoint) is set, `scopes` must *also* be set on the - # credentials object - super().__init__( - host=host, - credentials=credentials, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - url_scheme=url_scheme, - api_audience=api_audience - ) - self._session = AuthorizedSession( - self._credentials, default_host=self.DEFAULT_HOST) - if client_cert_source_for_mtls: - self._session.configure_mtls_channel(client_cert_source_for_mtls) - self._interceptor = interceptor or TextToSpeechRestInterceptor() - self._prep_wrapped_messages(client_info) - - class _ListVoices(_BaseTextToSpeechRestTransport._BaseListVoices, TextToSpeechRestStub): - def __hash__(self): - return hash("TextToSpeechRestTransport.ListVoices") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - ) - return response - - def __call__(self, - request: cloud_tts.ListVoicesRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> cloud_tts.ListVoicesResponse: - r"""Call the list voices method over HTTP. - - Args: - request (~.cloud_tts.ListVoicesRequest): - The request object. The top-level message sent by the client for the - ``ListVoices`` method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - ~.cloud_tts.ListVoicesResponse: - The message returned to the client by the ``ListVoices`` - method. - - """ - - http_options = _BaseTextToSpeechRestTransport._BaseListVoices._get_http_options() - request, metadata = self._interceptor.pre_list_voices(request, metadata) - transcoded_request = _BaseTextToSpeechRestTransport._BaseListVoices._get_transcoded_request(http_options, request) - - # Jsonify the query params - query_params = _BaseTextToSpeechRestTransport._BaseListVoices._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechRestTransport._ListVoices._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - # Return the response - resp = cloud_tts.ListVoicesResponse() - pb_resp = cloud_tts.ListVoicesResponse.pb(resp) - - json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) - resp = self._interceptor.post_list_voices(resp) - return resp - - class _StreamingSynthesize(_BaseTextToSpeechRestTransport._BaseStreamingSynthesize, TextToSpeechRestStub): - def __hash__(self): - return hash("TextToSpeechRestTransport.StreamingSynthesize") - - def __call__(self, - request: cloud_tts.StreamingSynthesizeRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> rest_streaming.ResponseIterator: - raise NotImplementedError( - "Method StreamingSynthesize is not available over REST transport" - ) - class _SynthesizeSpeech(_BaseTextToSpeechRestTransport._BaseSynthesizeSpeech, TextToSpeechRestStub): - def __hash__(self): - return hash("TextToSpeechRestTransport.SynthesizeSpeech") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - data=body, - ) - return response - - def __call__(self, - request: cloud_tts.SynthesizeSpeechRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> cloud_tts.SynthesizeSpeechResponse: - r"""Call the synthesize speech method over HTTP. - - Args: - request (~.cloud_tts.SynthesizeSpeechRequest): - The request object. The top-level message sent by the client for the - ``SynthesizeSpeech`` method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - ~.cloud_tts.SynthesizeSpeechResponse: - The message returned to the client by the - ``SynthesizeSpeech`` method. - - """ - - http_options = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_http_options() - request, metadata = self._interceptor.pre_synthesize_speech(request, metadata) - transcoded_request = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_transcoded_request(http_options, request) - - body = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_request_body_json(transcoded_request) - - # Jsonify the query params - query_params = _BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechRestTransport._SynthesizeSpeech._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request, body) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - # Return the response - resp = cloud_tts.SynthesizeSpeechResponse() - pb_resp = cloud_tts.SynthesizeSpeechResponse.pb(resp) - - json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) - resp = self._interceptor.post_synthesize_speech(resp) - return resp - - @property - def list_voices(self) -> Callable[ - [cloud_tts.ListVoicesRequest], - cloud_tts.ListVoicesResponse]: - # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. - # In C++ this would require a dynamic_cast - return self._ListVoices(self._session, self._host, self._interceptor) # type: ignore - - @property - def streaming_synthesize(self) -> Callable[ - [cloud_tts.StreamingSynthesizeRequest], - cloud_tts.StreamingSynthesizeResponse]: - # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. - # In C++ this would require a dynamic_cast - return self._StreamingSynthesize(self._session, self._host, self._interceptor) # type: ignore - - @property - def synthesize_speech(self) -> Callable[ - [cloud_tts.SynthesizeSpeechRequest], - cloud_tts.SynthesizeSpeechResponse]: - # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. - # In C++ this would require a dynamic_cast - return self._SynthesizeSpeech(self._session, self._host, self._interceptor) # type: ignore - - @property - def get_operation(self): - return self._GetOperation(self._session, self._host, self._interceptor) # type: ignore - - class _GetOperation(_BaseTextToSpeechRestTransport._BaseGetOperation, TextToSpeechRestStub): - def __hash__(self): - return hash("TextToSpeechRestTransport.GetOperation") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - ) - return response - - def __call__(self, - request: operations_pb2.GetOperationRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> operations_pb2.Operation: - - r"""Call the get operation method over HTTP. - - Args: - request (operations_pb2.GetOperationRequest): - The request object for GetOperation method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - operations_pb2.Operation: Response from GetOperation method. - """ - - http_options = _BaseTextToSpeechRestTransport._BaseGetOperation._get_http_options() - request, metadata = self._interceptor.pre_get_operation(request, metadata) - transcoded_request = _BaseTextToSpeechRestTransport._BaseGetOperation._get_transcoded_request(http_options, request) - - # Jsonify the query params - query_params = _BaseTextToSpeechRestTransport._BaseGetOperation._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechRestTransport._GetOperation._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - content = response.content.decode("utf-8") - resp = operations_pb2.Operation() - resp = json_format.Parse(content, resp) - resp = self._interceptor.post_get_operation(resp) - return resp - - @property - def list_operations(self): - return self._ListOperations(self._session, self._host, self._interceptor) # type: ignore - - class _ListOperations(_BaseTextToSpeechRestTransport._BaseListOperations, TextToSpeechRestStub): - def __hash__(self): - return hash("TextToSpeechRestTransport.ListOperations") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - ) - return response - - def __call__(self, - request: operations_pb2.ListOperationsRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> operations_pb2.ListOperationsResponse: - - r"""Call the list operations method over HTTP. - - Args: - request (operations_pb2.ListOperationsRequest): - The request object for ListOperations method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - operations_pb2.ListOperationsResponse: Response from ListOperations method. - """ - - http_options = _BaseTextToSpeechRestTransport._BaseListOperations._get_http_options() - request, metadata = self._interceptor.pre_list_operations(request, metadata) - transcoded_request = _BaseTextToSpeechRestTransport._BaseListOperations._get_transcoded_request(http_options, request) - - # Jsonify the query params - query_params = _BaseTextToSpeechRestTransport._BaseListOperations._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechRestTransport._ListOperations._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - content = response.content.decode("utf-8") - resp = operations_pb2.ListOperationsResponse() - resp = json_format.Parse(content, resp) - resp = self._interceptor.post_list_operations(resp) - return resp - - @property - def kind(self) -> str: - return "rest" - - def close(self): - self._session.close() - - -__all__=( - 'TextToSpeechRestTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest_base.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest_base.py deleted file mode 100644 index f1752d008c12..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest_base.py +++ /dev/null @@ -1,220 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 json # type: ignore -from google.api_core import path_template -from google.api_core import gapic_v1 - -from google.protobuf import json_format -from .base import TextToSpeechTransport, DEFAULT_CLIENT_INFO - -import re -from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union - - -from google.cloud.texttospeech_v1beta1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore - - -class _BaseTextToSpeechRestTransport(TextToSpeechTransport): - """Base REST backend transport for TextToSpeech. - - Note: This class is not meant to be used directly. Use its sync and - async sub-classes instead. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends JSON representations of protocol buffers over HTTP/1.1 - """ - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[Any] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - url_scheme: str = 'https', - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[Any]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you are developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - url_scheme: the protocol scheme for the API endpoint. Normally - "https", but for testing or local servers, - "http" can be specified. - """ - # Run the base constructor - maybe_url_match = re.match("^(?Phttp(?:s)?://)?(?P.*)$", host) - if maybe_url_match is None: - raise ValueError(f"Unexpected hostname structure: {host}") # pragma: NO COVER - - url_match_items = maybe_url_match.groupdict() - - host = f"{url_scheme}://{host}" if not url_match_items["scheme"] else host - - super().__init__( - host=host, - credentials=credentials, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - api_audience=api_audience - ) - - class _BaseListVoices: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'get', - 'uri': '/v1beta1/voices', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - pb_request = cloud_tts.ListVoicesRequest.pb(request) - transcoded_request = path_template.transcode(http_options, pb_request) - return transcoded_request - - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json_format.MessageToJson( - transcoded_request['query_params'], - use_integers_for_enums=False, - )) - - return query_params - - class _BaseStreamingSynthesize: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - class _BaseSynthesizeSpeech: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = { - } - - @classmethod - def _get_unset_required_fields(cls, message_dict): - return {k: v for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() if k not in message_dict} - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'post', - 'uri': '/v1beta1/text:synthesize', - 'body': '*', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - pb_request = cloud_tts.SynthesizeSpeechRequest.pb(request) - transcoded_request = path_template.transcode(http_options, pb_request) - return transcoded_request - - @staticmethod - def _get_request_body_json(transcoded_request): - # Jsonify the request body - - body = json_format.MessageToJson( - transcoded_request['body'], - use_integers_for_enums=False - ) - return body - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json_format.MessageToJson( - transcoded_request['query_params'], - use_integers_for_enums=False, - )) - query_params.update(_BaseTextToSpeechRestTransport._BaseSynthesizeSpeech._get_unset_required_fields(query_params)) - - return query_params - - class _BaseGetOperation: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'get', - 'uri': '/v1beta1/{name=projects/*/locations/*/operations/*}', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - request_kwargs = json_format.MessageToDict(request) - transcoded_request = path_template.transcode( - http_options, **request_kwargs) - return transcoded_request - - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json.dumps(transcoded_request['query_params'])) - return query_params - - class _BaseListOperations: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'get', - 'uri': '/v1beta1/{name=projects/*/locations/*}/operations', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - request_kwargs = json_format.MessageToDict(request) - transcoded_request = path_template.transcode( - http_options, **request_kwargs) - return transcoded_request - - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json.dumps(transcoded_request['query_params'])) - return query_params - - -__all__=( - '_BaseTextToSpeechRestTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/__init__.py deleted file mode 100644 index 9a4b4f08eb08..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from .client import TextToSpeechLongAudioSynthesizeClient -from .async_client import TextToSpeechLongAudioSynthesizeAsyncClient - -__all__ = ( - 'TextToSpeechLongAudioSynthesizeClient', - 'TextToSpeechLongAudioSynthesizeAsyncClient', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/async_client.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/async_client.py deleted file mode 100644 index ec142430a338..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/async_client.py +++ /dev/null @@ -1,454 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from collections import OrderedDict -import re -from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union - -from google.cloud.texttospeech_v1beta1 import gapic_version as package_version - -from google.api_core.client_options import ClientOptions -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import retry_async as retries -from google.auth import credentials as ga_credentials # type: ignore -from google.oauth2 import service_account # type: ignore - - -try: - OptionalRetry = Union[retries.AsyncRetry, gapic_v1.method._MethodDefault, None] -except AttributeError: # pragma: NO COVER - OptionalRetry = Union[retries.AsyncRetry, object, None] # type: ignore - -from google.api_core import operation # type: ignore -from google.api_core import operation_async # type: ignore -from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore -from .transports.base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO -from .transports.grpc_asyncio import TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport -from .client import TextToSpeechLongAudioSynthesizeClient - - -class TextToSpeechLongAudioSynthesizeAsyncClient: - """Service that implements Google Cloud Text-to-Speech API.""" - - _client: TextToSpeechLongAudioSynthesizeClient - - # Copy defaults from the synchronous client for use here. - # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. - DEFAULT_ENDPOINT = TextToSpeechLongAudioSynthesizeClient.DEFAULT_ENDPOINT - DEFAULT_MTLS_ENDPOINT = TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT - _DEFAULT_ENDPOINT_TEMPLATE = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE - _DEFAULT_UNIVERSE = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - - model_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.model_path) - parse_model_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_model_path) - common_billing_account_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_billing_account_path) - parse_common_billing_account_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_billing_account_path) - common_folder_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_folder_path) - parse_common_folder_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_folder_path) - common_organization_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_organization_path) - parse_common_organization_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_organization_path) - common_project_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_project_path) - parse_common_project_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_project_path) - common_location_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.common_location_path) - parse_common_location_path = staticmethod(TextToSpeechLongAudioSynthesizeClient.parse_common_location_path) - - @classmethod - def from_service_account_info(cls, info: dict, *args, **kwargs): - """Creates an instance of this client using the provided credentials - info. - - Args: - info (dict): The service account private key info. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechLongAudioSynthesizeAsyncClient: The constructed client. - """ - return TextToSpeechLongAudioSynthesizeClient.from_service_account_info.__func__(TextToSpeechLongAudioSynthesizeAsyncClient, info, *args, **kwargs) # type: ignore - - @classmethod - def from_service_account_file(cls, filename: str, *args, **kwargs): - """Creates an instance of this client using the provided credentials - file. - - Args: - filename (str): The path to the service account private key json - file. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechLongAudioSynthesizeAsyncClient: The constructed client. - """ - return TextToSpeechLongAudioSynthesizeClient.from_service_account_file.__func__(TextToSpeechLongAudioSynthesizeAsyncClient, filename, *args, **kwargs) # type: ignore - - from_service_account_json = from_service_account_file - - @classmethod - def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[ClientOptions] = None): - """Return the API endpoint and client cert source for mutual TLS. - - The client cert source is determined in the following order: - (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the - client cert source is None. - (2) if `client_options.client_cert_source` is provided, use the provided one; if the - default client cert source exists, use the default one; otherwise the client cert - source is None. - - The API endpoint is determined in the following order: - (1) if `client_options.api_endpoint` if provided, use the provided one. - (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the - default mTLS endpoint; if the environment variable is "never", use the default API - endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise - use the default API endpoint. - - More details can be found at https://google.aip.dev/auth/4114. - - Args: - client_options (google.api_core.client_options.ClientOptions): Custom options for the - client. Only the `api_endpoint` and `client_cert_source` properties may be used - in this method. - - Returns: - Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the - client cert source to use. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If any errors happen. - """ - return TextToSpeechLongAudioSynthesizeClient.get_mtls_endpoint_and_cert_source(client_options) # type: ignore - - @property - def transport(self) -> TextToSpeechLongAudioSynthesizeTransport: - """Returns the transport used by the client instance. - - Returns: - TextToSpeechLongAudioSynthesizeTransport: The transport used by the client instance. - """ - return self._client.transport - - @property - def api_endpoint(self): - """Return the API endpoint used by the client instance. - - Returns: - str: The API endpoint used by the client instance. - """ - return self._client._api_endpoint - - @property - def universe_domain(self) -> str: - """Return the universe domain used by the client instance. - - Returns: - str: The universe domain used - by the client instance. - """ - return self._client._universe_domain - - get_transport_class = TextToSpeechLongAudioSynthesizeClient.get_transport_class - - def __init__(self, *, - credentials: Optional[ga_credentials.Credentials] = None, - transport: Optional[Union[str, TextToSpeechLongAudioSynthesizeTransport, Callable[..., TextToSpeechLongAudioSynthesizeTransport]]] = "grpc_asyncio", - client_options: Optional[ClientOptions] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - ) -> None: - """Instantiates the text to speech long audio synthesize async client. - - Args: - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - transport (Optional[Union[str,TextToSpeechLongAudioSynthesizeTransport,Callable[..., TextToSpeechLongAudioSynthesizeTransport]]]): - The transport to use, or a Callable that constructs and returns a new transport to use. - If a Callable is given, it will be called with the same set of initialization - arguments as used in the TextToSpeechLongAudioSynthesizeTransport constructor. - If set to None, a transport is chosen automatically. - NOTE: "rest" transport functionality is currently in a - beta state (preview). We welcome your feedback via an - issue in this library's source repository. - client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): - Custom options for the client. - - 1. The ``api_endpoint`` property can be used to override the - default endpoint provided by the client when ``transport`` is - not explicitly provided. Only if this property is not set and - ``transport`` was not explicitly provided, the endpoint is - determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment - variable, which have one of the following values: - "always" (always use the default mTLS endpoint), "never" (always - use the default regular endpoint) and "auto" (auto-switch to the - default mTLS endpoint if client certificate is present; this is - the default value). - - 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable - is "true", then the ``client_cert_source`` property can be used - to provide a client certificate for mTLS transport. If - not provided, the default SSL client certificate will be used if - present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not - set, no client certificate will be used. - - 3. The ``universe_domain`` property can be used to override the - default "googleapis.com" universe. Note that ``api_endpoint`` - property still takes precedence; and ``universe_domain`` is - currently not supported for mTLS. - - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - - Raises: - google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport - creation failed for any reason. - """ - self._client = TextToSpeechLongAudioSynthesizeClient( - credentials=credentials, - transport=transport, - client_options=client_options, - client_info=client_info, - - ) - - async def synthesize_long_audio(self, - request: Optional[Union[cloud_tts_lrs.SynthesizeLongAudioRequest, dict]] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operation_async.AsyncOperation: - r"""Synthesizes long form text asynchronously. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1beta1 - - async def sample_synthesize_long_audio(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeAsyncClient() - - # Initialize request argument(s) - input = texttospeech_v1beta1.SynthesisInput() - input.text = "text_value" - - audio_config = texttospeech_v1beta1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - voice = texttospeech_v1beta1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - request = texttospeech_v1beta1.SynthesizeLongAudioRequest( - input=input, - audio_config=audio_config, - output_gcs_uri="output_gcs_uri_value", - voice=voice, - ) - - # Make the request - operation = client.synthesize_long_audio(request=request) - - print("Waiting for operation to complete...") - - response = (await operation).result() - - # Handle the response - print(response) - - Args: - request (Optional[Union[google.cloud.texttospeech_v1beta1.types.SynthesizeLongAudioRequest, dict]]): - The request object. The top-level message sent by the client for the - ``SynthesizeLongAudio`` method. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - google.api_core.operation_async.AsyncOperation: - An object representing a long-running operation. - - The result type for the operation will be - :class:`google.cloud.texttospeech_v1beta1.types.SynthesizeLongAudioResponse` - The message returned to the client by the - SynthesizeLongAudio method. - - """ - # Create or coerce a protobuf request object. - # - Use the request object if provided (there's no risk of modifying the input as - # there are no flattened fields), or create one. - if not isinstance(request, cloud_tts_lrs.SynthesizeLongAudioRequest): - request = cloud_tts_lrs.SynthesizeLongAudioRequest(request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._client._transport._wrapped_methods[self._client._transport.synthesize_long_audio] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata(( - ("parent", request.parent), - )), - ) - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Wrap the response in an operation future. - response = operation_async.from_gapic( - response, - self._client._transport.operations_client, - cloud_tts_lrs.SynthesizeLongAudioResponse, - metadata_type=cloud_tts_lrs.SynthesizeLongAudioMetadata, - ) - - # Done; return the response. - return response - - async def list_operations( - self, - request: Optional[operations_pb2.ListOperationsRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.ListOperationsResponse: - r"""Lists operations that match the specified filter in the request. - - Args: - request (:class:`~.operations_pb2.ListOperationsRequest`): - The request object. Request message for - `ListOperations` method. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.ListOperationsResponse: - Response message for ``ListOperations`` method. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.ListOperationsRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self.transport._wrapped_methods[self._client._transport.list_operations] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - async def get_operation( - self, - request: Optional[operations_pb2.GetOperationRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.Operation: - r"""Gets the latest state of a long-running operation. - - Args: - request (:class:`~.operations_pb2.GetOperationRequest`): - The request object. Request message for - `GetOperation` method. - retry (google.api_core.retry_async.AsyncRetry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.Operation: - An ``Operation`` object. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.GetOperationRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self.transport._wrapped_methods[self._client._transport.get_operation] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._client._validate_universe_domain() - - # Send the request. - response = await rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - async def __aenter__(self) -> "TextToSpeechLongAudioSynthesizeAsyncClient": - return self - - async def __aexit__(self, exc_type, exc, tb): - await self.transport.close() - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) - - -__all__ = ( - "TextToSpeechLongAudioSynthesizeAsyncClient", -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/client.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/client.py deleted file mode 100644 index c3877f090f4e..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/client.py +++ /dev/null @@ -1,813 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from collections import OrderedDict -import os -import re -from typing import Dict, Callable, Mapping, MutableMapping, MutableSequence, Optional, Sequence, Tuple, Type, Union, cast -import warnings - -from google.cloud.texttospeech_v1beta1 import gapic_version as package_version - -from google.api_core import client_options as client_options_lib -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import retry as retries -from google.auth import credentials as ga_credentials # type: ignore -from google.auth.transport import mtls # type: ignore -from google.auth.transport.grpc import SslCredentials # type: ignore -from google.auth.exceptions import MutualTLSChannelError # type: ignore -from google.oauth2 import service_account # type: ignore - -try: - OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] -except AttributeError: # pragma: NO COVER - OptionalRetry = Union[retries.Retry, object, None] # type: ignore - -from google.api_core import operation # type: ignore -from google.api_core import operation_async # type: ignore -from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore -from .transports.base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO -from .transports.grpc import TextToSpeechLongAudioSynthesizeGrpcTransport -from .transports.grpc_asyncio import TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport -from .transports.rest import TextToSpeechLongAudioSynthesizeRestTransport - - -class TextToSpeechLongAudioSynthesizeClientMeta(type): - """Metaclass for the TextToSpeechLongAudioSynthesize client. - - This provides class-level methods for building and retrieving - support objects (e.g. transport) without polluting the client instance - objects. - """ - _transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechLongAudioSynthesizeTransport]] - _transport_registry["grpc"] = TextToSpeechLongAudioSynthesizeGrpcTransport - _transport_registry["grpc_asyncio"] = TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport - _transport_registry["rest"] = TextToSpeechLongAudioSynthesizeRestTransport - - def get_transport_class(cls, - label: Optional[str] = None, - ) -> Type[TextToSpeechLongAudioSynthesizeTransport]: - """Returns an appropriate transport class. - - Args: - label: The name of the desired transport. If none is - provided, then the first transport in the registry is used. - - Returns: - The transport class to use. - """ - # If a specific transport is requested, return that one. - if label: - return cls._transport_registry[label] - - # No transport is requested; return the default (that is, the first one - # in the dictionary). - return next(iter(cls._transport_registry.values())) - - -class TextToSpeechLongAudioSynthesizeClient(metaclass=TextToSpeechLongAudioSynthesizeClientMeta): - """Service that implements Google Cloud Text-to-Speech API.""" - - @staticmethod - def _get_default_mtls_endpoint(api_endpoint): - """Converts api endpoint to mTLS endpoint. - - Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to - "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively. - Args: - api_endpoint (Optional[str]): the api endpoint to convert. - Returns: - str: converted mTLS api endpoint. - """ - if not api_endpoint: - return api_endpoint - - mtls_endpoint_re = re.compile( - r"(?P[^.]+)(?P\.mtls)?(?P\.sandbox)?(?P\.googleapis\.com)?" - ) - - m = mtls_endpoint_re.match(api_endpoint) - name, mtls, sandbox, googledomain = m.groups() - if mtls or not googledomain: - return api_endpoint - - if sandbox: - return api_endpoint.replace( - "sandbox.googleapis.com", "mtls.sandbox.googleapis.com" - ) - - return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com") - - # Note: DEFAULT_ENDPOINT is deprecated. Use _DEFAULT_ENDPOINT_TEMPLATE instead. - DEFAULT_ENDPOINT = "texttospeech.googleapis.com" - DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore - DEFAULT_ENDPOINT - ) - - _DEFAULT_ENDPOINT_TEMPLATE = "texttospeech.{UNIVERSE_DOMAIN}" - _DEFAULT_UNIVERSE = "googleapis.com" - - @classmethod - def from_service_account_info(cls, info: dict, *args, **kwargs): - """Creates an instance of this client using the provided credentials - info. - - Args: - info (dict): The service account private key info. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechLongAudioSynthesizeClient: The constructed client. - """ - credentials = service_account.Credentials.from_service_account_info(info) - kwargs["credentials"] = credentials - return cls(*args, **kwargs) - - @classmethod - def from_service_account_file(cls, filename: str, *args, **kwargs): - """Creates an instance of this client using the provided credentials - file. - - Args: - filename (str): The path to the service account private key json - file. - args: Additional arguments to pass to the constructor. - kwargs: Additional arguments to pass to the constructor. - - Returns: - TextToSpeechLongAudioSynthesizeClient: The constructed client. - """ - credentials = service_account.Credentials.from_service_account_file( - filename) - kwargs["credentials"] = credentials - return cls(*args, **kwargs) - - from_service_account_json = from_service_account_file - - @property - def transport(self) -> TextToSpeechLongAudioSynthesizeTransport: - """Returns the transport used by the client instance. - - Returns: - TextToSpeechLongAudioSynthesizeTransport: The transport used by the client - instance. - """ - return self._transport - - @staticmethod - def model_path(project: str,location: str,model: str,) -> str: - """Returns a fully-qualified model string.""" - return "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) - - @staticmethod - def parse_model_path(path: str) -> Dict[str,str]: - """Parses a model path into its component segments.""" - m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)/models/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_billing_account_path(billing_account: str, ) -> str: - """Returns a fully-qualified billing_account string.""" - return "billingAccounts/{billing_account}".format(billing_account=billing_account, ) - - @staticmethod - def parse_common_billing_account_path(path: str) -> Dict[str,str]: - """Parse a billing_account path into its component segments.""" - m = re.match(r"^billingAccounts/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_folder_path(folder: str, ) -> str: - """Returns a fully-qualified folder string.""" - return "folders/{folder}".format(folder=folder, ) - - @staticmethod - def parse_common_folder_path(path: str) -> Dict[str,str]: - """Parse a folder path into its component segments.""" - m = re.match(r"^folders/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_organization_path(organization: str, ) -> str: - """Returns a fully-qualified organization string.""" - return "organizations/{organization}".format(organization=organization, ) - - @staticmethod - def parse_common_organization_path(path: str) -> Dict[str,str]: - """Parse a organization path into its component segments.""" - m = re.match(r"^organizations/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_project_path(project: str, ) -> str: - """Returns a fully-qualified project string.""" - return "projects/{project}".format(project=project, ) - - @staticmethod - def parse_common_project_path(path: str) -> Dict[str,str]: - """Parse a project path into its component segments.""" - m = re.match(r"^projects/(?P.+?)$", path) - return m.groupdict() if m else {} - - @staticmethod - def common_location_path(project: str, location: str, ) -> str: - """Returns a fully-qualified location string.""" - return "projects/{project}/locations/{location}".format(project=project, location=location, ) - - @staticmethod - def parse_common_location_path(path: str) -> Dict[str,str]: - """Parse a location path into its component segments.""" - m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path) - return m.groupdict() if m else {} - - @classmethod - def get_mtls_endpoint_and_cert_source(cls, client_options: Optional[client_options_lib.ClientOptions] = None): - """Deprecated. Return the API endpoint and client cert source for mutual TLS. - - The client cert source is determined in the following order: - (1) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is not "true", the - client cert source is None. - (2) if `client_options.client_cert_source` is provided, use the provided one; if the - default client cert source exists, use the default one; otherwise the client cert - source is None. - - The API endpoint is determined in the following order: - (1) if `client_options.api_endpoint` if provided, use the provided one. - (2) if `GOOGLE_API_USE_CLIENT_CERTIFICATE` environment variable is "always", use the - default mTLS endpoint; if the environment variable is "never", use the default API - endpoint; otherwise if client cert source exists, use the default mTLS endpoint, otherwise - use the default API endpoint. - - More details can be found at https://google.aip.dev/auth/4114. - - Args: - client_options (google.api_core.client_options.ClientOptions): Custom options for the - client. Only the `api_endpoint` and `client_cert_source` properties may be used - in this method. - - Returns: - Tuple[str, Callable[[], Tuple[bytes, bytes]]]: returns the API endpoint and the - client cert source to use. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If any errors happen. - """ - - warnings.warn("get_mtls_endpoint_and_cert_source is deprecated. Use the api_endpoint property instead.", - DeprecationWarning) - if client_options is None: - client_options = client_options_lib.ClientOptions() - use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false") - use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto") - if use_client_cert not in ("true", "false"): - raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") - if use_mtls_endpoint not in ("auto", "never", "always"): - raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") - - # Figure out the client cert source to use. - client_cert_source = None - if use_client_cert == "true": - if client_options.client_cert_source: - client_cert_source = client_options.client_cert_source - elif mtls.has_default_client_cert_source(): - client_cert_source = mtls.default_client_cert_source() - - # Figure out which api endpoint to use. - if client_options.api_endpoint is not None: - api_endpoint = client_options.api_endpoint - elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): - api_endpoint = cls.DEFAULT_MTLS_ENDPOINT - else: - api_endpoint = cls.DEFAULT_ENDPOINT - - return api_endpoint, client_cert_source - - @staticmethod - def _read_environment_variables(): - """Returns the environment variables used by the client. - - Returns: - Tuple[bool, str, str]: returns the GOOGLE_API_USE_CLIENT_CERTIFICATE, - GOOGLE_API_USE_MTLS_ENDPOINT, and GOOGLE_CLOUD_UNIVERSE_DOMAIN environment variables. - - Raises: - ValueError: If GOOGLE_API_USE_CLIENT_CERTIFICATE is not - any of ["true", "false"]. - google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT - is not any of ["auto", "never", "always"]. - """ - use_client_cert = os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false").lower() - use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower() - universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN") - if use_client_cert not in ("true", "false"): - raise ValueError("Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`") - if use_mtls_endpoint not in ("auto", "never", "always"): - raise MutualTLSChannelError("Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`") - return use_client_cert == "true", use_mtls_endpoint, universe_domain_env - - @staticmethod - def _get_client_cert_source(provided_cert_source, use_cert_flag): - """Return the client cert source to be used by the client. - - Args: - provided_cert_source (bytes): The client certificate source provided. - use_cert_flag (bool): A flag indicating whether to use the client certificate. - - Returns: - bytes or None: The client cert source to be used by the client. - """ - client_cert_source = None - if use_cert_flag: - if provided_cert_source: - client_cert_source = provided_cert_source - elif mtls.has_default_client_cert_source(): - client_cert_source = mtls.default_client_cert_source() - return client_cert_source - - @staticmethod - def _get_api_endpoint(api_override, client_cert_source, universe_domain, use_mtls_endpoint): - """Return the API endpoint used by the client. - - Args: - api_override (str): The API endpoint override. If specified, this is always - the return value of this function and the other arguments are not used. - client_cert_source (bytes): The client certificate source used by the client. - universe_domain (str): The universe domain used by the client. - use_mtls_endpoint (str): How to use the mTLS endpoint, which depends also on the other parameters. - Possible values are "always", "auto", or "never". - - Returns: - str: The API endpoint to be used by the client. - """ - if api_override is not None: - api_endpoint = api_override - elif use_mtls_endpoint == "always" or (use_mtls_endpoint == "auto" and client_cert_source): - _default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - if universe_domain != _default_universe: - raise MutualTLSChannelError(f"mTLS is not supported in any universe other than {_default_universe}.") - api_endpoint = TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT - else: - api_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=universe_domain) - return api_endpoint - - @staticmethod - def _get_universe_domain(client_universe_domain: Optional[str], universe_domain_env: Optional[str]) -> str: - """Return the universe domain used by the client. - - Args: - client_universe_domain (Optional[str]): The universe domain configured via the client options. - universe_domain_env (Optional[str]): The universe domain configured via the "GOOGLE_CLOUD_UNIVERSE_DOMAIN" environment variable. - - Returns: - str: The universe domain to be used by the client. - - Raises: - ValueError: If the universe domain is an empty string. - """ - universe_domain = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - if client_universe_domain is not None: - universe_domain = client_universe_domain - elif universe_domain_env is not None: - universe_domain = universe_domain_env - if len(universe_domain.strip()) == 0: - raise ValueError("Universe Domain cannot be an empty string.") - return universe_domain - - @staticmethod - def _compare_universes(client_universe: str, - credentials: ga_credentials.Credentials) -> bool: - """Returns True iff the universe domains used by the client and credentials match. - - Args: - client_universe (str): The universe domain configured via the client options. - credentials (ga_credentials.Credentials): The credentials being used in the client. - - Returns: - bool: True iff client_universe matches the universe in credentials. - - Raises: - ValueError: when client_universe does not match the universe in credentials. - """ - - default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - credentials_universe = getattr(credentials, "universe_domain", default_universe) - - if client_universe != credentials_universe: - raise ValueError("The configured universe domain " - f"({client_universe}) does not match the universe domain " - f"found in the credentials ({credentials_universe}). " - "If you haven't configured the universe domain explicitly, " - f"`{default_universe}` is the default.") - return True - - def _validate_universe_domain(self): - """Validates client's and credentials' universe domains are consistent. - - Returns: - bool: True iff the configured universe domain is valid. - - Raises: - ValueError: If the configured universe domain is not valid. - """ - self._is_universe_domain_valid = (self._is_universe_domain_valid or - TextToSpeechLongAudioSynthesizeClient._compare_universes(self.universe_domain, self.transport._credentials)) - return self._is_universe_domain_valid - - @property - def api_endpoint(self): - """Return the API endpoint used by the client instance. - - Returns: - str: The API endpoint used by the client instance. - """ - return self._api_endpoint - - @property - def universe_domain(self) -> str: - """Return the universe domain used by the client instance. - - Returns: - str: The universe domain used by the client instance. - """ - return self._universe_domain - - def __init__(self, *, - credentials: Optional[ga_credentials.Credentials] = None, - transport: Optional[Union[str, TextToSpeechLongAudioSynthesizeTransport, Callable[..., TextToSpeechLongAudioSynthesizeTransport]]] = None, - client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - ) -> None: - """Instantiates the text to speech long audio synthesize client. - - Args: - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - transport (Optional[Union[str,TextToSpeechLongAudioSynthesizeTransport,Callable[..., TextToSpeechLongAudioSynthesizeTransport]]]): - The transport to use, or a Callable that constructs and returns a new transport. - If a Callable is given, it will be called with the same set of initialization - arguments as used in the TextToSpeechLongAudioSynthesizeTransport constructor. - If set to None, a transport is chosen automatically. - NOTE: "rest" transport functionality is currently in a - beta state (preview). We welcome your feedback via an - issue in this library's source repository. - client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): - Custom options for the client. - - 1. The ``api_endpoint`` property can be used to override the - default endpoint provided by the client when ``transport`` is - not explicitly provided. Only if this property is not set and - ``transport`` was not explicitly provided, the endpoint is - determined by the GOOGLE_API_USE_MTLS_ENDPOINT environment - variable, which have one of the following values: - "always" (always use the default mTLS endpoint), "never" (always - use the default regular endpoint) and "auto" (auto-switch to the - default mTLS endpoint if client certificate is present; this is - the default value). - - 2. If the GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable - is "true", then the ``client_cert_source`` property can be used - to provide a client certificate for mTLS transport. If - not provided, the default SSL client certificate will be used if - present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not - set, no client certificate will be used. - - 3. The ``universe_domain`` property can be used to override the - default "googleapis.com" universe. Note that the ``api_endpoint`` - property still takes precedence; and ``universe_domain`` is - currently not supported for mTLS. - - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport - creation failed for any reason. - """ - self._client_options = client_options - if isinstance(self._client_options, dict): - self._client_options = client_options_lib.from_dict(self._client_options) - if self._client_options is None: - self._client_options = client_options_lib.ClientOptions() - self._client_options = cast(client_options_lib.ClientOptions, self._client_options) - - universe_domain_opt = getattr(self._client_options, 'universe_domain', None) - - self._use_client_cert, self._use_mtls_endpoint, self._universe_domain_env = TextToSpeechLongAudioSynthesizeClient._read_environment_variables() - self._client_cert_source = TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(self._client_options.client_cert_source, self._use_client_cert) - self._universe_domain = TextToSpeechLongAudioSynthesizeClient._get_universe_domain(universe_domain_opt, self._universe_domain_env) - self._api_endpoint = None # updated below, depending on `transport` - - # Initialize the universe domain validation. - self._is_universe_domain_valid = False - - api_key_value = getattr(self._client_options, "api_key", None) - if api_key_value and credentials: - raise ValueError("client_options.api_key and credentials are mutually exclusive") - - # Save or instantiate the transport. - # Ordinarily, we provide the transport, but allowing a custom transport - # instance provides an extensibility point for unusual situations. - transport_provided = isinstance(transport, TextToSpeechLongAudioSynthesizeTransport) - if transport_provided: - # transport is a TextToSpeechLongAudioSynthesizeTransport instance. - if credentials or self._client_options.credentials_file or api_key_value: - raise ValueError("When providing a transport instance, " - "provide its credentials directly.") - if self._client_options.scopes: - raise ValueError( - "When providing a transport instance, provide its scopes " - "directly." - ) - self._transport = cast(TextToSpeechLongAudioSynthesizeTransport, transport) - self._api_endpoint = self._transport.host - - self._api_endpoint = (self._api_endpoint or - TextToSpeechLongAudioSynthesizeClient._get_api_endpoint( - self._client_options.api_endpoint, - self._client_cert_source, - self._universe_domain, - self._use_mtls_endpoint)) - - if not transport_provided: - import google.auth._default # type: ignore - - if api_key_value and hasattr(google.auth._default, "get_api_key_credentials"): - credentials = google.auth._default.get_api_key_credentials(api_key_value) - - transport_init: Union[Type[TextToSpeechLongAudioSynthesizeTransport], Callable[..., TextToSpeechLongAudioSynthesizeTransport]] = ( - TextToSpeechLongAudioSynthesizeClient.get_transport_class(transport) - if isinstance(transport, str) or transport is None - else cast(Callable[..., TextToSpeechLongAudioSynthesizeTransport], transport) - ) - # initialize with the provided callable or the passed in class - self._transport = transport_init( - credentials=credentials, - credentials_file=self._client_options.credentials_file, - host=self._api_endpoint, - scopes=self._client_options.scopes, - client_cert_source_for_mtls=self._client_cert_source, - quota_project_id=self._client_options.quota_project_id, - client_info=client_info, - always_use_jwt_access=True, - api_audience=self._client_options.api_audience, - ) - - def synthesize_long_audio(self, - request: Optional[Union[cloud_tts_lrs.SynthesizeLongAudioRequest, dict]] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operation.Operation: - r"""Synthesizes long form text asynchronously. - - .. code-block:: python - - # This snippet has been automatically generated and should be regarded as a - # code template only. - # It will require modifications to work: - # - It may require correct/in-range values for request initialization. - # - It may require specifying regional endpoints when creating the service - # client as shown in: - # https://googleapis.dev/python/google-api-core/latest/client_options.html - from google.cloud import texttospeech_v1beta1 - - def sample_synthesize_long_audio(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeClient() - - # Initialize request argument(s) - input = texttospeech_v1beta1.SynthesisInput() - input.text = "text_value" - - audio_config = texttospeech_v1beta1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - voice = texttospeech_v1beta1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - request = texttospeech_v1beta1.SynthesizeLongAudioRequest( - input=input, - audio_config=audio_config, - output_gcs_uri="output_gcs_uri_value", - voice=voice, - ) - - # Make the request - operation = client.synthesize_long_audio(request=request) - - print("Waiting for operation to complete...") - - response = operation.result() - - # Handle the response - print(response) - - Args: - request (Union[google.cloud.texttospeech_v1beta1.types.SynthesizeLongAudioRequest, dict]): - The request object. The top-level message sent by the client for the - ``SynthesizeLongAudio`` method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - google.api_core.operation.Operation: - An object representing a long-running operation. - - The result type for the operation will be - :class:`google.cloud.texttospeech_v1beta1.types.SynthesizeLongAudioResponse` - The message returned to the client by the - SynthesizeLongAudio method. - - """ - # Create or coerce a protobuf request object. - # - Use the request object if provided (there's no risk of modifying the input as - # there are no flattened fields), or create one. - if not isinstance(request, cloud_tts_lrs.SynthesizeLongAudioRequest): - request = cloud_tts_lrs.SynthesizeLongAudioRequest(request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.synthesize_long_audio] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata(( - ("parent", request.parent), - )), - ) - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - - # Wrap the response in an operation future. - response = operation.from_gapic( - response, - self._transport.operations_client, - cloud_tts_lrs.SynthesizeLongAudioResponse, - metadata_type=cloud_tts_lrs.SynthesizeLongAudioMetadata, - ) - - # Done; return the response. - return response - - def __enter__(self) -> "TextToSpeechLongAudioSynthesizeClient": - return self - - def __exit__(self, type, value, traceback): - """Releases underlying transport's resources. - - .. warning:: - ONLY use as a context manager if the transport is NOT shared - with other clients! Exiting the with block will CLOSE the transport - and may cause errors in other clients! - """ - self.transport.close() - - def list_operations( - self, - request: Optional[operations_pb2.ListOperationsRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.ListOperationsResponse: - r"""Lists operations that match the specified filter in the request. - - Args: - request (:class:`~.operations_pb2.ListOperationsRequest`): - The request object. Request message for - `ListOperations` method. - retry (google.api_core.retry.Retry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.ListOperationsResponse: - Response message for ``ListOperations`` method. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.ListOperationsRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.list_operations] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - def get_operation( - self, - request: Optional[operations_pb2.GetOperationRequest] = None, - *, - retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: Union[float, object] = gapic_v1.method.DEFAULT, - metadata: Sequence[Tuple[str, str]] = (), - ) -> operations_pb2.Operation: - r"""Gets the latest state of a long-running operation. - - Args: - request (:class:`~.operations_pb2.GetOperationRequest`): - The request object. Request message for - `GetOperation` method. - retry (google.api_core.retry.Retry): Designation of what errors, - if any, should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - Returns: - ~.operations_pb2.Operation: - An ``Operation`` object. - """ - # Create or coerce a protobuf request object. - # The request isn't a proto-plus wrapped type, - # so it must be constructed via keyword expansion. - if isinstance(request, dict): - request = operations_pb2.GetOperationRequest(**request) - - # Wrap the RPC method; this adds retry and timeout information, - # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.get_operation] - - # Certain fields should be provided within the metadata header; - # add these here. - metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata( - (("name", request.name),)), - ) - - # Validate the universe domain. - self._validate_universe_domain() - - # Send the request. - response = rpc( - request, retry=retry, timeout=timeout, metadata=metadata,) - - # Done; return the response. - return response - - - - - - - - - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) - - -__all__ = ( - "TextToSpeechLongAudioSynthesizeClient", -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/README.rst b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/README.rst deleted file mode 100644 index 44ada032f342..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/README.rst +++ /dev/null @@ -1,9 +0,0 @@ - -transport inheritance structure -_______________________________ - -`TextToSpeechLongAudioSynthesizeTransport` is the ABC for all transports. -- public child `TextToSpeechLongAudioSynthesizeGrpcTransport` for sync gRPC transport (defined in `grpc.py`). -- public child `TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport` for async gRPC transport (defined in `grpc_asyncio.py`). -- private child `_BaseTextToSpeechLongAudioSynthesizeRestTransport` for base REST transport with inner classes `_BaseMETHOD` (defined in `rest_base.py`). -- public child `TextToSpeechLongAudioSynthesizeRestTransport` for sync REST transport with inner classes `METHOD` derived from the parent's corresponding `_BaseMETHOD` classes (defined in `rest.py`). diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/__init__.py deleted file mode 100644 index b9316b7eeac3..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/__init__.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from collections import OrderedDict -from typing import Dict, Type - -from .base import TextToSpeechLongAudioSynthesizeTransport -from .grpc import TextToSpeechLongAudioSynthesizeGrpcTransport -from .grpc_asyncio import TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport -from .rest import TextToSpeechLongAudioSynthesizeRestTransport -from .rest import TextToSpeechLongAudioSynthesizeRestInterceptor - - -# Compile a registry of transports. -_transport_registry = OrderedDict() # type: Dict[str, Type[TextToSpeechLongAudioSynthesizeTransport]] -_transport_registry['grpc'] = TextToSpeechLongAudioSynthesizeGrpcTransport -_transport_registry['grpc_asyncio'] = TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport -_transport_registry['rest'] = TextToSpeechLongAudioSynthesizeRestTransport - -__all__ = ( - 'TextToSpeechLongAudioSynthesizeTransport', - 'TextToSpeechLongAudioSynthesizeGrpcTransport', - 'TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport', - 'TextToSpeechLongAudioSynthesizeRestTransport', - 'TextToSpeechLongAudioSynthesizeRestInterceptor', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/base.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/base.py deleted file mode 100644 index 143a73ee1505..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/base.py +++ /dev/null @@ -1,189 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 abc -from typing import Awaitable, Callable, Dict, Optional, Sequence, Union - -from google.cloud.texttospeech_v1beta1 import gapic_version as package_version - -import google.auth # type: ignore -import google.api_core -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import retry as retries -from google.api_core import operations_v1 -from google.auth import credentials as ga_credentials # type: ignore -from google.oauth2 import service_account # type: ignore - -from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(gapic_version=package_version.__version__) - - -class TextToSpeechLongAudioSynthesizeTransport(abc.ABC): - """Abstract transport class for TextToSpeechLongAudioSynthesize.""" - - AUTH_SCOPES = ( - 'https://www.googleapis.com/auth/cloud-platform', - ) - - DEFAULT_HOST: str = 'texttospeech.googleapis.com' - def __init__( - self, *, - host: str = DEFAULT_HOST, - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - api_audience: Optional[str] = None, - **kwargs, - ) -> None: - """Instantiate the transport. - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is mutually exclusive with credentials. - scopes (Optional[Sequence[str]]): A list of scopes. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - """ - - scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} - - # Save the scopes. - self._scopes = scopes - if not hasattr(self, "_ignore_credentials"): - self._ignore_credentials: bool = False - - # If no credentials are provided, then determine the appropriate - # defaults. - if credentials and credentials_file: - raise core_exceptions.DuplicateCredentialArgs("'credentials_file' and 'credentials' are mutually exclusive") - - if credentials_file is not None: - credentials, _ = google.auth.load_credentials_from_file( - credentials_file, - **scopes_kwargs, - quota_project_id=quota_project_id - ) - elif credentials is None and not self._ignore_credentials: - credentials, _ = google.auth.default(**scopes_kwargs, quota_project_id=quota_project_id) - # Don't apply audience if the credentials file passed from user. - if hasattr(credentials, "with_gdch_audience"): - credentials = credentials.with_gdch_audience(api_audience if api_audience else host) - - # If the credentials are service account credentials, then always try to use self signed JWT. - if always_use_jwt_access and isinstance(credentials, service_account.Credentials) and hasattr(service_account.Credentials, "with_always_use_jwt_access"): - credentials = credentials.with_always_use_jwt_access(True) - - # Save the credentials. - self._credentials = credentials - - # Save the hostname. Default to port 443 (HTTPS) if none is specified. - if ':' not in host: - host += ':443' - self._host = host - - @property - def host(self): - return self._host - - def _prep_wrapped_messages(self, client_info): - # Precompute the wrapped methods. - self._wrapped_methods = { - self.synthesize_long_audio: gapic_v1.method.wrap_method( - self.synthesize_long_audio, - default_timeout=5000.0, - client_info=client_info, - ), - self.get_operation: gapic_v1.method.wrap_method( - self.get_operation, - default_timeout=None, - client_info=client_info, - ), - self.list_operations: gapic_v1.method.wrap_method( - self.list_operations, - default_timeout=None, - client_info=client_info, - ), - } - - def close(self): - """Closes resources associated with the transport. - - .. warning:: - Only call this method if the transport is NOT shared - with other clients - this may cause errors in other clients! - """ - raise NotImplementedError() - - @property - def operations_client(self): - """Return the client designed to process long-running operations.""" - raise NotImplementedError() - - @property - def synthesize_long_audio(self) -> Callable[ - [cloud_tts_lrs.SynthesizeLongAudioRequest], - Union[ - operations_pb2.Operation, - Awaitable[operations_pb2.Operation] - ]]: - raise NotImplementedError() - - @property - def list_operations( - self, - ) -> Callable[ - [operations_pb2.ListOperationsRequest], - Union[operations_pb2.ListOperationsResponse, Awaitable[operations_pb2.ListOperationsResponse]], - ]: - raise NotImplementedError() - - @property - def get_operation( - self, - ) -> Callable[ - [operations_pb2.GetOperationRequest], - Union[operations_pb2.Operation, Awaitable[operations_pb2.Operation]], - ]: - raise NotImplementedError() - - @property - def kind(self) -> str: - raise NotImplementedError() - - -__all__ = ( - 'TextToSpeechLongAudioSynthesizeTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc.py deleted file mode 100644 index dd6f52849589..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc.py +++ /dev/null @@ -1,325 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 warnings -from typing import Callable, Dict, Optional, Sequence, Tuple, Union - -from google.api_core import grpc_helpers -from google.api_core import operations_v1 -from google.api_core import gapic_v1 -import google.auth # type: ignore -from google.auth import credentials as ga_credentials # type: ignore -from google.auth.transport.grpc import SslCredentials # type: ignore - -import grpc # type: ignore - -from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore -from .base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO - - -class TextToSpeechLongAudioSynthesizeGrpcTransport(TextToSpeechLongAudioSynthesizeTransport): - """gRPC backend transport for TextToSpeechLongAudioSynthesize. - - Service that implements Google Cloud Text-to-Speech API. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends protocol buffers over the wire using gRPC (which is built on - top of HTTP/2); the ``grpcio`` package must be installed. - """ - _stubs: Dict[str, Callable] - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - channel: Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]] = None, - api_mtls_endpoint: Optional[str] = None, - client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, - client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - This argument is ignored if a ``channel`` instance is provided. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is ignored if a ``channel`` instance is provided. - scopes (Optional(Sequence[str])): A list of scopes. This argument is - ignored if a ``channel`` instance is provided. - channel (Optional[Union[grpc.Channel, Callable[..., grpc.Channel]]]): - A ``Channel`` instance through which to make calls, or a Callable - that constructs and returns one. If set to None, ``self.create_channel`` - is used to create the channel. If a Callable is given, it will be called - with the same arguments as used in ``self.create_channel``. - api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. - If provided, it overrides the ``host`` argument and tries to create - a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or application default SSL credentials. - client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): - Deprecated. A callback to provide client SSL certificate bytes and - private key bytes, both in PEM format. It is ignored if - ``api_mtls_endpoint`` is None. - ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for the grpc channel. It is ignored if a ``channel`` instance is provided. - client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): - A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure a mutual TLS channel. It is - ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - - Raises: - google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport - creation failed for any reason. - google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` - and ``credentials_file`` are passed. - """ - self._grpc_channel = None - self._ssl_channel_credentials = ssl_channel_credentials - self._stubs: Dict[str, Callable] = {} - self._operations_client: Optional[operations_v1.OperationsClient] = None - - if api_mtls_endpoint: - warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) - if client_cert_source: - warnings.warn("client_cert_source is deprecated", DeprecationWarning) - - if isinstance(channel, grpc.Channel): - # Ignore credentials if a channel was passed. - credentials = None - self._ignore_credentials = True - # If a channel was explicitly provided, set it. - self._grpc_channel = channel - self._ssl_channel_credentials = None - - else: - if api_mtls_endpoint: - host = api_mtls_endpoint - - # Create SSL credentials with client_cert_source or application - # default SSL credentials. - if client_cert_source: - cert, key = client_cert_source() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - else: - self._ssl_channel_credentials = SslCredentials().ssl_credentials - - else: - if client_cert_source_for_mtls and not ssl_channel_credentials: - cert, key = client_cert_source_for_mtls() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - - # The base transport sets the host, credentials and scopes - super().__init__( - host=host, - credentials=credentials, - credentials_file=credentials_file, - scopes=scopes, - quota_project_id=quota_project_id, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - api_audience=api_audience, - ) - - if not self._grpc_channel: - # initialize with the provided callable or the default channel - channel_init = channel or type(self).create_channel - self._grpc_channel = channel_init( - self._host, - # use the credentials which are saved - credentials=self._credentials, - # Set ``credentials_file`` to ``None`` here as - # the credentials that we saved earlier should be used. - credentials_file=None, - scopes=self._scopes, - ssl_credentials=self._ssl_channel_credentials, - quota_project_id=quota_project_id, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - # Wrap messages. This must be done after self._grpc_channel exists - self._prep_wrapped_messages(client_info) - - @classmethod - def create_channel(cls, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - quota_project_id: Optional[str] = None, - **kwargs) -> grpc.Channel: - """Create and return a gRPC channel object. - Args: - host (Optional[str]): The host for the channel to use. - credentials (Optional[~.Credentials]): The - authorization credentials to attach to requests. These - credentials identify this application to the service. If - none are specified, the client will attempt to ascertain - the credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is mutually exclusive with credentials. - scopes (Optional[Sequence[str]]): A optional list of scopes needed for this - service. These are only used when credentials are not specified and - are passed to :func:`google.auth.default`. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - kwargs (Optional[dict]): Keyword arguments, which are passed to the - channel creation. - Returns: - grpc.Channel: A gRPC channel object. - - Raises: - google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` - and ``credentials_file`` are passed. - """ - - return grpc_helpers.create_channel( - host, - credentials=credentials, - credentials_file=credentials_file, - quota_project_id=quota_project_id, - default_scopes=cls.AUTH_SCOPES, - scopes=scopes, - default_host=cls.DEFAULT_HOST, - **kwargs - ) - - @property - def grpc_channel(self) -> grpc.Channel: - """Return the channel designed to connect to this service. - """ - return self._grpc_channel - - @property - def operations_client(self) -> operations_v1.OperationsClient: - """Create the client designed to process long-running operations. - - This property caches on the instance; repeated calls return the same - client. - """ - # Quick check: Only create a new client if we do not already have one. - if self._operations_client is None: - self._operations_client = operations_v1.OperationsClient( - self.grpc_channel - ) - - # Return the client from cache. - return self._operations_client - - @property - def synthesize_long_audio(self) -> Callable[ - [cloud_tts_lrs.SynthesizeLongAudioRequest], - operations_pb2.Operation]: - r"""Return a callable for the synthesize long audio method over gRPC. - - Synthesizes long form text asynchronously. - - Returns: - Callable[[~.SynthesizeLongAudioRequest], - ~.Operation]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'synthesize_long_audio' not in self._stubs: - self._stubs['synthesize_long_audio'] = self.grpc_channel.unary_unary( - '/google.cloud.texttospeech.v1beta1.TextToSpeechLongAudioSynthesize/SynthesizeLongAudio', - request_serializer=cloud_tts_lrs.SynthesizeLongAudioRequest.serialize, - response_deserializer=operations_pb2.Operation.FromString, - ) - return self._stubs['synthesize_long_audio'] - - def close(self): - self.grpc_channel.close() - - @property - def get_operation( - self, - ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: - r"""Return a callable for the get_operation method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "get_operation" not in self._stubs: - self._stubs["get_operation"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/GetOperation", - request_serializer=operations_pb2.GetOperationRequest.SerializeToString, - response_deserializer=operations_pb2.Operation.FromString, - ) - return self._stubs["get_operation"] - - @property - def list_operations( - self, - ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: - r"""Return a callable for the list_operations method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "list_operations" not in self._stubs: - self._stubs["list_operations"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/ListOperations", - request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, - response_deserializer=operations_pb2.ListOperationsResponse.FromString, - ) - return self._stubs["list_operations"] - - @property - def kind(self) -> str: - return "grpc" - - -__all__ = ( - 'TextToSpeechLongAudioSynthesizeGrpcTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py deleted file mode 100644 index 2f5ae21343fb..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/grpc_asyncio.py +++ /dev/null @@ -1,356 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 inspect -import warnings -from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union - -from google.api_core import gapic_v1 -from google.api_core import grpc_helpers_async -from google.api_core import exceptions as core_exceptions -from google.api_core import retry_async as retries -from google.api_core import operations_v1 -from google.auth import credentials as ga_credentials # type: ignore -from google.auth.transport.grpc import SslCredentials # type: ignore - -import grpc # type: ignore -from grpc.experimental import aio # type: ignore - -from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore -from .base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO -from .grpc import TextToSpeechLongAudioSynthesizeGrpcTransport - - -class TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport(TextToSpeechLongAudioSynthesizeTransport): - """gRPC AsyncIO backend transport for TextToSpeechLongAudioSynthesize. - - Service that implements Google Cloud Text-to-Speech API. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends protocol buffers over the wire using gRPC (which is built on - top of HTTP/2); the ``grpcio`` package must be installed. - """ - - _grpc_channel: aio.Channel - _stubs: Dict[str, Callable] = {} - - @classmethod - def create_channel(cls, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - quota_project_id: Optional[str] = None, - **kwargs) -> aio.Channel: - """Create and return a gRPC AsyncIO channel object. - Args: - host (Optional[str]): The host for the channel to use. - credentials (Optional[~.Credentials]): The - authorization credentials to attach to requests. These - credentials identify this application to the service. If - none are specified, the client will attempt to ascertain - the credentials from the environment. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - scopes (Optional[Sequence[str]]): A optional list of scopes needed for this - service. These are only used when credentials are not specified and - are passed to :func:`google.auth.default`. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - kwargs (Optional[dict]): Keyword arguments, which are passed to the - channel creation. - Returns: - aio.Channel: A gRPC AsyncIO channel object. - """ - - return grpc_helpers_async.create_channel( - host, - credentials=credentials, - credentials_file=credentials_file, - quota_project_id=quota_project_id, - default_scopes=cls.AUTH_SCOPES, - scopes=scopes, - default_host=cls.DEFAULT_HOST, - **kwargs - ) - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - channel: Optional[Union[aio.Channel, Callable[..., aio.Channel]]] = None, - api_mtls_endpoint: Optional[str] = None, - client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, - client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - This argument is ignored if a ``channel`` instance is provided. - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is ignored if a ``channel`` instance is provided. - scopes (Optional[Sequence[str]]): A optional list of scopes needed for this - service. These are only used when credentials are not specified and - are passed to :func:`google.auth.default`. - channel (Optional[Union[aio.Channel, Callable[..., aio.Channel]]]): - A ``Channel`` instance through which to make calls, or a Callable - that constructs and returns one. If set to None, ``self.create_channel`` - is used to create the channel. If a Callable is given, it will be called - with the same arguments as used in ``self.create_channel``. - api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. - If provided, it overrides the ``host`` argument and tries to create - a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or application default SSL credentials. - client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): - Deprecated. A callback to provide client SSL certificate bytes and - private key bytes, both in PEM format. It is ignored if - ``api_mtls_endpoint`` is None. - ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for the grpc channel. It is ignored if a ``channel`` instance is provided. - client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): - A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure a mutual TLS channel. It is - ignored if a ``channel`` instance or ``ssl_channel_credentials`` is provided. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you're developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - - Raises: - google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport - creation failed for any reason. - google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials`` - and ``credentials_file`` are passed. - """ - self._grpc_channel = None - self._ssl_channel_credentials = ssl_channel_credentials - self._stubs: Dict[str, Callable] = {} - self._operations_client: Optional[operations_v1.OperationsAsyncClient] = None - - if api_mtls_endpoint: - warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning) - if client_cert_source: - warnings.warn("client_cert_source is deprecated", DeprecationWarning) - - if isinstance(channel, aio.Channel): - # Ignore credentials if a channel was passed. - credentials = None - self._ignore_credentials = True - # If a channel was explicitly provided, set it. - self._grpc_channel = channel - self._ssl_channel_credentials = None - else: - if api_mtls_endpoint: - host = api_mtls_endpoint - - # Create SSL credentials with client_cert_source or application - # default SSL credentials. - if client_cert_source: - cert, key = client_cert_source() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - else: - self._ssl_channel_credentials = SslCredentials().ssl_credentials - - else: - if client_cert_source_for_mtls and not ssl_channel_credentials: - cert, key = client_cert_source_for_mtls() - self._ssl_channel_credentials = grpc.ssl_channel_credentials( - certificate_chain=cert, private_key=key - ) - - # The base transport sets the host, credentials and scopes - super().__init__( - host=host, - credentials=credentials, - credentials_file=credentials_file, - scopes=scopes, - quota_project_id=quota_project_id, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - api_audience=api_audience, - ) - - if not self._grpc_channel: - # initialize with the provided callable or the default channel - channel_init = channel or type(self).create_channel - self._grpc_channel = channel_init( - self._host, - # use the credentials which are saved - credentials=self._credentials, - # Set ``credentials_file`` to ``None`` here as - # the credentials that we saved earlier should be used. - credentials_file=None, - scopes=self._scopes, - ssl_credentials=self._ssl_channel_credentials, - quota_project_id=quota_project_id, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - # Wrap messages. This must be done after self._grpc_channel exists - self._wrap_with_kind = "kind" in inspect.signature(gapic_v1.method_async.wrap_method).parameters - self._prep_wrapped_messages(client_info) - - @property - def grpc_channel(self) -> aio.Channel: - """Create the channel designed to connect to this service. - - This property caches on the instance; repeated calls return - the same channel. - """ - # Return the channel from cache. - return self._grpc_channel - - @property - def operations_client(self) -> operations_v1.OperationsAsyncClient: - """Create the client designed to process long-running operations. - - This property caches on the instance; repeated calls return the same - client. - """ - # Quick check: Only create a new client if we do not already have one. - if self._operations_client is None: - self._operations_client = operations_v1.OperationsAsyncClient( - self.grpc_channel - ) - - # Return the client from cache. - return self._operations_client - - @property - def synthesize_long_audio(self) -> Callable[ - [cloud_tts_lrs.SynthesizeLongAudioRequest], - Awaitable[operations_pb2.Operation]]: - r"""Return a callable for the synthesize long audio method over gRPC. - - Synthesizes long form text asynchronously. - - Returns: - Callable[[~.SynthesizeLongAudioRequest], - Awaitable[~.Operation]]: - A function that, when called, will call the underlying RPC - on the server. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if 'synthesize_long_audio' not in self._stubs: - self._stubs['synthesize_long_audio'] = self.grpc_channel.unary_unary( - '/google.cloud.texttospeech.v1beta1.TextToSpeechLongAudioSynthesize/SynthesizeLongAudio', - request_serializer=cloud_tts_lrs.SynthesizeLongAudioRequest.serialize, - response_deserializer=operations_pb2.Operation.FromString, - ) - return self._stubs['synthesize_long_audio'] - - def _prep_wrapped_messages(self, client_info): - """ Precompute the wrapped methods, overriding the base class method to use async wrappers.""" - self._wrapped_methods = { - self.synthesize_long_audio: self._wrap_method( - self.synthesize_long_audio, - default_timeout=5000.0, - client_info=client_info, - ), - self.get_operation: self._wrap_method( - self.get_operation, - default_timeout=None, - client_info=client_info, - ), - self.list_operations: self._wrap_method( - self.list_operations, - default_timeout=None, - client_info=client_info, - ), - } - - def _wrap_method(self, func, *args, **kwargs): - if self._wrap_with_kind: # pragma: NO COVER - kwargs["kind"] = self.kind - return gapic_v1.method_async.wrap_method(func, *args, **kwargs) - - def close(self): - return self.grpc_channel.close() - - @property - def kind(self) -> str: - return "grpc_asyncio" - - @property - def get_operation( - self, - ) -> Callable[[operations_pb2.GetOperationRequest], operations_pb2.Operation]: - r"""Return a callable for the get_operation method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "get_operation" not in self._stubs: - self._stubs["get_operation"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/GetOperation", - request_serializer=operations_pb2.GetOperationRequest.SerializeToString, - response_deserializer=operations_pb2.Operation.FromString, - ) - return self._stubs["get_operation"] - - @property - def list_operations( - self, - ) -> Callable[[operations_pb2.ListOperationsRequest], operations_pb2.ListOperationsResponse]: - r"""Return a callable for the list_operations method over gRPC. - """ - # Generate a "stub function" on-the-fly which will actually make - # the request. - # gRPC handles serialization and deserialization, so we just need - # to pass in the functions for each. - if "list_operations" not in self._stubs: - self._stubs["list_operations"] = self.grpc_channel.unary_unary( - "/google.longrunning.Operations/ListOperations", - request_serializer=operations_pb2.ListOperationsRequest.SerializeToString, - response_deserializer=operations_pb2.ListOperationsResponse.FromString, - ) - return self._stubs["list_operations"] - - -__all__ = ( - 'TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py deleted file mode 100644 index e87b1cbbe722..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py +++ /dev/null @@ -1,509 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# - -from google.auth.transport.requests import AuthorizedSession # type: ignore -import json # type: ignore -from google.auth import credentials as ga_credentials # type: ignore -from google.api_core import exceptions as core_exceptions -from google.api_core import retry as retries -from google.api_core import rest_helpers -from google.api_core import rest_streaming -from google.api_core import gapic_v1 - -from google.protobuf import json_format -from google.api_core import operations_v1 - -from requests import __version__ as requests_version -import dataclasses -from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union -import warnings - - -from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore - - -from .rest_base import _BaseTextToSpeechLongAudioSynthesizeRestTransport -from .base import DEFAULT_CLIENT_INFO as BASE_DEFAULT_CLIENT_INFO - -try: - OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] -except AttributeError: # pragma: NO COVER - OptionalRetry = Union[retries.Retry, object, None] # type: ignore - - -DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( - gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, - grpc_version=None, - rest_version=f"requests@{requests_version}", -) - - -class TextToSpeechLongAudioSynthesizeRestInterceptor: - """Interceptor for TextToSpeechLongAudioSynthesize. - - Interceptors are used to manipulate requests, request metadata, and responses - in arbitrary ways. - Example use cases include: - * Logging - * Verifying requests according to service or custom semantics - * Stripping extraneous information from responses - - These use cases and more can be enabled by injecting an - instance of a custom subclass when constructing the TextToSpeechLongAudioSynthesizeRestTransport. - - .. code-block:: python - class MyCustomTextToSpeechLongAudioSynthesizeInterceptor(TextToSpeechLongAudioSynthesizeRestInterceptor): - def pre_synthesize_long_audio(self, request, metadata): - logging.log(f"Received request: {request}") - return request, metadata - - def post_synthesize_long_audio(self, response): - logging.log(f"Received response: {response}") - return response - - transport = TextToSpeechLongAudioSynthesizeRestTransport(interceptor=MyCustomTextToSpeechLongAudioSynthesizeInterceptor()) - client = TextToSpeechLongAudioSynthesizeClient(transport=transport) - - - """ - def pre_synthesize_long_audio(self, request: cloud_tts_lrs.SynthesizeLongAudioRequest, metadata: Sequence[Tuple[str, str]]) -> Tuple[cloud_tts_lrs.SynthesizeLongAudioRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for synthesize_long_audio - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeechLongAudioSynthesize server. - """ - return request, metadata - - def post_synthesize_long_audio(self, response: operations_pb2.Operation) -> operations_pb2.Operation: - """Post-rpc interceptor for synthesize_long_audio - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeechLongAudioSynthesize server but before - it is returned to user code. - """ - return response - - def pre_get_operation( - self, request: operations_pb2.GetOperationRequest, metadata: Sequence[Tuple[str, str]] - ) -> Tuple[operations_pb2.GetOperationRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for get_operation - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeechLongAudioSynthesize server. - """ - return request, metadata - - def post_get_operation( - self, response: operations_pb2.Operation - ) -> operations_pb2.Operation: - """Post-rpc interceptor for get_operation - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeechLongAudioSynthesize server but before - it is returned to user code. - """ - return response - - def pre_list_operations( - self, request: operations_pb2.ListOperationsRequest, metadata: Sequence[Tuple[str, str]] - ) -> Tuple[operations_pb2.ListOperationsRequest, Sequence[Tuple[str, str]]]: - """Pre-rpc interceptor for list_operations - - Override in a subclass to manipulate the request or metadata - before they are sent to the TextToSpeechLongAudioSynthesize server. - """ - return request, metadata - - def post_list_operations( - self, response: operations_pb2.ListOperationsResponse - ) -> operations_pb2.ListOperationsResponse: - """Post-rpc interceptor for list_operations - - Override in a subclass to manipulate the response - after it is returned by the TextToSpeechLongAudioSynthesize server but before - it is returned to user code. - """ - return response - - -@dataclasses.dataclass -class TextToSpeechLongAudioSynthesizeRestStub: - _session: AuthorizedSession - _host: str - _interceptor: TextToSpeechLongAudioSynthesizeRestInterceptor - - -class TextToSpeechLongAudioSynthesizeRestTransport(_BaseTextToSpeechLongAudioSynthesizeRestTransport): - """REST backend synchronous transport for TextToSpeechLongAudioSynthesize. - - Service that implements Google Cloud Text-to-Speech API. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends JSON representations of protocol buffers over HTTP/1.1 - """ - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[ga_credentials.Credentials] = None, - credentials_file: Optional[str] = None, - scopes: Optional[Sequence[str]] = None, - client_cert_source_for_mtls: Optional[Callable[[ - ], Tuple[bytes, bytes]]] = None, - quota_project_id: Optional[str] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - url_scheme: str = 'https', - interceptor: Optional[TextToSpeechLongAudioSynthesizeRestInterceptor] = None, - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - - NOTE: This REST transport functionality is currently in a beta - state (preview). We welcome your feedback via a GitHub issue in - this library's repository. Thank you! - - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[google.auth.credentials.Credentials]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - - credentials_file (Optional[str]): A file with credentials that can - be loaded with :func:`google.auth.load_credentials_from_file`. - This argument is ignored if ``channel`` is provided. - scopes (Optional(Sequence[str])): A list of scopes. This argument is - ignored if ``channel`` is provided. - client_cert_source_for_mtls (Callable[[], Tuple[bytes, bytes]]): Client - certificate to configure mutual TLS HTTP channel. It is ignored - if ``channel`` is provided. - quota_project_id (Optional[str]): An optional project to use for billing - and quota. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you are developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - url_scheme: the protocol scheme for the API endpoint. Normally - "https", but for testing or local servers, - "http" can be specified. - """ - # Run the base constructor - # TODO(yon-mg): resolve other ctor params i.e. scopes, quota, etc. - # TODO: When custom host (api_endpoint) is set, `scopes` must *also* be set on the - # credentials object - super().__init__( - host=host, - credentials=credentials, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - url_scheme=url_scheme, - api_audience=api_audience - ) - self._session = AuthorizedSession( - self._credentials, default_host=self.DEFAULT_HOST) - self._operations_client: Optional[operations_v1.AbstractOperationsClient] = None - if client_cert_source_for_mtls: - self._session.configure_mtls_channel(client_cert_source_for_mtls) - self._interceptor = interceptor or TextToSpeechLongAudioSynthesizeRestInterceptor() - self._prep_wrapped_messages(client_info) - - @property - def operations_client(self) -> operations_v1.AbstractOperationsClient: - """Create the client designed to process long-running operations. - - This property caches on the instance; repeated calls return the same - client. - """ - # Only create a new client if we do not already have one. - if self._operations_client is None: - http_options: Dict[str, List[Dict[str, str]]] = { - 'google.longrunning.Operations.GetOperation': [ - { - 'method': 'get', - 'uri': '/v1beta1/{name=projects/*/locations/*/operations/*}', - }, - ], - 'google.longrunning.Operations.ListOperations': [ - { - 'method': 'get', - 'uri': '/v1beta1/{name=projects/*/locations/*}/operations', - }, - ], - } - - rest_transport = operations_v1.OperationsRestTransport( - host=self._host, - # use the credentials which are saved - credentials=self._credentials, - scopes=self._scopes, - http_options=http_options, - path_prefix="v1beta1") - - self._operations_client = operations_v1.AbstractOperationsClient(transport=rest_transport) - - # Return the client from cache. - return self._operations_client - - class _SynthesizeLongAudio(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio, TextToSpeechLongAudioSynthesizeRestStub): - def __hash__(self): - return hash("TextToSpeechLongAudioSynthesizeRestTransport.SynthesizeLongAudio") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - data=body, - ) - return response - - def __call__(self, - request: cloud_tts_lrs.SynthesizeLongAudioRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> operations_pb2.Operation: - r"""Call the synthesize long audio method over HTTP. - - Args: - request (~.cloud_tts_lrs.SynthesizeLongAudioRequest): - The request object. The top-level message sent by the client for the - ``SynthesizeLongAudio`` method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - ~.operations_pb2.Operation: - This resource represents a - long-running operation that is the - result of a network API call. - - """ - - http_options = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_http_options() - request, metadata = self._interceptor.pre_synthesize_long_audio(request, metadata) - transcoded_request = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_transcoded_request(http_options, request) - - body = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_request_body_json(transcoded_request) - - # Jsonify the query params - query_params = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechLongAudioSynthesizeRestTransport._SynthesizeLongAudio._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request, body) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - # Return the response - resp = operations_pb2.Operation() - json_format.Parse(response.content, resp, ignore_unknown_fields=True) - resp = self._interceptor.post_synthesize_long_audio(resp) - return resp - - @property - def synthesize_long_audio(self) -> Callable[ - [cloud_tts_lrs.SynthesizeLongAudioRequest], - operations_pb2.Operation]: - # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. - # In C++ this would require a dynamic_cast - return self._SynthesizeLongAudio(self._session, self._host, self._interceptor) # type: ignore - - @property - def get_operation(self): - return self._GetOperation(self._session, self._host, self._interceptor) # type: ignore - - class _GetOperation(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation, TextToSpeechLongAudioSynthesizeRestStub): - def __hash__(self): - return hash("TextToSpeechLongAudioSynthesizeRestTransport.GetOperation") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - ) - return response - - def __call__(self, - request: operations_pb2.GetOperationRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> operations_pb2.Operation: - - r"""Call the get operation method over HTTP. - - Args: - request (operations_pb2.GetOperationRequest): - The request object for GetOperation method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - operations_pb2.Operation: Response from GetOperation method. - """ - - http_options = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation._get_http_options() - request, metadata = self._interceptor.pre_get_operation(request, metadata) - transcoded_request = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation._get_transcoded_request(http_options, request) - - # Jsonify the query params - query_params = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseGetOperation._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechLongAudioSynthesizeRestTransport._GetOperation._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - content = response.content.decode("utf-8") - resp = operations_pb2.Operation() - resp = json_format.Parse(content, resp) - resp = self._interceptor.post_get_operation(resp) - return resp - - @property - def list_operations(self): - return self._ListOperations(self._session, self._host, self._interceptor) # type: ignore - - class _ListOperations(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations, TextToSpeechLongAudioSynthesizeRestStub): - def __hash__(self): - return hash("TextToSpeechLongAudioSynthesizeRestTransport.ListOperations") - - @staticmethod - def _get_response( - host, - metadata, - query_params, - session, - timeout, - transcoded_request, - body=None): - - uri = transcoded_request['uri'] - method = transcoded_request['method'] - headers = dict(metadata) - headers['Content-Type'] = 'application/json' - response = getattr(session, method)( - "{host}{uri}".format(host=host, uri=uri), - timeout=timeout, - headers=headers, - params=rest_helpers.flatten_query_params(query_params, strict=True), - ) - return response - - def __call__(self, - request: operations_pb2.ListOperationsRequest, *, - retry: OptionalRetry=gapic_v1.method.DEFAULT, - timeout: Optional[float]=None, - metadata: Sequence[Tuple[str, str]]=(), - ) -> operations_pb2.ListOperationsResponse: - - r"""Call the list operations method over HTTP. - - Args: - request (operations_pb2.ListOperationsRequest): - The request object for ListOperations method. - retry (google.api_core.retry.Retry): Designation of what errors, if any, - should be retried. - timeout (float): The timeout for this request. - metadata (Sequence[Tuple[str, str]]): Strings which should be - sent along with the request as metadata. - - Returns: - operations_pb2.ListOperationsResponse: Response from ListOperations method. - """ - - http_options = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations._get_http_options() - request, metadata = self._interceptor.pre_list_operations(request, metadata) - transcoded_request = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations._get_transcoded_request(http_options, request) - - # Jsonify the query params - query_params = _BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseListOperations._get_query_params_json(transcoded_request) - - # Send the request - response = TextToSpeechLongAudioSynthesizeRestTransport._ListOperations._get_response(self._host, metadata, query_params, self._session, timeout, transcoded_request) - - # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception - # subclass. - if response.status_code >= 400: - raise core_exceptions.from_http_response(response) - - content = response.content.decode("utf-8") - resp = operations_pb2.ListOperationsResponse() - resp = json_format.Parse(content, resp) - resp = self._interceptor.post_list_operations(resp) - return resp - - @property - def kind(self) -> str: - return "rest" - - def close(self): - self._session.close() - - -__all__=( - 'TextToSpeechLongAudioSynthesizeRestTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py deleted file mode 100644 index 68ce436c1cbf..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest_base.py +++ /dev/null @@ -1,188 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 json # type: ignore -from google.api_core import path_template -from google.api_core import gapic_v1 - -from google.protobuf import json_format -from .base import TextToSpeechLongAudioSynthesizeTransport, DEFAULT_CLIENT_INFO - -import re -from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union - - -from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore - - -class _BaseTextToSpeechLongAudioSynthesizeRestTransport(TextToSpeechLongAudioSynthesizeTransport): - """Base REST backend transport for TextToSpeechLongAudioSynthesize. - - Note: This class is not meant to be used directly. Use its sync and - async sub-classes instead. - - This class defines the same methods as the primary client, so the - primary client can load the underlying transport implementation - and call it. - - It sends JSON representations of protocol buffers over HTTP/1.1 - """ - - def __init__(self, *, - host: str = 'texttospeech.googleapis.com', - credentials: Optional[Any] = None, - client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, - always_use_jwt_access: Optional[bool] = False, - url_scheme: str = 'https', - api_audience: Optional[str] = None, - ) -> None: - """Instantiate the transport. - Args: - host (Optional[str]): - The hostname to connect to (default: 'texttospeech.googleapis.com'). - credentials (Optional[Any]): The - authorization credentials to attach to requests. These - credentials identify the application to the service; if none - are specified, the client will attempt to ascertain the - credentials from the environment. - client_info (google.api_core.gapic_v1.client_info.ClientInfo): - The client info used to send a user-agent string along with - API requests. If ``None``, then default info will be used. - Generally, you only need to set this if you are developing - your own client library. - always_use_jwt_access (Optional[bool]): Whether self signed JWT should - be used for service account credentials. - url_scheme: the protocol scheme for the API endpoint. Normally - "https", but for testing or local servers, - "http" can be specified. - """ - # Run the base constructor - maybe_url_match = re.match("^(?Phttp(?:s)?://)?(?P.*)$", host) - if maybe_url_match is None: - raise ValueError(f"Unexpected hostname structure: {host}") # pragma: NO COVER - - url_match_items = maybe_url_match.groupdict() - - host = f"{url_scheme}://{host}" if not url_match_items["scheme"] else host - - super().__init__( - host=host, - credentials=credentials, - client_info=client_info, - always_use_jwt_access=always_use_jwt_access, - api_audience=api_audience - ) - - class _BaseSynthesizeLongAudio: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = { - } - - @classmethod - def _get_unset_required_fields(cls, message_dict): - return {k: v for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() if k not in message_dict} - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'post', - 'uri': '/v1beta1/{parent=projects/*/locations/*}:synthesizeLongAudio', - 'body': '*', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - pb_request = cloud_tts_lrs.SynthesizeLongAudioRequest.pb(request) - transcoded_request = path_template.transcode(http_options, pb_request) - return transcoded_request - - @staticmethod - def _get_request_body_json(transcoded_request): - # Jsonify the request body - - body = json_format.MessageToJson( - transcoded_request['body'], - use_integers_for_enums=False - ) - return body - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json_format.MessageToJson( - transcoded_request['query_params'], - use_integers_for_enums=False, - )) - query_params.update(_BaseTextToSpeechLongAudioSynthesizeRestTransport._BaseSynthesizeLongAudio._get_unset_required_fields(query_params)) - - return query_params - - class _BaseGetOperation: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'get', - 'uri': '/v1beta1/{name=projects/*/locations/*/operations/*}', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - request_kwargs = json_format.MessageToDict(request) - transcoded_request = path_template.transcode( - http_options, **request_kwargs) - return transcoded_request - - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json.dumps(transcoded_request['query_params'])) - return query_params - - class _BaseListOperations: - def __hash__(self): # pragma: NO COVER - return NotImplementedError("__hash__ must be implemented.") - - @staticmethod - def _get_http_options(): - http_options: List[Dict[str, str]] = [{ - 'method': 'get', - 'uri': '/v1beta1/{name=projects/*/locations/*}/operations', - }, - ] - return http_options - - @staticmethod - def _get_transcoded_request(http_options, request): - request_kwargs = json_format.MessageToDict(request) - transcoded_request = path_template.transcode( - http_options, **request_kwargs) - return transcoded_request - - @staticmethod - def _get_query_params_json(transcoded_request): - query_params = json.loads(json.dumps(transcoded_request['query_params'])) - return query_params - - -__all__=( - '_BaseTextToSpeechLongAudioSynthesizeRestTransport', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/__init__.py deleted file mode 100644 index ffdb4bb045cb..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/__init__.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from .cloud_tts import ( - AdvancedVoiceOptions, - AudioConfig, - CustomPronunciationParams, - CustomPronunciations, - CustomVoiceParams, - ListVoicesRequest, - ListVoicesResponse, - MultiSpeakerMarkup, - StreamingSynthesisInput, - StreamingSynthesizeConfig, - StreamingSynthesizeRequest, - StreamingSynthesizeResponse, - SynthesisInput, - SynthesizeSpeechRequest, - SynthesizeSpeechResponse, - Timepoint, - Voice, - VoiceCloneParams, - VoiceSelectionParams, - AudioEncoding, - SsmlVoiceGender, -) -from .cloud_tts_lrs import ( - SynthesizeLongAudioMetadata, - SynthesizeLongAudioRequest, - SynthesizeLongAudioResponse, -) - -__all__ = ( - 'AdvancedVoiceOptions', - 'AudioConfig', - 'CustomPronunciationParams', - 'CustomPronunciations', - 'CustomVoiceParams', - 'ListVoicesRequest', - 'ListVoicesResponse', - 'MultiSpeakerMarkup', - 'StreamingSynthesisInput', - 'StreamingSynthesizeConfig', - 'StreamingSynthesizeRequest', - 'StreamingSynthesizeResponse', - 'SynthesisInput', - 'SynthesizeSpeechRequest', - 'SynthesizeSpeechResponse', - 'Timepoint', - 'Voice', - 'VoiceCloneParams', - 'VoiceSelectionParams', - 'AudioEncoding', - 'SsmlVoiceGender', - 'SynthesizeLongAudioMetadata', - 'SynthesizeLongAudioRequest', - 'SynthesizeLongAudioResponse', -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts.py deleted file mode 100644 index 722aceb992bb..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts.py +++ /dev/null @@ -1,826 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from __future__ import annotations - -from typing import MutableMapping, MutableSequence - -import proto # type: ignore - - -__protobuf__ = proto.module( - package='google.cloud.texttospeech.v1beta1', - manifest={ - 'SsmlVoiceGender', - 'AudioEncoding', - 'ListVoicesRequest', - 'ListVoicesResponse', - 'Voice', - 'AdvancedVoiceOptions', - 'SynthesizeSpeechRequest', - 'CustomPronunciationParams', - 'CustomPronunciations', - 'MultiSpeakerMarkup', - 'SynthesisInput', - 'VoiceSelectionParams', - 'AudioConfig', - 'CustomVoiceParams', - 'VoiceCloneParams', - 'SynthesizeSpeechResponse', - 'Timepoint', - 'StreamingSynthesizeConfig', - 'StreamingSynthesisInput', - 'StreamingSynthesizeRequest', - 'StreamingSynthesizeResponse', - }, -) - - -class SsmlVoiceGender(proto.Enum): - r"""Gender of the voice as described in `SSML voice - element `__. - - Values: - SSML_VOICE_GENDER_UNSPECIFIED (0): - An unspecified gender. - In VoiceSelectionParams, this means that the - client doesn't care which gender the selected - voice will have. In the Voice field of - ListVoicesResponse, this may mean that the voice - doesn't fit any of the other categories in this - enum, or that the gender of the voice isn't - known. - MALE (1): - A male voice. - FEMALE (2): - A female voice. - NEUTRAL (3): - A gender-neutral voice. This voice is not yet - supported. - """ - SSML_VOICE_GENDER_UNSPECIFIED = 0 - MALE = 1 - FEMALE = 2 - NEUTRAL = 3 - - -class AudioEncoding(proto.Enum): - r"""Configuration to set up audio encoder. The encoding - determines the output audio format that we'd like. - - Values: - AUDIO_ENCODING_UNSPECIFIED (0): - Not specified. Will return result - [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. - LINEAR16 (1): - Uncompressed 16-bit signed little-endian - samples (Linear PCM). Audio content returned as - LINEAR16 also contains a WAV header. - MP3 (2): - MP3 audio at 32kbps. - MP3_64_KBPS (4): - MP3 at 64kbps. - OGG_OPUS (3): - Opus encoded audio wrapped in an ogg - container. The result will be a file which can - be played natively on Android, and in browsers - (at least Chrome and Firefox). The quality of - the encoding is considerably higher than MP3 - while using approximately the same bitrate. - MULAW (5): - 8-bit samples that compand 14-bit audio - samples using G.711 PCMU/mu-law. Audio content - returned as MULAW also contains a WAV header. - ALAW (6): - 8-bit samples that compand 14-bit audio - samples using G.711 PCMU/A-law. Audio content - returned as ALAW also contains a WAV header. - """ - AUDIO_ENCODING_UNSPECIFIED = 0 - LINEAR16 = 1 - MP3 = 2 - MP3_64_KBPS = 4 - OGG_OPUS = 3 - MULAW = 5 - ALAW = 6 - - -class ListVoicesRequest(proto.Message): - r"""The top-level message sent by the client for the ``ListVoices`` - method. - - Attributes: - language_code (str): - Optional. Recommended. - `BCP-47 `__ - language tag. If not specified, the API will return all - supported voices. If specified, the ListVoices call will - only return voices that can be used to synthesize this - language_code. For example, if you specify ``"en-NZ"``, all - ``"en-NZ"`` voices will be returned. If you specify - ``"no"``, both ``"no-\*"`` (Norwegian) and ``"nb-\*"`` - (Norwegian Bokmal) voices will be returned. - """ - - language_code: str = proto.Field( - proto.STRING, - number=1, - ) - - -class ListVoicesResponse(proto.Message): - r"""The message returned to the client by the ``ListVoices`` method. - - Attributes: - voices (MutableSequence[google.cloud.texttospeech_v1beta1.types.Voice]): - The list of voices. - """ - - voices: MutableSequence['Voice'] = proto.RepeatedField( - proto.MESSAGE, - number=1, - message='Voice', - ) - - -class Voice(proto.Message): - r"""Description of a voice supported by the TTS service. - - Attributes: - language_codes (MutableSequence[str]): - The languages that this voice supports, expressed as - `BCP-47 `__ - language tags (e.g. "en-US", "es-419", "cmn-tw"). - name (str): - The name of this voice. Each distinct voice - has a unique name. - ssml_gender (google.cloud.texttospeech_v1beta1.types.SsmlVoiceGender): - The gender of this voice. - natural_sample_rate_hertz (int): - The natural sample rate (in hertz) for this - voice. - """ - - language_codes: MutableSequence[str] = proto.RepeatedField( - proto.STRING, - number=1, - ) - name: str = proto.Field( - proto.STRING, - number=2, - ) - ssml_gender: 'SsmlVoiceGender' = proto.Field( - proto.ENUM, - number=3, - enum='SsmlVoiceGender', - ) - natural_sample_rate_hertz: int = proto.Field( - proto.INT32, - number=4, - ) - - -class AdvancedVoiceOptions(proto.Message): - r"""Used for advanced voice options. - - .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields - - Attributes: - low_latency_journey_synthesis (bool): - Only for Journey voices. If false, the - synthesis will be context aware and have higher - latency. - - This field is a member of `oneof`_ ``_low_latency_journey_synthesis``. - """ - - low_latency_journey_synthesis: bool = proto.Field( - proto.BOOL, - number=1, - optional=True, - ) - - -class SynthesizeSpeechRequest(proto.Message): - r"""The top-level message sent by the client for the - ``SynthesizeSpeech`` method. - - - .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields - - Attributes: - input (google.cloud.texttospeech_v1beta1.types.SynthesisInput): - Required. The Synthesizer requires either - plain text or SSML as input. - voice (google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams): - Required. The desired voice of the - synthesized audio. - audio_config (google.cloud.texttospeech_v1beta1.types.AudioConfig): - Required. The configuration of the - synthesized audio. - enable_time_pointing (MutableSequence[google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechRequest.TimepointType]): - Whether and what timepoints are returned in - the response. - advanced_voice_options (google.cloud.texttospeech_v1beta1.types.AdvancedVoiceOptions): - Advanced voice options. - - This field is a member of `oneof`_ ``_advanced_voice_options``. - """ - class TimepointType(proto.Enum): - r"""The type of timepoint information that is returned in the - response. - - Values: - TIMEPOINT_TYPE_UNSPECIFIED (0): - Not specified. No timepoint information will - be returned. - SSML_MARK (1): - Timepoint information of ```` tags in SSML input will - be returned. - """ - TIMEPOINT_TYPE_UNSPECIFIED = 0 - SSML_MARK = 1 - - input: 'SynthesisInput' = proto.Field( - proto.MESSAGE, - number=1, - message='SynthesisInput', - ) - voice: 'VoiceSelectionParams' = proto.Field( - proto.MESSAGE, - number=2, - message='VoiceSelectionParams', - ) - audio_config: 'AudioConfig' = proto.Field( - proto.MESSAGE, - number=3, - message='AudioConfig', - ) - enable_time_pointing: MutableSequence[TimepointType] = proto.RepeatedField( - proto.ENUM, - number=4, - enum=TimepointType, - ) - advanced_voice_options: 'AdvancedVoiceOptions' = proto.Field( - proto.MESSAGE, - number=8, - optional=True, - message='AdvancedVoiceOptions', - ) - - -class CustomPronunciationParams(proto.Message): - r"""Pronunciation customization for a phrase. - - .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields - - Attributes: - phrase (str): - The phrase to which the customization will be - applied. The phrase can be multiple words (in - the case of proper nouns etc), but should not - span to a whole sentence. - - This field is a member of `oneof`_ ``_phrase``. - phonetic_encoding (google.cloud.texttospeech_v1beta1.types.CustomPronunciationParams.PhoneticEncoding): - The phonetic encoding of the phrase. - - This field is a member of `oneof`_ ``_phonetic_encoding``. - pronunciation (str): - The pronunciation of the phrase. This must be - in the phonetic encoding specified above. - - This field is a member of `oneof`_ ``_pronunciation``. - """ - class PhoneticEncoding(proto.Enum): - r"""The phonetic encoding of the phrase. - - Values: - PHONETIC_ENCODING_UNSPECIFIED (0): - Not specified. - PHONETIC_ENCODING_IPA (1): - IPA. (e.g. apple -> ˈæpəl ) - https://en.wikipedia.org/wiki/International_Phonetic_Alphabet - PHONETIC_ENCODING_X_SAMPA (2): - X-SAMPA (e.g. apple -> "{p@l" ) - https://en.wikipedia.org/wiki/X-SAMPA - """ - PHONETIC_ENCODING_UNSPECIFIED = 0 - PHONETIC_ENCODING_IPA = 1 - PHONETIC_ENCODING_X_SAMPA = 2 - - phrase: str = proto.Field( - proto.STRING, - number=1, - optional=True, - ) - phonetic_encoding: PhoneticEncoding = proto.Field( - proto.ENUM, - number=2, - optional=True, - enum=PhoneticEncoding, - ) - pronunciation: str = proto.Field( - proto.STRING, - number=3, - optional=True, - ) - - -class CustomPronunciations(proto.Message): - r"""A collection of pronunciation customizations. - - Attributes: - pronunciations (MutableSequence[google.cloud.texttospeech_v1beta1.types.CustomPronunciationParams]): - The pronunciation customizations to be - applied. - """ - - pronunciations: MutableSequence['CustomPronunciationParams'] = proto.RepeatedField( - proto.MESSAGE, - number=1, - message='CustomPronunciationParams', - ) - - -class MultiSpeakerMarkup(proto.Message): - r"""A collection of turns for multi-speaker synthesis. - - Attributes: - turns (MutableSequence[google.cloud.texttospeech_v1beta1.types.MultiSpeakerMarkup.Turn]): - Required. Speaker turns. - """ - - class Turn(proto.Message): - r"""A Multi-speaker turn. - - Attributes: - speaker (str): - Required. The speaker of the turn, for - example, 'O' or 'Q'. Please refer to - documentation for available speakers. - text (str): - Required. The text to speak. - """ - - speaker: str = proto.Field( - proto.STRING, - number=1, - ) - text: str = proto.Field( - proto.STRING, - number=2, - ) - - turns: MutableSequence[Turn] = proto.RepeatedField( - proto.MESSAGE, - number=1, - message=Turn, - ) - - -class SynthesisInput(proto.Message): - r"""Contains text input to be synthesized. Either ``text`` or ``ssml`` - must be supplied. Supplying both or neither returns - [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. - The input size is limited to 5000 bytes. - - This message has `oneof`_ fields (mutually exclusive fields). - For each oneof, at most one member field can be set at the same time. - Setting any member of the oneof automatically clears all other - members. - - .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields - - Attributes: - text (str): - The raw text to be synthesized. - - This field is a member of `oneof`_ ``input_source``. - ssml (str): - The SSML document to be synthesized. The SSML document must - be valid and well-formed. Otherwise the RPC will fail and - return - [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. - For more information, see - `SSML `__. - - This field is a member of `oneof`_ ``input_source``. - multi_speaker_markup (google.cloud.texttospeech_v1beta1.types.MultiSpeakerMarkup): - The multi-speaker input to be synthesized. - Only applicable for multi-speaker synthesis. - - This field is a member of `oneof`_ ``input_source``. - custom_pronunciations (google.cloud.texttospeech_v1beta1.types.CustomPronunciations): - Optional. The pronunciation customizations to - be applied to the input. If this is set, the - input will be synthesized using the given - pronunciation customizations. - - The initial support will be for EFIGS (English, - French, Italian, German, Spanish) languages, as - provided in VoiceSelectionParams. Journey and - Instant Clone voices are not supported yet. - - In order to customize the pronunciation of a - phrase, there must be an exact match of the - phrase in the input types. If using SSML, the - phrase must not be inside a phoneme tag - (entirely or partially). - """ - - text: str = proto.Field( - proto.STRING, - number=1, - oneof='input_source', - ) - ssml: str = proto.Field( - proto.STRING, - number=2, - oneof='input_source', - ) - multi_speaker_markup: 'MultiSpeakerMarkup' = proto.Field( - proto.MESSAGE, - number=4, - oneof='input_source', - message='MultiSpeakerMarkup', - ) - custom_pronunciations: 'CustomPronunciations' = proto.Field( - proto.MESSAGE, - number=3, - message='CustomPronunciations', - ) - - -class VoiceSelectionParams(proto.Message): - r"""Description of which voice to use for a synthesis request. - - Attributes: - language_code (str): - Required. The language (and potentially also the region) of - the voice expressed as a - `BCP-47 `__ - language tag, e.g. "en-US". This should not include a script - tag (e.g. use "cmn-cn" rather than "cmn-Hant-cn"), because - the script will be inferred from the input provided in the - SynthesisInput. The TTS service will use this parameter to - help choose an appropriate voice. Note that the TTS service - may choose a voice with a slightly different language code - than the one selected; it may substitute a different region - (e.g. using en-US rather than en-CA if there isn't a - Canadian voice available), or even a different language, - e.g. using "nb" (Norwegian Bokmal) instead of "no" - (Norwegian)". - name (str): - The name of the voice. If both the name and the gender are - not set, the service will choose a voice based on the other - parameters such as language_code. - ssml_gender (google.cloud.texttospeech_v1beta1.types.SsmlVoiceGender): - The preferred gender of the voice. If not set, the service - will choose a voice based on the other parameters such as - language_code and name. Note that this is only a preference, - not requirement; if a voice of the appropriate gender is not - available, the synthesizer should substitute a voice with a - different gender rather than failing the request. - custom_voice (google.cloud.texttospeech_v1beta1.types.CustomVoiceParams): - The configuration for a custom voice. If - [CustomVoiceParams.model] is set, the service will choose - the custom voice matching the specified configuration. - voice_clone (google.cloud.texttospeech_v1beta1.types.VoiceCloneParams): - Optional. The configuration for a voice clone. If - [VoiceCloneParams.voice_clone_key] is set, the service will - choose the voice clone matching the specified configuration. - """ - - language_code: str = proto.Field( - proto.STRING, - number=1, - ) - name: str = proto.Field( - proto.STRING, - number=2, - ) - ssml_gender: 'SsmlVoiceGender' = proto.Field( - proto.ENUM, - number=3, - enum='SsmlVoiceGender', - ) - custom_voice: 'CustomVoiceParams' = proto.Field( - proto.MESSAGE, - number=4, - message='CustomVoiceParams', - ) - voice_clone: 'VoiceCloneParams' = proto.Field( - proto.MESSAGE, - number=5, - message='VoiceCloneParams', - ) - - -class AudioConfig(proto.Message): - r"""Description of audio data to be synthesized. - - Attributes: - audio_encoding (google.cloud.texttospeech_v1beta1.types.AudioEncoding): - Required. The format of the audio byte - stream. - speaking_rate (float): - Optional. Input only. Speaking rate/speed, in the range - [0.25, 4.0]. 1.0 is the normal native speed supported by the - specific voice. 2.0 is twice as fast, and 0.5 is half as - fast. If unset(0.0), defaults to the native 1.0 speed. Any - other values < 0.25 or > 4.0 will return an error. - pitch (float): - Optional. Input only. Speaking pitch, in the range [-20.0, - 20.0]. 20 means increase 20 semitones from the original - pitch. -20 means decrease 20 semitones from the original - pitch. - volume_gain_db (float): - Optional. Input only. Volume gain (in dB) of the normal - native volume supported by the specific voice, in the range - [-96.0, 16.0]. If unset, or set to a value of 0.0 (dB), will - play at normal native signal amplitude. A value of -6.0 (dB) - will play at approximately half the amplitude of the normal - native signal amplitude. A value of +6.0 (dB) will play at - approximately twice the amplitude of the normal native - signal amplitude. Strongly recommend not to exceed +10 (dB) - as there's usually no effective increase in loudness for any - value greater than that. - sample_rate_hertz (int): - Optional. The synthesis sample rate (in hertz) for this - audio. When this is specified in SynthesizeSpeechRequest, if - this is different from the voice's natural sample rate, then - the synthesizer will honor this request by converting to the - desired sample rate (which might result in worse audio - quality), unless the specified sample rate is not supported - for the encoding chosen, in which case it will fail the - request and return - [google.rpc.Code.INVALID_ARGUMENT][google.rpc.Code.INVALID_ARGUMENT]. - effects_profile_id (MutableSequence[str]): - Optional. Input only. An identifier which selects 'audio - effects' profiles that are applied on (post synthesized) - text to speech. Effects are applied on top of each other in - the order they are given. See `audio - profiles `__ - for current supported profile ids. - """ - - audio_encoding: 'AudioEncoding' = proto.Field( - proto.ENUM, - number=1, - enum='AudioEncoding', - ) - speaking_rate: float = proto.Field( - proto.DOUBLE, - number=2, - ) - pitch: float = proto.Field( - proto.DOUBLE, - number=3, - ) - volume_gain_db: float = proto.Field( - proto.DOUBLE, - number=4, - ) - sample_rate_hertz: int = proto.Field( - proto.INT32, - number=5, - ) - effects_profile_id: MutableSequence[str] = proto.RepeatedField( - proto.STRING, - number=6, - ) - - -class CustomVoiceParams(proto.Message): - r"""Description of the custom voice to be synthesized. - - Attributes: - model (str): - Required. The name of the AutoML model that - synthesizes the custom voice. - reported_usage (google.cloud.texttospeech_v1beta1.types.CustomVoiceParams.ReportedUsage): - Optional. Deprecated. The usage of the - synthesized audio to be reported. - """ - class ReportedUsage(proto.Enum): - r"""Deprecated. The usage of the synthesized audio. Usage does - not affect billing. - - Values: - REPORTED_USAGE_UNSPECIFIED (0): - Request with reported usage unspecified will - be rejected. - REALTIME (1): - For scenarios where the synthesized audio is - not downloadable and can only be used once. For - example, real-time request in IVR system. - OFFLINE (2): - For scenarios where the synthesized audio is - downloadable and can be reused. For example, the - synthesized audio is downloaded, stored in - customer service system and played repeatedly. - """ - REPORTED_USAGE_UNSPECIFIED = 0 - REALTIME = 1 - OFFLINE = 2 - - model: str = proto.Field( - proto.STRING, - number=1, - ) - reported_usage: ReportedUsage = proto.Field( - proto.ENUM, - number=3, - enum=ReportedUsage, - ) - - -class VoiceCloneParams(proto.Message): - r"""The configuration of Voice Clone feature. - - Attributes: - voice_cloning_key (str): - Required. Created by GenerateVoiceCloningKey. - """ - - voice_cloning_key: str = proto.Field( - proto.STRING, - number=1, - ) - - -class SynthesizeSpeechResponse(proto.Message): - r"""The message returned to the client by the ``SynthesizeSpeech`` - method. - - Attributes: - audio_content (bytes): - The audio data bytes encoded as specified in the request, - including the header for encodings that are wrapped in - containers (e.g. MP3, OGG_OPUS). For LINEAR16 audio, we - include the WAV header. Note: as with all bytes fields, - protobuffers use a pure binary representation, whereas JSON - representations use base64. - timepoints (MutableSequence[google.cloud.texttospeech_v1beta1.types.Timepoint]): - A link between a position in the original request input and - a corresponding time in the output audio. It's only - supported via ```` of SSML input. - audio_config (google.cloud.texttospeech_v1beta1.types.AudioConfig): - The audio metadata of ``audio_content``. - """ - - audio_content: bytes = proto.Field( - proto.BYTES, - number=1, - ) - timepoints: MutableSequence['Timepoint'] = proto.RepeatedField( - proto.MESSAGE, - number=2, - message='Timepoint', - ) - audio_config: 'AudioConfig' = proto.Field( - proto.MESSAGE, - number=4, - message='AudioConfig', - ) - - -class Timepoint(proto.Message): - r"""This contains a mapping between a certain point in the input - text and a corresponding time in the output audio. - - Attributes: - mark_name (str): - Timepoint name as received from the client within ```` - tag. - time_seconds (float): - Time offset in seconds from the start of the - synthesized audio. - """ - - mark_name: str = proto.Field( - proto.STRING, - number=4, - ) - time_seconds: float = proto.Field( - proto.DOUBLE, - number=3, - ) - - -class StreamingSynthesizeConfig(proto.Message): - r"""Provides configuration information for the - StreamingSynthesize request. - - Attributes: - voice (google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams): - Required. The desired voice of the - synthesized audio. - """ - - voice: 'VoiceSelectionParams' = proto.Field( - proto.MESSAGE, - number=1, - message='VoiceSelectionParams', - ) - - -class StreamingSynthesisInput(proto.Message): - r"""Input to be synthesized. - - .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields - - Attributes: - text (str): - The raw text to be synthesized. It is - recommended that each input contains complete, - terminating sentences, as this will likely - result in better prosody in the output audio. - That being said, users are free to input text - however they please. - - This field is a member of `oneof`_ ``input_source``. - """ - - text: str = proto.Field( - proto.STRING, - number=1, - oneof='input_source', - ) - - -class StreamingSynthesizeRequest(proto.Message): - r"""Request message for the ``StreamingSynthesize`` method. Multiple - ``StreamingSynthesizeRequest`` messages are sent in one call. The - first message must contain a ``streaming_config`` that fully - specifies the request configuration and must not contain ``input``. - All subsequent messages must only have ``input`` set. - - This message has `oneof`_ fields (mutually exclusive fields). - For each oneof, at most one member field can be set at the same time. - Setting any member of the oneof automatically clears all other - members. - - .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields - - Attributes: - streaming_config (google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeConfig): - StreamingSynthesizeConfig to be used in this streaming - attempt. Only specified in the first message sent in a - ``StreamingSynthesize`` call. - - This field is a member of `oneof`_ ``streaming_request``. - input (google.cloud.texttospeech_v1beta1.types.StreamingSynthesisInput): - Input to synthesize. Specified in all messages but the first - in a ``StreamingSynthesize`` call. - - This field is a member of `oneof`_ ``streaming_request``. - """ - - streaming_config: 'StreamingSynthesizeConfig' = proto.Field( - proto.MESSAGE, - number=1, - oneof='streaming_request', - message='StreamingSynthesizeConfig', - ) - input: 'StreamingSynthesisInput' = proto.Field( - proto.MESSAGE, - number=2, - oneof='streaming_request', - message='StreamingSynthesisInput', - ) - - -class StreamingSynthesizeResponse(proto.Message): - r"""``StreamingSynthesizeResponse`` is the only message returned to the - client by ``StreamingSynthesize`` method. A series of zero or more - ``StreamingSynthesizeResponse`` messages are streamed back to the - client. - - Attributes: - audio_content (bytes): - The audio data bytes encoded as specified in - the request. This is headerless LINEAR16 audio - with a sample rate of 24000. - """ - - audio_content: bytes = proto.Field( - proto.BYTES, - number=1, - ) - - -__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts_lrs.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts_lrs.py deleted file mode 100644 index 233decd928f3..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/google/cloud/texttospeech_v1beta1/types/cloud_tts_lrs.py +++ /dev/null @@ -1,122 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -from __future__ import annotations - -from typing import MutableMapping, MutableSequence - -import proto # type: ignore - -from google.cloud.texttospeech_v1beta1.types import cloud_tts -from google.protobuf import timestamp_pb2 # type: ignore - - -__protobuf__ = proto.module( - package='google.cloud.texttospeech.v1beta1', - manifest={ - 'SynthesizeLongAudioRequest', - 'SynthesizeLongAudioResponse', - 'SynthesizeLongAudioMetadata', - }, -) - - -class SynthesizeLongAudioRequest(proto.Message): - r"""The top-level message sent by the client for the - ``SynthesizeLongAudio`` method. - - Attributes: - parent (str): - The resource states of the request in the form of - ``projects/*/locations/*``. - input (google.cloud.texttospeech_v1beta1.types.SynthesisInput): - Required. The Synthesizer requires either - plain text or SSML as input. - audio_config (google.cloud.texttospeech_v1beta1.types.AudioConfig): - Required. The configuration of the - synthesized audio. - output_gcs_uri (str): - Required. Specifies a Cloud Storage URI for the synthesis - results. Must be specified in the format: - ``gs://bucket_name/object_name``, and the bucket must - already exist. - voice (google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams): - Required. The desired voice of the - synthesized audio. - """ - - parent: str = proto.Field( - proto.STRING, - number=1, - ) - input: cloud_tts.SynthesisInput = proto.Field( - proto.MESSAGE, - number=2, - message=cloud_tts.SynthesisInput, - ) - audio_config: cloud_tts.AudioConfig = proto.Field( - proto.MESSAGE, - number=3, - message=cloud_tts.AudioConfig, - ) - output_gcs_uri: str = proto.Field( - proto.STRING, - number=4, - ) - voice: cloud_tts.VoiceSelectionParams = proto.Field( - proto.MESSAGE, - number=5, - message=cloud_tts.VoiceSelectionParams, - ) - - -class SynthesizeLongAudioResponse(proto.Message): - r"""The message returned to the client by the ``SynthesizeLongAudio`` - method. - - """ - - -class SynthesizeLongAudioMetadata(proto.Message): - r"""Metadata for response returned by the ``SynthesizeLongAudio`` - method. - - Attributes: - start_time (google.protobuf.timestamp_pb2.Timestamp): - Time when the request was received. - last_update_time (google.protobuf.timestamp_pb2.Timestamp): - Deprecated. Do not use. - progress_percentage (float): - The progress of the most recent processing - update in percentage, ie. 70.0%. - """ - - start_time: timestamp_pb2.Timestamp = proto.Field( - proto.MESSAGE, - number=1, - message=timestamp_pb2.Timestamp, - ) - last_update_time: timestamp_pb2.Timestamp = proto.Field( - proto.MESSAGE, - number=2, - message=timestamp_pb2.Timestamp, - ) - progress_percentage: float = proto.Field( - proto.DOUBLE, - number=3, - ) - - -__all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/mypy.ini b/owl-bot-staging/google-cloud-texttospeech/v1beta1/mypy.ini deleted file mode 100644 index 574c5aed394b..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/mypy.ini +++ /dev/null @@ -1,3 +0,0 @@ -[mypy] -python_version = 3.7 -namespace_packages = True diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/noxfile.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/noxfile.py deleted file mode 100644 index 70ae5c73c174..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/noxfile.py +++ /dev/null @@ -1,280 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 pathlib -import re -import shutil -import subprocess -import sys - - -import nox # type: ignore - -ALL_PYTHON = [ - "3.7", - "3.8", - "3.9", - "3.10", - "3.11", - "3.12", - "3.13", -] - -CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() - -LOWER_BOUND_CONSTRAINTS_FILE = CURRENT_DIRECTORY / "constraints.txt" -PACKAGE_NAME = 'google-cloud-texttospeech' - -BLACK_VERSION = "black==22.3.0" -BLACK_PATHS = ["docs", "google", "tests", "samples", "noxfile.py", "setup.py"] -DEFAULT_PYTHON_VERSION = "3.13" - -nox.sessions = [ - "unit", - "cover", - "mypy", - "check_lower_bounds" - # exclude update_lower_bounds from default - "docs", - "blacken", - "lint", - "prerelease_deps", -] - -@nox.session(python=ALL_PYTHON) -@nox.parametrize( - "protobuf_implementation", - [ "python", "upb", "cpp" ], -) -def unit(session, protobuf_implementation): - """Run the unit test suite.""" - - if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): - session.skip("cpp implementation is not supported in python 3.11+") - - session.install('coverage', 'pytest', 'pytest-cov', 'pytest-asyncio', 'asyncmock; python_version < "3.8"') - session.install('-e', '.', "-c", f"testing/constraints-{session.python}.txt") - - # Remove the 'cpp' implementation once support for Protobuf 3.x is dropped. - # The 'cpp' implementation requires Protobuf<4. - if protobuf_implementation == "cpp": - session.install("protobuf<4") - - session.run( - 'py.test', - '--quiet', - '--cov=google/cloud/texttospeech_v1beta1/', - '--cov=tests/', - '--cov-config=.coveragerc', - '--cov-report=term', - '--cov-report=html', - os.path.join('tests', 'unit', ''.join(session.posargs)), - env={ - "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, - }, - ) - -@nox.session(python=ALL_PYTHON[-1]) -@nox.parametrize( - "protobuf_implementation", - [ "python", "upb", "cpp" ], -) -def prerelease_deps(session, protobuf_implementation): - """Run the unit test suite against pre-release versions of dependencies.""" - - if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): - session.skip("cpp implementation is not supported in python 3.11+") - - # Install test environment dependencies - session.install('coverage', 'pytest', 'pytest-cov', 'pytest-asyncio', 'asyncmock; python_version < "3.8"') - - # Install the package without dependencies - session.install('-e', '.', '--no-deps') - - # We test the minimum dependency versions using the minimum Python - # version so the lowest python runtime that we test has a corresponding constraints - # file, located at `testing/constraints--.txt`, which contains all of the - # dependencies and extras. - with open( - CURRENT_DIRECTORY - / "testing" - / f"constraints-{ALL_PYTHON[0]}.txt", - encoding="utf-8", - ) as constraints_file: - constraints_text = constraints_file.read() - - # Ignore leading whitespace and comment lines. - constraints_deps = [ - match.group(1) - for match in re.finditer( - r"^\s*(\S+)(?===\S+)", constraints_text, flags=re.MULTILINE - ) - ] - - session.install(*constraints_deps) - - prerel_deps = [ - "googleapis-common-protos", - "google-api-core", - "google-auth", - # Exclude grpcio!=1.67.0rc1 which does not support python 3.13 - "grpcio!=1.67.0rc1", - "grpcio-status", - "protobuf", - "proto-plus", - ] - - for dep in prerel_deps: - session.install("--pre", "--no-deps", "--upgrade", dep) - - # Remaining dependencies - other_deps = [ - "requests", - ] - session.install(*other_deps) - - # Print out prerelease package versions - - session.run("python", "-c", "import google.api_core; print(google.api_core.__version__)") - session.run("python", "-c", "import google.auth; print(google.auth.__version__)") - session.run("python", "-c", "import grpc; print(grpc.__version__)") - session.run( - "python", "-c", "import google.protobuf; print(google.protobuf.__version__)" - ) - session.run( - "python", "-c", "import proto; print(proto.__version__)" - ) - - session.run( - 'py.test', - '--quiet', - '--cov=google/cloud/texttospeech_v1beta1/', - '--cov=tests/', - '--cov-config=.coveragerc', - '--cov-report=term', - '--cov-report=html', - os.path.join('tests', 'unit', ''.join(session.posargs)), - env={ - "PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION": protobuf_implementation, - }, - ) - - -@nox.session(python=DEFAULT_PYTHON_VERSION) -def cover(session): - """Run the final coverage report. - This outputs the coverage report aggregating coverage from the unit - test runs (not system test runs), and then erases coverage data. - """ - session.install("coverage", "pytest-cov") - session.run("coverage", "report", "--show-missing", "--fail-under=100") - - session.run("coverage", "erase") - - -@nox.session(python=ALL_PYTHON) -def mypy(session): - """Run the type checker.""" - session.install( - 'mypy', - 'types-requests', - 'types-protobuf' - ) - session.install('.') - session.run( - 'mypy', - '-p', - 'google', - ) - - -@nox.session -def update_lower_bounds(session): - """Update lower bounds in constraints.txt to match setup.py""" - session.install('google-cloud-testutils') - session.install('.') - - session.run( - 'lower-bound-checker', - 'update', - '--package-name', - PACKAGE_NAME, - '--constraints-file', - str(LOWER_BOUND_CONSTRAINTS_FILE), - ) - - -@nox.session -def check_lower_bounds(session): - """Check lower bounds in setup.py are reflected in constraints file""" - session.install('google-cloud-testutils') - session.install('.') - - session.run( - 'lower-bound-checker', - 'check', - '--package-name', - PACKAGE_NAME, - '--constraints-file', - str(LOWER_BOUND_CONSTRAINTS_FILE), - ) - -@nox.session(python=DEFAULT_PYTHON_VERSION) -def docs(session): - """Build the docs for this library.""" - - session.install("-e", ".") - session.install("sphinx==7.0.1", "alabaster", "recommonmark") - - shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True) - session.run( - "sphinx-build", - "-W", # warnings as errors - "-T", # show full traceback on exception - "-N", # no colors - "-b", - "html", - "-d", - os.path.join("docs", "_build", "doctrees", ""), - os.path.join("docs", ""), - os.path.join("docs", "_build", "html", ""), - ) - - -@nox.session(python=DEFAULT_PYTHON_VERSION) -def lint(session): - """Run linters. - - Returns a failure if the linters find linting errors or sufficiently - serious code quality issues. - """ - session.install("flake8", BLACK_VERSION) - session.run( - "black", - "--check", - *BLACK_PATHS, - ) - session.run("flake8", "google", "tests", "samples") - - -@nox.session(python=DEFAULT_PYTHON_VERSION) -def blacken(session): - """Run black. Format code to uniform standard.""" - session.install(BLACK_VERSION) - session.run( - "black", - *BLACK_PATHS, - ) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json deleted file mode 100644 index 2877853b66c5..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json +++ /dev/null @@ -1,659 +0,0 @@ -{ - "clientLibrary": { - "apis": [ - { - "id": "google.cloud.texttospeech.v1beta1", - "version": "v1beta1" - } - ], - "language": "PYTHON", - "name": "google-cloud-texttospeech", - "version": "0.1.0" - }, - "snippets": [ - { - "canonical": true, - "clientMethod": { - "async": true, - "client": { - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeAsyncClient", - "shortName": "TextToSpeechLongAudioSynthesizeAsyncClient" - }, - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeAsyncClient.synthesize_long_audio", - "method": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeechLongAudioSynthesize.SynthesizeLongAudio", - "service": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeechLongAudioSynthesize", - "shortName": "TextToSpeechLongAudioSynthesize" - }, - "shortName": "SynthesizeLongAudio" - }, - "parameters": [ - { - "name": "request", - "type": "google.cloud.texttospeech_v1beta1.types.SynthesizeLongAudioRequest" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "google.api_core.operation_async.AsyncOperation", - "shortName": "synthesize_long_audio" - }, - "description": "Sample for SynthesizeLongAudio", - "file": "texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1beta1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_async", - "segments": [ - { - "end": 67, - "start": 27, - "type": "FULL" - }, - { - "end": 67, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 57, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 64, - "start": 58, - "type": "REQUEST_EXECUTION" - }, - { - "end": 68, - "start": 65, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py" - }, - { - "canonical": true, - "clientMethod": { - "client": { - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeClient", - "shortName": "TextToSpeechLongAudioSynthesizeClient" - }, - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeClient.synthesize_long_audio", - "method": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeechLongAudioSynthesize.SynthesizeLongAudio", - "service": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeechLongAudioSynthesize", - "shortName": "TextToSpeechLongAudioSynthesize" - }, - "shortName": "SynthesizeLongAudio" - }, - "parameters": [ - { - "name": "request", - "type": "google.cloud.texttospeech_v1beta1.types.SynthesizeLongAudioRequest" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "google.api_core.operation.Operation", - "shortName": "synthesize_long_audio" - }, - "description": "Sample for SynthesizeLongAudio", - "file": "texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1beta1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_sync", - "segments": [ - { - "end": 67, - "start": 27, - "type": "FULL" - }, - { - "end": 67, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 57, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 64, - "start": 58, - "type": "REQUEST_EXECUTION" - }, - { - "end": 68, - "start": 65, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py" - }, - { - "canonical": true, - "clientMethod": { - "async": true, - "client": { - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechAsyncClient", - "shortName": "TextToSpeechAsyncClient" - }, - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechAsyncClient.list_voices", - "method": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech.ListVoices", - "service": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech", - "shortName": "TextToSpeech" - }, - "shortName": "ListVoices" - }, - "parameters": [ - { - "name": "request", - "type": "google.cloud.texttospeech_v1beta1.types.ListVoicesRequest" - }, - { - "name": "language_code", - "type": "str" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "google.cloud.texttospeech_v1beta1.types.ListVoicesResponse", - "shortName": "list_voices" - }, - "description": "Sample for ListVoices", - "file": "texttospeech_v1beta1_generated_text_to_speech_list_voices_async.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1beta1_generated_TextToSpeech_ListVoices_async", - "segments": [ - { - "end": 50, - "start": 27, - "type": "FULL" - }, - { - "end": 50, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 44, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 47, - "start": 45, - "type": "REQUEST_EXECUTION" - }, - { - "end": 51, - "start": 48, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1beta1_generated_text_to_speech_list_voices_async.py" - }, - { - "canonical": true, - "clientMethod": { - "client": { - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechClient", - "shortName": "TextToSpeechClient" - }, - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechClient.list_voices", - "method": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech.ListVoices", - "service": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech", - "shortName": "TextToSpeech" - }, - "shortName": "ListVoices" - }, - "parameters": [ - { - "name": "request", - "type": "google.cloud.texttospeech_v1beta1.types.ListVoicesRequest" - }, - { - "name": "language_code", - "type": "str" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "google.cloud.texttospeech_v1beta1.types.ListVoicesResponse", - "shortName": "list_voices" - }, - "description": "Sample for ListVoices", - "file": "texttospeech_v1beta1_generated_text_to_speech_list_voices_sync.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1beta1_generated_TextToSpeech_ListVoices_sync", - "segments": [ - { - "end": 50, - "start": 27, - "type": "FULL" - }, - { - "end": 50, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 44, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 47, - "start": 45, - "type": "REQUEST_EXECUTION" - }, - { - "end": 51, - "start": 48, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1beta1_generated_text_to_speech_list_voices_sync.py" - }, - { - "canonical": true, - "clientMethod": { - "async": true, - "client": { - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechAsyncClient", - "shortName": "TextToSpeechAsyncClient" - }, - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechAsyncClient.streaming_synthesize", - "method": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech.StreamingSynthesize", - "service": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech", - "shortName": "TextToSpeech" - }, - "shortName": "StreamingSynthesize" - }, - "parameters": [ - { - "name": "requests", - "type": "Iterator[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeRequest]" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "Iterable[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeResponse]", - "shortName": "streaming_synthesize" - }, - "description": "Sample for StreamingSynthesize", - "file": "texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_async.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1beta1_generated_TextToSpeech_StreamingSynthesize_async", - "segments": [ - { - "end": 65, - "start": 27, - "type": "FULL" - }, - { - "end": 65, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 58, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 61, - "start": 59, - "type": "REQUEST_EXECUTION" - }, - { - "end": 66, - "start": 62, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_async.py" - }, - { - "canonical": true, - "clientMethod": { - "client": { - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechClient", - "shortName": "TextToSpeechClient" - }, - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechClient.streaming_synthesize", - "method": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech.StreamingSynthesize", - "service": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech", - "shortName": "TextToSpeech" - }, - "shortName": "StreamingSynthesize" - }, - "parameters": [ - { - "name": "requests", - "type": "Iterator[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeRequest]" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "Iterable[google.cloud.texttospeech_v1beta1.types.StreamingSynthesizeResponse]", - "shortName": "streaming_synthesize" - }, - "description": "Sample for StreamingSynthesize", - "file": "texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_sync.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1beta1_generated_TextToSpeech_StreamingSynthesize_sync", - "segments": [ - { - "end": 65, - "start": 27, - "type": "FULL" - }, - { - "end": 65, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 58, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 61, - "start": 59, - "type": "REQUEST_EXECUTION" - }, - { - "end": 66, - "start": 62, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_sync.py" - }, - { - "canonical": true, - "clientMethod": { - "async": true, - "client": { - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechAsyncClient", - "shortName": "TextToSpeechAsyncClient" - }, - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechAsyncClient.synthesize_speech", - "method": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech.SynthesizeSpeech", - "service": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech", - "shortName": "TextToSpeech" - }, - "shortName": "SynthesizeSpeech" - }, - "parameters": [ - { - "name": "request", - "type": "google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechRequest" - }, - { - "name": "input", - "type": "google.cloud.texttospeech_v1beta1.types.SynthesisInput" - }, - { - "name": "voice", - "type": "google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams" - }, - { - "name": "audio_config", - "type": "google.cloud.texttospeech_v1beta1.types.AudioConfig" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechResponse", - "shortName": "synthesize_speech" - }, - "description": "Sample for SynthesizeSpeech", - "file": "texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_async.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1beta1_generated_TextToSpeech_SynthesizeSpeech_async", - "segments": [ - { - "end": 62, - "start": 27, - "type": "FULL" - }, - { - "end": 62, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 56, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 59, - "start": 57, - "type": "REQUEST_EXECUTION" - }, - { - "end": 63, - "start": 60, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_async.py" - }, - { - "canonical": true, - "clientMethod": { - "client": { - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechClient", - "shortName": "TextToSpeechClient" - }, - "fullName": "google.cloud.texttospeech_v1beta1.TextToSpeechClient.synthesize_speech", - "method": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech.SynthesizeSpeech", - "service": { - "fullName": "google.cloud.texttospeech.v1beta1.TextToSpeech", - "shortName": "TextToSpeech" - }, - "shortName": "SynthesizeSpeech" - }, - "parameters": [ - { - "name": "request", - "type": "google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechRequest" - }, - { - "name": "input", - "type": "google.cloud.texttospeech_v1beta1.types.SynthesisInput" - }, - { - "name": "voice", - "type": "google.cloud.texttospeech_v1beta1.types.VoiceSelectionParams" - }, - { - "name": "audio_config", - "type": "google.cloud.texttospeech_v1beta1.types.AudioConfig" - }, - { - "name": "retry", - "type": "google.api_core.retry.Retry" - }, - { - "name": "timeout", - "type": "float" - }, - { - "name": "metadata", - "type": "Sequence[Tuple[str, str]" - } - ], - "resultType": "google.cloud.texttospeech_v1beta1.types.SynthesizeSpeechResponse", - "shortName": "synthesize_speech" - }, - "description": "Sample for SynthesizeSpeech", - "file": "texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_sync.py", - "language": "PYTHON", - "origin": "API_DEFINITION", - "regionTag": "texttospeech_v1beta1_generated_TextToSpeech_SynthesizeSpeech_sync", - "segments": [ - { - "end": 62, - "start": 27, - "type": "FULL" - }, - { - "end": 62, - "start": 27, - "type": "SHORT" - }, - { - "end": 40, - "start": 38, - "type": "CLIENT_INITIALIZATION" - }, - { - "end": 56, - "start": 41, - "type": "REQUEST_INITIALIZATION" - }, - { - "end": 59, - "start": 57, - "type": "REQUEST_EXECUTION" - }, - { - "end": 63, - "start": 60, - "type": "RESPONSE_HANDLING" - } - ], - "title": "texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_sync.py" - } - ] -} diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_async.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_async.py deleted file mode 100644 index 80d0fca4abdd..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_async.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for ListVoices -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1beta1_generated_TextToSpeech_ListVoices_async] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1beta1 - - -async def sample_list_voices(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechAsyncClient() - - # Initialize request argument(s) - request = texttospeech_v1beta1.ListVoicesRequest( - ) - - # Make the request - response = await client.list_voices(request=request) - - # Handle the response - print(response) - -# [END texttospeech_v1beta1_generated_TextToSpeech_ListVoices_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_sync.py deleted file mode 100644 index ecd143cd38b1..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_list_voices_sync.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for ListVoices -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1beta1_generated_TextToSpeech_ListVoices_sync] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1beta1 - - -def sample_list_voices(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechClient() - - # Initialize request argument(s) - request = texttospeech_v1beta1.ListVoicesRequest( - ) - - # Make the request - response = client.list_voices(request=request) - - # Handle the response - print(response) - -# [END texttospeech_v1beta1_generated_TextToSpeech_ListVoices_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py deleted file mode 100644 index 1319a5349f8b..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_async.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for SynthesizeLongAudio -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1beta1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_async] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1beta1 - - -async def sample_synthesize_long_audio(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeAsyncClient() - - # Initialize request argument(s) - input = texttospeech_v1beta1.SynthesisInput() - input.text = "text_value" - - audio_config = texttospeech_v1beta1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - voice = texttospeech_v1beta1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - request = texttospeech_v1beta1.SynthesizeLongAudioRequest( - input=input, - audio_config=audio_config, - output_gcs_uri="output_gcs_uri_value", - voice=voice, - ) - - # Make the request - operation = client.synthesize_long_audio(request=request) - - print("Waiting for operation to complete...") - - response = (await operation).result() - - # Handle the response - print(response) - -# [END texttospeech_v1beta1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py deleted file mode 100644 index 2acd42ac9c00..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_long_audio_synthesize_synthesize_long_audio_sync.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for SynthesizeLongAudio -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1beta1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_sync] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1beta1 - - -def sample_synthesize_long_audio(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechLongAudioSynthesizeClient() - - # Initialize request argument(s) - input = texttospeech_v1beta1.SynthesisInput() - input.text = "text_value" - - audio_config = texttospeech_v1beta1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - voice = texttospeech_v1beta1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - request = texttospeech_v1beta1.SynthesizeLongAudioRequest( - input=input, - audio_config=audio_config, - output_gcs_uri="output_gcs_uri_value", - voice=voice, - ) - - # Make the request - operation = client.synthesize_long_audio(request=request) - - print("Waiting for operation to complete...") - - response = operation.result() - - # Handle the response - print(response) - -# [END texttospeech_v1beta1_generated_TextToSpeechLongAudioSynthesize_SynthesizeLongAudio_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_async.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_async.py deleted file mode 100644 index 9b403cb1b4a1..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_async.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for StreamingSynthesize -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1beta1_generated_TextToSpeech_StreamingSynthesize_async] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1beta1 - - -async def sample_streaming_synthesize(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechAsyncClient() - - # Initialize request argument(s) - streaming_config = texttospeech_v1beta1.StreamingSynthesizeConfig() - streaming_config.voice.language_code = "language_code_value" - - request = texttospeech_v1beta1.StreamingSynthesizeRequest( - streaming_config=streaming_config, - ) - - # This method expects an iterator which contains - # 'texttospeech_v1beta1.StreamingSynthesizeRequest' objects - # Here we create a generator that yields a single `request` for - # demonstrative purposes. - requests = [request] - - def request_generator(): - for request in requests: - yield request - - # Make the request - stream = await client.streaming_synthesize(requests=request_generator()) - - # Handle the response - async for response in stream: - print(response) - -# [END texttospeech_v1beta1_generated_TextToSpeech_StreamingSynthesize_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_sync.py deleted file mode 100644 index cda6d83baa38..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_streaming_synthesize_sync.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for StreamingSynthesize -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1beta1_generated_TextToSpeech_StreamingSynthesize_sync] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1beta1 - - -def sample_streaming_synthesize(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechClient() - - # Initialize request argument(s) - streaming_config = texttospeech_v1beta1.StreamingSynthesizeConfig() - streaming_config.voice.language_code = "language_code_value" - - request = texttospeech_v1beta1.StreamingSynthesizeRequest( - streaming_config=streaming_config, - ) - - # This method expects an iterator which contains - # 'texttospeech_v1beta1.StreamingSynthesizeRequest' objects - # Here we create a generator that yields a single `request` for - # demonstrative purposes. - requests = [request] - - def request_generator(): - for request in requests: - yield request - - # Make the request - stream = client.streaming_synthesize(requests=request_generator()) - - # Handle the response - for response in stream: - print(response) - -# [END texttospeech_v1beta1_generated_TextToSpeech_StreamingSynthesize_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_async.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_async.py deleted file mode 100644 index 6572f699ae90..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_async.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for SynthesizeSpeech -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1beta1_generated_TextToSpeech_SynthesizeSpeech_async] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1beta1 - - -async def sample_synthesize_speech(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechAsyncClient() - - # Initialize request argument(s) - input = texttospeech_v1beta1.SynthesisInput() - input.text = "text_value" - - voice = texttospeech_v1beta1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - audio_config = texttospeech_v1beta1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - request = texttospeech_v1beta1.SynthesizeSpeechRequest( - input=input, - voice=voice, - audio_config=audio_config, - ) - - # Make the request - response = await client.synthesize_speech(request=request) - - # Handle the response - print(response) - -# [END texttospeech_v1beta1_generated_TextToSpeech_SynthesizeSpeech_async] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_sync.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_sync.py deleted file mode 100644 index 3c635c21ded4..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/samples/generated_samples/texttospeech_v1beta1_generated_text_to_speech_synthesize_speech_sync.py +++ /dev/null @@ -1,63 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# -# Generated code. DO NOT EDIT! -# -# Snippet for SynthesizeSpeech -# NOTE: This snippet has been automatically generated for illustrative purposes only. -# It may require modifications to work in your environment. - -# To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-texttospeech - - -# [START texttospeech_v1beta1_generated_TextToSpeech_SynthesizeSpeech_sync] -# This snippet has been automatically generated and should be regarded as a -# code template only. -# It will require modifications to work: -# - It may require correct/in-range values for request initialization. -# - It may require specifying regional endpoints when creating the service -# client as shown in: -# https://googleapis.dev/python/google-api-core/latest/client_options.html -from google.cloud import texttospeech_v1beta1 - - -def sample_synthesize_speech(): - # Create a client - client = texttospeech_v1beta1.TextToSpeechClient() - - # Initialize request argument(s) - input = texttospeech_v1beta1.SynthesisInput() - input.text = "text_value" - - voice = texttospeech_v1beta1.VoiceSelectionParams() - voice.language_code = "language_code_value" - - audio_config = texttospeech_v1beta1.AudioConfig() - audio_config.audio_encoding = "ALAW" - - request = texttospeech_v1beta1.SynthesizeSpeechRequest( - input=input, - voice=voice, - audio_config=audio_config, - ) - - # Make the request - response = client.synthesize_speech(request=request) - - # Handle the response - print(response) - -# [END texttospeech_v1beta1_generated_TextToSpeech_SynthesizeSpeech_sync] diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/scripts/fixup_texttospeech_v1beta1_keywords.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/scripts/fixup_texttospeech_v1beta1_keywords.py deleted file mode 100644 index 349a0a5110a2..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/scripts/fixup_texttospeech_v1beta1_keywords.py +++ /dev/null @@ -1,179 +0,0 @@ -#! /usr/bin/env python3 -# -*- coding: utf-8 -*- -# Copyright 2024 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 argparse -import os -import libcst as cst -import pathlib -import sys -from typing import (Any, Callable, Dict, List, Sequence, Tuple) - - -def partition( - predicate: Callable[[Any], bool], - iterator: Sequence[Any] -) -> Tuple[List[Any], List[Any]]: - """A stable, out-of-place partition.""" - results = ([], []) - - for i in iterator: - results[int(predicate(i))].append(i) - - # Returns trueList, falseList - return results[1], results[0] - - -class texttospeechCallTransformer(cst.CSTTransformer): - CTRL_PARAMS: Tuple[str] = ('retry', 'timeout', 'metadata') - METHOD_TO_PARAMS: Dict[str, Tuple[str]] = { - 'list_voices': ('language_code', ), - 'streaming_synthesize': ('streaming_config', 'input', ), - 'synthesize_long_audio': ('input', 'audio_config', 'output_gcs_uri', 'voice', 'parent', ), - 'synthesize_speech': ('input', 'voice', 'audio_config', 'enable_time_pointing', 'advanced_voice_options', ), - } - - def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode: - try: - key = original.func.attr.value - kword_params = self.METHOD_TO_PARAMS[key] - except (AttributeError, KeyError): - # Either not a method from the API or too convoluted to be sure. - return updated - - # If the existing code is valid, keyword args come after positional args. - # Therefore, all positional args must map to the first parameters. - args, kwargs = partition(lambda a: not bool(a.keyword), updated.args) - if any(k.keyword.value == "request" for k in kwargs): - # We've already fixed this file, don't fix it again. - return updated - - kwargs, ctrl_kwargs = partition( - lambda a: a.keyword.value not in self.CTRL_PARAMS, - kwargs - ) - - args, ctrl_args = args[:len(kword_params)], args[len(kword_params):] - ctrl_kwargs.extend(cst.Arg(value=a.value, keyword=cst.Name(value=ctrl)) - for a, ctrl in zip(ctrl_args, self.CTRL_PARAMS)) - - request_arg = cst.Arg( - value=cst.Dict([ - cst.DictElement( - cst.SimpleString("'{}'".format(name)), -cst.Element(value=arg.value) - ) - # Note: the args + kwargs looks silly, but keep in mind that - # the control parameters had to be stripped out, and that - # those could have been passed positionally or by keyword. - for name, arg in zip(kword_params, args + kwargs)]), - keyword=cst.Name("request") - ) - - return updated.with_changes( - args=[request_arg] + ctrl_kwargs - ) - - -def fix_files( - in_dir: pathlib.Path, - out_dir: pathlib.Path, - *, - transformer=texttospeechCallTransformer(), -): - """Duplicate the input dir to the output dir, fixing file method calls. - - Preconditions: - * in_dir is a real directory - * out_dir is a real, empty directory - """ - pyfile_gen = ( - pathlib.Path(os.path.join(root, f)) - for root, _, files in os.walk(in_dir) - for f in files if os.path.splitext(f)[1] == ".py" - ) - - for fpath in pyfile_gen: - with open(fpath, 'r') as f: - src = f.read() - - # Parse the code and insert method call fixes. - tree = cst.parse_module(src) - updated = tree.visit(transformer) - - # Create the path and directory structure for the new file. - updated_path = out_dir.joinpath(fpath.relative_to(in_dir)) - updated_path.parent.mkdir(parents=True, exist_ok=True) - - # Generate the updated source file at the corresponding path. - with open(updated_path, 'w') as f: - f.write(updated.code) - - -if __name__ == '__main__': - parser = argparse.ArgumentParser( - description="""Fix up source that uses the texttospeech client library. - -The existing sources are NOT overwritten but are copied to output_dir with changes made. - -Note: This tool operates at a best-effort level at converting positional - parameters in client method calls to keyword based parameters. - Cases where it WILL FAIL include - A) * or ** expansion in a method call. - B) Calls via function or method alias (includes free function calls) - C) Indirect or dispatched calls (e.g. the method is looked up dynamically) - - These all constitute false negatives. The tool will also detect false - positives when an API method shares a name with another method. -""") - parser.add_argument( - '-d', - '--input-directory', - required=True, - dest='input_dir', - help='the input directory to walk for python files to fix up', - ) - parser.add_argument( - '-o', - '--output-directory', - required=True, - dest='output_dir', - help='the directory to output files fixed via un-flattening', - ) - args = parser.parse_args() - input_dir = pathlib.Path(args.input_dir) - output_dir = pathlib.Path(args.output_dir) - if not input_dir.is_dir(): - print( - f"input directory '{input_dir}' does not exist or is not a directory", - file=sys.stderr, - ) - sys.exit(-1) - - if not output_dir.is_dir(): - print( - f"output directory '{output_dir}' does not exist or is not a directory", - file=sys.stderr, - ) - sys.exit(-1) - - if os.listdir(output_dir): - print( - f"output directory '{output_dir}' is not empty", - file=sys.stderr, - ) - sys.exit(-1) - - fix_files(input_dir, output_dir) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/setup.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/setup.py deleted file mode 100644 index d91c15741bbe..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/setup.py +++ /dev/null @@ -1,98 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 io -import os -import re - -import setuptools # type: ignore - -package_root = os.path.abspath(os.path.dirname(__file__)) - -name = 'google-cloud-texttospeech' - - -description = "Google Cloud Texttospeech API client library" - -version = None - -with open(os.path.join(package_root, 'google/cloud/texttospeech/gapic_version.py')) as fp: - version_candidates = re.findall(r"(?<=\")\d+.\d+.\d+(?=\")", fp.read()) - assert (len(version_candidates) == 1) - version = version_candidates[0] - -if version[0] == "0": - release_status = "Development Status :: 4 - Beta" -else: - release_status = "Development Status :: 5 - Production/Stable" - -dependencies = [ - "google-api-core[grpc] >= 1.34.1, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*", - # Exclude incompatible versions of `google-auth` - # See https://github.com/googleapis/google-cloud-python/issues/12364 - "google-auth >= 2.14.1, <3.0.0dev,!=2.24.0,!=2.25.0", - "proto-plus >= 1.22.3, <2.0.0dev", - "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", - "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", -] -extras = { -} -url = "https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-texttospeech" - -package_root = os.path.abspath(os.path.dirname(__file__)) - -readme_filename = os.path.join(package_root, "README.rst") -with io.open(readme_filename, encoding="utf-8") as readme_file: - readme = readme_file.read() - -packages = [ - package - for package in setuptools.find_namespace_packages() - if package.startswith("google") -] - -setuptools.setup( - name=name, - version=version, - description=description, - long_description=readme, - author="Google LLC", - author_email="googleapis-packages@google.com", - license="Apache 2.0", - url=url, - classifiers=[ - release_status, - "Intended Audience :: Developers", - "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Operating System :: OS Independent", - "Topic :: Internet", - ], - platforms="Posix; MacOS X; Windows", - packages=packages, - python_requires=">=3.7", - install_requires=dependencies, - extras_require=extras, - include_package_data=True, - zip_safe=False, -) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.10.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.10.txt deleted file mode 100644 index ed7f9aed2559..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.10.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -proto-plus -protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.11.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.11.txt deleted file mode 100644 index ed7f9aed2559..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.11.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -proto-plus -protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.12.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.12.txt deleted file mode 100644 index ed7f9aed2559..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.12.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -proto-plus -protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.13.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.13.txt deleted file mode 100644 index ed7f9aed2559..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.13.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -proto-plus -protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.7.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.7.txt deleted file mode 100644 index fc812592b0ee..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.7.txt +++ /dev/null @@ -1,10 +0,0 @@ -# This constraints file is used to check that lower bounds -# are correct in setup.py -# List all library dependencies and extras in this file. -# Pin the version to the lower bound. -# e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0dev", -# Then this file should have google-cloud-foo==1.14.0 -google-api-core==1.34.1 -google-auth==2.14.1 -proto-plus==1.22.3 -protobuf==3.20.2 diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.8.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.8.txt deleted file mode 100644 index ed7f9aed2559..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.8.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -proto-plus -protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.9.txt b/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.9.txt deleted file mode 100644 index ed7f9aed2559..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/testing/constraints-3.9.txt +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -proto-plus -protobuf diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/__init__.py deleted file mode 100644 index 7b3de3117f38..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ - -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/__init__.py deleted file mode 100644 index 7b3de3117f38..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ - -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/__init__.py deleted file mode 100644 index 7b3de3117f38..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ - -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/__init__.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/__init__.py deleted file mode 100644 index 7b3de3117f38..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ - -# -*- coding: utf-8 -*- -# Copyright 2024 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. -# diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech.py deleted file mode 100644 index c5d00459fbf4..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech.py +++ /dev/null @@ -1,3141 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 -# try/except added for compatibility with python < 3.8 -try: - from unittest import mock - from unittest.mock import AsyncMock # pragma: NO COVER -except ImportError: # pragma: NO COVER - import mock - -import grpc -from grpc.experimental import aio -from collections.abc import Iterable, AsyncIterable -from google.protobuf import json_format -import json -import math -import pytest -from google.api_core import api_core_version -from proto.marshal.rules.dates import DurationRule, TimestampRule -from proto.marshal.rules import wrappers -from requests import Response -from requests import Request, PreparedRequest -from requests.sessions import Session -from google.protobuf import json_format - -try: - from google.auth.aio import credentials as ga_credentials_async - HAS_GOOGLE_AUTH_AIO = True -except ImportError: # pragma: NO COVER - HAS_GOOGLE_AUTH_AIO = False - -from google.api_core import client_options -from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import grpc_helpers -from google.api_core import grpc_helpers_async -from google.api_core import path_template -from google.api_core import retry as retries -from google.auth import credentials as ga_credentials -from google.auth.exceptions import MutualTLSChannelError -from google.cloud.texttospeech_v1beta1.services.text_to_speech import TextToSpeechAsyncClient -from google.cloud.texttospeech_v1beta1.services.text_to_speech import TextToSpeechClient -from google.cloud.texttospeech_v1beta1.services.text_to_speech import transports -from google.cloud.texttospeech_v1beta1.types import cloud_tts -from google.longrunning import operations_pb2 # type: ignore -from google.oauth2 import service_account -import google.auth - - -async def mock_async_gen(data, chunk_size=1): - for i in range(0, len(data)): # pragma: NO COVER - chunk = data[i : i + chunk_size] - yield chunk.encode("utf-8") - -def client_cert_source_callback(): - return b"cert bytes", b"key bytes" - -# TODO: use async auth anon credentials by default once the minimum version of google-auth is upgraded. -# See related issue: https://github.com/googleapis/gapic-generator-python/issues/2107. -def async_anonymous_credentials(): - if HAS_GOOGLE_AUTH_AIO: - return ga_credentials_async.AnonymousCredentials() - return ga_credentials.AnonymousCredentials() - -# If default endpoint is localhost, then default mtls endpoint will be the same. -# This method modifies the default endpoint so the client can produce a different -# mtls endpoint for endpoint testing purposes. -def modify_default_endpoint(client): - return "foo.googleapis.com" if ("localhost" in client.DEFAULT_ENDPOINT) else client.DEFAULT_ENDPOINT - -# If default endpoint template is localhost, then default mtls endpoint will be the same. -# This method modifies the default endpoint template so the client can produce a different -# mtls endpoint for endpoint testing purposes. -def modify_default_endpoint_template(client): - return "test.{UNIVERSE_DOMAIN}" if ("localhost" in client._DEFAULT_ENDPOINT_TEMPLATE) else client._DEFAULT_ENDPOINT_TEMPLATE - - -def test__get_default_mtls_endpoint(): - api_endpoint = "example.googleapis.com" - api_mtls_endpoint = "example.mtls.googleapis.com" - sandbox_endpoint = "example.sandbox.googleapis.com" - sandbox_mtls_endpoint = "example.mtls.sandbox.googleapis.com" - non_googleapi = "api.example.com" - - assert TextToSpeechClient._get_default_mtls_endpoint(None) is None - assert TextToSpeechClient._get_default_mtls_endpoint(api_endpoint) == api_mtls_endpoint - assert TextToSpeechClient._get_default_mtls_endpoint(api_mtls_endpoint) == api_mtls_endpoint - assert TextToSpeechClient._get_default_mtls_endpoint(sandbox_endpoint) == sandbox_mtls_endpoint - assert TextToSpeechClient._get_default_mtls_endpoint(sandbox_mtls_endpoint) == sandbox_mtls_endpoint - assert TextToSpeechClient._get_default_mtls_endpoint(non_googleapi) == non_googleapi - -def test__read_environment_variables(): - assert TextToSpeechClient._read_environment_variables() == (False, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - assert TextToSpeechClient._read_environment_variables() == (True, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): - assert TextToSpeechClient._read_environment_variables() == (False, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): - with pytest.raises(ValueError) as excinfo: - TextToSpeechClient._read_environment_variables() - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - assert TextToSpeechClient._read_environment_variables() == (False, "never", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - assert TextToSpeechClient._read_environment_variables() == (False, "always", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}): - assert TextToSpeechClient._read_environment_variables() == (False, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): - with pytest.raises(MutualTLSChannelError) as excinfo: - TextToSpeechClient._read_environment_variables() - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" - - with mock.patch.dict(os.environ, {"GOOGLE_CLOUD_UNIVERSE_DOMAIN": "foo.com"}): - assert TextToSpeechClient._read_environment_variables() == (False, "auto", "foo.com") - -def test__get_client_cert_source(): - mock_provided_cert_source = mock.Mock() - mock_default_cert_source = mock.Mock() - - assert TextToSpeechClient._get_client_cert_source(None, False) is None - assert TextToSpeechClient._get_client_cert_source(mock_provided_cert_source, False) is None - assert TextToSpeechClient._get_client_cert_source(mock_provided_cert_source, True) == mock_provided_cert_source - - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): - with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_default_cert_source): - assert TextToSpeechClient._get_client_cert_source(None, True) is mock_default_cert_source - assert TextToSpeechClient._get_client_cert_source(mock_provided_cert_source, "true") is mock_provided_cert_source - -@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) -@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) -def test__get_api_endpoint(): - api_override = "foo.com" - mock_client_cert_source = mock.Mock() - default_universe = TextToSpeechClient._DEFAULT_UNIVERSE - default_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) - mock_universe = "bar.com" - mock_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) - - assert TextToSpeechClient._get_api_endpoint(api_override, mock_client_cert_source, default_universe, "always") == api_override - assert TextToSpeechClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "auto") == TextToSpeechClient.DEFAULT_MTLS_ENDPOINT - assert TextToSpeechClient._get_api_endpoint(None, None, default_universe, "auto") == default_endpoint - assert TextToSpeechClient._get_api_endpoint(None, None, default_universe, "always") == TextToSpeechClient.DEFAULT_MTLS_ENDPOINT - assert TextToSpeechClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "always") == TextToSpeechClient.DEFAULT_MTLS_ENDPOINT - assert TextToSpeechClient._get_api_endpoint(None, None, mock_universe, "never") == mock_endpoint - assert TextToSpeechClient._get_api_endpoint(None, None, default_universe, "never") == default_endpoint - - with pytest.raises(MutualTLSChannelError) as excinfo: - TextToSpeechClient._get_api_endpoint(None, mock_client_cert_source, mock_universe, "auto") - assert str(excinfo.value) == "mTLS is not supported in any universe other than googleapis.com." - - -def test__get_universe_domain(): - client_universe_domain = "foo.com" - universe_domain_env = "bar.com" - - assert TextToSpeechClient._get_universe_domain(client_universe_domain, universe_domain_env) == client_universe_domain - assert TextToSpeechClient._get_universe_domain(None, universe_domain_env) == universe_domain_env - assert TextToSpeechClient._get_universe_domain(None, None) == TextToSpeechClient._DEFAULT_UNIVERSE - - with pytest.raises(ValueError) as excinfo: - TextToSpeechClient._get_universe_domain("", None) - assert str(excinfo.value) == "Universe Domain cannot be an empty string." - -@pytest.mark.parametrize("client_class,transport_class,transport_name", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc"), - (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest"), -]) -def test__validate_universe_domain(client_class, transport_class, transport_name): - client = client_class( - transport=transport_class( - credentials=ga_credentials.AnonymousCredentials() - ) - ) - assert client._validate_universe_domain() == True - - # Test the case when universe is already validated. - assert client._validate_universe_domain() == True - - if transport_name == "grpc": - # Test the case where credentials are provided by the - # `local_channel_credentials`. The default universes in both match. - channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) - client = client_class(transport=transport_class(channel=channel)) - assert client._validate_universe_domain() == True - - # Test the case where credentials do not exist: e.g. a transport is provided - # with no credentials. Validation should still succeed because there is no - # mismatch with non-existent credentials. - channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) - transport=transport_class(channel=channel) - transport._credentials = None - client = client_class(transport=transport) - assert client._validate_universe_domain() == True - - # TODO: This is needed to cater for older versions of google-auth - # Make this test unconditional once the minimum supported version of - # google-auth becomes 2.23.0 or higher. - google_auth_major, google_auth_minor = [int(part) for part in google.auth.__version__.split(".")[0:2]] - if google_auth_major > 2 or (google_auth_major == 2 and google_auth_minor >= 23): - credentials = ga_credentials.AnonymousCredentials() - credentials._universe_domain = "foo.com" - # Test the case when there is a universe mismatch from the credentials. - client = client_class( - transport=transport_class(credentials=credentials) - ) - with pytest.raises(ValueError) as excinfo: - client._validate_universe_domain() - assert str(excinfo.value) == "The configured universe domain (googleapis.com) does not match the universe domain found in the credentials (foo.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." - - # Test the case when there is a universe mismatch from the client. - # - # TODO: Make this test unconditional once the minimum supported version of - # google-api-core becomes 2.15.0 or higher. - api_core_major, api_core_minor = [int(part) for part in api_core_version.__version__.split(".")[0:2]] - if api_core_major > 2 or (api_core_major == 2 and api_core_minor >= 15): - client = client_class(client_options={"universe_domain": "bar.com"}, transport=transport_class(credentials=ga_credentials.AnonymousCredentials(),)) - with pytest.raises(ValueError) as excinfo: - client._validate_universe_domain() - assert str(excinfo.value) == "The configured universe domain (bar.com) does not match the universe domain found in the credentials (googleapis.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." - - # Test that ValueError is raised if universe_domain is provided via client options and credentials is None - with pytest.raises(ValueError): - client._compare_universes("foo.bar", None) - - -@pytest.mark.parametrize("client_class,transport_name", [ - (TextToSpeechClient, "grpc"), - (TextToSpeechAsyncClient, "grpc_asyncio"), - (TextToSpeechClient, "rest"), -]) -def test_text_to_speech_client_from_service_account_info(client_class, transport_name): - creds = ga_credentials.AnonymousCredentials() - with mock.patch.object(service_account.Credentials, 'from_service_account_info') as factory: - factory.return_value = creds - info = {"valid": True} - client = client_class.from_service_account_info(info, transport=transport_name) - assert client.transport._credentials == creds - assert isinstance(client, client_class) - - assert client.transport._host == ( - 'texttospeech.googleapis.com:443' - if transport_name in ['grpc', 'grpc_asyncio'] - else - 'https://texttospeech.googleapis.com' - ) - - -@pytest.mark.parametrize("transport_class,transport_name", [ - (transports.TextToSpeechGrpcTransport, "grpc"), - (transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio"), - (transports.TextToSpeechRestTransport, "rest"), -]) -def test_text_to_speech_client_service_account_always_use_jwt(transport_class, transport_name): - with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: - creds = service_account.Credentials(None, None, None) - transport = transport_class(credentials=creds, always_use_jwt_access=True) - use_jwt.assert_called_once_with(True) - - with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: - creds = service_account.Credentials(None, None, None) - transport = transport_class(credentials=creds, always_use_jwt_access=False) - use_jwt.assert_not_called() - - -@pytest.mark.parametrize("client_class,transport_name", [ - (TextToSpeechClient, "grpc"), - (TextToSpeechAsyncClient, "grpc_asyncio"), - (TextToSpeechClient, "rest"), -]) -def test_text_to_speech_client_from_service_account_file(client_class, transport_name): - creds = ga_credentials.AnonymousCredentials() - with mock.patch.object(service_account.Credentials, 'from_service_account_file') as factory: - factory.return_value = creds - client = client_class.from_service_account_file("dummy/file/path.json", transport=transport_name) - assert client.transport._credentials == creds - assert isinstance(client, client_class) - - client = client_class.from_service_account_json("dummy/file/path.json", transport=transport_name) - assert client.transport._credentials == creds - assert isinstance(client, client_class) - - assert client.transport._host == ( - 'texttospeech.googleapis.com:443' - if transport_name in ['grpc', 'grpc_asyncio'] - else - 'https://texttospeech.googleapis.com' - ) - - -def test_text_to_speech_client_get_transport_class(): - transport = TextToSpeechClient.get_transport_class() - available_transports = [ - transports.TextToSpeechGrpcTransport, - transports.TextToSpeechRestTransport, - ] - assert transport in available_transports - - transport = TextToSpeechClient.get_transport_class("grpc") - assert transport == transports.TextToSpeechGrpcTransport - - -@pytest.mark.parametrize("client_class,transport_class,transport_name", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc"), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio"), - (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest"), -]) -@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) -@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) -def test_text_to_speech_client_client_options(client_class, transport_class, transport_name): - # Check that if channel is provided we won't create a new one. - with mock.patch.object(TextToSpeechClient, 'get_transport_class') as gtc: - transport = transport_class( - credentials=ga_credentials.AnonymousCredentials() - ) - client = client_class(transport=transport) - gtc.assert_not_called() - - # Check that if channel is provided via str we will create a new one. - with mock.patch.object(TextToSpeechClient, 'get_transport_class') as gtc: - client = client_class(transport=transport_name) - gtc.assert_called() - - # Check the case api_endpoint is provided. - options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(transport=transport_name, client_options=options) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host="squid.clam.whelk", - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is - # "never". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is - # "always". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client.DEFAULT_MTLS_ENDPOINT, - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has - # unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): - with pytest.raises(MutualTLSChannelError) as excinfo: - client = client_class(transport=transport_name) - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" - - # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): - with pytest.raises(ValueError) as excinfo: - client = client_class(transport=transport_name) - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - - # Check the case quota_project_id is provided - options = client_options.ClientOptions(quota_project_id="octopus") - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id="octopus", - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - # Check the case api_endpoint is provided - options = client_options.ClientOptions(api_audience="https://language.googleapis.com") - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience="https://language.googleapis.com" - ) - -@pytest.mark.parametrize("client_class,transport_class,transport_name,use_client_cert_env", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", "true"), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", "true"), - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", "false"), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", "false"), - (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest", "true"), - (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest", "false"), -]) -@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) -@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) -@mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}) -def test_text_to_speech_client_mtls_env_auto(client_class, transport_class, transport_name, use_client_cert_env): - # This tests the endpoint autoswitch behavior. Endpoint is autoswitched to the default - # mtls endpoint, if GOOGLE_API_USE_CLIENT_CERTIFICATE is "true" and client cert exists. - - # Check the case client_cert_source is provided. Whether client cert is used depends on - # GOOGLE_API_USE_CLIENT_CERTIFICATE value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): - options = client_options.ClientOptions(client_cert_source=client_cert_source_callback) - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - - if use_client_cert_env == "false": - expected_client_cert_source = None - expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) - else: - expected_client_cert_source = client_cert_source_callback - expected_host = client.DEFAULT_MTLS_ENDPOINT - - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=expected_host, - scopes=None, - client_cert_source_for_mtls=expected_client_cert_source, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case ADC client cert is provided. Whether client cert is used depends on - # GOOGLE_API_USE_CLIENT_CERTIFICATE value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): - with mock.patch.object(transport_class, '__init__') as patched: - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): - with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=client_cert_source_callback): - if use_client_cert_env == "false": - expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) - expected_client_cert_source = None - else: - expected_host = client.DEFAULT_MTLS_ENDPOINT - expected_client_cert_source = client_cert_source_callback - - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=expected_host, - scopes=None, - client_cert_source_for_mtls=expected_client_cert_source, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case client_cert_source and ADC client cert are not provided. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): - with mock.patch.object(transport_class, '__init__') as patched: - with mock.patch("google.auth.transport.mtls.has_default_client_cert_source", return_value=False): - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - -@pytest.mark.parametrize("client_class", [ - TextToSpeechClient, TextToSpeechAsyncClient -]) -@mock.patch.object(TextToSpeechClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechClient)) -@mock.patch.object(TextToSpeechAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechAsyncClient)) -def test_text_to_speech_client_get_mtls_endpoint_and_cert_source(client_class): - mock_client_cert_source = mock.Mock() - - # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "true". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - mock_api_endpoint = "foo" - options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) - assert api_endpoint == mock_api_endpoint - assert cert_source == mock_client_cert_source - - # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "false". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): - mock_client_cert_source = mock.Mock() - mock_api_endpoint = "foo" - options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) - assert api_endpoint == mock_api_endpoint - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_ENDPOINT - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "always". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert doesn't exist. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=False): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_ENDPOINT - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert exists. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): - with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_client_cert_source): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT - assert cert_source == mock_client_cert_source - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has - # unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): - with pytest.raises(MutualTLSChannelError) as excinfo: - client_class.get_mtls_endpoint_and_cert_source() - - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" - - # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): - with pytest.raises(ValueError) as excinfo: - client_class.get_mtls_endpoint_and_cert_source() - - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - -@pytest.mark.parametrize("client_class", [ - TextToSpeechClient, TextToSpeechAsyncClient -]) -@mock.patch.object(TextToSpeechClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechClient)) -@mock.patch.object(TextToSpeechAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechAsyncClient)) -def test_text_to_speech_client_client_api_endpoint(client_class): - mock_client_cert_source = client_cert_source_callback - api_override = "foo.com" - default_universe = TextToSpeechClient._DEFAULT_UNIVERSE - default_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) - mock_universe = "bar.com" - mock_endpoint = TextToSpeechClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) - - # If ClientOptions.api_endpoint is set and GOOGLE_API_USE_CLIENT_CERTIFICATE="true", - # use ClientOptions.api_endpoint as the api endpoint regardless. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel"): - options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=api_override) - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == api_override - - # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="never", - # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - client = client_class(credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == default_endpoint - - # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="always", - # use the DEFAULT_MTLS_ENDPOINT as the api endpoint. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - client = client_class(credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT - - # If ClientOptions.api_endpoint is not set, GOOGLE_API_USE_MTLS_ENDPOINT="auto" (default), - # GOOGLE_API_USE_CLIENT_CERTIFICATE="false" (default), default cert source doesn't exist, - # and ClientOptions.universe_domain="bar.com", - # use the _DEFAULT_ENDPOINT_TEMPLATE populated with universe domain as the api endpoint. - options = client_options.ClientOptions() - universe_exists = hasattr(options, "universe_domain") - if universe_exists: - options = client_options.ClientOptions(universe_domain=mock_universe) - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - else: - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == (mock_endpoint if universe_exists else default_endpoint) - assert client.universe_domain == (mock_universe if universe_exists else default_universe) - - # If ClientOptions does not have a universe domain attribute and GOOGLE_API_USE_MTLS_ENDPOINT="never", - # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. - options = client_options.ClientOptions() - if hasattr(options, "universe_domain"): - delattr(options, "universe_domain") - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == default_endpoint - - -@pytest.mark.parametrize("client_class,transport_class,transport_name", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc"), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio"), - (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest"), -]) -def test_text_to_speech_client_client_options_scopes(client_class, transport_class, transport_name): - # Check the case scopes are provided. - options = client_options.ClientOptions( - scopes=["1", "2"], - ) - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=["1", "2"], - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - -@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", grpc_helpers), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), - (TextToSpeechClient, transports.TextToSpeechRestTransport, "rest", None), -]) -def test_text_to_speech_client_client_options_credentials_file(client_class, transport_class, transport_name, grpc_helpers): - # Check the case credentials file is provided. - options = client_options.ClientOptions( - credentials_file="credentials.json" - ) - - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file="credentials.json", - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - -def test_text_to_speech_client_client_options_from_dict(): - with mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech.transports.TextToSpeechGrpcTransport.__init__') as grpc_transport: - grpc_transport.return_value = None - client = TextToSpeechClient( - client_options={'api_endpoint': 'squid.clam.whelk'} - ) - grpc_transport.assert_called_once_with( - credentials=None, - credentials_file=None, - host="squid.clam.whelk", - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - -@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport, "grpc", grpc_helpers), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), -]) -def test_text_to_speech_client_create_channel_credentials_file(client_class, transport_class, transport_name, grpc_helpers): - # Check the case credentials file is provided. - options = client_options.ClientOptions( - credentials_file="credentials.json" - ) - - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file="credentials.json", - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # test that the credentials from file are saved and used as the credentials. - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch.object( - google.auth, "default", autospec=True - ) as adc, mock.patch.object( - grpc_helpers, "create_channel" - ) as create_channel: - creds = ga_credentials.AnonymousCredentials() - file_creds = ga_credentials.AnonymousCredentials() - load_creds.return_value = (file_creds, None) - adc.return_value = (creds, None) - client = client_class(client_options=options, transport=transport_name) - create_channel.assert_called_with( - "texttospeech.googleapis.com:443", - credentials=file_creds, - credentials_file=None, - quota_project_id=None, - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - scopes=None, - default_host="texttospeech.googleapis.com", - ssl_credentials=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts.ListVoicesRequest, - dict, -]) -def test_list_voices(request_type, transport: str = 'grpc'): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = cloud_tts.ListVoicesResponse( - ) - response = client.list_voices(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - request = cloud_tts.ListVoicesRequest() - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, cloud_tts.ListVoicesResponse) - - -def test_list_voices_non_empty_request_with_auto_populated_field(): - # This test is a coverage failsafe to make sure that UUID4 fields are - # automatically populated, according to AIP-4235, with non-empty requests. - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='grpc', - ) - - # Populate all string fields in the request which are not UUID4 - # since we want to check that UUID4 are populated automatically - # if they meet the requirements of AIP 4235. - request = cloud_tts.ListVoicesRequest( - language_code='language_code_value', - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - call.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client.list_voices(request=request) - call.assert_called() - _, args, _ = call.mock_calls[0] - assert args[0] == cloud_tts.ListVoicesRequest( - language_code='language_code_value', - ) - -def test_list_voices_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.list_voices in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.list_voices] = mock_rpc - request = {} - client.list_voices(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - client.list_voices(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_list_voices_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._client._transport.list_voices in client._client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.AsyncMock() - mock_rpc.return_value = mock.Mock() - client._client._transport._wrapped_methods[client._client._transport.list_voices] = mock_rpc - - request = {} - await client.list_voices(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - await client.list_voices(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_list_voices_async(transport: str = 'grpc_asyncio', request_type=cloud_tts.ListVoicesRequest): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value =grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.ListVoicesResponse( - )) - response = await client.list_voices(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - request = cloud_tts.ListVoicesRequest() - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, cloud_tts.ListVoicesResponse) - - -@pytest.mark.asyncio -async def test_list_voices_async_from_dict(): - await test_list_voices_async(request_type=dict) - - -def test_list_voices_flattened(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = cloud_tts.ListVoicesResponse() - # Call the method with a truthy value for each flattened field, - # using the keyword arguments to the method. - client.list_voices( - language_code='language_code_value', - ) - - # Establish that the underlying call was made with the expected - # request object values. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - arg = args[0].language_code - mock_val = 'language_code_value' - assert arg == mock_val - - -def test_list_voices_flattened_error(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Attempting to call a method with both a request object and flattened - # fields is an error. - with pytest.raises(ValueError): - client.list_voices( - cloud_tts.ListVoicesRequest(), - language_code='language_code_value', - ) - -@pytest.mark.asyncio -async def test_list_voices_flattened_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = cloud_tts.ListVoicesResponse() - - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.ListVoicesResponse()) - # Call the method with a truthy value for each flattened field, - # using the keyword arguments to the method. - response = await client.list_voices( - language_code='language_code_value', - ) - - # Establish that the underlying call was made with the expected - # request object values. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - arg = args[0].language_code - mock_val = 'language_code_value' - assert arg == mock_val - -@pytest.mark.asyncio -async def test_list_voices_flattened_error_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Attempting to call a method with both a request object and flattened - # fields is an error. - with pytest.raises(ValueError): - await client.list_voices( - cloud_tts.ListVoicesRequest(), - language_code='language_code_value', - ) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts.SynthesizeSpeechRequest, - dict, -]) -def test_synthesize_speech(request_type, transport: str = 'grpc'): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = cloud_tts.SynthesizeSpeechResponse( - audio_content=b'audio_content_blob', - ) - response = client.synthesize_speech(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - request = cloud_tts.SynthesizeSpeechRequest() - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, cloud_tts.SynthesizeSpeechResponse) - assert response.audio_content == b'audio_content_blob' - - -def test_synthesize_speech_non_empty_request_with_auto_populated_field(): - # This test is a coverage failsafe to make sure that UUID4 fields are - # automatically populated, according to AIP-4235, with non-empty requests. - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='grpc', - ) - - # Populate all string fields in the request which are not UUID4 - # since we want to check that UUID4 are populated automatically - # if they meet the requirements of AIP 4235. - request = cloud_tts.SynthesizeSpeechRequest( - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - call.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client.synthesize_speech(request=request) - call.assert_called() - _, args, _ = call.mock_calls[0] - assert args[0] == cloud_tts.SynthesizeSpeechRequest( - ) - -def test_synthesize_speech_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.synthesize_speech in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.synthesize_speech] = mock_rpc - request = {} - client.synthesize_speech(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - client.synthesize_speech(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_synthesize_speech_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._client._transport.synthesize_speech in client._client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.AsyncMock() - mock_rpc.return_value = mock.Mock() - client._client._transport._wrapped_methods[client._client._transport.synthesize_speech] = mock_rpc - - request = {} - await client.synthesize_speech(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - await client.synthesize_speech(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_synthesize_speech_async(transport: str = 'grpc_asyncio', request_type=cloud_tts.SynthesizeSpeechRequest): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value =grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.SynthesizeSpeechResponse( - audio_content=b'audio_content_blob', - )) - response = await client.synthesize_speech(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - request = cloud_tts.SynthesizeSpeechRequest() - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, cloud_tts.SynthesizeSpeechResponse) - assert response.audio_content == b'audio_content_blob' - - -@pytest.mark.asyncio -async def test_synthesize_speech_async_from_dict(): - await test_synthesize_speech_async(request_type=dict) - - -def test_synthesize_speech_flattened(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = cloud_tts.SynthesizeSpeechResponse() - # Call the method with a truthy value for each flattened field, - # using the keyword arguments to the method. - client.synthesize_speech( - input=cloud_tts.SynthesisInput(text='text_value'), - voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), - audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), - ) - - # Establish that the underlying call was made with the expected - # request object values. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - arg = args[0].input - mock_val = cloud_tts.SynthesisInput(text='text_value') - assert arg == mock_val - arg = args[0].voice - mock_val = cloud_tts.VoiceSelectionParams(language_code='language_code_value') - assert arg == mock_val - arg = args[0].audio_config - mock_val = cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16) - assert arg == mock_val - - -def test_synthesize_speech_flattened_error(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Attempting to call a method with both a request object and flattened - # fields is an error. - with pytest.raises(ValueError): - client.synthesize_speech( - cloud_tts.SynthesizeSpeechRequest(), - input=cloud_tts.SynthesisInput(text='text_value'), - voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), - audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), - ) - -@pytest.mark.asyncio -async def test_synthesize_speech_flattened_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = cloud_tts.SynthesizeSpeechResponse() - - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.SynthesizeSpeechResponse()) - # Call the method with a truthy value for each flattened field, - # using the keyword arguments to the method. - response = await client.synthesize_speech( - input=cloud_tts.SynthesisInput(text='text_value'), - voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), - audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), - ) - - # Establish that the underlying call was made with the expected - # request object values. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - arg = args[0].input - mock_val = cloud_tts.SynthesisInput(text='text_value') - assert arg == mock_val - arg = args[0].voice - mock_val = cloud_tts.VoiceSelectionParams(language_code='language_code_value') - assert arg == mock_val - arg = args[0].audio_config - mock_val = cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16) - assert arg == mock_val - -@pytest.mark.asyncio -async def test_synthesize_speech_flattened_error_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Attempting to call a method with both a request object and flattened - # fields is an error. - with pytest.raises(ValueError): - await client.synthesize_speech( - cloud_tts.SynthesizeSpeechRequest(), - input=cloud_tts.SynthesisInput(text='text_value'), - voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), - audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), - ) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts.StreamingSynthesizeRequest, - dict, -]) -def test_streaming_synthesize(request_type, transport: str = 'grpc'): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - requests = [request] - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.streaming_synthesize), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = iter([cloud_tts.StreamingSynthesizeResponse()]) - response = client.streaming_synthesize(iter(requests)) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert next(args[0]) == request - - # Establish that the response is the type that we expect. - for message in response: - assert isinstance(message, cloud_tts.StreamingSynthesizeResponse) - - -def test_streaming_synthesize_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.streaming_synthesize in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.streaming_synthesize] = mock_rpc - request = [{}] - client.streaming_synthesize(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - client.streaming_synthesize(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_streaming_synthesize_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._client._transport.streaming_synthesize in client._client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.AsyncMock() - mock_rpc.return_value = mock.Mock() - client._client._transport._wrapped_methods[client._client._transport.streaming_synthesize] = mock_rpc - - request = [{}] - await client.streaming_synthesize(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - await client.streaming_synthesize(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_streaming_synthesize_async(transport: str = 'grpc_asyncio', request_type=cloud_tts.StreamingSynthesizeRequest): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - requests = [request] - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.streaming_synthesize), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = mock.Mock(aio.StreamStreamCall, autospec=True) - call.return_value.read = mock.AsyncMock(side_effect=[cloud_tts.StreamingSynthesizeResponse()]) - response = await client.streaming_synthesize(iter(requests)) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - assert next(args[0]) == request - - # Establish that the response is the type that we expect. - message = await response.read() - assert isinstance(message, cloud_tts.StreamingSynthesizeResponse) - - -@pytest.mark.asyncio -async def test_streaming_synthesize_async_from_dict(): - await test_streaming_synthesize_async(request_type=dict) - - -def test_list_voices_rest_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.list_voices in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.list_voices] = mock_rpc - - request = {} - client.list_voices(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - client.list_voices(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - - -def test_list_voices_rest_flattened(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Mock the http request call within the method and fake a response. - with mock.patch.object(type(client.transport._session), 'request') as req: - # Designate an appropriate value for the returned response. - return_value = cloud_tts.ListVoicesResponse() - - # get arguments that satisfy an http rule for this method - sample_request = {} - - # get truthy value for each flattened field - mock_args = dict( - language_code='language_code_value', - ) - mock_args.update(sample_request) - - # Wrap the value into a proper Response obj - response_value = Response() - response_value.status_code = 200 - # Convert return value to protobuf type - return_value = cloud_tts.ListVoicesResponse.pb(return_value) - json_return_value = json_format.MessageToJson(return_value) - response_value._content = json_return_value.encode('UTF-8') - req.return_value = response_value - - client.list_voices(**mock_args) - - # Establish that the underlying call was made with the expected - # request object values. - assert len(req.mock_calls) == 1 - _, args, _ = req.mock_calls[0] - assert path_template.validate("%s/v1beta1/voices" % client.transport._host, args[1]) - - -def test_list_voices_rest_flattened_error(transport: str = 'rest'): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Attempting to call a method with both a request object and flattened - # fields is an error. - with pytest.raises(ValueError): - client.list_voices( - cloud_tts.ListVoicesRequest(), - language_code='language_code_value', - ) - - -def test_synthesize_speech_rest_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.synthesize_speech in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.synthesize_speech] = mock_rpc - - request = {} - client.synthesize_speech(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - client.synthesize_speech(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - - -def test_synthesize_speech_rest_required_fields(request_type=cloud_tts.SynthesizeSpeechRequest): - transport_class = transports.TextToSpeechRestTransport - - request_init = {} - request = request_type(**request_init) - pb_request = request_type.pb(request) - jsonified_request = json.loads(json_format.MessageToJson( - pb_request, - use_integers_for_enums=False - )) - - # verify fields with default values are dropped - - unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_speech._get_unset_required_fields(jsonified_request) - jsonified_request.update(unset_fields) - - # verify required fields with default values are now present - - unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_speech._get_unset_required_fields(jsonified_request) - jsonified_request.update(unset_fields) - - # verify required fields with non-default values are left alone - - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='rest', - ) - request = request_type(**request_init) - - # Designate an appropriate value for the returned response. - return_value = cloud_tts.SynthesizeSpeechResponse() - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, 'request') as req: - # We need to mock transcode() because providing default values - # for required fields will fail the real version if the http_options - # expect actual values for those fields. - with mock.patch.object(path_template, 'transcode') as transcode: - # A uri without fields and an empty body will force all the - # request fields to show up in the query_params. - pb_request = request_type.pb(request) - transcode_result = { - 'uri': 'v1/sample_method', - 'method': "post", - 'query_params': pb_request, - } - transcode_result['body'] = pb_request - transcode.return_value = transcode_result - - response_value = Response() - response_value.status_code = 200 - - # Convert return value to protobuf type - return_value = cloud_tts.SynthesizeSpeechResponse.pb(return_value) - json_return_value = json_format.MessageToJson(return_value) - - response_value._content = json_return_value.encode('UTF-8') - req.return_value = response_value - - response = client.synthesize_speech(request) - - expected_params = [ - ] - actual_params = req.call_args.kwargs['params'] - assert expected_params == actual_params - - -def test_synthesize_speech_rest_unset_required_fields(): - transport = transports.TextToSpeechRestTransport(credentials=ga_credentials.AnonymousCredentials) - - unset_fields = transport.synthesize_speech._get_unset_required_fields({}) - assert set(unset_fields) == (set(()) & set(("input", "voice", "audioConfig", ))) - - -def test_synthesize_speech_rest_flattened(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Mock the http request call within the method and fake a response. - with mock.patch.object(type(client.transport._session), 'request') as req: - # Designate an appropriate value for the returned response. - return_value = cloud_tts.SynthesizeSpeechResponse() - - # get arguments that satisfy an http rule for this method - sample_request = {} - - # get truthy value for each flattened field - mock_args = dict( - input=cloud_tts.SynthesisInput(text='text_value'), - voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), - audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), - ) - mock_args.update(sample_request) - - # Wrap the value into a proper Response obj - response_value = Response() - response_value.status_code = 200 - # Convert return value to protobuf type - return_value = cloud_tts.SynthesizeSpeechResponse.pb(return_value) - json_return_value = json_format.MessageToJson(return_value) - response_value._content = json_return_value.encode('UTF-8') - req.return_value = response_value - - client.synthesize_speech(**mock_args) - - # Establish that the underlying call was made with the expected - # request object values. - assert len(req.mock_calls) == 1 - _, args, _ = req.mock_calls[0] - assert path_template.validate("%s/v1beta1/text:synthesize" % client.transport._host, args[1]) - - -def test_synthesize_speech_rest_flattened_error(transport: str = 'rest'): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Attempting to call a method with both a request object and flattened - # fields is an error. - with pytest.raises(ValueError): - client.synthesize_speech( - cloud_tts.SynthesizeSpeechRequest(), - input=cloud_tts.SynthesisInput(text='text_value'), - voice=cloud_tts.VoiceSelectionParams(language_code='language_code_value'), - audio_config=cloud_tts.AudioConfig(audio_encoding=cloud_tts.AudioEncoding.LINEAR16), - ) - - -def test_streaming_synthesize_rest_no_http_options(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - request = cloud_tts.StreamingSynthesizeRequest() - requests = [request] - with pytest.raises(RuntimeError): - client.streaming_synthesize(requests) - - -def test_streaming_synthesize_rest_error(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='rest' - ) - # Since a `google.api.http` annotation is required for using a rest transport - # method, this should error. - with pytest.raises(NotImplementedError) as not_implemented_error: - client.streaming_synthesize({}) - assert ( - "Method StreamingSynthesize is not available over REST transport" - in str(not_implemented_error.value) - ) - - -def test_credentials_transport_error(): - # It is an error to provide credentials and a transport instance. - transport = transports.TextToSpeechGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - with pytest.raises(ValueError): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # It is an error to provide a credentials file and a transport instance. - transport = transports.TextToSpeechGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - with pytest.raises(ValueError): - client = TextToSpeechClient( - client_options={"credentials_file": "credentials.json"}, - transport=transport, - ) - - # It is an error to provide an api_key and a transport instance. - transport = transports.TextToSpeechGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - options = client_options.ClientOptions() - options.api_key = "api_key" - with pytest.raises(ValueError): - client = TextToSpeechClient( - client_options=options, - transport=transport, - ) - - # It is an error to provide an api_key and a credential. - options = client_options.ClientOptions() - options.api_key = "api_key" - with pytest.raises(ValueError): - client = TextToSpeechClient( - client_options=options, - credentials=ga_credentials.AnonymousCredentials() - ) - - # It is an error to provide scopes and a transport instance. - transport = transports.TextToSpeechGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - with pytest.raises(ValueError): - client = TextToSpeechClient( - client_options={"scopes": ["1", "2"]}, - transport=transport, - ) - - -def test_transport_instance(): - # A client may be instantiated with a custom transport instance. - transport = transports.TextToSpeechGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - client = TextToSpeechClient(transport=transport) - assert client.transport is transport - -def test_transport_get_channel(): - # A client may be instantiated with a custom transport instance. - transport = transports.TextToSpeechGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - channel = transport.grpc_channel - assert channel - - transport = transports.TextToSpeechGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - channel = transport.grpc_channel - assert channel - -@pytest.mark.parametrize("transport_class", [ - transports.TextToSpeechGrpcTransport, - transports.TextToSpeechGrpcAsyncIOTransport, - transports.TextToSpeechRestTransport, -]) -def test_transport_adc(transport_class): - # Test default credentials are used if not provided. - with mock.patch.object(google.auth, 'default') as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class() - adc.assert_called_once() - -def test_transport_kind_grpc(): - transport = TextToSpeechClient.get_transport_class("grpc")( - credentials=ga_credentials.AnonymousCredentials() - ) - assert transport.kind == "grpc" - - -def test_initialize_client_w_grpc(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc" - ) - assert client is not None - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -def test_list_voices_empty_call_grpc(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - call.return_value = cloud_tts.ListVoicesResponse() - client.list_voices(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts.ListVoicesRequest() - - assert args[0] == request_msg - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -def test_synthesize_speech_empty_call_grpc(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - call.return_value = cloud_tts.SynthesizeSpeechResponse() - client.synthesize_speech(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts.SynthesizeSpeechRequest() - - assert args[0] == request_msg - - -def test_transport_kind_grpc_asyncio(): - transport = TextToSpeechAsyncClient.get_transport_class("grpc_asyncio")( - credentials=async_anonymous_credentials() - ) - assert transport.kind == "grpc_asyncio" - - -def test_initialize_client_w_grpc_asyncio(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio" - ) - assert client is not None - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -@pytest.mark.asyncio -async def test_list_voices_empty_call_grpc_asyncio(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.ListVoicesResponse( - )) - await client.list_voices(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts.ListVoicesRequest() - - assert args[0] == request_msg - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -@pytest.mark.asyncio -async def test_synthesize_speech_empty_call_grpc_asyncio(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloud_tts.SynthesizeSpeechResponse( - audio_content=b'audio_content_blob', - )) - await client.synthesize_speech(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts.SynthesizeSpeechRequest() - - assert args[0] == request_msg - - -def test_transport_kind_rest(): - transport = TextToSpeechClient.get_transport_class("rest")( - credentials=ga_credentials.AnonymousCredentials() - ) - assert transport.kind == "rest" - - -def test_list_voices_rest_bad_request(request_type=cloud_tts.ListVoicesRequest): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - # send a request that will satisfy transcoding - request_init = {} - request = request_type(**request_init) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = mock.Mock() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = mock.Mock() - req.return_value = response_value - client.list_voices(request) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts.ListVoicesRequest, - dict, -]) -def test_list_voices_rest_call_success(request_type): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - - # send a request that will satisfy transcoding - request_init = {} - request = request_type(**request_init) - - # Mock the http request call within the method and fake a response. - with mock.patch.object(type(client.transport._session), 'request') as req: - # Designate an appropriate value for the returned response. - return_value = cloud_tts.ListVoicesResponse( - ) - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - - # Convert return value to protobuf type - return_value = cloud_tts.ListVoicesResponse.pb(return_value) - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - req.return_value = response_value - response = client.list_voices(request) - - # Establish that the response is the type that we expect. - assert isinstance(response, cloud_tts.ListVoicesResponse) - - -@pytest.mark.parametrize("null_interceptor", [True, False]) -def test_list_voices_rest_interceptors(null_interceptor): - transport = transports.TextToSpeechRestTransport( - credentials=ga_credentials.AnonymousCredentials(), - interceptor=None if null_interceptor else transports.TextToSpeechRestInterceptor(), - ) - client = TextToSpeechClient(transport=transport) - - with mock.patch.object(type(client.transport._session), "request") as req, \ - mock.patch.object(path_template, "transcode") as transcode, \ - mock.patch.object(transports.TextToSpeechRestInterceptor, "post_list_voices") as post, \ - mock.patch.object(transports.TextToSpeechRestInterceptor, "pre_list_voices") as pre: - pre.assert_not_called() - post.assert_not_called() - pb_message = cloud_tts.ListVoicesRequest.pb(cloud_tts.ListVoicesRequest()) - transcode.return_value = { - "method": "post", - "uri": "my_uri", - "body": pb_message, - "query_params": pb_message, - } - - req.return_value = mock.Mock() - req.return_value.status_code = 200 - return_value = cloud_tts.ListVoicesResponse.to_json(cloud_tts.ListVoicesResponse()) - req.return_value.content = return_value - - request = cloud_tts.ListVoicesRequest() - metadata =[ - ("key", "val"), - ("cephalopod", "squid"), - ] - pre.return_value = request, metadata - post.return_value = cloud_tts.ListVoicesResponse() - - client.list_voices(request, metadata=[("key", "val"), ("cephalopod", "squid"),]) - - pre.assert_called_once() - post.assert_called_once() - - -def test_synthesize_speech_rest_bad_request(request_type=cloud_tts.SynthesizeSpeechRequest): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - # send a request that will satisfy transcoding - request_init = {} - request = request_type(**request_init) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = mock.Mock() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = mock.Mock() - req.return_value = response_value - client.synthesize_speech(request) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts.SynthesizeSpeechRequest, - dict, -]) -def test_synthesize_speech_rest_call_success(request_type): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - - # send a request that will satisfy transcoding - request_init = {} - request = request_type(**request_init) - - # Mock the http request call within the method and fake a response. - with mock.patch.object(type(client.transport._session), 'request') as req: - # Designate an appropriate value for the returned response. - return_value = cloud_tts.SynthesizeSpeechResponse( - audio_content=b'audio_content_blob', - ) - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - - # Convert return value to protobuf type - return_value = cloud_tts.SynthesizeSpeechResponse.pb(return_value) - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - req.return_value = response_value - response = client.synthesize_speech(request) - - # Establish that the response is the type that we expect. - assert isinstance(response, cloud_tts.SynthesizeSpeechResponse) - assert response.audio_content == b'audio_content_blob' - - -@pytest.mark.parametrize("null_interceptor", [True, False]) -def test_synthesize_speech_rest_interceptors(null_interceptor): - transport = transports.TextToSpeechRestTransport( - credentials=ga_credentials.AnonymousCredentials(), - interceptor=None if null_interceptor else transports.TextToSpeechRestInterceptor(), - ) - client = TextToSpeechClient(transport=transport) - - with mock.patch.object(type(client.transport._session), "request") as req, \ - mock.patch.object(path_template, "transcode") as transcode, \ - mock.patch.object(transports.TextToSpeechRestInterceptor, "post_synthesize_speech") as post, \ - mock.patch.object(transports.TextToSpeechRestInterceptor, "pre_synthesize_speech") as pre: - pre.assert_not_called() - post.assert_not_called() - pb_message = cloud_tts.SynthesizeSpeechRequest.pb(cloud_tts.SynthesizeSpeechRequest()) - transcode.return_value = { - "method": "post", - "uri": "my_uri", - "body": pb_message, - "query_params": pb_message, - } - - req.return_value = mock.Mock() - req.return_value.status_code = 200 - return_value = cloud_tts.SynthesizeSpeechResponse.to_json(cloud_tts.SynthesizeSpeechResponse()) - req.return_value.content = return_value - - request = cloud_tts.SynthesizeSpeechRequest() - metadata =[ - ("key", "val"), - ("cephalopod", "squid"), - ] - pre.return_value = request, metadata - post.return_value = cloud_tts.SynthesizeSpeechResponse() - - client.synthesize_speech(request, metadata=[("key", "val"), ("cephalopod", "squid"),]) - - pre.assert_called_once() - post.assert_called_once() - - -def test_streaming_synthesize_rest_error(): - - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - - with pytest.raises(NotImplementedError) as not_implemented_error: - client.streaming_synthesize({}) - assert ( - "Method StreamingSynthesize is not available over REST transport" - in str(not_implemented_error.value) - ) - - -def test_get_operation_rest_bad_request(request_type=operations_pb2.GetOperationRequest): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - request = request_type() - request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2/operations/sample3'}, request) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = Response() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = Request() - req.return_value = response_value - client.get_operation(request) - - -@pytest.mark.parametrize("request_type", [ - operations_pb2.GetOperationRequest, - dict, -]) -def test_get_operation_rest(request_type): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - request_init = {'name': 'projects/sample1/locations/sample2/operations/sample3'} - request = request_type(**request_init) - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, 'request') as req: - # Designate an appropriate value for the returned response. - return_value = operations_pb2.Operation() - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - - req.return_value = response_value - - response = client.get_operation(request) - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.Operation) - - -def test_list_operations_rest_bad_request(request_type=operations_pb2.ListOperationsRequest): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - request = request_type() - request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2'}, request) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = Response() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = Request() - req.return_value = response_value - client.list_operations(request) - - -@pytest.mark.parametrize("request_type", [ - operations_pb2.ListOperationsRequest, - dict, -]) -def test_list_operations_rest(request_type): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - request_init = {'name': 'projects/sample1/locations/sample2'} - request = request_type(**request_init) - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, 'request') as req: - # Designate an appropriate value for the returned response. - return_value = operations_pb2.ListOperationsResponse() - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - - req.return_value = response_value - - response = client.list_operations(request) - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.ListOperationsResponse) - -def test_initialize_client_w_rest(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - assert client is not None - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -def test_list_voices_empty_call_rest(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.list_voices), - '__call__') as call: - client.list_voices(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts.ListVoicesRequest() - - assert args[0] == request_msg - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -def test_synthesize_speech_empty_call_rest(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_speech), - '__call__') as call: - client.synthesize_speech(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts.SynthesizeSpeechRequest() - - assert args[0] == request_msg - - -def test_transport_grpc_default(): - # A client should use the gRPC transport by default. - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - assert isinstance( - client.transport, - transports.TextToSpeechGrpcTransport, - ) - -def test_text_to_speech_base_transport_error(): - # Passing both a credentials object and credentials_file should raise an error - with pytest.raises(core_exceptions.DuplicateCredentialArgs): - transport = transports.TextToSpeechTransport( - credentials=ga_credentials.AnonymousCredentials(), - credentials_file="credentials.json" - ) - - -def test_text_to_speech_base_transport(): - # Instantiate the base transport. - with mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech.transports.TextToSpeechTransport.__init__') as Transport: - Transport.return_value = None - transport = transports.TextToSpeechTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Every method on the transport should just blindly - # raise NotImplementedError. - methods = ( - 'list_voices', - 'synthesize_speech', - 'streaming_synthesize', - 'get_operation', - 'list_operations', - ) - for method in methods: - with pytest.raises(NotImplementedError): - getattr(transport, method)(request=object()) - - with pytest.raises(NotImplementedError): - transport.close() - - # Catch all for all remaining methods and properties - remainder = [ - 'kind', - ] - for r in remainder: - with pytest.raises(NotImplementedError): - getattr(transport, r)() - - -def test_text_to_speech_base_transport_with_credentials_file(): - # Instantiate the base transport with a credentials file - with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech.transports.TextToSpeechTransport._prep_wrapped_messages') as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.TextToSpeechTransport( - credentials_file="credentials.json", - quota_project_id="octopus", - ) - load_creds.assert_called_once_with("credentials.json", - scopes=None, - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - quota_project_id="octopus", - ) - - -def test_text_to_speech_base_transport_with_adc(): - # Test the default credentials are used if credentials and credentials_file are None. - with mock.patch.object(google.auth, 'default', autospec=True) as adc, mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech.transports.TextToSpeechTransport._prep_wrapped_messages') as Transport: - Transport.return_value = None - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.TextToSpeechTransport() - adc.assert_called_once() - - -def test_text_to_speech_auth_adc(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, 'default', autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - TextToSpeechClient() - adc.assert_called_once_with( - scopes=None, - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - quota_project_id=None, - ) - - -@pytest.mark.parametrize( - "transport_class", - [ - transports.TextToSpeechGrpcTransport, - transports.TextToSpeechGrpcAsyncIOTransport, - ], -) -def test_text_to_speech_transport_auth_adc(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, 'default', autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus", scopes=["1", "2"]) - adc.assert_called_once_with( - scopes=["1", "2"], - default_scopes=( 'https://www.googleapis.com/auth/cloud-platform',), - quota_project_id="octopus", - ) - - -@pytest.mark.parametrize( - "transport_class", - [ - transports.TextToSpeechGrpcTransport, - transports.TextToSpeechGrpcAsyncIOTransport, - transports.TextToSpeechRestTransport, - ], -) -def test_text_to_speech_transport_auth_gdch_credentials(transport_class): - host = 'https://language.com' - api_audience_tests = [None, 'https://language2.com'] - api_audience_expect = [host, 'https://language2.com'] - for t, e in zip(api_audience_tests, api_audience_expect): - with mock.patch.object(google.auth, 'default', autospec=True) as adc: - gdch_mock = mock.MagicMock() - type(gdch_mock).with_gdch_audience = mock.PropertyMock(return_value=gdch_mock) - adc.return_value = (gdch_mock, None) - transport_class(host=host, api_audience=t) - gdch_mock.with_gdch_audience.assert_called_once_with( - e - ) - - -@pytest.mark.parametrize( - "transport_class,grpc_helpers", - [ - (transports.TextToSpeechGrpcTransport, grpc_helpers), - (transports.TextToSpeechGrpcAsyncIOTransport, grpc_helpers_async) - ], -) -def test_text_to_speech_transport_create_channel(transport_class, grpc_helpers): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch.object( - grpc_helpers, "create_channel", autospec=True - ) as create_channel: - creds = ga_credentials.AnonymousCredentials() - adc.return_value = (creds, None) - transport_class( - quota_project_id="octopus", - scopes=["1", "2"] - ) - - create_channel.assert_called_with( - "texttospeech.googleapis.com:443", - credentials=creds, - credentials_file=None, - quota_project_id="octopus", - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - scopes=["1", "2"], - default_host="texttospeech.googleapis.com", - ssl_credentials=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - -@pytest.mark.parametrize("transport_class", [transports.TextToSpeechGrpcTransport, transports.TextToSpeechGrpcAsyncIOTransport]) -def test_text_to_speech_grpc_transport_client_cert_source_for_mtls( - transport_class -): - cred = ga_credentials.AnonymousCredentials() - - # Check ssl_channel_credentials is used if provided. - with mock.patch.object(transport_class, "create_channel") as mock_create_channel: - mock_ssl_channel_creds = mock.Mock() - transport_class( - host="squid.clam.whelk", - credentials=cred, - ssl_channel_credentials=mock_ssl_channel_creds - ) - mock_create_channel.assert_called_once_with( - "squid.clam.whelk:443", - credentials=cred, - credentials_file=None, - scopes=None, - ssl_credentials=mock_ssl_channel_creds, - quota_project_id=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - # Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls - # is used. - with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()): - with mock.patch("grpc.ssl_channel_credentials") as mock_ssl_cred: - transport_class( - credentials=cred, - client_cert_source_for_mtls=client_cert_source_callback - ) - expected_cert, expected_key = client_cert_source_callback() - mock_ssl_cred.assert_called_once_with( - certificate_chain=expected_cert, - private_key=expected_key - ) - -def test_text_to_speech_http_transport_client_cert_source_for_mtls(): - cred = ga_credentials.AnonymousCredentials() - with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel") as mock_configure_mtls_channel: - transports.TextToSpeechRestTransport ( - credentials=cred, - client_cert_source_for_mtls=client_cert_source_callback - ) - mock_configure_mtls_channel.assert_called_once_with(client_cert_source_callback) - - -@pytest.mark.parametrize("transport_name", [ - "grpc", - "grpc_asyncio", - "rest", -]) -def test_text_to_speech_host_no_port(transport_name): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com'), - transport=transport_name, - ) - assert client.transport._host == ( - 'texttospeech.googleapis.com:443' - if transport_name in ['grpc', 'grpc_asyncio'] - else 'https://texttospeech.googleapis.com' - ) - -@pytest.mark.parametrize("transport_name", [ - "grpc", - "grpc_asyncio", - "rest", -]) -def test_text_to_speech_host_with_port(transport_name): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com:8000'), - transport=transport_name, - ) - assert client.transport._host == ( - 'texttospeech.googleapis.com:8000' - if transport_name in ['grpc', 'grpc_asyncio'] - else 'https://texttospeech.googleapis.com:8000' - ) - -@pytest.mark.parametrize("transport_name", [ - "rest", -]) -def test_text_to_speech_client_transport_session_collision(transport_name): - creds1 = ga_credentials.AnonymousCredentials() - creds2 = ga_credentials.AnonymousCredentials() - client1 = TextToSpeechClient( - credentials=creds1, - transport=transport_name, - ) - client2 = TextToSpeechClient( - credentials=creds2, - transport=transport_name, - ) - session1 = client1.transport.list_voices._session - session2 = client2.transport.list_voices._session - assert session1 != session2 - session1 = client1.transport.synthesize_speech._session - session2 = client2.transport.synthesize_speech._session - assert session1 != session2 - session1 = client1.transport.streaming_synthesize._session - session2 = client2.transport.streaming_synthesize._session - assert session1 != session2 -def test_text_to_speech_grpc_transport_channel(): - channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) - - # Check that channel is used if provided. - transport = transports.TextToSpeechGrpcTransport( - host="squid.clam.whelk", - channel=channel, - ) - assert transport.grpc_channel == channel - assert transport._host == "squid.clam.whelk:443" - assert transport._ssl_channel_credentials == None - - -def test_text_to_speech_grpc_asyncio_transport_channel(): - channel = aio.secure_channel('http://localhost/', grpc.local_channel_credentials()) - - # Check that channel is used if provided. - transport = transports.TextToSpeechGrpcAsyncIOTransport( - host="squid.clam.whelk", - channel=channel, - ) - assert transport.grpc_channel == channel - assert transport._host == "squid.clam.whelk:443" - assert transport._ssl_channel_credentials == None - - -# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are -# removed from grpc/grpc_asyncio transport constructor. -@pytest.mark.parametrize("transport_class", [transports.TextToSpeechGrpcTransport, transports.TextToSpeechGrpcAsyncIOTransport]) -def test_text_to_speech_transport_channel_mtls_with_client_cert_source( - transport_class -): - with mock.patch("grpc.ssl_channel_credentials", autospec=True) as grpc_ssl_channel_cred: - with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: - mock_ssl_cred = mock.Mock() - grpc_ssl_channel_cred.return_value = mock_ssl_cred - - mock_grpc_channel = mock.Mock() - grpc_create_channel.return_value = mock_grpc_channel - - cred = ga_credentials.AnonymousCredentials() - with pytest.warns(DeprecationWarning): - with mock.patch.object(google.auth, 'default') as adc: - adc.return_value = (cred, None) - transport = transport_class( - host="squid.clam.whelk", - api_mtls_endpoint="mtls.squid.clam.whelk", - client_cert_source=client_cert_source_callback, - ) - adc.assert_called_once() - - grpc_ssl_channel_cred.assert_called_once_with( - certificate_chain=b"cert bytes", private_key=b"key bytes" - ) - grpc_create_channel.assert_called_once_with( - "mtls.squid.clam.whelk:443", - credentials=cred, - credentials_file=None, - scopes=None, - ssl_credentials=mock_ssl_cred, - quota_project_id=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - assert transport.grpc_channel == mock_grpc_channel - assert transport._ssl_channel_credentials == mock_ssl_cred - - -# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are -# removed from grpc/grpc_asyncio transport constructor. -@pytest.mark.parametrize("transport_class", [transports.TextToSpeechGrpcTransport, transports.TextToSpeechGrpcAsyncIOTransport]) -def test_text_to_speech_transport_channel_mtls_with_adc( - transport_class -): - mock_ssl_cred = mock.Mock() - with mock.patch.multiple( - "google.auth.transport.grpc.SslCredentials", - __init__=mock.Mock(return_value=None), - ssl_credentials=mock.PropertyMock(return_value=mock_ssl_cred), - ): - with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: - mock_grpc_channel = mock.Mock() - grpc_create_channel.return_value = mock_grpc_channel - mock_cred = mock.Mock() - - with pytest.warns(DeprecationWarning): - transport = transport_class( - host="squid.clam.whelk", - credentials=mock_cred, - api_mtls_endpoint="mtls.squid.clam.whelk", - client_cert_source=None, - ) - - grpc_create_channel.assert_called_once_with( - "mtls.squid.clam.whelk:443", - credentials=mock_cred, - credentials_file=None, - scopes=None, - ssl_credentials=mock_ssl_cred, - quota_project_id=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - assert transport.grpc_channel == mock_grpc_channel - - -def test_model_path(): - project = "squid" - location = "clam" - model = "whelk" - expected = "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) - actual = TextToSpeechClient.model_path(project, location, model) - assert expected == actual - - -def test_parse_model_path(): - expected = { - "project": "octopus", - "location": "oyster", - "model": "nudibranch", - } - path = TextToSpeechClient.model_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechClient.parse_model_path(path) - assert expected == actual - -def test_common_billing_account_path(): - billing_account = "cuttlefish" - expected = "billingAccounts/{billing_account}".format(billing_account=billing_account, ) - actual = TextToSpeechClient.common_billing_account_path(billing_account) - assert expected == actual - - -def test_parse_common_billing_account_path(): - expected = { - "billing_account": "mussel", - } - path = TextToSpeechClient.common_billing_account_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechClient.parse_common_billing_account_path(path) - assert expected == actual - -def test_common_folder_path(): - folder = "winkle" - expected = "folders/{folder}".format(folder=folder, ) - actual = TextToSpeechClient.common_folder_path(folder) - assert expected == actual - - -def test_parse_common_folder_path(): - expected = { - "folder": "nautilus", - } - path = TextToSpeechClient.common_folder_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechClient.parse_common_folder_path(path) - assert expected == actual - -def test_common_organization_path(): - organization = "scallop" - expected = "organizations/{organization}".format(organization=organization, ) - actual = TextToSpeechClient.common_organization_path(organization) - assert expected == actual - - -def test_parse_common_organization_path(): - expected = { - "organization": "abalone", - } - path = TextToSpeechClient.common_organization_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechClient.parse_common_organization_path(path) - assert expected == actual - -def test_common_project_path(): - project = "squid" - expected = "projects/{project}".format(project=project, ) - actual = TextToSpeechClient.common_project_path(project) - assert expected == actual - - -def test_parse_common_project_path(): - expected = { - "project": "clam", - } - path = TextToSpeechClient.common_project_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechClient.parse_common_project_path(path) - assert expected == actual - -def test_common_location_path(): - project = "whelk" - location = "octopus" - expected = "projects/{project}/locations/{location}".format(project=project, location=location, ) - actual = TextToSpeechClient.common_location_path(project, location) - assert expected == actual - - -def test_parse_common_location_path(): - expected = { - "project": "oyster", - "location": "nudibranch", - } - path = TextToSpeechClient.common_location_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechClient.parse_common_location_path(path) - assert expected == actual - - -def test_client_with_default_client_info(): - client_info = gapic_v1.client_info.ClientInfo() - - with mock.patch.object(transports.TextToSpeechTransport, '_prep_wrapped_messages') as prep: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - client_info=client_info, - ) - prep.assert_called_once_with(client_info) - - with mock.patch.object(transports.TextToSpeechTransport, '_prep_wrapped_messages') as prep: - transport_class = TextToSpeechClient.get_transport_class() - transport = transport_class( - credentials=ga_credentials.AnonymousCredentials(), - client_info=client_info, - ) - prep.assert_called_once_with(client_info) - - -def test_get_operation(transport: str = "grpc"): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.GetOperationRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.Operation() - response = client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.Operation) -@pytest.mark.asyncio -async def test_get_operation_async(transport: str = "grpc_asyncio"): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.GetOperationRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation() - ) - response = await client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.Operation) - -def test_get_operation_field_headers(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.GetOperationRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - call.return_value = operations_pb2.Operation() - - client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] -@pytest.mark.asyncio -async def test_get_operation_field_headers_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.GetOperationRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation() - ) - await client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] - -def test_get_operation_from_dict(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.Operation() - - response = client.get_operation( - request={ - "name": "locations", - } - ) - call.assert_called() -@pytest.mark.asyncio -async def test_get_operation_from_dict_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation() - ) - response = await client.get_operation( - request={ - "name": "locations", - } - ) - call.assert_called() - - -def test_list_operations(transport: str = "grpc"): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.ListOperationsRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.ListOperationsResponse() - response = client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.ListOperationsResponse) -@pytest.mark.asyncio -async def test_list_operations_async(transport: str = "grpc_asyncio"): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.ListOperationsRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.ListOperationsResponse() - ) - response = await client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.ListOperationsResponse) - -def test_list_operations_field_headers(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.ListOperationsRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - call.return_value = operations_pb2.ListOperationsResponse() - - client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] -@pytest.mark.asyncio -async def test_list_operations_field_headers_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.ListOperationsRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.ListOperationsResponse() - ) - await client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] - -def test_list_operations_from_dict(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.ListOperationsResponse() - - response = client.list_operations( - request={ - "name": "locations", - } - ) - call.assert_called() -@pytest.mark.asyncio -async def test_list_operations_from_dict_async(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.ListOperationsResponse() - ) - response = await client.list_operations( - request={ - "name": "locations", - } - ) - call.assert_called() - - -def test_transport_close_grpc(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc" - ) - with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: - with client: - close.assert_not_called() - close.assert_called_once() - - -@pytest.mark.asyncio -async def test_transport_close_grpc_asyncio(): - client = TextToSpeechAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio" - ) - with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: - async with client: - close.assert_not_called() - close.assert_called_once() - - -def test_transport_close_rest(): - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - with mock.patch.object(type(getattr(client.transport, "_session")), "close") as close: - with client: - close.assert_not_called() - close.assert_called_once() - - -def test_client_ctx(): - transports = [ - 'rest', - 'grpc', - ] - for transport in transports: - client = TextToSpeechClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport - ) - # Test client calls underlying transport. - with mock.patch.object(type(client.transport), "close") as close: - close.assert_not_called() - with client: - pass - close.assert_called() - -@pytest.mark.parametrize("client_class,transport_class", [ - (TextToSpeechClient, transports.TextToSpeechGrpcTransport), - (TextToSpeechAsyncClient, transports.TextToSpeechGrpcAsyncIOTransport), -]) -def test_api_key_credentials(client_class, transport_class): - with mock.patch.object( - google.auth._default, "get_api_key_credentials", create=True - ) as get_api_key_credentials: - mock_cred = mock.Mock() - get_api_key_credentials.return_value = mock_cred - options = client_options.ClientOptions() - options.api_key = "api_key" - with mock.patch.object(transport_class, "__init__") as patched: - patched.return_value = None - client = client_class(client_options=options) - patched.assert_called_once_with( - credentials=mock_cred, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) diff --git a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech_long_audio_synthesize.py b/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech_long_audio_synthesize.py deleted file mode 100644 index 94782be9078e..000000000000 --- a/owl-bot-staging/google-cloud-texttospeech/v1beta1/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech_long_audio_synthesize.py +++ /dev/null @@ -1,2433 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2024 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 -# try/except added for compatibility with python < 3.8 -try: - from unittest import mock - from unittest.mock import AsyncMock # pragma: NO COVER -except ImportError: # pragma: NO COVER - import mock - -import grpc -from grpc.experimental import aio -from collections.abc import Iterable, AsyncIterable -from google.protobuf import json_format -import json -import math -import pytest -from google.api_core import api_core_version -from proto.marshal.rules.dates import DurationRule, TimestampRule -from proto.marshal.rules import wrappers -from requests import Response -from requests import Request, PreparedRequest -from requests.sessions import Session -from google.protobuf import json_format - -try: - from google.auth.aio import credentials as ga_credentials_async - HAS_GOOGLE_AUTH_AIO = True -except ImportError: # pragma: NO COVER - HAS_GOOGLE_AUTH_AIO = False - -from google.api_core import client_options -from google.api_core import exceptions as core_exceptions -from google.api_core import future -from google.api_core import gapic_v1 -from google.api_core import grpc_helpers -from google.api_core import grpc_helpers_async -from google.api_core import operation -from google.api_core import operation_async # type: ignore -from google.api_core import operations_v1 -from google.api_core import path_template -from google.api_core import retry as retries -from google.auth import credentials as ga_credentials -from google.auth.exceptions import MutualTLSChannelError -from google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeAsyncClient -from google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize import TextToSpeechLongAudioSynthesizeClient -from google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize import transports -from google.cloud.texttospeech_v1beta1.types import cloud_tts -from google.cloud.texttospeech_v1beta1.types import cloud_tts_lrs -from google.longrunning import operations_pb2 # type: ignore -from google.oauth2 import service_account -import google.auth - - -async def mock_async_gen(data, chunk_size=1): - for i in range(0, len(data)): # pragma: NO COVER - chunk = data[i : i + chunk_size] - yield chunk.encode("utf-8") - -def client_cert_source_callback(): - return b"cert bytes", b"key bytes" - -# TODO: use async auth anon credentials by default once the minimum version of google-auth is upgraded. -# See related issue: https://github.com/googleapis/gapic-generator-python/issues/2107. -def async_anonymous_credentials(): - if HAS_GOOGLE_AUTH_AIO: - return ga_credentials_async.AnonymousCredentials() - return ga_credentials.AnonymousCredentials() - -# If default endpoint is localhost, then default mtls endpoint will be the same. -# This method modifies the default endpoint so the client can produce a different -# mtls endpoint for endpoint testing purposes. -def modify_default_endpoint(client): - return "foo.googleapis.com" if ("localhost" in client.DEFAULT_ENDPOINT) else client.DEFAULT_ENDPOINT - -# If default endpoint template is localhost, then default mtls endpoint will be the same. -# This method modifies the default endpoint template so the client can produce a different -# mtls endpoint for endpoint testing purposes. -def modify_default_endpoint_template(client): - return "test.{UNIVERSE_DOMAIN}" if ("localhost" in client._DEFAULT_ENDPOINT_TEMPLATE) else client._DEFAULT_ENDPOINT_TEMPLATE - - -def test__get_default_mtls_endpoint(): - api_endpoint = "example.googleapis.com" - api_mtls_endpoint = "example.mtls.googleapis.com" - sandbox_endpoint = "example.sandbox.googleapis.com" - sandbox_mtls_endpoint = "example.mtls.sandbox.googleapis.com" - non_googleapi = "api.example.com" - - assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(None) is None - assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(api_endpoint) == api_mtls_endpoint - assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(api_mtls_endpoint) == api_mtls_endpoint - assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(sandbox_endpoint) == sandbox_mtls_endpoint - assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(sandbox_mtls_endpoint) == sandbox_mtls_endpoint - assert TextToSpeechLongAudioSynthesizeClient._get_default_mtls_endpoint(non_googleapi) == non_googleapi - -def test__read_environment_variables(): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (True, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): - with pytest.raises(ValueError) as excinfo: - TextToSpeechLongAudioSynthesizeClient._read_environment_variables() - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "never", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "always", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", None) - - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): - with pytest.raises(MutualTLSChannelError) as excinfo: - TextToSpeechLongAudioSynthesizeClient._read_environment_variables() - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" - - with mock.patch.dict(os.environ, {"GOOGLE_CLOUD_UNIVERSE_DOMAIN": "foo.com"}): - assert TextToSpeechLongAudioSynthesizeClient._read_environment_variables() == (False, "auto", "foo.com") - -def test__get_client_cert_source(): - mock_provided_cert_source = mock.Mock() - mock_default_cert_source = mock.Mock() - - assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(None, False) is None - assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(mock_provided_cert_source, False) is None - assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(mock_provided_cert_source, True) == mock_provided_cert_source - - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): - with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_default_cert_source): - assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(None, True) is mock_default_cert_source - assert TextToSpeechLongAudioSynthesizeClient._get_client_cert_source(mock_provided_cert_source, "true") is mock_provided_cert_source - -@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) -@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) -def test__get_api_endpoint(): - api_override = "foo.com" - mock_client_cert_source = mock.Mock() - default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - default_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) - mock_universe = "bar.com" - mock_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) - - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(api_override, mock_client_cert_source, default_universe, "always") == api_override - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "auto") == TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, default_universe, "auto") == default_endpoint - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, default_universe, "always") == TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, mock_client_cert_source, default_universe, "always") == TextToSpeechLongAudioSynthesizeClient.DEFAULT_MTLS_ENDPOINT - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, mock_universe, "never") == mock_endpoint - assert TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, None, default_universe, "never") == default_endpoint - - with pytest.raises(MutualTLSChannelError) as excinfo: - TextToSpeechLongAudioSynthesizeClient._get_api_endpoint(None, mock_client_cert_source, mock_universe, "auto") - assert str(excinfo.value) == "mTLS is not supported in any universe other than googleapis.com." - - -def test__get_universe_domain(): - client_universe_domain = "foo.com" - universe_domain_env = "bar.com" - - assert TextToSpeechLongAudioSynthesizeClient._get_universe_domain(client_universe_domain, universe_domain_env) == client_universe_domain - assert TextToSpeechLongAudioSynthesizeClient._get_universe_domain(None, universe_domain_env) == universe_domain_env - assert TextToSpeechLongAudioSynthesizeClient._get_universe_domain(None, None) == TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - - with pytest.raises(ValueError) as excinfo: - TextToSpeechLongAudioSynthesizeClient._get_universe_domain("", None) - assert str(excinfo.value) == "Universe Domain cannot be an empty string." - -@pytest.mark.parametrize("client_class,transport_class,transport_name", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), -]) -def test__validate_universe_domain(client_class, transport_class, transport_name): - client = client_class( - transport=transport_class( - credentials=ga_credentials.AnonymousCredentials() - ) - ) - assert client._validate_universe_domain() == True - - # Test the case when universe is already validated. - assert client._validate_universe_domain() == True - - if transport_name == "grpc": - # Test the case where credentials are provided by the - # `local_channel_credentials`. The default universes in both match. - channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) - client = client_class(transport=transport_class(channel=channel)) - assert client._validate_universe_domain() == True - - # Test the case where credentials do not exist: e.g. a transport is provided - # with no credentials. Validation should still succeed because there is no - # mismatch with non-existent credentials. - channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) - transport=transport_class(channel=channel) - transport._credentials = None - client = client_class(transport=transport) - assert client._validate_universe_domain() == True - - # TODO: This is needed to cater for older versions of google-auth - # Make this test unconditional once the minimum supported version of - # google-auth becomes 2.23.0 or higher. - google_auth_major, google_auth_minor = [int(part) for part in google.auth.__version__.split(".")[0:2]] - if google_auth_major > 2 or (google_auth_major == 2 and google_auth_minor >= 23): - credentials = ga_credentials.AnonymousCredentials() - credentials._universe_domain = "foo.com" - # Test the case when there is a universe mismatch from the credentials. - client = client_class( - transport=transport_class(credentials=credentials) - ) - with pytest.raises(ValueError) as excinfo: - client._validate_universe_domain() - assert str(excinfo.value) == "The configured universe domain (googleapis.com) does not match the universe domain found in the credentials (foo.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." - - # Test the case when there is a universe mismatch from the client. - # - # TODO: Make this test unconditional once the minimum supported version of - # google-api-core becomes 2.15.0 or higher. - api_core_major, api_core_minor = [int(part) for part in api_core_version.__version__.split(".")[0:2]] - if api_core_major > 2 or (api_core_major == 2 and api_core_minor >= 15): - client = client_class(client_options={"universe_domain": "bar.com"}, transport=transport_class(credentials=ga_credentials.AnonymousCredentials(),)) - with pytest.raises(ValueError) as excinfo: - client._validate_universe_domain() - assert str(excinfo.value) == "The configured universe domain (bar.com) does not match the universe domain found in the credentials (googleapis.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default." - - # Test that ValueError is raised if universe_domain is provided via client options and credentials is None - with pytest.raises(ValueError): - client._compare_universes("foo.bar", None) - - -@pytest.mark.parametrize("client_class,transport_name", [ - (TextToSpeechLongAudioSynthesizeClient, "grpc"), - (TextToSpeechLongAudioSynthesizeAsyncClient, "grpc_asyncio"), - (TextToSpeechLongAudioSynthesizeClient, "rest"), -]) -def test_text_to_speech_long_audio_synthesize_client_from_service_account_info(client_class, transport_name): - creds = ga_credentials.AnonymousCredentials() - with mock.patch.object(service_account.Credentials, 'from_service_account_info') as factory: - factory.return_value = creds - info = {"valid": True} - client = client_class.from_service_account_info(info, transport=transport_name) - assert client.transport._credentials == creds - assert isinstance(client, client_class) - - assert client.transport._host == ( - 'texttospeech.googleapis.com:443' - if transport_name in ['grpc', 'grpc_asyncio'] - else - 'https://texttospeech.googleapis.com' - ) - - -@pytest.mark.parametrize("transport_class,transport_name", [ - (transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), - (transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio"), - (transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), -]) -def test_text_to_speech_long_audio_synthesize_client_service_account_always_use_jwt(transport_class, transport_name): - with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: - creds = service_account.Credentials(None, None, None) - transport = transport_class(credentials=creds, always_use_jwt_access=True) - use_jwt.assert_called_once_with(True) - - with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt: - creds = service_account.Credentials(None, None, None) - transport = transport_class(credentials=creds, always_use_jwt_access=False) - use_jwt.assert_not_called() - - -@pytest.mark.parametrize("client_class,transport_name", [ - (TextToSpeechLongAudioSynthesizeClient, "grpc"), - (TextToSpeechLongAudioSynthesizeAsyncClient, "grpc_asyncio"), - (TextToSpeechLongAudioSynthesizeClient, "rest"), -]) -def test_text_to_speech_long_audio_synthesize_client_from_service_account_file(client_class, transport_name): - creds = ga_credentials.AnonymousCredentials() - with mock.patch.object(service_account.Credentials, 'from_service_account_file') as factory: - factory.return_value = creds - client = client_class.from_service_account_file("dummy/file/path.json", transport=transport_name) - assert client.transport._credentials == creds - assert isinstance(client, client_class) - - client = client_class.from_service_account_json("dummy/file/path.json", transport=transport_name) - assert client.transport._credentials == creds - assert isinstance(client, client_class) - - assert client.transport._host == ( - 'texttospeech.googleapis.com:443' - if transport_name in ['grpc', 'grpc_asyncio'] - else - 'https://texttospeech.googleapis.com' - ) - - -def test_text_to_speech_long_audio_synthesize_client_get_transport_class(): - transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class() - available_transports = [ - transports.TextToSpeechLongAudioSynthesizeGrpcTransport, - transports.TextToSpeechLongAudioSynthesizeRestTransport, - ] - assert transport in available_transports - - transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class("grpc") - assert transport == transports.TextToSpeechLongAudioSynthesizeGrpcTransport - - -@pytest.mark.parametrize("client_class,transport_class,transport_name", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio"), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), -]) -@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) -@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) -def test_text_to_speech_long_audio_synthesize_client_client_options(client_class, transport_class, transport_name): - # Check that if channel is provided we won't create a new one. - with mock.patch.object(TextToSpeechLongAudioSynthesizeClient, 'get_transport_class') as gtc: - transport = transport_class( - credentials=ga_credentials.AnonymousCredentials() - ) - client = client_class(transport=transport) - gtc.assert_not_called() - - # Check that if channel is provided via str we will create a new one. - with mock.patch.object(TextToSpeechLongAudioSynthesizeClient, 'get_transport_class') as gtc: - client = client_class(transport=transport_name) - gtc.assert_called() - - # Check the case api_endpoint is provided. - options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(transport=transport_name, client_options=options) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host="squid.clam.whelk", - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is - # "never". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is - # "always". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client.DEFAULT_MTLS_ENDPOINT, - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has - # unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): - with pytest.raises(MutualTLSChannelError) as excinfo: - client = client_class(transport=transport_name) - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" - - # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): - with pytest.raises(ValueError) as excinfo: - client = client_class(transport=transport_name) - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - - # Check the case quota_project_id is provided - options = client_options.ClientOptions(quota_project_id="octopus") - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id="octopus", - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - # Check the case api_endpoint is provided - options = client_options.ClientOptions(api_audience="https://language.googleapis.com") - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience="https://language.googleapis.com" - ) - -@pytest.mark.parametrize("client_class,transport_class,transport_name,use_client_cert_env", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", "true"), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", "true"), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", "false"), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", "false"), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest", "true"), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest", "false"), -]) -@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) -@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) -@mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"}) -def test_text_to_speech_long_audio_synthesize_client_mtls_env_auto(client_class, transport_class, transport_name, use_client_cert_env): - # This tests the endpoint autoswitch behavior. Endpoint is autoswitched to the default - # mtls endpoint, if GOOGLE_API_USE_CLIENT_CERTIFICATE is "true" and client cert exists. - - # Check the case client_cert_source is provided. Whether client cert is used depends on - # GOOGLE_API_USE_CLIENT_CERTIFICATE value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): - options = client_options.ClientOptions(client_cert_source=client_cert_source_callback) - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - - if use_client_cert_env == "false": - expected_client_cert_source = None - expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) - else: - expected_client_cert_source = client_cert_source_callback - expected_host = client.DEFAULT_MTLS_ENDPOINT - - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=expected_host, - scopes=None, - client_cert_source_for_mtls=expected_client_cert_source, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case ADC client cert is provided. Whether client cert is used depends on - # GOOGLE_API_USE_CLIENT_CERTIFICATE value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): - with mock.patch.object(transport_class, '__init__') as patched: - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): - with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=client_cert_source_callback): - if use_client_cert_env == "false": - expected_host = client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE) - expected_client_cert_source = None - else: - expected_host = client.DEFAULT_MTLS_ENDPOINT - expected_client_cert_source = client_cert_source_callback - - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=expected_host, - scopes=None, - client_cert_source_for_mtls=expected_client_cert_source, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # Check the case client_cert_source and ADC client cert are not provided. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}): - with mock.patch.object(transport_class, '__init__') as patched: - with mock.patch("google.auth.transport.mtls.has_default_client_cert_source", return_value=False): - patched.return_value = None - client = client_class(transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - -@pytest.mark.parametrize("client_class", [ - TextToSpeechLongAudioSynthesizeClient, TextToSpeechLongAudioSynthesizeAsyncClient -]) -@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechLongAudioSynthesizeClient)) -@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(TextToSpeechLongAudioSynthesizeAsyncClient)) -def test_text_to_speech_long_audio_synthesize_client_get_mtls_endpoint_and_cert_source(client_class): - mock_client_cert_source = mock.Mock() - - # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "true". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - mock_api_endpoint = "foo" - options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) - assert api_endpoint == mock_api_endpoint - assert cert_source == mock_client_cert_source - - # Test the case GOOGLE_API_USE_CLIENT_CERTIFICATE is "false". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}): - mock_client_cert_source = mock.Mock() - mock_api_endpoint = "foo" - options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=mock_api_endpoint) - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source(options) - assert api_endpoint == mock_api_endpoint - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "never". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_ENDPOINT - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "always". - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert doesn't exist. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=False): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_ENDPOINT - assert cert_source is None - - # Test the case GOOGLE_API_USE_MTLS_ENDPOINT is "auto" and default cert exists. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True): - with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=mock_client_cert_source): - api_endpoint, cert_source = client_class.get_mtls_endpoint_and_cert_source() - assert api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT - assert cert_source == mock_client_cert_source - - # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has - # unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}): - with pytest.raises(MutualTLSChannelError) as excinfo: - client_class.get_mtls_endpoint_and_cert_source() - - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`" - - # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}): - with pytest.raises(ValueError) as excinfo: - client_class.get_mtls_endpoint_and_cert_source() - - assert str(excinfo.value) == "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`" - -@pytest.mark.parametrize("client_class", [ - TextToSpeechLongAudioSynthesizeClient, TextToSpeechLongAudioSynthesizeAsyncClient -]) -@mock.patch.object(TextToSpeechLongAudioSynthesizeClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeClient)) -@mock.patch.object(TextToSpeechLongAudioSynthesizeAsyncClient, "_DEFAULT_ENDPOINT_TEMPLATE", modify_default_endpoint_template(TextToSpeechLongAudioSynthesizeAsyncClient)) -def test_text_to_speech_long_audio_synthesize_client_client_api_endpoint(client_class): - mock_client_cert_source = client_cert_source_callback - api_override = "foo.com" - default_universe = TextToSpeechLongAudioSynthesizeClient._DEFAULT_UNIVERSE - default_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=default_universe) - mock_universe = "bar.com" - mock_endpoint = TextToSpeechLongAudioSynthesizeClient._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=mock_universe) - - # If ClientOptions.api_endpoint is set and GOOGLE_API_USE_CLIENT_CERTIFICATE="true", - # use ClientOptions.api_endpoint as the api endpoint regardless. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}): - with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel"): - options = client_options.ClientOptions(client_cert_source=mock_client_cert_source, api_endpoint=api_override) - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == api_override - - # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="never", - # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - client = client_class(credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == default_endpoint - - # If ClientOptions.api_endpoint is not set and GOOGLE_API_USE_MTLS_ENDPOINT="always", - # use the DEFAULT_MTLS_ENDPOINT as the api endpoint. - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): - client = client_class(credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == client_class.DEFAULT_MTLS_ENDPOINT - - # If ClientOptions.api_endpoint is not set, GOOGLE_API_USE_MTLS_ENDPOINT="auto" (default), - # GOOGLE_API_USE_CLIENT_CERTIFICATE="false" (default), default cert source doesn't exist, - # and ClientOptions.universe_domain="bar.com", - # use the _DEFAULT_ENDPOINT_TEMPLATE populated with universe domain as the api endpoint. - options = client_options.ClientOptions() - universe_exists = hasattr(options, "universe_domain") - if universe_exists: - options = client_options.ClientOptions(universe_domain=mock_universe) - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - else: - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == (mock_endpoint if universe_exists else default_endpoint) - assert client.universe_domain == (mock_universe if universe_exists else default_universe) - - # If ClientOptions does not have a universe domain attribute and GOOGLE_API_USE_MTLS_ENDPOINT="never", - # use the _DEFAULT_ENDPOINT_TEMPLATE populated with GDU as the api endpoint. - options = client_options.ClientOptions() - if hasattr(options, "universe_domain"): - delattr(options, "universe_domain") - with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): - client = client_class(client_options=options, credentials=ga_credentials.AnonymousCredentials()) - assert client.api_endpoint == default_endpoint - - -@pytest.mark.parametrize("client_class,transport_class,transport_name", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc"), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio"), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest"), -]) -def test_text_to_speech_long_audio_synthesize_client_client_options_scopes(client_class, transport_class, transport_name): - # Check the case scopes are provided. - options = client_options.ClientOptions( - scopes=["1", "2"], - ) - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=["1", "2"], - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - -@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", grpc_helpers), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeRestTransport, "rest", None), -]) -def test_text_to_speech_long_audio_synthesize_client_client_options_credentials_file(client_class, transport_class, transport_name, grpc_helpers): - # Check the case credentials file is provided. - options = client_options.ClientOptions( - credentials_file="credentials.json" - ) - - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file="credentials.json", - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - -def test_text_to_speech_long_audio_synthesize_client_client_options_from_dict(): - with mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeGrpcTransport.__init__') as grpc_transport: - grpc_transport.return_value = None - client = TextToSpeechLongAudioSynthesizeClient( - client_options={'api_endpoint': 'squid.clam.whelk'} - ) - grpc_transport.assert_called_once_with( - credentials=None, - credentials_file=None, - host="squid.clam.whelk", - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - -@pytest.mark.parametrize("client_class,transport_class,transport_name,grpc_helpers", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport, "grpc", grpc_helpers), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, "grpc_asyncio", grpc_helpers_async), -]) -def test_text_to_speech_long_audio_synthesize_client_create_channel_credentials_file(client_class, transport_class, transport_name, grpc_helpers): - # Check the case credentials file is provided. - options = client_options.ClientOptions( - credentials_file="credentials.json" - ) - - with mock.patch.object(transport_class, '__init__') as patched: - patched.return_value = None - client = client_class(client_options=options, transport=transport_name) - patched.assert_called_once_with( - credentials=None, - credentials_file="credentials.json", - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) - - # test that the credentials from file are saved and used as the credentials. - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch.object( - google.auth, "default", autospec=True - ) as adc, mock.patch.object( - grpc_helpers, "create_channel" - ) as create_channel: - creds = ga_credentials.AnonymousCredentials() - file_creds = ga_credentials.AnonymousCredentials() - load_creds.return_value = (file_creds, None) - adc.return_value = (creds, None) - client = client_class(client_options=options, transport=transport_name) - create_channel.assert_called_with( - "texttospeech.googleapis.com:443", - credentials=file_creds, - credentials_file=None, - quota_project_id=None, - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - scopes=None, - default_host="texttospeech.googleapis.com", - ssl_credentials=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts_lrs.SynthesizeLongAudioRequest, - dict, -]) -def test_synthesize_long_audio(request_type, transport: str = 'grpc'): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.Operation(name='operations/spam') - response = client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - request = cloud_tts_lrs.SynthesizeLongAudioRequest() - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, future.Future) - - -def test_synthesize_long_audio_non_empty_request_with_auto_populated_field(): - # This test is a coverage failsafe to make sure that UUID4 fields are - # automatically populated, according to AIP-4235, with non-empty requests. - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='grpc', - ) - - # Populate all string fields in the request which are not UUID4 - # since we want to check that UUID4 are populated automatically - # if they meet the requirements of AIP 4235. - request = cloud_tts_lrs.SynthesizeLongAudioRequest( - parent='parent_value', - output_gcs_uri='output_gcs_uri_value', - ) - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - call.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client.synthesize_long_audio(request=request) - call.assert_called() - _, args, _ = call.mock_calls[0] - assert args[0] == cloud_tts_lrs.SynthesizeLongAudioRequest( - parent='parent_value', - output_gcs_uri='output_gcs_uri_value', - ) - -def test_synthesize_long_audio_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.synthesize_long_audio in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.synthesize_long_audio] = mock_rpc - request = {} - client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - # Operation methods call wrapper_fn to build a cached - # client._transport.operations_client instance on first rpc call. - # Subsequent calls should use the cached wrapper - wrapper_fn.reset_mock() - - client.synthesize_long_audio(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_synthesize_long_audio_async_use_cached_wrapped_rpc(transport: str = "grpc_asyncio"): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method_async.wrap_method") as wrapper_fn: - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._client._transport.synthesize_long_audio in client._client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.AsyncMock() - mock_rpc.return_value = mock.Mock() - client._client._transport._wrapped_methods[client._client._transport.synthesize_long_audio] = mock_rpc - - request = {} - await client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - # Operation methods call wrapper_fn to build a cached - # client._transport.operations_client instance on first rpc call. - # Subsequent calls should use the cached wrapper - wrapper_fn.reset_mock() - - await client.synthesize_long_audio(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - -@pytest.mark.asyncio -async def test_synthesize_long_audio_async(transport: str = 'grpc_asyncio', request_type=cloud_tts_lrs.SynthesizeLongAudioRequest): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = request_type() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation(name='operations/spam') - ) - response = await client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - request = cloud_tts_lrs.SynthesizeLongAudioRequest() - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, future.Future) - - -@pytest.mark.asyncio -async def test_synthesize_long_audio_async_from_dict(): - await test_synthesize_long_audio_async(request_type=dict) - -def test_synthesize_long_audio_field_headers(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = cloud_tts_lrs.SynthesizeLongAudioRequest() - - request.parent = 'parent_value' - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - call.return_value = operations_pb2.Operation(name='operations/op') - client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ( - 'x-goog-request-params', - 'parent=parent_value', - ) in kw['metadata'] - - -@pytest.mark.asyncio -async def test_synthesize_long_audio_field_headers_async(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = cloud_tts_lrs.SynthesizeLongAudioRequest() - - request.parent = 'parent_value' - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(operations_pb2.Operation(name='operations/op')) - await client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ( - 'x-goog-request-params', - 'parent=parent_value', - ) in kw['metadata'] - - -def test_synthesize_long_audio_rest_use_cached_wrapped_rpc(): - # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, - # instead of constructing them on each call - with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Should wrap all calls on client creation - assert wrapper_fn.call_count > 0 - wrapper_fn.reset_mock() - - # Ensure method has been cached - assert client._transport.synthesize_long_audio in client._transport._wrapped_methods - - # Replace cached wrapped function with mock - mock_rpc = mock.Mock() - mock_rpc.return_value.name = "foo" # operation_request.operation in compute client(s) expect a string. - client._transport._wrapped_methods[client._transport.synthesize_long_audio] = mock_rpc - - request = {} - client.synthesize_long_audio(request) - - # Establish that the underlying gRPC stub method was called. - assert mock_rpc.call_count == 1 - - # Operation methods build a cached wrapper on first rpc call - # subsequent calls should use the cached wrapper - wrapper_fn.reset_mock() - - client.synthesize_long_audio(request) - - # Establish that a new wrapper was not created for this call - assert wrapper_fn.call_count == 0 - assert mock_rpc.call_count == 2 - - -def test_synthesize_long_audio_rest_required_fields(request_type=cloud_tts_lrs.SynthesizeLongAudioRequest): - transport_class = transports.TextToSpeechLongAudioSynthesizeRestTransport - - request_init = {} - request_init["output_gcs_uri"] = "" - request = request_type(**request_init) - pb_request = request_type.pb(request) - jsonified_request = json.loads(json_format.MessageToJson( - pb_request, - use_integers_for_enums=False - )) - - # verify fields with default values are dropped - - unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_long_audio._get_unset_required_fields(jsonified_request) - jsonified_request.update(unset_fields) - - # verify required fields with default values are now present - - jsonified_request["outputGcsUri"] = 'output_gcs_uri_value' - - unset_fields = transport_class(credentials=ga_credentials.AnonymousCredentials()).synthesize_long_audio._get_unset_required_fields(jsonified_request) - jsonified_request.update(unset_fields) - - # verify required fields with non-default values are left alone - assert "outputGcsUri" in jsonified_request - assert jsonified_request["outputGcsUri"] == 'output_gcs_uri_value' - - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='rest', - ) - request = request_type(**request_init) - - # Designate an appropriate value for the returned response. - return_value = operations_pb2.Operation(name='operations/spam') - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, 'request') as req: - # We need to mock transcode() because providing default values - # for required fields will fail the real version if the http_options - # expect actual values for those fields. - with mock.patch.object(path_template, 'transcode') as transcode: - # A uri without fields and an empty body will force all the - # request fields to show up in the query_params. - pb_request = request_type.pb(request) - transcode_result = { - 'uri': 'v1/sample_method', - 'method': "post", - 'query_params': pb_request, - } - transcode_result['body'] = pb_request - transcode.return_value = transcode_result - - response_value = Response() - response_value.status_code = 200 - json_return_value = json_format.MessageToJson(return_value) - - response_value._content = json_return_value.encode('UTF-8') - req.return_value = response_value - - response = client.synthesize_long_audio(request) - - expected_params = [ - ] - actual_params = req.call_args.kwargs['params'] - assert expected_params == actual_params - - -def test_synthesize_long_audio_rest_unset_required_fields(): - transport = transports.TextToSpeechLongAudioSynthesizeRestTransport(credentials=ga_credentials.AnonymousCredentials) - - unset_fields = transport.synthesize_long_audio._get_unset_required_fields({}) - assert set(unset_fields) == (set(()) & set(("input", "audioConfig", "outputGcsUri", "voice", ))) - - -def test_credentials_transport_error(): - # It is an error to provide credentials and a transport instance. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - with pytest.raises(ValueError): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # It is an error to provide a credentials file and a transport instance. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - with pytest.raises(ValueError): - client = TextToSpeechLongAudioSynthesizeClient( - client_options={"credentials_file": "credentials.json"}, - transport=transport, - ) - - # It is an error to provide an api_key and a transport instance. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - options = client_options.ClientOptions() - options.api_key = "api_key" - with pytest.raises(ValueError): - client = TextToSpeechLongAudioSynthesizeClient( - client_options=options, - transport=transport, - ) - - # It is an error to provide an api_key and a credential. - options = client_options.ClientOptions() - options.api_key = "api_key" - with pytest.raises(ValueError): - client = TextToSpeechLongAudioSynthesizeClient( - client_options=options, - credentials=ga_credentials.AnonymousCredentials() - ) - - # It is an error to provide scopes and a transport instance. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - with pytest.raises(ValueError): - client = TextToSpeechLongAudioSynthesizeClient( - client_options={"scopes": ["1", "2"]}, - transport=transport, - ) - - -def test_transport_instance(): - # A client may be instantiated with a custom transport instance. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - client = TextToSpeechLongAudioSynthesizeClient(transport=transport) - assert client.transport is transport - -def test_transport_get_channel(): - # A client may be instantiated with a custom transport instance. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - channel = transport.grpc_channel - assert channel - - transport = transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - channel = transport.grpc_channel - assert channel - -@pytest.mark.parametrize("transport_class", [ - transports.TextToSpeechLongAudioSynthesizeGrpcTransport, - transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, - transports.TextToSpeechLongAudioSynthesizeRestTransport, -]) -def test_transport_adc(transport_class): - # Test default credentials are used if not provided. - with mock.patch.object(google.auth, 'default') as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class() - adc.assert_called_once() - -def test_transport_kind_grpc(): - transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class("grpc")( - credentials=ga_credentials.AnonymousCredentials() - ) - assert transport.kind == "grpc" - - -def test_initialize_client_w_grpc(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc" - ) - assert client is not None - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -def test_synthesize_long_audio_empty_call_grpc(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - call.return_value = operations_pb2.Operation(name='operations/op') - client.synthesize_long_audio(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts_lrs.SynthesizeLongAudioRequest() - - assert args[0] == request_msg - - -def test_transport_kind_grpc_asyncio(): - transport = TextToSpeechLongAudioSynthesizeAsyncClient.get_transport_class("grpc_asyncio")( - credentials=async_anonymous_credentials() - ) - assert transport.kind == "grpc_asyncio" - - -def test_initialize_client_w_grpc_asyncio(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio" - ) - assert client is not None - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -@pytest.mark.asyncio -async def test_synthesize_long_audio_empty_call_grpc_asyncio(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation(name='operations/spam') - ) - await client.synthesize_long_audio(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts_lrs.SynthesizeLongAudioRequest() - - assert args[0] == request_msg - - -def test_transport_kind_rest(): - transport = TextToSpeechLongAudioSynthesizeClient.get_transport_class("rest")( - credentials=ga_credentials.AnonymousCredentials() - ) - assert transport.kind == "rest" - - -def test_synthesize_long_audio_rest_bad_request(request_type=cloud_tts_lrs.SynthesizeLongAudioRequest): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - # send a request that will satisfy transcoding - request_init = {'parent': 'projects/sample1/locations/sample2'} - request = request_type(**request_init) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = mock.Mock() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = mock.Mock() - req.return_value = response_value - client.synthesize_long_audio(request) - - -@pytest.mark.parametrize("request_type", [ - cloud_tts_lrs.SynthesizeLongAudioRequest, - dict, -]) -def test_synthesize_long_audio_rest_call_success(request_type): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - - # send a request that will satisfy transcoding - request_init = {'parent': 'projects/sample1/locations/sample2'} - request = request_type(**request_init) - - # Mock the http request call within the method and fake a response. - with mock.patch.object(type(client.transport._session), 'request') as req: - # Designate an appropriate value for the returned response. - return_value = operations_pb2.Operation(name='operations/spam') - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - req.return_value = response_value - response = client.synthesize_long_audio(request) - - # Establish that the response is the type that we expect. - json_return_value = json_format.MessageToJson(return_value) - - -@pytest.mark.parametrize("null_interceptor", [True, False]) -def test_synthesize_long_audio_rest_interceptors(null_interceptor): - transport = transports.TextToSpeechLongAudioSynthesizeRestTransport( - credentials=ga_credentials.AnonymousCredentials(), - interceptor=None if null_interceptor else transports.TextToSpeechLongAudioSynthesizeRestInterceptor(), - ) - client = TextToSpeechLongAudioSynthesizeClient(transport=transport) - - with mock.patch.object(type(client.transport._session), "request") as req, \ - mock.patch.object(path_template, "transcode") as transcode, \ - mock.patch.object(operation.Operation, "_set_result_from_operation"), \ - mock.patch.object(transports.TextToSpeechLongAudioSynthesizeRestInterceptor, "post_synthesize_long_audio") as post, \ - mock.patch.object(transports.TextToSpeechLongAudioSynthesizeRestInterceptor, "pre_synthesize_long_audio") as pre: - pre.assert_not_called() - post.assert_not_called() - pb_message = cloud_tts_lrs.SynthesizeLongAudioRequest.pb(cloud_tts_lrs.SynthesizeLongAudioRequest()) - transcode.return_value = { - "method": "post", - "uri": "my_uri", - "body": pb_message, - "query_params": pb_message, - } - - req.return_value = mock.Mock() - req.return_value.status_code = 200 - return_value = json_format.MessageToJson(operations_pb2.Operation()) - req.return_value.content = return_value - - request = cloud_tts_lrs.SynthesizeLongAudioRequest() - metadata =[ - ("key", "val"), - ("cephalopod", "squid"), - ] - pre.return_value = request, metadata - post.return_value = operations_pb2.Operation() - - client.synthesize_long_audio(request, metadata=[("key", "val"), ("cephalopod", "squid"),]) - - pre.assert_called_once() - post.assert_called_once() - - -def test_get_operation_rest_bad_request(request_type=operations_pb2.GetOperationRequest): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - request = request_type() - request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2/operations/sample3'}, request) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = Response() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = Request() - req.return_value = response_value - client.get_operation(request) - - -@pytest.mark.parametrize("request_type", [ - operations_pb2.GetOperationRequest, - dict, -]) -def test_get_operation_rest(request_type): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - request_init = {'name': 'projects/sample1/locations/sample2/operations/sample3'} - request = request_type(**request_init) - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, 'request') as req: - # Designate an appropriate value for the returned response. - return_value = operations_pb2.Operation() - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - - req.return_value = response_value - - response = client.get_operation(request) - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.Operation) - - -def test_list_operations_rest_bad_request(request_type=operations_pb2.ListOperationsRequest): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - request = request_type() - request = json_format.ParseDict({'name': 'projects/sample1/locations/sample2'}, request) - - # Mock the http request call within the method and fake a BadRequest error. - with mock.patch.object(Session, 'request') as req, pytest.raises(core_exceptions.BadRequest): - # Wrap the value into a proper Response obj - response_value = Response() - json_return_value = '' - response_value.json = mock.Mock(return_value={}) - response_value.status_code = 400 - response_value.request = Request() - req.return_value = response_value - client.list_operations(request) - - -@pytest.mark.parametrize("request_type", [ - operations_pb2.ListOperationsRequest, - dict, -]) -def test_list_operations_rest(request_type): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - request_init = {'name': 'projects/sample1/locations/sample2'} - request = request_type(**request_init) - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, 'request') as req: - # Designate an appropriate value for the returned response. - return_value = operations_pb2.ListOperationsResponse() - - # Wrap the value into a proper Response obj - response_value = mock.Mock() - response_value.status_code = 200 - json_return_value = json_format.MessageToJson(return_value) - response_value.content = json_return_value.encode('UTF-8') - - req.return_value = response_value - - response = client.list_operations(request) - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.ListOperationsResponse) - -def test_initialize_client_w_rest(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - assert client is not None - - -# This test is a coverage failsafe to make sure that totally empty calls, -# i.e. request == None and no flattened fields passed, work. -def test_synthesize_long_audio_empty_call_rest(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - - # Mock the actual call, and fake the request. - with mock.patch.object( - type(client.transport.synthesize_long_audio), - '__call__') as call: - client.synthesize_long_audio(request=None) - - # Establish that the underlying stub method was called. - call.assert_called() - _, args, _ = call.mock_calls[0] - request_msg = cloud_tts_lrs.SynthesizeLongAudioRequest() - - assert args[0] == request_msg - - -def test_text_to_speech_long_audio_synthesize_rest_lro_client(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest", - ) - transport = client.transport - - # Ensure that we have an api-core operations client. - assert isinstance( - transport.operations_client, -operations_v1.AbstractOperationsClient, - ) - - # Ensure that subsequent calls to the property send the exact same object. - assert transport.operations_client is transport.operations_client - -def test_transport_grpc_default(): - # A client should use the gRPC transport by default. - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - assert isinstance( - client.transport, - transports.TextToSpeechLongAudioSynthesizeGrpcTransport, - ) - -def test_text_to_speech_long_audio_synthesize_base_transport_error(): - # Passing both a credentials object and credentials_file should raise an error - with pytest.raises(core_exceptions.DuplicateCredentialArgs): - transport = transports.TextToSpeechLongAudioSynthesizeTransport( - credentials=ga_credentials.AnonymousCredentials(), - credentials_file="credentials.json" - ) - - -def test_text_to_speech_long_audio_synthesize_base_transport(): - # Instantiate the base transport. - with mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeTransport.__init__') as Transport: - Transport.return_value = None - transport = transports.TextToSpeechLongAudioSynthesizeTransport( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Every method on the transport should just blindly - # raise NotImplementedError. - methods = ( - 'synthesize_long_audio', - 'get_operation', - 'list_operations', - ) - for method in methods: - with pytest.raises(NotImplementedError): - getattr(transport, method)(request=object()) - - with pytest.raises(NotImplementedError): - transport.close() - - # Additionally, the LRO client (a property) should - # also raise NotImplementedError - with pytest.raises(NotImplementedError): - transport.operations_client - - # Catch all for all remaining methods and properties - remainder = [ - 'kind', - ] - for r in remainder: - with pytest.raises(NotImplementedError): - getattr(transport, r)() - - -def test_text_to_speech_long_audio_synthesize_base_transport_with_credentials_file(): - # Instantiate the base transport with a credentials file - with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeTransport._prep_wrapped_messages') as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.TextToSpeechLongAudioSynthesizeTransport( - credentials_file="credentials.json", - quota_project_id="octopus", - ) - load_creds.assert_called_once_with("credentials.json", - scopes=None, - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - quota_project_id="octopus", - ) - - -def test_text_to_speech_long_audio_synthesize_base_transport_with_adc(): - # Test the default credentials are used if credentials and credentials_file are None. - with mock.patch.object(google.auth, 'default', autospec=True) as adc, mock.patch('google.cloud.texttospeech_v1beta1.services.text_to_speech_long_audio_synthesize.transports.TextToSpeechLongAudioSynthesizeTransport._prep_wrapped_messages') as Transport: - Transport.return_value = None - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.TextToSpeechLongAudioSynthesizeTransport() - adc.assert_called_once() - - -def test_text_to_speech_long_audio_synthesize_auth_adc(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, 'default', autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - TextToSpeechLongAudioSynthesizeClient() - adc.assert_called_once_with( - scopes=None, - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - quota_project_id=None, - ) - - -@pytest.mark.parametrize( - "transport_class", - [ - transports.TextToSpeechLongAudioSynthesizeGrpcTransport, - transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, - ], -) -def test_text_to_speech_long_audio_synthesize_transport_auth_adc(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, 'default', autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus", scopes=["1", "2"]) - adc.assert_called_once_with( - scopes=["1", "2"], - default_scopes=( 'https://www.googleapis.com/auth/cloud-platform',), - quota_project_id="octopus", - ) - - -@pytest.mark.parametrize( - "transport_class", - [ - transports.TextToSpeechLongAudioSynthesizeGrpcTransport, - transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, - transports.TextToSpeechLongAudioSynthesizeRestTransport, - ], -) -def test_text_to_speech_long_audio_synthesize_transport_auth_gdch_credentials(transport_class): - host = 'https://language.com' - api_audience_tests = [None, 'https://language2.com'] - api_audience_expect = [host, 'https://language2.com'] - for t, e in zip(api_audience_tests, api_audience_expect): - with mock.patch.object(google.auth, 'default', autospec=True) as adc: - gdch_mock = mock.MagicMock() - type(gdch_mock).with_gdch_audience = mock.PropertyMock(return_value=gdch_mock) - adc.return_value = (gdch_mock, None) - transport_class(host=host, api_audience=t) - gdch_mock.with_gdch_audience.assert_called_once_with( - e - ) - - -@pytest.mark.parametrize( - "transport_class,grpc_helpers", - [ - (transports.TextToSpeechLongAudioSynthesizeGrpcTransport, grpc_helpers), - (transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport, grpc_helpers_async) - ], -) -def test_text_to_speech_long_audio_synthesize_transport_create_channel(transport_class, grpc_helpers): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch.object( - grpc_helpers, "create_channel", autospec=True - ) as create_channel: - creds = ga_credentials.AnonymousCredentials() - adc.return_value = (creds, None) - transport_class( - quota_project_id="octopus", - scopes=["1", "2"] - ) - - create_channel.assert_called_with( - "texttospeech.googleapis.com:443", - credentials=creds, - credentials_file=None, - quota_project_id="octopus", - default_scopes=( - 'https://www.googleapis.com/auth/cloud-platform', -), - scopes=["1", "2"], - default_host="texttospeech.googleapis.com", - ssl_credentials=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - -@pytest.mark.parametrize("transport_class", [transports.TextToSpeechLongAudioSynthesizeGrpcTransport, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport]) -def test_text_to_speech_long_audio_synthesize_grpc_transport_client_cert_source_for_mtls( - transport_class -): - cred = ga_credentials.AnonymousCredentials() - - # Check ssl_channel_credentials is used if provided. - with mock.patch.object(transport_class, "create_channel") as mock_create_channel: - mock_ssl_channel_creds = mock.Mock() - transport_class( - host="squid.clam.whelk", - credentials=cred, - ssl_channel_credentials=mock_ssl_channel_creds - ) - mock_create_channel.assert_called_once_with( - "squid.clam.whelk:443", - credentials=cred, - credentials_file=None, - scopes=None, - ssl_credentials=mock_ssl_channel_creds, - quota_project_id=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - - # Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls - # is used. - with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()): - with mock.patch("grpc.ssl_channel_credentials") as mock_ssl_cred: - transport_class( - credentials=cred, - client_cert_source_for_mtls=client_cert_source_callback - ) - expected_cert, expected_key = client_cert_source_callback() - mock_ssl_cred.assert_called_once_with( - certificate_chain=expected_cert, - private_key=expected_key - ) - -def test_text_to_speech_long_audio_synthesize_http_transport_client_cert_source_for_mtls(): - cred = ga_credentials.AnonymousCredentials() - with mock.patch("google.auth.transport.requests.AuthorizedSession.configure_mtls_channel") as mock_configure_mtls_channel: - transports.TextToSpeechLongAudioSynthesizeRestTransport ( - credentials=cred, - client_cert_source_for_mtls=client_cert_source_callback - ) - mock_configure_mtls_channel.assert_called_once_with(client_cert_source_callback) - - -@pytest.mark.parametrize("transport_name", [ - "grpc", - "grpc_asyncio", - "rest", -]) -def test_text_to_speech_long_audio_synthesize_host_no_port(transport_name): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com'), - transport=transport_name, - ) - assert client.transport._host == ( - 'texttospeech.googleapis.com:443' - if transport_name in ['grpc', 'grpc_asyncio'] - else 'https://texttospeech.googleapis.com' - ) - -@pytest.mark.parametrize("transport_name", [ - "grpc", - "grpc_asyncio", - "rest", -]) -def test_text_to_speech_long_audio_synthesize_host_with_port(transport_name): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - client_options=client_options.ClientOptions(api_endpoint='texttospeech.googleapis.com:8000'), - transport=transport_name, - ) - assert client.transport._host == ( - 'texttospeech.googleapis.com:8000' - if transport_name in ['grpc', 'grpc_asyncio'] - else 'https://texttospeech.googleapis.com:8000' - ) - -@pytest.mark.parametrize("transport_name", [ - "rest", -]) -def test_text_to_speech_long_audio_synthesize_client_transport_session_collision(transport_name): - creds1 = ga_credentials.AnonymousCredentials() - creds2 = ga_credentials.AnonymousCredentials() - client1 = TextToSpeechLongAudioSynthesizeClient( - credentials=creds1, - transport=transport_name, - ) - client2 = TextToSpeechLongAudioSynthesizeClient( - credentials=creds2, - transport=transport_name, - ) - session1 = client1.transport.synthesize_long_audio._session - session2 = client2.transport.synthesize_long_audio._session - assert session1 != session2 -def test_text_to_speech_long_audio_synthesize_grpc_transport_channel(): - channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials()) - - # Check that channel is used if provided. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcTransport( - host="squid.clam.whelk", - channel=channel, - ) - assert transport.grpc_channel == channel - assert transport._host == "squid.clam.whelk:443" - assert transport._ssl_channel_credentials == None - - -def test_text_to_speech_long_audio_synthesize_grpc_asyncio_transport_channel(): - channel = aio.secure_channel('http://localhost/', grpc.local_channel_credentials()) - - # Check that channel is used if provided. - transport = transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport( - host="squid.clam.whelk", - channel=channel, - ) - assert transport.grpc_channel == channel - assert transport._host == "squid.clam.whelk:443" - assert transport._ssl_channel_credentials == None - - -# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are -# removed from grpc/grpc_asyncio transport constructor. -@pytest.mark.parametrize("transport_class", [transports.TextToSpeechLongAudioSynthesizeGrpcTransport, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport]) -def test_text_to_speech_long_audio_synthesize_transport_channel_mtls_with_client_cert_source( - transport_class -): - with mock.patch("grpc.ssl_channel_credentials", autospec=True) as grpc_ssl_channel_cred: - with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: - mock_ssl_cred = mock.Mock() - grpc_ssl_channel_cred.return_value = mock_ssl_cred - - mock_grpc_channel = mock.Mock() - grpc_create_channel.return_value = mock_grpc_channel - - cred = ga_credentials.AnonymousCredentials() - with pytest.warns(DeprecationWarning): - with mock.patch.object(google.auth, 'default') as adc: - adc.return_value = (cred, None) - transport = transport_class( - host="squid.clam.whelk", - api_mtls_endpoint="mtls.squid.clam.whelk", - client_cert_source=client_cert_source_callback, - ) - adc.assert_called_once() - - grpc_ssl_channel_cred.assert_called_once_with( - certificate_chain=b"cert bytes", private_key=b"key bytes" - ) - grpc_create_channel.assert_called_once_with( - "mtls.squid.clam.whelk:443", - credentials=cred, - credentials_file=None, - scopes=None, - ssl_credentials=mock_ssl_cred, - quota_project_id=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - assert transport.grpc_channel == mock_grpc_channel - assert transport._ssl_channel_credentials == mock_ssl_cred - - -# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are -# removed from grpc/grpc_asyncio transport constructor. -@pytest.mark.parametrize("transport_class", [transports.TextToSpeechLongAudioSynthesizeGrpcTransport, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport]) -def test_text_to_speech_long_audio_synthesize_transport_channel_mtls_with_adc( - transport_class -): - mock_ssl_cred = mock.Mock() - with mock.patch.multiple( - "google.auth.transport.grpc.SslCredentials", - __init__=mock.Mock(return_value=None), - ssl_credentials=mock.PropertyMock(return_value=mock_ssl_cred), - ): - with mock.patch.object(transport_class, "create_channel") as grpc_create_channel: - mock_grpc_channel = mock.Mock() - grpc_create_channel.return_value = mock_grpc_channel - mock_cred = mock.Mock() - - with pytest.warns(DeprecationWarning): - transport = transport_class( - host="squid.clam.whelk", - credentials=mock_cred, - api_mtls_endpoint="mtls.squid.clam.whelk", - client_cert_source=None, - ) - - grpc_create_channel.assert_called_once_with( - "mtls.squid.clam.whelk:443", - credentials=mock_cred, - credentials_file=None, - scopes=None, - ssl_credentials=mock_ssl_cred, - quota_project_id=None, - options=[ - ("grpc.max_send_message_length", -1), - ("grpc.max_receive_message_length", -1), - ], - ) - assert transport.grpc_channel == mock_grpc_channel - - -def test_text_to_speech_long_audio_synthesize_grpc_lro_client(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='grpc', - ) - transport = client.transport - - # Ensure that we have a api-core operations client. - assert isinstance( - transport.operations_client, - operations_v1.OperationsClient, - ) - - # Ensure that subsequent calls to the property send the exact same object. - assert transport.operations_client is transport.operations_client - - -def test_text_to_speech_long_audio_synthesize_grpc_lro_async_client(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=ga_credentials.AnonymousCredentials(), - transport='grpc_asyncio', - ) - transport = client.transport - - # Ensure that we have a api-core operations client. - assert isinstance( - transport.operations_client, - operations_v1.OperationsAsyncClient, - ) - - # Ensure that subsequent calls to the property send the exact same object. - assert transport.operations_client is transport.operations_client - - -def test_model_path(): - project = "squid" - location = "clam" - model = "whelk" - expected = "projects/{project}/locations/{location}/models/{model}".format(project=project, location=location, model=model, ) - actual = TextToSpeechLongAudioSynthesizeClient.model_path(project, location, model) - assert expected == actual - - -def test_parse_model_path(): - expected = { - "project": "octopus", - "location": "oyster", - "model": "nudibranch", - } - path = TextToSpeechLongAudioSynthesizeClient.model_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechLongAudioSynthesizeClient.parse_model_path(path) - assert expected == actual - -def test_common_billing_account_path(): - billing_account = "cuttlefish" - expected = "billingAccounts/{billing_account}".format(billing_account=billing_account, ) - actual = TextToSpeechLongAudioSynthesizeClient.common_billing_account_path(billing_account) - assert expected == actual - - -def test_parse_common_billing_account_path(): - expected = { - "billing_account": "mussel", - } - path = TextToSpeechLongAudioSynthesizeClient.common_billing_account_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechLongAudioSynthesizeClient.parse_common_billing_account_path(path) - assert expected == actual - -def test_common_folder_path(): - folder = "winkle" - expected = "folders/{folder}".format(folder=folder, ) - actual = TextToSpeechLongAudioSynthesizeClient.common_folder_path(folder) - assert expected == actual - - -def test_parse_common_folder_path(): - expected = { - "folder": "nautilus", - } - path = TextToSpeechLongAudioSynthesizeClient.common_folder_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechLongAudioSynthesizeClient.parse_common_folder_path(path) - assert expected == actual - -def test_common_organization_path(): - organization = "scallop" - expected = "organizations/{organization}".format(organization=organization, ) - actual = TextToSpeechLongAudioSynthesizeClient.common_organization_path(organization) - assert expected == actual - - -def test_parse_common_organization_path(): - expected = { - "organization": "abalone", - } - path = TextToSpeechLongAudioSynthesizeClient.common_organization_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechLongAudioSynthesizeClient.parse_common_organization_path(path) - assert expected == actual - -def test_common_project_path(): - project = "squid" - expected = "projects/{project}".format(project=project, ) - actual = TextToSpeechLongAudioSynthesizeClient.common_project_path(project) - assert expected == actual - - -def test_parse_common_project_path(): - expected = { - "project": "clam", - } - path = TextToSpeechLongAudioSynthesizeClient.common_project_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechLongAudioSynthesizeClient.parse_common_project_path(path) - assert expected == actual - -def test_common_location_path(): - project = "whelk" - location = "octopus" - expected = "projects/{project}/locations/{location}".format(project=project, location=location, ) - actual = TextToSpeechLongAudioSynthesizeClient.common_location_path(project, location) - assert expected == actual - - -def test_parse_common_location_path(): - expected = { - "project": "oyster", - "location": "nudibranch", - } - path = TextToSpeechLongAudioSynthesizeClient.common_location_path(**expected) - - # Check that the path construction is reversible. - actual = TextToSpeechLongAudioSynthesizeClient.parse_common_location_path(path) - assert expected == actual - - -def test_client_with_default_client_info(): - client_info = gapic_v1.client_info.ClientInfo() - - with mock.patch.object(transports.TextToSpeechLongAudioSynthesizeTransport, '_prep_wrapped_messages') as prep: - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - client_info=client_info, - ) - prep.assert_called_once_with(client_info) - - with mock.patch.object(transports.TextToSpeechLongAudioSynthesizeTransport, '_prep_wrapped_messages') as prep: - transport_class = TextToSpeechLongAudioSynthesizeClient.get_transport_class() - transport = transport_class( - credentials=ga_credentials.AnonymousCredentials(), - client_info=client_info, - ) - prep.assert_called_once_with(client_info) - - -def test_get_operation(transport: str = "grpc"): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.GetOperationRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.Operation() - response = client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.Operation) -@pytest.mark.asyncio -async def test_get_operation_async(transport: str = "grpc_asyncio"): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.GetOperationRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation() - ) - response = await client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.Operation) - -def test_get_operation_field_headers(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.GetOperationRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - call.return_value = operations_pb2.Operation() - - client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] -@pytest.mark.asyncio -async def test_get_operation_field_headers_async(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.GetOperationRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation() - ) - await client.get_operation(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] - -def test_get_operation_from_dict(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.Operation() - - response = client.get_operation( - request={ - "name": "locations", - } - ) - call.assert_called() -@pytest.mark.asyncio -async def test_get_operation_from_dict_async(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.get_operation), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.Operation() - ) - response = await client.get_operation( - request={ - "name": "locations", - } - ) - call.assert_called() - - -def test_list_operations(transport: str = "grpc"): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.ListOperationsRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.ListOperationsResponse() - response = client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.ListOperationsResponse) -@pytest.mark.asyncio -async def test_list_operations_async(transport: str = "grpc_asyncio"): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), transport=transport, - ) - - # Everything is optional in proto3 as far as the runtime is concerned, - # and we are mocking out the actual API, so just send an empty request. - request = operations_pb2.ListOperationsRequest() - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.ListOperationsResponse() - ) - response = await client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the response is the type that we expect. - assert isinstance(response, operations_pb2.ListOperationsResponse) - -def test_list_operations_field_headers(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.ListOperationsRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - call.return_value = operations_pb2.ListOperationsResponse() - - client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] -@pytest.mark.asyncio -async def test_list_operations_field_headers_async(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - ) - - # Any value that is part of the HTTP/1.1 URI should be sent as - # a field header. Set these to a non-empty value. - request = operations_pb2.ListOperationsRequest() - request.name = "locations" - - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.ListOperationsResponse() - ) - await client.list_operations(request) - # Establish that the underlying gRPC stub method was called. - assert len(call.mock_calls) == 1 - _, args, _ = call.mock_calls[0] - assert args[0] == request - - # Establish that the field header was sent. - _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=locations",) in kw["metadata"] - -def test_list_operations_from_dict(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = operations_pb2.ListOperationsResponse() - - response = client.list_operations( - request={ - "name": "locations", - } - ) - call.assert_called() -@pytest.mark.asyncio -async def test_list_operations_from_dict_async(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - ) - # Mock the actual call within the gRPC stub, and fake the request. - with mock.patch.object(type(client.transport.list_operations), "__call__") as call: - # Designate an appropriate return value for the call. - call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - operations_pb2.ListOperationsResponse() - ) - response = await client.list_operations( - request={ - "name": "locations", - } - ) - call.assert_called() - - -def test_transport_close_grpc(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="grpc" - ) - with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: - with client: - close.assert_not_called() - close.assert_called_once() - - -@pytest.mark.asyncio -async def test_transport_close_grpc_asyncio(): - client = TextToSpeechLongAudioSynthesizeAsyncClient( - credentials=async_anonymous_credentials(), - transport="grpc_asyncio" - ) - with mock.patch.object(type(getattr(client.transport, "_grpc_channel")), "close") as close: - async with client: - close.assert_not_called() - close.assert_called_once() - - -def test_transport_close_rest(): - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport="rest" - ) - with mock.patch.object(type(getattr(client.transport, "_session")), "close") as close: - with client: - close.assert_not_called() - close.assert_called_once() - - -def test_client_ctx(): - transports = [ - 'rest', - 'grpc', - ] - for transport in transports: - client = TextToSpeechLongAudioSynthesizeClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport - ) - # Test client calls underlying transport. - with mock.patch.object(type(client.transport), "close") as close: - close.assert_not_called() - with client: - pass - close.assert_called() - -@pytest.mark.parametrize("client_class,transport_class", [ - (TextToSpeechLongAudioSynthesizeClient, transports.TextToSpeechLongAudioSynthesizeGrpcTransport), - (TextToSpeechLongAudioSynthesizeAsyncClient, transports.TextToSpeechLongAudioSynthesizeGrpcAsyncIOTransport), -]) -def test_api_key_credentials(client_class, transport_class): - with mock.patch.object( - google.auth._default, "get_api_key_credentials", create=True - ) as get_api_key_credentials: - mock_cred = mock.Mock() - get_api_key_credentials.return_value = mock_cred - options = client_options.ClientOptions() - options.api_key = "api_key" - with mock.patch.object(transport_class, "__init__") as patched: - patched.return_value = None - client = client_class(client_options=options) - patched.assert_called_once_with( - credentials=mock_cred, - credentials_file=None, - host=client._DEFAULT_ENDPOINT_TEMPLATE.format(UNIVERSE_DOMAIN=client._DEFAULT_UNIVERSE), - scopes=None, - client_cert_source_for_mtls=None, - quota_project_id=None, - client_info=transports.base.DEFAULT_CLIENT_INFO, - always_use_jwt_access=True, - api_audience=None, - ) diff --git a/packages/google-cloud-texttospeech/.flake8 b/packages/google-cloud-texttospeech/.flake8 index 87f6e408c47d..32986c79287a 100644 --- a/packages/google-cloud-texttospeech/.flake8 +++ b/packages/google-cloud-texttospeech/.flake8 @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/packages/google-cloud-texttospeech/CONTRIBUTING.rst b/packages/google-cloud-texttospeech/CONTRIBUTING.rst index 6a49c48dcbd9..243818a08a23 100644 --- a/packages/google-cloud-texttospeech/CONTRIBUTING.rst +++ b/packages/google-cloud-texttospeech/CONTRIBUTING.rst @@ -22,7 +22,7 @@ In order to add a feature: documentation. - The feature must work fully on the following CPython versions: - 3.7, 3.8, 3.9, 3.10, 3.11 and 3.12 on both UNIX and Windows. + 3.7, 3.8, 3.9, 3.10, 3.11, 3.12 and 3.13 on both UNIX and Windows. - The feature must not add unnecessary dependencies (where "unnecessary" is of course subjective, but new dependencies should @@ -72,7 +72,7 @@ We use `nox `__ to instrument our tests. - To run a single unit test:: - $ nox -s unit-3.12 -- -k + $ nox -s unit-3.13 -- -k .. note:: @@ -143,12 +143,12 @@ Running System Tests $ nox -s system # Run a single system test - $ nox -s system-3.12 -- -k + $ nox -s system-3.13 -- -k .. note:: - System tests are only configured to run under Python 3.8, 3.9, 3.10, 3.11 and 3.12. + System tests are only configured to run under Python 3.8, 3.9, 3.10, 3.11, 3.12 and 3.13. For expediency, we do not run them in older versions of Python 3. This alone will not run the tests. You'll need to change some local @@ -227,6 +227,7 @@ We support: - `Python 3.10`_ - `Python 3.11`_ - `Python 3.12`_ +- `Python 3.13`_ .. _Python 3.7: https://docs.python.org/3.7/ .. _Python 3.8: https://docs.python.org/3.8/ @@ -234,6 +235,7 @@ We support: .. _Python 3.10: https://docs.python.org/3.10/ .. _Python 3.11: https://docs.python.org/3.11/ .. _Python 3.12: https://docs.python.org/3.12/ +.. _Python 3.13: https://docs.python.org/3.13/ Supported versions can be found in our ``noxfile.py`` `config`_. diff --git a/packages/google-cloud-texttospeech/MANIFEST.in b/packages/google-cloud-texttospeech/MANIFEST.in index e0a66705318e..d6814cd60037 100644 --- a/packages/google-cloud-texttospeech/MANIFEST.in +++ b/packages/google-cloud-texttospeech/MANIFEST.in @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/packages/google-cloud-texttospeech/docs/conf.py b/packages/google-cloud-texttospeech/docs/conf.py index 88477d10c2e8..fe697d054520 100644 --- a/packages/google-cloud-texttospeech/docs/conf.py +++ b/packages/google-cloud-texttospeech/docs/conf.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech/gapic_version.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech/gapic_version.py index 4ed6d7530c12..558c8aab67c5 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech/gapic_version.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.19.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/gapic_version.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/gapic_version.py index 4ed6d7530c12..558c8aab67c5 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/gapic_version.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.19.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py index c832b41cd9d3..29fe4ad53e5a 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py @@ -42,7 +42,7 @@ DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, grpc_version=None, - rest_version=requests_version, + rest_version=f"requests@{requests_version}", ) diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py index e50d298eaf06..aef1fb1b427e 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py @@ -42,7 +42,7 @@ DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, grpc_version=None, - rest_version=requests_version, + rest_version=f"requests@{requests_version}", ) diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/__init__.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/__init__.py index fe9cff8b7985..e6b180c6d751 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/__init__.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/__init__.py @@ -32,6 +32,7 @@ CustomVoiceParams, ListVoicesRequest, ListVoicesResponse, + MultiSpeakerMarkup, SsmlVoiceGender, StreamingSynthesisInput, StreamingSynthesizeConfig, @@ -62,6 +63,7 @@ "CustomVoiceParams", "ListVoicesRequest", "ListVoicesResponse", + "MultiSpeakerMarkup", "SsmlVoiceGender", "StreamingSynthesisInput", "StreamingSynthesizeConfig", diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/gapic_version.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/gapic_version.py index 4ed6d7530c12..558c8aab67c5 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/gapic_version.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.19.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py index 100f5231f3e0..acb68ea0dcbe 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py @@ -42,7 +42,7 @@ DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, grpc_version=None, - rest_version=requests_version, + rest_version=f"requests@{requests_version}", ) diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py index ecd89a3b628b..8574e90d027f 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py @@ -42,7 +42,7 @@ DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( gapic_version=BASE_DEFAULT_CLIENT_INFO.gapic_version, grpc_version=None, - rest_version=requests_version, + rest_version=f"requests@{requests_version}", ) diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/types/__init__.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/types/__init__.py index 3dbb17dcc1e7..41b170715804 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/types/__init__.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/types/__init__.py @@ -22,6 +22,7 @@ CustomVoiceParams, ListVoicesRequest, ListVoicesResponse, + MultiSpeakerMarkup, SsmlVoiceGender, StreamingSynthesisInput, StreamingSynthesizeConfig, @@ -49,6 +50,7 @@ "CustomVoiceParams", "ListVoicesRequest", "ListVoicesResponse", + "MultiSpeakerMarkup", "StreamingSynthesisInput", "StreamingSynthesizeConfig", "StreamingSynthesizeRequest", diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/types/cloud_tts.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/types/cloud_tts.py index 0bafe651fc07..2bb1bbe8cbf0 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/types/cloud_tts.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/types/cloud_tts.py @@ -31,6 +31,7 @@ "SynthesizeSpeechRequest", "CustomPronunciationParams", "CustomPronunciations", + "MultiSpeakerMarkup", "SynthesisInput", "VoiceSelectionParams", "AudioConfig", @@ -355,6 +356,42 @@ class CustomPronunciations(proto.Message): ) +class MultiSpeakerMarkup(proto.Message): + r"""A collection of turns for multi-speaker synthesis. + + Attributes: + turns (MutableSequence[google.cloud.texttospeech_v1beta1.types.MultiSpeakerMarkup.Turn]): + Required. Speaker turns. + """ + + class Turn(proto.Message): + r"""A Multi-speaker turn. + + Attributes: + speaker (str): + Required. The speaker of the turn, for + example, 'O' or 'Q'. Please refer to + documentation for available speakers. + text (str): + Required. The text to speak. + """ + + speaker: str = proto.Field( + proto.STRING, + number=1, + ) + text: str = proto.Field( + proto.STRING, + number=2, + ) + + turns: MutableSequence[Turn] = proto.RepeatedField( + proto.MESSAGE, + number=1, + message=Turn, + ) + + class SynthesisInput(proto.Message): r"""Contains text input to be synthesized. Either ``text`` or ``ssml`` must be supplied. Supplying both or neither returns @@ -381,6 +418,11 @@ class SynthesisInput(proto.Message): For more information, see `SSML `__. + This field is a member of `oneof`_ ``input_source``. + multi_speaker_markup (google.cloud.texttospeech_v1beta1.types.MultiSpeakerMarkup): + The multi-speaker input to be synthesized. + Only applicable for multi-speaker synthesis. + This field is a member of `oneof`_ ``input_source``. custom_pronunciations (google.cloud.texttospeech_v1beta1.types.CustomPronunciations): Optional. The pronunciation customizations to @@ -410,6 +452,12 @@ class SynthesisInput(proto.Message): number=2, oneof="input_source", ) + multi_speaker_markup: "MultiSpeakerMarkup" = proto.Field( + proto.MESSAGE, + number=4, + oneof="input_source", + message="MultiSpeakerMarkup", + ) custom_pronunciations: "CustomPronunciations" = proto.Field( proto.MESSAGE, number=3, diff --git a/packages/google-cloud-texttospeech/noxfile.py b/packages/google-cloud-texttospeech/noxfile.py index 67b7265f7586..a9ceef47133c 100644 --- a/packages/google-cloud-texttospeech/noxfile.py +++ b/packages/google-cloud-texttospeech/noxfile.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright 2023 Google LLC +# Copyright 2024 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -35,7 +35,15 @@ DEFAULT_PYTHON_VERSION = "3.10" -UNIT_TEST_PYTHON_VERSIONS: List[str] = ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"] +UNIT_TEST_PYTHON_VERSIONS: List[str] = [ + "3.7", + "3.8", + "3.9", + "3.10", + "3.11", + "3.12", + "3.13", +] UNIT_TEST_STANDARD_DEPENDENCIES = [ "mock", "asyncmock", @@ -49,7 +57,7 @@ UNIT_TEST_EXTRAS: List[str] = [] UNIT_TEST_EXTRAS_BY_PYTHON: Dict[str, List[str]] = {} -SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.8", "3.9", "3.10", "3.11", "3.12"] +SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] SYSTEM_TEST_STANDARD_DEPENDENCIES = [ "mock", "pytest", @@ -168,7 +176,7 @@ def install_unittest_dependencies(session, *constraints): def unit(session, protobuf_implementation): # Install all test dependencies, then install this package in-place. - if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12"): + if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") constraints_path = str( @@ -368,7 +376,7 @@ def docfx(session): ) -@nox.session(python="3.12") +@nox.session(python="3.13") @nox.parametrize( "protobuf_implementation", ["python", "upb", "cpp"], @@ -376,7 +384,7 @@ def docfx(session): def prerelease_deps(session, protobuf_implementation): """Run all tests with prerelease versions of dependencies installed.""" - if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12"): + if protobuf_implementation == "cpp" and session.python in ("3.11", "3.12", "3.13"): session.skip("cpp implementation is not supported in python 3.11+") # Install all dependencies diff --git a/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json b/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json index b6e7b5cce3ab..f87785fcdd45 100644 --- a/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json +++ b/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-texttospeech", - "version": "2.19.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json b/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json index 8e5fcbb5defa..2877853b66c5 100644 --- a/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json +++ b/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-texttospeech", - "version": "2.19.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-texttospeech/scripts/decrypt-secrets.sh b/packages/google-cloud-texttospeech/scripts/decrypt-secrets.sh index 0018b421ddf8..120b0ddc4364 100755 --- a/packages/google-cloud-texttospeech/scripts/decrypt-secrets.sh +++ b/packages/google-cloud-texttospeech/scripts/decrypt-secrets.sh @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2023 Google LLC All rights reserved. +# Copyright 2024 Google LLC All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/packages/google-cloud-texttospeech/setup.py b/packages/google-cloud-texttospeech/setup.py index 47c51585ba6b..dd970fb5b4e8 100644 --- a/packages/google-cloud-texttospeech/setup.py +++ b/packages/google-cloud-texttospeech/setup.py @@ -46,6 +46,7 @@ # See https://github.com/googleapis/google-cloud-python/issues/12364 "google-auth >= 2.14.1, <3.0.0dev,!=2.24.0,!=2.25.0", "proto-plus >= 1.22.3, <2.0.0dev", + "proto-plus >= 1.25.0, <2.0.0dev; python_version >= '3.13'", "protobuf>=3.20.2,<6.0.0dev,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", ] extras = {} @@ -84,6 +85,7 @@ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", "Operating System :: OS Independent", "Topic :: Internet", ], diff --git a/owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.13.txt b/packages/google-cloud-texttospeech/testing/constraints-3.13.txt similarity index 100% rename from owl-bot-staging/google-cloud-texttospeech/v1/testing/constraints-3.13.txt rename to packages/google-cloud-texttospeech/testing/constraints-3.13.txt