From aff2eb712ffb144d75af8c1b7ce81a40a6af2583 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Tue, 12 May 2026 11:31:11 -0400 Subject: [PATCH 1/2] feat(spanner): drop support for python 3.9 --- packages/google-cloud-spanner/README.rst | 4 ++-- packages/google-cloud-spanner/docs/README.rst | 4 ++-- packages/google-cloud-spanner/noxfile.py | 1 - packages/google-cloud-spanner/setup.py | 3 +-- .../testing/constraints-3.9.txt | 13 ------------- .../tests/unit/gapic/spanner_v1/test_spanner.py | 4 +--- 6 files changed, 6 insertions(+), 23 deletions(-) delete mode 100644 packages/google-cloud-spanner/testing/constraints-3.9.txt diff --git a/packages/google-cloud-spanner/README.rst b/packages/google-cloud-spanner/README.rst index 4b65deae869b..5b022e6d4dea 100644 --- a/packages/google-cloud-spanner/README.rst +++ b/packages/google-cloud-spanner/README.rst @@ -62,14 +62,14 @@ Supported Python Versions Our client libraries are compatible with all current `active`_ and `maintenance`_ versions of Python. -Python >= 3.9, including 3.14 +Python >= 3.10, including 3.14 .. _active: https://devguide.python.org/devcycle/#in-development-main-branch .. _maintenance: https://devguide.python.org/devcycle/#maintenance-branches Unsupported Python Versions ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Python <= 3.8 +Python <= 3.9 If you are using an `end-of-life`_ version of Python, we recommend that you update as soon as possible to an actively supported version. diff --git a/packages/google-cloud-spanner/docs/README.rst b/packages/google-cloud-spanner/docs/README.rst index 4b65deae869b..5b022e6d4dea 100644 --- a/packages/google-cloud-spanner/docs/README.rst +++ b/packages/google-cloud-spanner/docs/README.rst @@ -62,14 +62,14 @@ Supported Python Versions Our client libraries are compatible with all current `active`_ and `maintenance`_ versions of Python. -Python >= 3.9, including 3.14 +Python >= 3.10, including 3.14 .. _active: https://devguide.python.org/devcycle/#in-development-main-branch .. _maintenance: https://devguide.python.org/devcycle/#maintenance-branches Unsupported Python Versions ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Python <= 3.8 +Python <= 3.9 If you are using an `end-of-life`_ version of Python, we recommend that you update as soon as possible to an actively supported version. diff --git a/packages/google-cloud-spanner/noxfile.py b/packages/google-cloud-spanner/noxfile.py index dd6db62994e8..e1a13b2ea098 100644 --- a/packages/google-cloud-spanner/noxfile.py +++ b/packages/google-cloud-spanner/noxfile.py @@ -31,7 +31,6 @@ SYSTEM_TEST_PYTHON_VERSIONS: List[str] = ["3.12"] ALL_PYTHON: List[str] = [ - "3.9", "3.10", "3.11", "3.12", diff --git a/packages/google-cloud-spanner/setup.py b/packages/google-cloud-spanner/setup.py index 6c076979fbe7..babf000c3928 100644 --- a/packages/google-cloud-spanner/setup.py +++ b/packages/google-cloud-spanner/setup.py @@ -86,7 +86,6 @@ "License :: OSI Approved :: Apache Software License", "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", @@ -97,7 +96,7 @@ ], platforms="Posix; MacOS X; Windows", packages=packages, - python_requires=">=3.9", + python_requires=">=3.10", install_requires=dependencies, extras_require=extras, include_package_data=True, diff --git a/packages/google-cloud-spanner/testing/constraints-3.9.txt b/packages/google-cloud-spanner/testing/constraints-3.9.txt deleted file mode 100644 index ac3833d41b9a..000000000000 --- a/packages/google-cloud-spanner/testing/constraints-3.9.txt +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -# This constraints file is used to check that lower bounds -# are correct in setup.py -# List all library dependencies and extras in this file, -# pinning their versions to their lower bounds. -# For example, if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0", -# then this file should have google-cloud-foo==1.14.0 -google-api-core==2.21.0 -google-auth==2.35.0 -# TODO(https://github.com/googleapis/gapic-generator-python/issues/2453) -# Add the minimum supported version of grpcio to constraints files -proto-plus==1.22.3 -protobuf==4.25.8 diff --git a/packages/google-cloud-spanner/tests/unit/gapic/spanner_v1/test_spanner.py b/packages/google-cloud-spanner/tests/unit/gapic/spanner_v1/test_spanner.py index 4862f1f358f2..fb47236fc7a4 100644 --- a/packages/google-cloud-spanner/tests/unit/gapic/spanner_v1/test_spanner.py +++ b/packages/google-cloud-spanner/tests/unit/gapic/spanner_v1/test_spanner.py @@ -2783,9 +2783,7 @@ async def test_list_sessions_async_pages(): RuntimeError, ) pages = [] - # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` - # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 - async for page_ in ( # pragma: no branch + async for page_ in ( await client.list_sessions(request={}) ).pages: pages.append(page_) From 475be323433c59fcbd7df53459e99c6129083784 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Wed, 13 May 2026 07:53:37 -0400 Subject: [PATCH 2/2] fix(spanner): resolve dependency conflicts and clean up obsolete code --- .../spanner_admin_database_v1/__init__.py | 101 ++---------------- .../spanner_admin_instance_v1/__init__.py | 101 ++---------------- .../spanner_v1/_opentelemetry_tracing.py | 9 +- packages/google-cloud-spanner/setup.py | 7 +- .../testing/constraints-3.10.txt | 30 ++++-- .../google-cloud-spanner/tests/_helpers.py | 9 +- .../test_database_admin.py | 36 ++----- .../test_instance_admin.py | 26 +---- .../unit/gapic/spanner_v1/test_spanner.py | 4 +- 9 files changed, 61 insertions(+), 262 deletions(-) diff --git a/packages/google-cloud-spanner/google/cloud/spanner_admin_database_v1/__init__.py b/packages/google-cloud-spanner/google/cloud/spanner_admin_database_v1/__init__.py index d3da77d95793..0254ea8bbfbe 100644 --- a/packages/google-cloud-spanner/google/cloud/spanner_admin_database_v1/__init__.py +++ b/packages/google-cloud-spanner/google/cloud/spanner_admin_database_v1/__init__.py @@ -21,13 +21,6 @@ __version__ = package_version.__version__ -if sys.version_info >= (3, 8): # pragma: NO COVER - from importlib import metadata -else: # pragma: NO COVER - # TODO(https://github.com/googleapis/python-api-core/issues/835): Remove - # this code path once we drop support for Python 3.7 - import importlib_metadata as metadata - from .services.database_admin import DatabaseAdminAsyncClient, DatabaseAdminClient from .types.backup import ( @@ -106,92 +99,18 @@ api_core.check_python_version("google.cloud.spanner_admin_database_v1") # type: ignore api_core.check_dependency_versions("google.cloud.spanner_admin_database_v1") # type: ignore else: # pragma: NO COVER - # An older version of api_core is installed which does not define the - # functions above. We do equivalent checks manually. - try: - import sys - import warnings - - _py_version_str = sys.version.split()[0] - _package_label = "google.cloud.spanner_admin_database_v1" - if sys.version_info < (3, 9): - warnings.warn( - "You are using a non-supported Python version " - + f"({_py_version_str}). Google will not post any further " - + f"updates to {_package_label} supporting this Python version. " - + "Please upgrade to the latest Python version, or at " - + f"least to Python 3.9, and then update {_package_label}.", - FutureWarning, - ) - if sys.version_info[:2] == (3, 9): - warnings.warn( - f"You are using a Python version ({_py_version_str}) " - + f"which Google will stop supporting in {_package_label} in " - + "January 2026. Please " - + "upgrade to the latest Python version, or at " - + "least to Python 3.10, before then, and " - + f"then update {_package_label}.", - FutureWarning, - ) - - def parse_version_to_tuple(version_string: str): - """Safely converts a semantic version string to a comparable tuple of integers. - Example: "4.25.8" -> (4, 25, 8) - Ignores non-numeric parts and handles common version formats. - Args: - version_string: Version string in the format "x.y.z" or "x.y.z" - Returns: - Tuple of integers for the parsed version string. - """ - parts = [] - for part in version_string.split("."): - try: - parts.append(int(part)) - except ValueError: - # If it's a non-numeric part (e.g., '1.0.0b1' -> 'b1'), stop here. - # This is a simplification compared to 'packaging.parse_version', but sufficient - # for comparing strictly numeric semantic versions. - break - return tuple(parts) - - def _get_version(dependency_name): - try: - version_string: str = metadata.version(dependency_name) - parsed_version = parse_version_to_tuple(version_string) - return (parsed_version, version_string) - except Exception: - # Catch exceptions from metadata.version() (e.g., PackageNotFoundError) - # or errors during parse_version_to_tuple - return (None, "--") + import warnings - _dependency_package = "google.protobuf" - _next_supported_version = "4.25.8" - _next_supported_version_tuple = (4, 25, 8) - _recommendation = " (we recommend 6.x)" - (_version_used, _version_used_string) = _get_version(_dependency_package) - if _version_used and _version_used < _next_supported_version_tuple: - warnings.warn( - f"Package {_package_label} depends on " - + f"{_dependency_package}, currently installed at version " - + f"{_version_used_string}. Future updates to " - + f"{_package_label} will require {_dependency_package} at " - + f"version {_next_supported_version} or higher{_recommendation}." - + " Please ensure " - + "that either (a) your Python environment doesn't pin the " - + f"version of {_dependency_package}, so that updates to " - + f"{_package_label} can require the higher version, or " - + "(b) you manually update your Python environment to use at " - + f"least version {_next_supported_version} of " - + f"{_dependency_package}.", - FutureWarning, - ) - except Exception: + _py_version_str = sys.version.split()[0] + # version-scanner: ignore-next-line + if sys.version_info < (3, 10): warnings.warn( - "Could not determine the version of Python " - + "currently being used. To continue receiving " - + "updates for {_package_label}, ensure you are " - + "using a supported version of Python; see " - + "https://devguide.python.org/versions/" + "You are using a non-supported Python version " + + f"({_py_version_str}). Google will not post any further " + + "updates to google.cloud.spanner_admin_database_v1 supporting this Python version. " + + "Please upgrade to the latest Python version, or at " + + "least to Python 3.10, and then update google.cloud.spanner_admin_database_v1.", + FutureWarning, ) __all__ = ( diff --git a/packages/google-cloud-spanner/google/cloud/spanner_admin_instance_v1/__init__.py b/packages/google-cloud-spanner/google/cloud/spanner_admin_instance_v1/__init__.py index b2f713eae7fb..9e3c73a6220d 100644 --- a/packages/google-cloud-spanner/google/cloud/spanner_admin_instance_v1/__init__.py +++ b/packages/google-cloud-spanner/google/cloud/spanner_admin_instance_v1/__init__.py @@ -21,13 +21,6 @@ __version__ = package_version.__version__ -if sys.version_info >= (3, 8): # pragma: NO COVER - from importlib import metadata -else: # pragma: NO COVER - # TODO(https://github.com/googleapis/python-api-core/issues/835): Remove - # this code path once we drop support for Python 3.7 - import importlib_metadata as metadata - from .services.instance_admin import InstanceAdminAsyncClient, InstanceAdminClient from .types.common import FulfillmentPeriod, OperationProgress, ReplicaSelection @@ -78,92 +71,18 @@ api_core.check_python_version("google.cloud.spanner_admin_instance_v1") # type: ignore api_core.check_dependency_versions("google.cloud.spanner_admin_instance_v1") # type: ignore else: # pragma: NO COVER - # An older version of api_core is installed which does not define the - # functions above. We do equivalent checks manually. - try: - import sys - import warnings - - _py_version_str = sys.version.split()[0] - _package_label = "google.cloud.spanner_admin_instance_v1" - if sys.version_info < (3, 9): - warnings.warn( - "You are using a non-supported Python version " - + f"({_py_version_str}). Google will not post any further " - + f"updates to {_package_label} supporting this Python version. " - + "Please upgrade to the latest Python version, or at " - + f"least to Python 3.9, and then update {_package_label}.", - FutureWarning, - ) - if sys.version_info[:2] == (3, 9): - warnings.warn( - f"You are using a Python version ({_py_version_str}) " - + f"which Google will stop supporting in {_package_label} in " - + "January 2026. Please " - + "upgrade to the latest Python version, or at " - + "least to Python 3.10, before then, and " - + f"then update {_package_label}.", - FutureWarning, - ) - - def parse_version_to_tuple(version_string: str): - """Safely converts a semantic version string to a comparable tuple of integers. - Example: "4.25.8" -> (4, 25, 8) - Ignores non-numeric parts and handles common version formats. - Args: - version_string: Version string in the format "x.y.z" or "x.y.z" - Returns: - Tuple of integers for the parsed version string. - """ - parts = [] - for part in version_string.split("."): - try: - parts.append(int(part)) - except ValueError: - # If it's a non-numeric part (e.g., '1.0.0b1' -> 'b1'), stop here. - # This is a simplification compared to 'packaging.parse_version', but sufficient - # for comparing strictly numeric semantic versions. - break - return tuple(parts) - - def _get_version(dependency_name): - try: - version_string: str = metadata.version(dependency_name) - parsed_version = parse_version_to_tuple(version_string) - return (parsed_version, version_string) - except Exception: - # Catch exceptions from metadata.version() (e.g., PackageNotFoundError) - # or errors during parse_version_to_tuple - return (None, "--") + import warnings - _dependency_package = "google.protobuf" - _next_supported_version = "4.25.8" - _next_supported_version_tuple = (4, 25, 8) - _recommendation = " (we recommend 6.x)" - (_version_used, _version_used_string) = _get_version(_dependency_package) - if _version_used and _version_used < _next_supported_version_tuple: - warnings.warn( - f"Package {_package_label} depends on " - + f"{_dependency_package}, currently installed at version " - + f"{_version_used_string}. Future updates to " - + f"{_package_label} will require {_dependency_package} at " - + f"version {_next_supported_version} or higher{_recommendation}." - + " Please ensure " - + "that either (a) your Python environment doesn't pin the " - + f"version of {_dependency_package}, so that updates to " - + f"{_package_label} can require the higher version, or " - + "(b) you manually update your Python environment to use at " - + f"least version {_next_supported_version} of " - + f"{_dependency_package}.", - FutureWarning, - ) - except Exception: + _py_version_str = sys.version.split()[0] + # version-scanner: ignore-next-line + if sys.version_info < (3, 10): warnings.warn( - "Could not determine the version of Python " - + "currently being used. To continue receiving " - + "updates for {_package_label}, ensure you are " - + "using a supported version of Python; see " - + "https://devguide.python.org/versions/" + "You are using a non-supported Python version " + + f"({_py_version_str}). Google will not post any further " + + "updates to google.cloud.spanner_admin_instance_v1 supporting this Python version. " + + "Please upgrade to the latest Python version, or at " + + "least to Python 3.10, and then update google.cloud.spanner_admin_instance_v1.", + FutureWarning, ) __all__ = ( diff --git a/packages/google-cloud-spanner/google/cloud/spanner_v1/_opentelemetry_tracing.py b/packages/google-cloud-spanner/google/cloud/spanner_v1/_opentelemetry_tracing.py index 62033ddfcb7b..8bda1daaed5a 100644 --- a/packages/google-cloud-spanner/google/cloud/spanner_v1/_opentelemetry_tracing.py +++ b/packages/google-cloud-spanner/google/cloud/spanner_v1/_opentelemetry_tracing.py @@ -19,10 +19,7 @@ from datetime import datetime from opentelemetry import trace -from opentelemetry.semconv.attributes.otel_attributes import ( - OTEL_SCOPE_NAME, - OTEL_SCOPE_VERSION, -) + from opentelemetry.trace.status import Status, StatusCode from google.cloud.spanner_v1._helpers import ( @@ -99,9 +96,9 @@ def trace_call( "db.url": SpannerClient.DEFAULT_ENDPOINT, "db.instance": db_name, "net.host.name": SpannerClient.DEFAULT_ENDPOINT, - OTEL_SCOPE_NAME: TRACER_NAME, + "otel.scope.name": TRACER_NAME, "cloud.region": cloud_region, - OTEL_SCOPE_VERSION: TRACER_VERSION, + "otel.scope.version": TRACER_VERSION, # Standard GCP attributes for OTel, attributes are used for internal purpose and are subjected to change "gcp.client.service": "spanner", "gcp.client.version": TRACER_VERSION, diff --git a/packages/google-cloud-spanner/setup.py b/packages/google-cloud-spanner/setup.py index babf000c3928..6f4123d0e7fd 100644 --- a/packages/google-cloud-spanner/setup.py +++ b/packages/google-cloud-spanner/setup.py @@ -39,12 +39,11 @@ release_status = "Development Status :: 5 - Production/Stable" dependencies = [ - "google-api-core[grpc] >= 1.34.0, <3.0.0,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.*", - "google-cloud-core >= 1.4.4, < 3.0.0", + "google-api-core[grpc] >= 2.19.0, <3.0.0", + "google-cloud-core >= 2.0.0, < 3.0.0", "grpc-google-iam-v1 >= 0.12.4, <1.0.0", - "proto-plus >= 1.22.0, <2.0.0", + "proto-plus >= 1.22.3, <2.0.0", "sqlparse >= 0.4.4", - "proto-plus >= 1.22.2, <2.0.0; python_version>='3.11'", "protobuf >= 4.25.8, < 8.0.0", "grpc-interceptor >= 0.15.4", # Make OpenTelemetry a core dependency diff --git a/packages/google-cloud-spanner/testing/constraints-3.10.txt b/packages/google-cloud-spanner/testing/constraints-3.10.txt index 7599dea499ed..5dfc1a2a325a 100644 --- a/packages/google-cloud-spanner/testing/constraints-3.10.txt +++ b/packages/google-cloud-spanner/testing/constraints-3.10.txt @@ -1,10 +1,20 @@ -# -*- coding: utf-8 -*- -# This constraints file is required for unit tests. -# List all library dependencies and extras in this file. -google-api-core -google-auth -grpcio -proto-plus -protobuf -# cryptography is a direct dependency of google-auth -cryptography +# This constraints file is used to check that lower bounds +# are correct in setup.py +# List all library dependencies and extras in this file, +# pinning their versions to their lower bounds. +# For example, if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0", +# then this file should have google-cloud-foo==1.14.0 +google-api-core==2.19.0 +google-cloud-core==2.0.0 +grpc-google-iam-v1==0.12.4 +proto-plus==1.22.3 +sqlparse==0.4.4 +protobuf==4.25.8 +grpc-interceptor==0.15.4 +opentelemetry-api==1.22.0 +opentelemetry-sdk==1.22.0 +opentelemetry-semantic-conventions==0.43b0 +opentelemetry-resourcedetector-gcp==1.8.0a0 +google-cloud-monitoring==2.16.0 +mmh3==4.1.0 +libcst==0.2.5 diff --git a/packages/google-cloud-spanner/tests/_helpers.py b/packages/google-cloud-spanner/tests/_helpers.py index b6277de1e939..f2f67e96cbea 100644 --- a/packages/google-cloud-spanner/tests/_helpers.py +++ b/packages/google-cloud-spanner/tests/_helpers.py @@ -16,10 +16,7 @@ InMemorySpanExporter, ) from opentelemetry.sdk.trace.sampling import TraceIdRatioBased - from opentelemetry.semconv.attributes.otel_attributes import ( - OTEL_SCOPE_NAME, - OTEL_SCOPE_VERSION, - ) + from opentelemetry.trace.status import StatusCode trace.set_tracer_provider(TracerProvider(sampler=TraceIdRatioBased(1.0))) @@ -66,8 +63,8 @@ def enrich_with_otel_scope(attrs): for the purpose of avoiding cumbersome duplicated imports. """ if HAS_OPENTELEMETRY_INSTALLED: - attrs[OTEL_SCOPE_NAME] = "cloud.google.com/python/spanner" - attrs[OTEL_SCOPE_VERSION] = LIB_VERSION + attrs["otel.scope.name"] = "cloud.google.com/python/spanner" + attrs["otel.scope.version"] = LIB_VERSION return attrs diff --git a/packages/google-cloud-spanner/tests/unit/gapic/spanner_admin_database_v1/test_database_admin.py b/packages/google-cloud-spanner/tests/unit/gapic/spanner_admin_database_v1/test_database_admin.py index 849e0b9d3ffc..ff908520c496 100644 --- a/packages/google-cloud-spanner/tests/unit/gapic/spanner_admin_database_v1/test_database_admin.py +++ b/packages/google-cloud-spanner/tests/unit/gapic/spanner_admin_database_v1/test_database_admin.py @@ -1850,11 +1850,7 @@ async def test_list_databases_async_pages(): RuntimeError, ) pages = [] - # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` - # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 - async for page_ in ( # pragma: no branch - await client.list_databases(request={}) - ).pages: + async for page_ in (await client.list_databases(request={})).pages: pages.append(page_) for page_, token in zip(pages, ["abc", "def", "ghi", ""]): assert page_.raw_page.next_page_token == token @@ -7188,11 +7184,7 @@ async def test_list_backups_async_pages(): RuntimeError, ) pages = [] - # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` - # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 - async for page_ in ( # pragma: no branch - await client.list_backups(request={}) - ).pages: + async for page_ in (await client.list_backups(request={})).pages: pages.append(page_) for page_, token in zip(pages, ["abc", "def", "ghi", ""]): assert page_.raw_page.next_page_token == token @@ -8089,11 +8081,7 @@ async def test_list_database_operations_async_pages(): RuntimeError, ) pages = [] - # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` - # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 - async for page_ in ( # pragma: no branch - await client.list_database_operations(request={}) - ).pages: + async for page_ in (await client.list_database_operations(request={})).pages: pages.append(page_) for page_, token in zip(pages, ["abc", "def", "ghi", ""]): assert page_.raw_page.next_page_token == token @@ -8637,11 +8625,7 @@ async def test_list_backup_operations_async_pages(): RuntimeError, ) pages = [] - # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` - # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 - async for page_ in ( # pragma: no branch - await client.list_backup_operations(request={}) - ).pages: + async for page_ in (await client.list_backup_operations(request={})).pages: pages.append(page_) for page_, token in zip(pages, ["abc", "def", "ghi", ""]): assert page_.raw_page.next_page_token == token @@ -9185,11 +9169,7 @@ async def test_list_database_roles_async_pages(): RuntimeError, ) pages = [] - # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` - # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 - async for page_ in ( # pragma: no branch - await client.list_database_roles(request={}) - ).pages: + async for page_ in (await client.list_database_roles(request={})).pages: pages.append(page_) for page_, token in zip(pages, ["abc", "def", "ghi", ""]): assert page_.raw_page.next_page_token == token @@ -11451,11 +11431,7 @@ async def test_list_backup_schedules_async_pages(): RuntimeError, ) pages = [] - # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` - # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 - async for page_ in ( # pragma: no branch - await client.list_backup_schedules(request={}) - ).pages: + async for page_ in (await client.list_backup_schedules(request={})).pages: pages.append(page_) for page_, token in zip(pages, ["abc", "def", "ghi", ""]): assert page_.raw_page.next_page_token == token diff --git a/packages/google-cloud-spanner/tests/unit/gapic/spanner_admin_instance_v1/test_instance_admin.py b/packages/google-cloud-spanner/tests/unit/gapic/spanner_admin_instance_v1/test_instance_admin.py index 42b0b32c6c5f..9c5c96e5d164 100644 --- a/packages/google-cloud-spanner/tests/unit/gapic/spanner_admin_instance_v1/test_instance_admin.py +++ b/packages/google-cloud-spanner/tests/unit/gapic/spanner_admin_instance_v1/test_instance_admin.py @@ -1867,11 +1867,7 @@ async def test_list_instance_configs_async_pages(): RuntimeError, ) pages = [] - # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` - # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 - async for page_ in ( # pragma: no branch - await client.list_instance_configs(request={}) - ).pages: + async for page_ in (await client.list_instance_configs(request={})).pages: pages.append(page_) for page_, token in zip(pages, ["abc", "def", "ghi", ""]): assert page_.raw_page.next_page_token == token @@ -3877,9 +3873,7 @@ async def test_list_instance_config_operations_async_pages(): RuntimeError, ) pages = [] - # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` - # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 - async for page_ in ( # pragma: no branch + async for page_ in ( await client.list_instance_config_operations(request={}) ).pages: pages.append(page_) @@ -4403,11 +4397,7 @@ async def test_list_instances_async_pages(): RuntimeError, ) pages = [] - # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` - # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 - async for page_ in ( # pragma: no branch - await client.list_instances(request={}) - ).pages: + async for page_ in (await client.list_instances(request={})).pages: pages.append(page_) for page_, token in zip(pages, ["abc", "def", "ghi", ""]): assert page_.raw_page.next_page_token == token @@ -4960,11 +4950,7 @@ async def test_list_instance_partitions_async_pages(): RuntimeError, ) pages = [] - # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` - # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 - async for page_ in ( # pragma: no branch - await client.list_instance_partitions(request={}) - ).pages: + async for page_ in (await client.list_instance_partitions(request={})).pages: pages.append(page_) for page_, token in zip(pages, ["abc", "def", "ghi", ""]): assert page_.raw_page.next_page_token == token @@ -9390,9 +9376,7 @@ async def test_list_instance_partition_operations_async_pages(): RuntimeError, ) pages = [] - # Workaround issue in python 3.9 related to code coverage by adding `# pragma: no branch` - # See https://github.com/googleapis/gapic-generator-python/pull/1174#issuecomment-1025132372 - async for page_ in ( # pragma: no branch + async for page_ in ( await client.list_instance_partition_operations(request={}) ).pages: pages.append(page_) diff --git a/packages/google-cloud-spanner/tests/unit/gapic/spanner_v1/test_spanner.py b/packages/google-cloud-spanner/tests/unit/gapic/spanner_v1/test_spanner.py index fb47236fc7a4..59945612e175 100644 --- a/packages/google-cloud-spanner/tests/unit/gapic/spanner_v1/test_spanner.py +++ b/packages/google-cloud-spanner/tests/unit/gapic/spanner_v1/test_spanner.py @@ -2783,9 +2783,7 @@ async def test_list_sessions_async_pages(): RuntimeError, ) pages = [] - async for page_ in ( - await client.list_sessions(request={}) - ).pages: + async for page_ in (await client.list_sessions(request={})).pages: pages.append(page_) for page_, token in zip(pages, ["abc", "def", "ghi", ""]): assert page_.raw_page.next_page_token == token