From 47b14691e072d98866269a4a52cce1558745dcbf Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Thu, 16 Apr 2026 08:41:58 +0000 Subject: [PATCH] chore: complete migration of google-cloud-spanner No changes required other than regeneration. The diffs here are due to reformatting hand-written tests and samples. Fixes https://github.com/googleapis/librarian/issues/5338 --- librarian.yaml | 1 - .../google-cloud-spanner/.repo-metadata.json | 24 +++++------ .../benchwrapper/proto/spanner_pb2.py | 15 +++++++ .../samples/archived/backup_snippet.py | 9 ++-- .../samples/archived/backup_snippet_test.py | 12 ++++-- .../samples/samples/archived/pg_samples.py | 1 + .../samples/archived/pg_samples_test.py | 3 +- .../samples/samples/archived/samples.py | 13 +++--- .../samples/samples/archived/samples_test.py | 4 +- .../samples/samples/autocommit_test.py | 2 +- .../samples/samples/backup_sample.py | 5 +-- .../samples/samples/backup_sample_test.py | 6 +-- .../samples/backup_schedule_samples.py | 20 +++++---- .../samples/backup_schedule_samples_test.py | 5 ++- .../samples/samples/conftest.py | 4 +- .../samples/samples/graph_snippets_test.py | 3 +- .../samples/samples/noxfile.py | 16 +++---- .../samples/samples/pg_snippets.py | 19 ++++---- .../samples/samples/pg_snippets_test.py | 2 +- .../samples/samples/snippets.py | 43 ++++++++++--------- .../samples/samples/snippets_test.py | 2 +- .../samples/samples/testdata/singer_pb2.py | 35 +++++++++++---- .../tests/system/testdata/singer_pb2.py | 15 +++++++ .../tests/unit/testdata/singer_pb2.py | 15 +++++++ 24 files changed, 170 insertions(+), 104 deletions(-) diff --git a/librarian.yaml b/librarian.yaml index 7c0eb430af62..decf50fca46a 100644 --- a/librarian.yaml +++ b/librarian.yaml @@ -3541,7 +3541,6 @@ libraries: - docs/spanner_v1/table.rst - docs/spanner_v1/transaction.rst - tests/unit/gapic/conftest.py - skip_generate: true python: library_type: GAPIC_COMBO opt_args_by_api: diff --git a/packages/google-cloud-spanner/.repo-metadata.json b/packages/google-cloud-spanner/.repo-metadata.json index 9f9f2f0fc02a..ecd29547a09b 100644 --- a/packages/google-cloud-spanner/.repo-metadata.json +++ b/packages/google-cloud-spanner/.repo-metadata.json @@ -1,18 +1,16 @@ { - "name": "spanner", - "name_pretty": "Cloud Spanner", - "product_documentation": "https://cloud.google.com/spanner/docs/", + "api_description": "is the world's first fully managed relational database service \nto offer both strong consistency and horizontal scalability for \nmission-critical online transaction processing (OLTP) applications. With Cloud \nSpanner you enjoy all the traditional benefits of a relational database; but \nunlike any other relational database service, Cloud Spanner scales horizontally \nto hundreds or thousands of servers to handle the biggest transactional \nworkloads.", + "api_id": "spanner.googleapis.com", + "api_shortname": "spanner", "client_documentation": "https://cloud.google.com/python/docs/reference/spanner/latest", + "default_version": "v1", + "distribution_name": "google-cloud-spanner", "issue_tracker": "https://issuetracker.google.com/issues?q=componentid:190851%2B%20status:open", - "release_level": "stable", "language": "python", "library_type": "GAPIC_COMBO", - "repo": "googleapis/google-cloud-python", - "distribution_name": "google-cloud-spanner", - "api_id": "spanner.googleapis.com", - "requires_billing": true, - "default_version": "v1", - "codeowner_team": "@googleapis/spanner-team", - "api_shortname": "spanner", - "api_description": "is the world's first fully managed relational database service \nto offer both strong consistency and horizontal scalability for \nmission-critical online transaction processing (OLTP) applications. With Cloud \nSpanner you enjoy all the traditional benefits of a relational database; but \nunlike any other relational database service, Cloud Spanner scales horizontally \nto hundreds or thousands of servers to handle the biggest transactional \nworkloads." -} + "name": "spanner", + "name_pretty": "Cloud Spanner", + "product_documentation": "https://cloud.google.com/spanner/docs/", + "release_level": "stable", + "repo": "googleapis/google-cloud-python" +} \ No newline at end of file diff --git a/packages/google-cloud-spanner/benchmark/benchwrapper/proto/spanner_pb2.py b/packages/google-cloud-spanner/benchmark/benchwrapper/proto/spanner_pb2.py index e2d9b1a8250a..f922b907fb44 100644 --- a/packages/google-cloud-spanner/benchmark/benchwrapper/proto/spanner_pb2.py +++ b/packages/google-cloud-spanner/benchmark/benchwrapper/proto/spanner_pb2.py @@ -1,4 +1,19 @@ # -*- coding: utf-8 -*- + +# Copyright 2025 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 by the protocol buffer compiler. DO NOT EDIT! # source: benchmark/benchwrapper/proto/spanner.proto """Generated protocol buffer code.""" diff --git a/packages/google-cloud-spanner/samples/samples/archived/backup_snippet.py b/packages/google-cloud-spanner/samples/samples/archived/backup_snippet.py index f31cbc1f2c48..bdee010d5051 100644 --- a/packages/google-cloud-spanner/samples/samples/archived/backup_snippet.py +++ b/packages/google-cloud-spanner/samples/samples/archived/backup_snippet.py @@ -127,8 +127,7 @@ def create_backup_with_encryption_key( instance_id, database_id, backup_id, kms_key_name ): """Creates a backup for a database using a Customer Managed Encryption Key (CMEK).""" - from google.cloud.spanner_admin_database_v1 import \ - CreateBackupEncryptionConfig + from google.cloud.spanner_admin_database_v1 import CreateBackupEncryptionConfig spanner_client = spanner.Client() instance = spanner_client.instance(instance_id) @@ -187,8 +186,7 @@ def create_database_with_version_retention_period( + " AlbumTitle STRING(MAX)" + ") PRIMARY KEY (SingerId, AlbumId)," + " INTERLEAVE IN PARENT Singers ON DELETE CASCADE", - "ALTER DATABASE `{}`" - " SET OPTIONS (version_retention_period = '{}')".format( + "ALTER DATABASE `{}` SET OPTIONS (version_retention_period = '{}')".format( database_id, retention_period ), ] @@ -396,8 +394,7 @@ def restore_database_with_encryption_key( instance_id, new_database_id, backup_id, kms_key_name ): """Restores a database from a backup using a Customer Managed Encryption Key (CMEK).""" - from google.cloud.spanner_admin_database_v1 import \ - RestoreDatabaseEncryptionConfig + from google.cloud.spanner_admin_database_v1 import RestoreDatabaseEncryptionConfig spanner_client = spanner.Client() instance = spanner_client.instance(instance_id) diff --git a/packages/google-cloud-spanner/samples/samples/archived/backup_snippet_test.py b/packages/google-cloud-spanner/samples/samples/archived/backup_snippet_test.py index 888124ffad5d..e1c5251145c9 100644 --- a/packages/google-cloud-spanner/samples/samples/archived/backup_snippet_test.py +++ b/packages/google-cloud-spanner/samples/samples/archived/backup_snippet_test.py @@ -91,8 +91,10 @@ def test_create_backup_with_encryption_key( assert kms_key_name in out -@pytest.mark.skip(reason="same test passes on unarchived test suite, " - "but fails here. Needs investigation") +@pytest.mark.skip( + reason="same test passes on unarchived test suite, " + "but fails here. Needs investigation" +) @pytest.mark.dependency(depends=["create_backup"]) @RetryErrors(exception=DeadlineExceeded, max_tries=2) def test_restore_database(capsys, instance_id, sample_database): @@ -103,8 +105,10 @@ def test_restore_database(capsys, instance_id, sample_database): assert BACKUP_ID in out -@pytest.mark.skip(reason="same test passes on unarchived test suite, " - "but fails here. Needs investigation") +@pytest.mark.skip( + reason="same test passes on unarchived test suite, " + "but fails here. Needs investigation" +) @pytest.mark.dependency(depends=["create_backup_with_encryption_key"]) @RetryErrors(exception=DeadlineExceeded, max_tries=2) def test_restore_database_with_encryption_key( diff --git a/packages/google-cloud-spanner/samples/samples/archived/pg_samples.py b/packages/google-cloud-spanner/samples/samples/archived/pg_samples.py index 2d0dd0e5a983..2e66cbb7735c 100644 --- a/packages/google-cloud-spanner/samples/samples/archived/pg_samples.py +++ b/packages/google-cloud-spanner/samples/samples/archived/pg_samples.py @@ -18,6 +18,7 @@ Spanner PostgreSql dialect. For more information, see the README.rst under /spanner. """ + from google.cloud import spanner, spanner_admin_database_v1 from google.cloud.spanner_admin_database_v1.types.common import DatabaseDialect diff --git a/packages/google-cloud-spanner/samples/samples/archived/pg_samples_test.py b/packages/google-cloud-spanner/samples/samples/archived/pg_samples_test.py index 3863f5aa56a6..f64af67e0c34 100644 --- a/packages/google-cloud-spanner/samples/samples/archived/pg_samples_test.py +++ b/packages/google-cloud-spanner/samples/samples/archived/pg_samples_test.py @@ -17,9 +17,10 @@ import pg_samples as samples import pytest from google.api_core import exceptions -from google.cloud.spanner_admin_database_v1.types.common import DatabaseDialect from test_utils.retry import RetryErrors +from google.cloud.spanner_admin_database_v1.types.common import DatabaseDialect + CREATE_TABLE_SINGERS = """\ CREATE TABLE Singers ( SingerId BIGINT NOT NULL, diff --git a/packages/google-cloud-spanner/samples/samples/archived/samples.py b/packages/google-cloud-spanner/samples/samples/archived/samples.py index 0f930d4a356f..619c6ace65c9 100644 --- a/packages/google-cloud-spanner/samples/samples/archived/samples.py +++ b/packages/google-cloud-spanner/samples/samples/archived/samples.py @@ -22,10 +22,11 @@ import time -from google.cloud import spanner from google.iam.v1 import policy_pb2 from google.type import expr_pb2 +from google.cloud import spanner + OPERATION_TIMEOUT_SECONDS = 240 @@ -293,8 +294,9 @@ def create_database_with_default_leader(instance_id, database_id, default_leader AlbumTitle STRING(MAX) ) PRIMARY KEY (SingerId, AlbumId), INTERLEAVE IN PARENT Singers ON DELETE CASCADE""", - "ALTER DATABASE {}" - " SET OPTIONS (default_leader = '{}')".format(database_id, default_leader), + "ALTER DATABASE {} SET OPTIONS (default_leader = '{}')".format( + database_id, default_leader + ), ], ) operation = database.create() @@ -806,8 +808,9 @@ def update_database_with_default_leader(instance_id, database_id, default_leader operation = database.update_ddl( [ - "ALTER DATABASE {}" - " SET OPTIONS (default_leader = '{}')".format(database_id, default_leader) + "ALTER DATABASE {} SET OPTIONS (default_leader = '{}')".format( + database_id, default_leader + ) ] ) operation.result(OPERATION_TIMEOUT_SECONDS) diff --git a/packages/google-cloud-spanner/samples/samples/archived/samples_test.py b/packages/google-cloud-spanner/samples/samples/archived/samples_test.py index 6435dc531101..9a1d5063f76c 100644 --- a/packages/google-cloud-spanner/samples/samples/archived/samples_test.py +++ b/packages/google-cloud-spanner/samples/samples/archived/samples_test.py @@ -23,11 +23,11 @@ import pytest from google.api_core import exceptions -from google.cloud import spanner -from google.cloud.spanner_admin_database_v1.types.common import DatabaseDialect from test_utils.retry import RetryErrors import samples +from google.cloud import spanner +from google.cloud.spanner_admin_database_v1.types.common import DatabaseDialect CREATE_TABLE_SINGERS = """\ CREATE TABLE Singers ( diff --git a/packages/google-cloud-spanner/samples/samples/autocommit_test.py b/packages/google-cloud-spanner/samples/samples/autocommit_test.py index a22f74e6b44b..8150058f1c90 100644 --- a/packages/google-cloud-spanner/samples/samples/autocommit_test.py +++ b/packages/google-cloud-spanner/samples/samples/autocommit_test.py @@ -4,8 +4,8 @@ # license that can be found in the LICENSE file or at # https://developers.google.com/open-source/licenses/bsd -import pytest from google.api_core.exceptions import Aborted +import pytest from test_utils.retry import RetryErrors import autocommit diff --git a/packages/google-cloud-spanner/samples/samples/backup_sample.py b/packages/google-cloud-spanner/samples/samples/backup_sample.py index e984d3a11ea8..59c4bb71d816 100644 --- a/packages/google-cloud-spanner/samples/samples/backup_sample.py +++ b/packages/google-cloud-spanner/samples/samples/backup_sample.py @@ -631,8 +631,7 @@ def create_database_with_version_retention_period( + " AlbumTitle STRING(MAX)" + ") PRIMARY KEY (SingerId, AlbumId)," + " INTERLEAVE IN PARENT Singers ON DELETE CASCADE", - "ALTER DATABASE `{}`" - " SET OPTIONS (version_retention_period = '{}')".format( + "ALTER DATABASE `{}` SET OPTIONS (version_retention_period = '{}')".format( database_id, retention_period ), ] @@ -706,8 +705,8 @@ def copy_backup_with_multiple_kms_keys( ): """Copies a backup.""" - from google.cloud.spanner_admin_database_v1.types import backup as backup_pb from google.cloud.spanner_admin_database_v1 import CopyBackupEncryptionConfig + from google.cloud.spanner_admin_database_v1.types import backup as backup_pb spanner_client = spanner.Client() database_admin_api = spanner_client.database_admin_api diff --git a/packages/google-cloud-spanner/samples/samples/backup_sample_test.py b/packages/google-cloud-spanner/samples/samples/backup_sample_test.py index b588d5735b66..55e7bac1881e 100644 --- a/packages/google-cloud-spanner/samples/samples/backup_sample_test.py +++ b/packages/google-cloud-spanner/samples/samples/backup_sample_test.py @@ -93,7 +93,7 @@ def test_create_backup_with_encryption_key( assert kms_key_name in out -@pytest.mark.skip(reason="skipped since the KMS keys are not added on test " "project") +@pytest.mark.skip(reason="skipped since the KMS keys are not added on test project") @pytest.mark.dependency(name="create_backup_with_multiple_kms_keys") def test_create_backup_with_multiple_kms_keys( capsys, @@ -115,7 +115,7 @@ def test_create_backup_with_multiple_kms_keys( assert kms_key_names[2] in out -@pytest.mark.skip(reason="skipped since the KMS keys are not added on test " "project") +@pytest.mark.skip(reason="skipped since the KMS keys are not added on test project") @pytest.mark.dependency(depends=["create_backup_with_multiple_kms_keys"]) def test_copy_backup_with_multiple_kms_keys( capsys, multi_region_instance_id, spanner_client, kms_key_names @@ -162,7 +162,7 @@ def test_restore_database_with_encryption_key( assert kms_key_name in out -@pytest.mark.skip(reason="skipped since the KMS keys are not added on test " "project") +@pytest.mark.skip(reason="skipped since the KMS keys are not added on test project") @pytest.mark.dependency(depends=["create_backup_with_multiple_kms_keys"]) @RetryErrors(exception=DeadlineExceeded, max_tries=2) def test_restore_database_with_multiple_kms_keys( diff --git a/packages/google-cloud-spanner/samples/samples/backup_schedule_samples.py b/packages/google-cloud-spanner/samples/samples/backup_schedule_samples.py index c3c86b1538d7..53321fc7dd5b 100644 --- a/packages/google-cloud-spanner/samples/samples/backup_schedule_samples.py +++ b/packages/google-cloud-spanner/samples/samples/backup_schedule_samples.py @@ -18,7 +18,6 @@ """ import argparse - from enum import Enum @@ -29,14 +28,15 @@ def create_full_backup_schedule( schedule_id: str, ) -> None: from datetime import timedelta + from google.cloud import spanner - from google.cloud.spanner_admin_database_v1.types import ( - backup_schedule as backup_schedule_pb, - ) from google.cloud.spanner_admin_database_v1.types import ( CreateBackupEncryptionConfig, FullBackupSpec, ) + from google.cloud.spanner_admin_database_v1.types import ( + backup_schedule as backup_schedule_pb, + ) client = spanner.Client() database_admin_api = client.database_admin_api @@ -74,14 +74,15 @@ def create_incremental_backup_schedule( schedule_id: str, ) -> None: from datetime import timedelta + from google.cloud import spanner - from google.cloud.spanner_admin_database_v1.types import ( - backup_schedule as backup_schedule_pb, - ) from google.cloud.spanner_admin_database_v1.types import ( CreateBackupEncryptionConfig, IncrementalBackupSpec, ) + from google.cloud.spanner_admin_database_v1.types import ( + backup_schedule as backup_schedule_pb, + ) client = spanner.Client() database_admin_api = client.database_admin_api @@ -174,12 +175,13 @@ def update_backup_schedule( schedule_id: str, ) -> None: from datetime import timedelta + from google.cloud import spanner from google.cloud.spanner_admin_database_v1.types import ( - backup_schedule as backup_schedule_pb, + CreateBackupEncryptionConfig, ) from google.cloud.spanner_admin_database_v1.types import ( - CreateBackupEncryptionConfig, + backup_schedule as backup_schedule_pb, ) from google.protobuf.field_mask_pb2 import FieldMask diff --git a/packages/google-cloud-spanner/samples/samples/backup_schedule_samples_test.py b/packages/google-cloud-spanner/samples/samples/backup_schedule_samples_test.py index 6584d89701b2..8e263b6a4bdf 100644 --- a/packages/google-cloud-spanner/samples/samples/backup_schedule_samples_test.py +++ b/packages/google-cloud-spanner/samples/samples/backup_schedule_samples_test.py @@ -12,10 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -import backup_schedule_samples as samples -import pytest import uuid +import pytest + +import backup_schedule_samples as samples __FULL_BACKUP_SCHEDULE_ID = "full-backup-schedule" __INCREMENTAL_BACKUP_SCHEDULE_ID = "incremental-backup-schedule" diff --git a/packages/google-cloud-spanner/samples/samples/conftest.py b/packages/google-cloud-spanner/samples/samples/conftest.py index b34e9d16b12f..25671684cf6f 100644 --- a/packages/google-cloud-spanner/samples/samples/conftest.py +++ b/packages/google-cloud-spanner/samples/samples/conftest.py @@ -11,7 +11,7 @@ # 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. -""" Shared pytest fixtures.""" +"""Shared pytest fixtures.""" import time import uuid @@ -19,10 +19,10 @@ from google.api_core import exceptions from google.cloud import spanner_admin_database_v1 from google.cloud.spanner_admin_database_v1.types.common import DatabaseDialect +from google.cloud.spanner_admin_instance_v1.types import spanner_instance_admin from google.cloud.spanner_v1 import backup, client, database, instance import pytest from test_utils import retry -from google.cloud.spanner_admin_instance_v1.types import spanner_instance_admin INSTANCE_CREATION_TIMEOUT = 560 # seconds diff --git a/packages/google-cloud-spanner/samples/samples/graph_snippets_test.py b/packages/google-cloud-spanner/samples/samples/graph_snippets_test.py index bd49260007ab..70e14e21ac84 100644 --- a/packages/google-cloud-spanner/samples/samples/graph_snippets_test.py +++ b/packages/google-cloud-spanner/samples/samples/graph_snippets_test.py @@ -14,11 +14,10 @@ # import time import uuid -import pytest from google.api_core import exceptions - from google.cloud.spanner_admin_database_v1.types.common import DatabaseDialect +import pytest from test_utils.retry import RetryErrors import graph_snippets diff --git a/packages/google-cloud-spanner/samples/samples/noxfile.py b/packages/google-cloud-spanner/samples/samples/noxfile.py index 719e13109909..4e5349e54102 100644 --- a/packages/google-cloud-spanner/samples/samples/noxfile.py +++ b/packages/google-cloud-spanner/samples/samples/noxfile.py @@ -22,7 +22,6 @@ import nox - # WARNING - WARNING - WARNING - WARNING - WARNING # WARNING - WARNING - WARNING - WARNING - WARNING # DO NOT EDIT THIS FILE EVER! @@ -160,6 +159,7 @@ def blacken(session: nox.sessions.Session) -> None: # format = isort + black # + @nox.session def format(session: nox.sessions.Session) -> None: """ @@ -187,7 +187,9 @@ def _session_tests( session: nox.sessions.Session, post_install: Callable = None ) -> None: # check for presence of tests - test_list = glob.glob("**/*_test.py", recursive=True) + glob.glob("**/test_*.py", recursive=True) + test_list = glob.glob("**/*_test.py", recursive=True) + glob.glob( + "**/test_*.py", recursive=True + ) test_list.extend(glob.glob("**/tests", recursive=True)) if len(test_list) == 0: @@ -209,9 +211,7 @@ def _session_tests( if os.path.exists("requirements-test.txt"): if os.path.exists("constraints-test.txt"): - session.install( - "-r", "requirements-test.txt", "-c", "constraints-test.txt" - ) + session.install("-r", "requirements-test.txt", "-c", "constraints-test.txt") else: session.install("-r", "requirements-test.txt") with open("requirements-test.txt") as rtfile: @@ -224,9 +224,9 @@ def _session_tests( post_install(session) if "pytest-parallel" in packages: - concurrent_args.extend(['--workers', 'auto', '--tests-per-worker', 'auto']) + concurrent_args.extend(["--workers", "auto", "--tests-per-worker", "auto"]) elif "pytest-xdist" in packages: - concurrent_args.extend(['-n', 'auto']) + concurrent_args.extend(["-n", "auto"]) session.run( "pytest", @@ -256,7 +256,7 @@ def py(session: nox.sessions.Session) -> None: def _get_repo_root() -> Optional[str]: - """ Returns the root folder of the project. """ + """Returns the root folder of the project.""" # Get root of this repository. Assume we don't have directories nested deeper than 10 items. p = Path(os.getcwd()) for i in range(10): diff --git a/packages/google-cloud-spanner/samples/samples/pg_snippets.py b/packages/google-cloud-spanner/samples/samples/pg_snippets.py index 432d68a8ce5f..1c7e120f9c92 100644 --- a/packages/google-cloud-spanner/samples/samples/pg_snippets.py +++ b/packages/google-cloud-spanner/samples/samples/pg_snippets.py @@ -19,6 +19,7 @@ For more information, see the README.rst under /spanner. """ + import argparse import base64 import datetime @@ -491,7 +492,7 @@ def read_data_with_storing_index(instance_id, database_id): ) for row in results: - print("AlbumId: {}, AlbumTitle: {}, " "MarketingBudget: {}".format(*row)) + print("AlbumId: {}, AlbumTitle: {}, MarketingBudget: {}".format(*row)) # [END spanner_postgresql_read_data_with_storing_index] @@ -600,7 +601,7 @@ def query_data_with_parameter(instance_id, database_id): with database.snapshot() as snapshot: results = snapshot.execute_sql( - "SELECT SingerId, FirstName, LastName FROM Singers " "WHERE LastName = $1", + "SELECT SingerId, FirstName, LastName FROM Singers WHERE LastName = $1", params={"p1": "Garcia"}, param_types={"p1": spanner.param_types.STRING}, ) @@ -624,7 +625,7 @@ def transfer_budget(transaction): # Transfer marketing budget from one album to another. Performed in a # single transaction to ensure that the transfer is atomic. second_album_result = transaction.execute_sql( - "SELECT MarketingBudget from Albums " "WHERE SingerId = 2 and AlbumId = 2" + "SELECT MarketingBudget from Albums WHERE SingerId = 2 and AlbumId = 2" ) second_album_row = list(second_album_result)[0] second_album_budget = second_album_row[0] @@ -636,8 +637,7 @@ def transfer_budget(transaction): # will be rerun by the client library if second_album_budget >= transfer_amount: first_album_result = transaction.execute_sql( - "SELECT MarketingBudget from Albums " - "WHERE SingerId = 1 and AlbumId = 1" + "SELECT MarketingBudget from Albums WHERE SingerId = 1 and AlbumId = 1" ) first_album_row = list(first_album_result)[0] first_album_budget = first_album_row[0] @@ -969,8 +969,7 @@ def delete_data_with_dml_returning(instance_id, database_id): # deleted records by using 'RETURNING *'. def delete_singers(transaction): results = transaction.execute_sql( - "DELETE FROM Singers WHERE FirstName = 'David' " - "RETURNING SingerId, FullName" + "DELETE FROM Singers WHERE FirstName = 'David' RETURNING SingerId, FullName" ) for result in results: print("SingerId: {}, FullName: {}".format(*result)) @@ -1226,7 +1225,7 @@ def query_data_with_bytes(instance_id, database_id): with database.snapshot() as snapshot: results = snapshot.execute_sql( - "SELECT VenueId, VenueName FROM Venues " "WHERE VenueInfo = $1", + "SELECT VenueId, VenueName FROM Venues WHERE VenueInfo = $1", params=param, param_types=param_type, ) @@ -1277,7 +1276,7 @@ def query_data_with_int(instance_id, database_id): with database.snapshot() as snapshot: results = snapshot.execute_sql( - "SELECT VenueId, VenueName, Capacity FROM Venues " "WHERE Capacity >= $1", + "SELECT VenueId, VenueName, Capacity FROM Venues WHERE Capacity >= $1", params=param, param_types=param_type, ) @@ -1302,7 +1301,7 @@ def query_data_with_string(instance_id, database_id): with database.snapshot() as snapshot: results = snapshot.execute_sql( - "SELECT VenueId, VenueName FROM Venues " "WHERE VenueName = $1", + "SELECT VenueId, VenueName FROM Venues WHERE VenueName = $1", params=param, param_types=param_type, ) diff --git a/packages/google-cloud-spanner/samples/samples/pg_snippets_test.py b/packages/google-cloud-spanner/samples/samples/pg_snippets_test.py index 1b5d2971c19e..d4f08499d25a 100644 --- a/packages/google-cloud-spanner/samples/samples/pg_snippets_test.py +++ b/packages/google-cloud-spanner/samples/samples/pg_snippets_test.py @@ -15,9 +15,9 @@ import time import uuid -import pytest from google.api_core import exceptions from google.cloud.spanner_admin_database_v1.types.common import DatabaseDialect +import pytest from test_utils.retry import RetryErrors import pg_snippets as snippets diff --git a/packages/google-cloud-spanner/samples/samples/snippets.py b/packages/google-cloud-spanner/samples/samples/snippets.py index 96c00548525c..d3c89f236364 100644 --- a/packages/google-cloud-spanner/samples/samples/snippets.py +++ b/packages/google-cloud-spanner/samples/samples/snippets.py @@ -435,8 +435,9 @@ def create_database_with_default_leader(instance_id, database_id, default_leader AlbumTitle STRING(MAX) ) PRIMARY KEY (SingerId, AlbumId), INTERLEAVE IN PARENT Singers ON DELETE CASCADE""", - "ALTER DATABASE {}" - " SET OPTIONS (default_leader = '{}')".format(database_id, default_leader), + "ALTER DATABASE {} SET OPTIONS (default_leader = '{}')".format( + database_id, default_leader + ), ], ) operation = database_admin_api.create_database(request=request) @@ -467,8 +468,9 @@ def update_database_with_default_leader(instance_id, database_id, default_leader spanner_client.project, instance_id, database_id ), statements=[ - "ALTER DATABASE {}" - " SET OPTIONS (default_leader = '{}')".format(database_id, default_leader) + "ALTER DATABASE {} SET OPTIONS (default_leader = '{}')".format( + database_id, default_leader + ) ], ) operation = database_admin_api.update_database_ddl(request) @@ -811,7 +813,7 @@ def query_data_with_index( ) for row in results: - print("AlbumId: {}, AlbumTitle: {}, " "MarketingBudget: {}".format(*row)) + print("AlbumId: {}, AlbumTitle: {}, MarketingBudget: {}".format(*row)) # [END spanner_query_data_with_index] @@ -905,7 +907,7 @@ def read_data_with_storing_index(instance_id, database_id): ) for row in results: - print("AlbumId: {}, AlbumTitle: {}, " "MarketingBudget: {}".format(*row)) + print("AlbumId: {}, AlbumTitle: {}, MarketingBudget: {}".format(*row)) # [END spanner_read_data_with_storing_index] @@ -1439,7 +1441,7 @@ def query_with_struct(instance_id, database_id): with database.snapshot() as snapshot: results = snapshot.execute_sql( - "SELECT SingerId FROM Singers WHERE " "(FirstName, LastName) = @name", + "SELECT SingerId FROM Singers WHERE (FirstName, LastName) = @name", params={"name": record_value}, param_types={"name": record_type}, ) @@ -1503,7 +1505,7 @@ def query_struct_field(instance_id, database_id): with database.snapshot() as snapshot: results = snapshot.execute_sql( - "SELECT SingerId FROM Singers " "WHERE FirstName = @name.FirstName", + "SELECT SingerId FROM Singers WHERE FirstName = @name.FirstName", params={"name": ("Elena", "Campbell")}, param_types={"name": name_type}, ) @@ -1924,7 +1926,7 @@ def transfer_budget(transaction): # Transfer marketing budget from one album to another. Performed in a # single transaction to ensure that the transfer is atomic. second_album_result = transaction.execute_sql( - "SELECT MarketingBudget from Albums " "WHERE SingerId = 2 and AlbumId = 2" + "SELECT MarketingBudget from Albums WHERE SingerId = 2 and AlbumId = 2" ) second_album_row = list(second_album_result)[0] second_album_budget = second_album_row[0] @@ -1936,8 +1938,7 @@ def transfer_budget(transaction): # will be rerun by the client library if second_album_budget >= transfer_amount: first_album_result = transaction.execute_sql( - "SELECT MarketingBudget from Albums " - "WHERE SingerId = 1 and AlbumId = 1" + "SELECT MarketingBudget from Albums WHERE SingerId = 1 and AlbumId = 1" ) first_album_row = list(first_album_result)[0] first_album_budget = first_album_row[0] @@ -2226,7 +2227,7 @@ def query_data_with_bytes(instance_id, database_id): with database.snapshot() as snapshot: results = snapshot.execute_sql( - "SELECT VenueId, VenueName FROM Venues " "WHERE VenueInfo = @venue_info", + "SELECT VenueId, VenueName FROM Venues WHERE VenueInfo = @venue_info", params=param, param_types=param_type, ) @@ -2329,7 +2330,7 @@ def query_data_with_string(instance_id, database_id): with database.snapshot() as snapshot: results = snapshot.execute_sql( - "SELECT VenueId, VenueName FROM Venues " "WHERE VenueName = @venue_name", + "SELECT VenueId, VenueName FROM Venues WHERE VenueName = @venue_name", params=param, param_types=param_type, ) @@ -2354,7 +2355,7 @@ def query_data_with_numeric_parameter(instance_id, database_id): with database.snapshot() as snapshot: results = snapshot.execute_sql( - "SELECT VenueId, Revenue FROM Venues " "WHERE Revenue < @revenue", + "SELECT VenueId, Revenue FROM Venues WHERE Revenue < @revenue", params=param, param_types=param_type, ) @@ -3192,7 +3193,7 @@ def isolation_level_options( # [START spanner_isolation_level] # instance_id = "your-spanner-instance" # database_id = "your-spanner-db-id" - from google.cloud.spanner_v1 import TransactionOptions, DefaultTransactionOptions + from google.cloud.spanner_v1 import DefaultTransactionOptions, TransactionOptions # The isolation level specified at the client-level will be applied to all RW transactions. isolation_options_for_client = TransactionOptions.IsolationLevel.SERIALIZABLE @@ -3241,11 +3242,13 @@ def read_lock_mode_options( # [START spanner_read_lock_mode] # instance_id = "your-spanner-instance" # database_id = "your-spanner-db-id" - from google.cloud.spanner_v1 import TransactionOptions, DefaultTransactionOptions + from google.cloud.spanner_v1 import DefaultTransactionOptions, TransactionOptions # The read lock mode specified at the client-level will be applied to all # RW transactions. - read_lock_mode_options_for_client = TransactionOptions.ReadWrite.ReadLockMode.OPTIMISTIC + read_lock_mode_options_for_client = ( + TransactionOptions.ReadWrite.ReadLockMode.OPTIMISTIC + ) # Create a client that uses Serializable isolation (default) with # optimistic locking for read-write transactions. @@ -3280,7 +3283,7 @@ def update_albums_with_read_lock_mode(transaction): database.run_in_transaction( update_albums_with_read_lock_mode, - read_lock_mode=read_lock_mode_options_for_transaction + read_lock_mode=read_lock_mode_options_for_transaction, ) # [END spanner_read_lock_mode] @@ -3909,9 +3912,7 @@ def add_split_points(instance_id, database_id): subparsers.add_parser( "isolation_level_options", help=isolation_level_options.__doc__ ) - subparsers.add_parser( - "read_lock_mode_options", help=read_lock_mode_options.__doc__ - ) + subparsers.add_parser("read_lock_mode_options", help=read_lock_mode_options.__doc__) subparsers.add_parser( "set_custom_timeout_and_retry", help=set_custom_timeout_and_retry.__doc__ ) diff --git a/packages/google-cloud-spanner/samples/samples/snippets_test.py b/packages/google-cloud-spanner/samples/samples/snippets_test.py index 3888bf012092..d1abeb4b277e 100644 --- a/packages/google-cloud-spanner/samples/samples/snippets_test.py +++ b/packages/google-cloud-spanner/samples/samples/snippets_test.py @@ -254,7 +254,7 @@ def test_create_database_with_encryption_config( assert kms_key_name in out -@pytest.mark.skip(reason="skipped since the KMS keys are not added on test " "project") +@pytest.mark.skip(reason="skipped since the KMS keys are not added on test project") def test_create_database_with_multiple_kms_keys( capsys, multi_region_instance, diff --git a/packages/google-cloud-spanner/samples/samples/testdata/singer_pb2.py b/packages/google-cloud-spanner/samples/samples/testdata/singer_pb2.py index 286f8841633a..c0b1711d20fa 100644 --- a/packages/google-cloud-spanner/samples/samples/testdata/singer_pb2.py +++ b/packages/google-cloud-spanner/samples/samples/testdata/singer_pb2.py @@ -1,28 +1,45 @@ # -*- coding: utf-8 -*- + +# Copyright 2025 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 by the protocol buffer compiler. DO NOT EDIT! # source: singer.proto # Protobuf Python Version: 4.25.1 """Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import symbol_database as _symbol_database from google.protobuf.internal import builder as _builder + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0csinger.proto\x12\x16\x65xamples.spanner.music\"\xc1\x01\n\nSingerInfo\x12\x16\n\tsinger_id\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x17\n\nbirth_date\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0bnationality\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x31\n\x05genre\x18\x04 \x01(\x0e\x32\x1d.examples.spanner.music.GenreH\x03\x88\x01\x01\x42\x0c\n\n_singer_idB\r\n\x0b_birth_dateB\x0e\n\x0c_nationalityB\x08\n\x06_genre*.\n\x05Genre\x12\x07\n\x03POP\x10\x00\x12\x08\n\x04JAZZ\x10\x01\x12\x08\n\x04\x46OLK\x10\x02\x12\x08\n\x04ROCK\x10\x03\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x0csinger.proto\x12\x16\x65xamples.spanner.music"\xc1\x01\n\nSingerInfo\x12\x16\n\tsinger_id\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x17\n\nbirth_date\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0bnationality\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x31\n\x05genre\x18\x04 \x01(\x0e\x32\x1d.examples.spanner.music.GenreH\x03\x88\x01\x01\x42\x0c\n\n_singer_idB\r\n\x0b_birth_dateB\x0e\n\x0c_nationalityB\x08\n\x06_genre*.\n\x05Genre\x12\x07\n\x03POP\x10\x00\x12\x08\n\x04JAZZ\x10\x01\x12\x08\n\x04\x46OLK\x10\x02\x12\x08\n\x04ROCK\x10\x03\x62\x06proto3' +) _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'singer_pb2', _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "singer_pb2", _globals) if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - _globals['_GENRE']._serialized_start=236 - _globals['_GENRE']._serialized_end=282 - _globals['_SINGERINFO']._serialized_start=41 - _globals['_SINGERINFO']._serialized_end=234 + DESCRIPTOR._options = None + _globals["_GENRE"]._serialized_start = 236 + _globals["_GENRE"]._serialized_end = 282 + _globals["_SINGERINFO"]._serialized_start = 41 + _globals["_SINGERINFO"]._serialized_end = 234 # @@protoc_insertion_point(module_scope) diff --git a/packages/google-cloud-spanner/tests/system/testdata/singer_pb2.py b/packages/google-cloud-spanner/tests/system/testdata/singer_pb2.py index 92ab0c5f608c..c0b1711d20fa 100644 --- a/packages/google-cloud-spanner/tests/system/testdata/singer_pb2.py +++ b/packages/google-cloud-spanner/tests/system/testdata/singer_pb2.py @@ -1,4 +1,19 @@ # -*- coding: utf-8 -*- + +# Copyright 2025 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 by the protocol buffer compiler. DO NOT EDIT! # source: singer.proto # Protobuf Python Version: 4.25.1 diff --git a/packages/google-cloud-spanner/tests/unit/testdata/singer_pb2.py b/packages/google-cloud-spanner/tests/unit/testdata/singer_pb2.py index 92ab0c5f608c..c0b1711d20fa 100644 --- a/packages/google-cloud-spanner/tests/unit/testdata/singer_pb2.py +++ b/packages/google-cloud-spanner/tests/unit/testdata/singer_pb2.py @@ -1,4 +1,19 @@ # -*- coding: utf-8 -*- + +# Copyright 2025 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 by the protocol buffer compiler. DO NOT EDIT! # source: singer.proto # Protobuf Python Version: 4.25.1