From a3b66dd53031d4881bab771c26e6654b08129bf9 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Fri, 6 Jun 2025 20:15:44 +0530 Subject: [PATCH 01/11] perf: Skip gRPC trailers for StreamingRead & ExecuteStreamingSql --- google/cloud/spanner_v1/streamed.py | 6 ++++++ tests/unit/test_streamed.py | 33 +++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/google/cloud/spanner_v1/streamed.py b/google/cloud/spanner_v1/streamed.py index 5de843e103..5f7b60b87f 100644 --- a/google/cloud/spanner_v1/streamed.py +++ b/google/cloud/spanner_v1/streamed.py @@ -54,6 +54,7 @@ def __init__( self._column_info = column_info # Column information self._field_decoders = None self._lazy_decode = lazy_decode # Return protobuf values + self._done = False @property def fields(self): @@ -159,11 +160,16 @@ def _consume_next(self): self._merge_values(values) + if response_pb.last: + self._done = True + def __iter__(self): while True: iter_rows, self._rows[:] = self._rows[:], () while iter_rows: yield iter_rows.pop(0) + if self._done: + return try: self._consume_next() except StopIteration: diff --git a/tests/unit/test_streamed.py b/tests/unit/test_streamed.py index 83aa25a9d1..f2324a68ed 100644 --- a/tests/unit/test_streamed.py +++ b/tests/unit/test_streamed.py @@ -124,12 +124,12 @@ def _make_result_set_stats(query_plan=None, **kw): @staticmethod def _make_partial_result_set( - values, metadata=None, stats=None, chunked_value=False + values, metadata=None, stats=None, chunked_value=False, last=False ): from google.cloud.spanner_v1 import PartialResultSet results = PartialResultSet( - metadata=metadata, stats=stats, chunked_value=chunked_value + metadata=metadata, stats=stats, chunked_value=chunked_value, last=last ) for v in values: results.values.append(v) @@ -164,6 +164,35 @@ def test__merge_chunk_bool(self): with self.assertRaises(Unmergeable): streamed._merge_chunk(chunk) + def test__PartialResultSetWithLastFlag(self): + from google.cloud.spanner_v1 import TypeCode + + fields = [ + self._make_scalar_field("ID", TypeCode.INT64), + self._make_scalar_field("NAME", TypeCode.STRING), + ] + for length in range(4, 6): + metadata = self._make_result_set_metadata(fields) + result_sets = [ + self._make_partial_result_set([self._make_value(0), "google_0"], + metadata=metadata)] + for i in range(1, 5): + bares = [i] + values = [[self._make_value(bare), "google_" + str(bare)] for + bare in bares] + result_sets.append(self._make_partial_result_set(*values, + metadata=metadata, + last=(i == length - 1))) + + iterator = _MockCancellableIterator(*result_sets) + streamed = self._make_one(iterator) + count = 0 + for row in streamed: + self.assertEqual(row[0], count) + self.assertEqual(row[1], "google_" + str(count)) + count += 1 + self.assertEqual(count, length) + def test__merge_chunk_numeric(self): from google.cloud.spanner_v1 import TypeCode From 6b3a5e0fe2273517a74f4f2e0ecd226a459df6a4 Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Fri, 6 Jun 2025 14:48:35 +0000 Subject: [PATCH 02/11] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20?= =?UTF-8?q?post-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 --- tests/unit/test_streamed.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tests/unit/test_streamed.py b/tests/unit/test_streamed.py index f2324a68ed..39a7ac2f82 100644 --- a/tests/unit/test_streamed.py +++ b/tests/unit/test_streamed.py @@ -174,15 +174,20 @@ def test__PartialResultSetWithLastFlag(self): for length in range(4, 6): metadata = self._make_result_set_metadata(fields) result_sets = [ - self._make_partial_result_set([self._make_value(0), "google_0"], - metadata=metadata)] + self._make_partial_result_set( + [self._make_value(0), "google_0"], metadata=metadata + ) + ] for i in range(1, 5): bares = [i] - values = [[self._make_value(bare), "google_" + str(bare)] for - bare in bares] - result_sets.append(self._make_partial_result_set(*values, - metadata=metadata, - last=(i == length - 1))) + values = [ + [self._make_value(bare), "google_" + str(bare)] for bare in bares + ] + result_sets.append( + self._make_partial_result_set( + *values, metadata=metadata, last=(i == length - 1) + ) + ) iterator = _MockCancellableIterator(*result_sets) streamed = self._make_one(iterator) From 280e43615b2e78225ab3340c5bdcbc0b93223610 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Sat, 7 Jun 2025 02:25:15 +0530 Subject: [PATCH 03/11] add mockspanner tests --- .../cloud/spanner_v1/testing/mock_spanner.py | 26 ++++++-- .../mockserver_tests/mock_server_test_base.py | 58 ++++++++++++++---- tests/mockserver_tests/test_basics.py | 61 +++++++++++++------ 3 files changed, 109 insertions(+), 36 deletions(-) diff --git a/google/cloud/spanner_v1/testing/mock_spanner.py b/google/cloud/spanner_v1/testing/mock_spanner.py index f8971a6098..62d8d2b7af 100644 --- a/google/cloud/spanner_v1/testing/mock_spanner.py +++ b/google/cloud/spanner_v1/testing/mock_spanner.py @@ -35,11 +35,17 @@ class MockSpanner: def __init__(self): self.results = {} + self.execute_streaming_sql_results = {} self.errors = {} def add_result(self, sql: str, result: result_set.ResultSet): self.results[sql.lower().strip()] = result + def add_execute_streaming_sql_results(self, sql: str, + partial_result_sets: list[result_set.PartialResultSet]): + self.execute_streaming_sql_results[ + sql.lower().strip()] = partial_result_sets + def get_result(self, sql: str) -> result_set.ResultSet: result = self.results.get(sql.lower().strip()) if result is None: @@ -55,9 +61,20 @@ def pop_error(self, context): if error: context.abort_with_status(error) + def get_execute_streaming_sql_results(self, sql: str, + started_transaction: transaction.Transaction) -> list[ + result_set.PartialResultSet]: + if self.execute_streaming_sql_results[sql.lower().strip()]: + partials = self.execute_streaming_sql_results[sql.lower().strip()] + else: + partials = self.get_result_as_partial_result_sets(sql) + if started_transaction: + partials[0].metadata.transaction = started_transaction + return partials + def get_result_as_partial_result_sets( - self, sql: str, started_transaction: transaction.Transaction - ) -> [result_set.PartialResultSet]: + self, sql: str + ) -> list[result_set.PartialResultSet]: result: result_set.ResultSet = self.get_result(sql) partials = [] first = True @@ -70,11 +87,10 @@ def get_result_as_partial_result_sets( partial = result_set.PartialResultSet() if first: partial.metadata = ResultSetMetadata(result.metadata) + first = False partial.values.extend(row) partials.append(partial) partials[len(partials) - 1].stats = result.stats - if started_transaction: - partials[0].metadata.transaction = started_transaction return partials @@ -149,7 +165,7 @@ def ExecuteStreamingSql(self, request, context): self._requests.append(request) self.mock_spanner.pop_error(context) started_transaction = self.__maybe_create_transaction(request) - partials = self.mock_spanner.get_result_as_partial_result_sets( + partials = self.mock_spanner.get_execute_streaming_sql_results( request.sql, started_transaction ) for result in partials: diff --git a/tests/mockserver_tests/mock_server_test_base.py b/tests/mockserver_tests/mock_server_test_base.py index 7b4538d601..acb07f0005 100644 --- a/tests/mockserver_tests/mock_server_test_base.py +++ b/tests/mockserver_tests/mock_server_test_base.py @@ -14,27 +14,36 @@ import unittest -from google.cloud.spanner_dbapi.parsed_statement import AutocommitDmlMode -from google.cloud.spanner_v1.testing.mock_database_admin import DatabaseAdminServicer -from google.cloud.spanner_v1.testing.mock_spanner import ( - start_mock_server, - SpannerServicer, -) -import google.cloud.spanner_v1.types.type as spanner_type -import google.cloud.spanner_v1.types.result_set as result_set +import grpc from google.api_core.client_options import ClientOptions from google.auth.credentials import AnonymousCredentials -from google.cloud.spanner_v1 import Client, TypeCode, FixedSizePool -from google.cloud.spanner_v1.database import Database -from google.cloud.spanner_v1.instance import Instance -import grpc +from google.cloud.spanner_v1 import Type + +from google.cloud.spanner_v1 import StructType +from google.cloud.spanner_v1._helpers import _make_value_pb + +from google.cloud.spanner_v1 import PartialResultSet +from google.protobuf.duration_pb2 import Duration from google.rpc import code_pb2 from google.rpc import status_pb2 from google.rpc.error_details_pb2 import RetryInfo -from google.protobuf.duration_pb2 import Duration from grpc_status._common import code_to_grpc_status_code from grpc_status.rpc_status import _Status +import google.cloud.spanner_v1.types.result_set as result_set +import google.cloud.spanner_v1.types.type as spanner_type +from google.cloud.spanner_dbapi.parsed_statement import AutocommitDmlMode +from google.cloud.spanner_v1 import Client +from google.cloud.spanner_v1 import FixedSizePool +from google.cloud.spanner_v1 import ResultSetMetadata +from google.cloud.spanner_v1 import TypeCode +from google.cloud.spanner_v1.database import Database +from google.cloud.spanner_v1.instance import Instance +from google.cloud.spanner_v1.testing.mock_database_admin import \ + DatabaseAdminServicer +from google.cloud.spanner_v1.testing.mock_spanner import SpannerServicer +from google.cloud.spanner_v1.testing.mock_spanner import start_mock_server + # Creates an aborted status with the smallest possible retry delay. def aborted_status() -> _Status: @@ -57,6 +66,24 @@ def aborted_status() -> _Status: return status +def _make_partial_result_sets(fields: list[tuple[str, TypeCode]], + results: list[dict]) -> list[result_set.PartialResultSet]: + partial_result_sets = [] + for result in results: + partial_result_set = PartialResultSet() + if len(partial_result_sets) == 0: + # setting the metadata + metadata = ResultSetMetadata(row_type=StructType(fields=[])) + for field in fields: + metadata.row_type.fields.append( + StructType.Field(name=field[0], type_=Type(code=field[1]))) + partial_result_set.metadata = metadata + for value in result["values"]: + partial_result_set.values.append(_make_value_pb(value)) + partial_result_set.last = result.get('last') or False + partial_result_sets.append(partial_result_set) + return partial_result_sets + # Creates an UNAVAILABLE status with the smallest possible retry delay. def unavailable_status() -> _Status: error = status_pb2.Status( @@ -101,6 +128,11 @@ def add_select1_result(): add_single_result("select 1", "c", TypeCode.INT64, [("1",)]) +def add_execute_streaming_sql_results(sql: str, + partial_result_sets: list[result_set.PartialResultSet]): + MockServerTestBase.spanner_service.mock_spanner.add_execute_streaming_sql_results( + sql, partial_result_sets) + def add_single_result( sql: str, column_name: str, type_code: spanner_type.TypeCode, row ): diff --git a/tests/mockserver_tests/test_basics.py b/tests/mockserver_tests/test_basics.py index 9db84b117f..814b180750 100644 --- a/tests/mockserver_tests/test_basics.py +++ b/tests/mockserver_tests/test_basics.py @@ -15,28 +15,32 @@ from google.cloud.spanner_admin_database_v1.types import spanner_database_admin from google.cloud.spanner_dbapi import Connection from google.cloud.spanner_dbapi.parsed_statement import AutocommitDmlMode -from google.cloud.spanner_v1 import ( - BatchCreateSessionsRequest, - ExecuteSqlRequest, - BeginTransactionRequest, - TransactionOptions, - ExecuteBatchDmlRequest, - TypeCode, -) -from google.cloud.spanner_v1.transaction import Transaction +from google.cloud.spanner_v1 import BatchCreateSessionsRequest +from google.cloud.spanner_v1 import BeginTransactionRequest +from google.cloud.spanner_v1 import ExecuteBatchDmlRequest +from google.cloud.spanner_v1 import ExecuteSqlRequest +from google.cloud.spanner_v1 import TransactionOptions +from google.cloud.spanner_v1 import TypeCode from google.cloud.spanner_v1.testing.mock_spanner import SpannerServicer - -from tests.mockserver_tests.mock_server_test_base import ( - MockServerTestBase, - add_select1_result, - add_update_count, - add_error, - unavailable_status, - add_single_result, -) +from google.cloud.spanner_v1.transaction import Transaction +from tests.mockserver_tests.mock_server_test_base import MockServerTestBase +from tests.mockserver_tests.mock_server_test_base import \ + _make_partial_result_sets +from tests.mockserver_tests.mock_server_test_base import add_error +from tests.mockserver_tests.mock_server_test_base import \ + add_execute_streaming_sql_results +from tests.mockserver_tests.mock_server_test_base import add_select1_result +from tests.mockserver_tests.mock_server_test_base import add_single_result +from tests.mockserver_tests.mock_server_test_base import add_update_count +from tests.mockserver_tests.mock_server_test_base import unavailable_status class TestBasics(MockServerTestBase): + + def setUp(self): + super().setUp() + super().setup_class() + def test_select1(self): add_select1_result() with self.database.snapshot() as snapshot: @@ -176,6 +180,27 @@ def test_last_statement_query(self): self.assertEqual(1, len(requests), msg=requests) self.assertTrue(requests[0].last_statement, requests[0]) + def test_execute_streaming_sql_last_field(self): + partial_result_sets = _make_partial_result_sets( + [("ID", TypeCode.INT64), ("NAME", TypeCode.STRING)], + [{"values": ["1", "ABC", "2", "DEF"]}, + {"values": ["3", "GHI"], "last": True}]) + + sql = "select * from my_table" + add_execute_streaming_sql_results(sql, partial_result_sets) + count = 1 + with self.database.snapshot() as snapshot: + results = snapshot.execute_sql(sql) + result_list = [] + for row in results: + result_list.append(row) + self.assertEqual(count, row[0]) + count += 1 + self.assertEqual(3, len(result_list)) + requests = self.spanner_service.requests + self.assertEqual(2, len(requests), msg=requests) + self.assertTrue(isinstance(requests[0], BatchCreateSessionsRequest)) + self.assertTrue(isinstance(requests[1], ExecuteSqlRequest)) def _execute_query(transaction: Transaction, sql: str): rows = transaction.execute_sql(sql, last_statement=True) From 2eb031bf09fd65fd113a16ce60aaf787959f8617 Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Mon, 9 Jun 2025 05:39:45 +0000 Subject: [PATCH 04/11] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20?= =?UTF-8?q?post-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 --- .../cloud/spanner_v1/testing/mock_spanner.py | 14 +++++------ .../mockserver_tests/mock_server_test_base.py | 23 +++++++++++-------- tests/mockserver_tests/test_basics.py | 17 ++++++++------ 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/google/cloud/spanner_v1/testing/mock_spanner.py b/google/cloud/spanner_v1/testing/mock_spanner.py index 62d8d2b7af..b0a9fb795d 100644 --- a/google/cloud/spanner_v1/testing/mock_spanner.py +++ b/google/cloud/spanner_v1/testing/mock_spanner.py @@ -41,10 +41,10 @@ def __init__(self): def add_result(self, sql: str, result: result_set.ResultSet): self.results[sql.lower().strip()] = result - def add_execute_streaming_sql_results(self, sql: str, - partial_result_sets: list[result_set.PartialResultSet]): - self.execute_streaming_sql_results[ - sql.lower().strip()] = partial_result_sets + def add_execute_streaming_sql_results( + self, sql: str, partial_result_sets: list[result_set.PartialResultSet] + ): + self.execute_streaming_sql_results[sql.lower().strip()] = partial_result_sets def get_result(self, sql: str) -> result_set.ResultSet: result = self.results.get(sql.lower().strip()) @@ -61,9 +61,9 @@ def pop_error(self, context): if error: context.abort_with_status(error) - def get_execute_streaming_sql_results(self, sql: str, - started_transaction: transaction.Transaction) -> list[ - result_set.PartialResultSet]: + def get_execute_streaming_sql_results( + self, sql: str, started_transaction: transaction.Transaction + ) -> list[result_set.PartialResultSet]: if self.execute_streaming_sql_results[sql.lower().strip()]: partials = self.execute_streaming_sql_results[sql.lower().strip()] else: diff --git a/tests/mockserver_tests/mock_server_test_base.py b/tests/mockserver_tests/mock_server_test_base.py index acb07f0005..a1ccf9d484 100644 --- a/tests/mockserver_tests/mock_server_test_base.py +++ b/tests/mockserver_tests/mock_server_test_base.py @@ -39,8 +39,7 @@ from google.cloud.spanner_v1 import TypeCode from google.cloud.spanner_v1.database import Database from google.cloud.spanner_v1.instance import Instance -from google.cloud.spanner_v1.testing.mock_database_admin import \ - DatabaseAdminServicer +from google.cloud.spanner_v1.testing.mock_database_admin import DatabaseAdminServicer from google.cloud.spanner_v1.testing.mock_spanner import SpannerServicer from google.cloud.spanner_v1.testing.mock_spanner import start_mock_server @@ -66,8 +65,9 @@ def aborted_status() -> _Status: return status -def _make_partial_result_sets(fields: list[tuple[str, TypeCode]], - results: list[dict]) -> list[result_set.PartialResultSet]: +def _make_partial_result_sets( + fields: list[tuple[str, TypeCode]], results: list[dict] +) -> list[result_set.PartialResultSet]: partial_result_sets = [] for result in results: partial_result_set = PartialResultSet() @@ -76,14 +76,16 @@ def _make_partial_result_sets(fields: list[tuple[str, TypeCode]], metadata = ResultSetMetadata(row_type=StructType(fields=[])) for field in fields: metadata.row_type.fields.append( - StructType.Field(name=field[0], type_=Type(code=field[1]))) + StructType.Field(name=field[0], type_=Type(code=field[1])) + ) partial_result_set.metadata = metadata for value in result["values"]: partial_result_set.values.append(_make_value_pb(value)) - partial_result_set.last = result.get('last') or False + partial_result_set.last = result.get("last") or False partial_result_sets.append(partial_result_set) return partial_result_sets + # Creates an UNAVAILABLE status with the smallest possible retry delay. def unavailable_status() -> _Status: error = status_pb2.Status( @@ -128,10 +130,13 @@ def add_select1_result(): add_single_result("select 1", "c", TypeCode.INT64, [("1",)]) -def add_execute_streaming_sql_results(sql: str, - partial_result_sets: list[result_set.PartialResultSet]): +def add_execute_streaming_sql_results( + sql: str, partial_result_sets: list[result_set.PartialResultSet] +): MockServerTestBase.spanner_service.mock_spanner.add_execute_streaming_sql_results( - sql, partial_result_sets) + sql, partial_result_sets + ) + def add_single_result( sql: str, column_name: str, type_code: spanner_type.TypeCode, row diff --git a/tests/mockserver_tests/test_basics.py b/tests/mockserver_tests/test_basics.py index 814b180750..5707137b0d 100644 --- a/tests/mockserver_tests/test_basics.py +++ b/tests/mockserver_tests/test_basics.py @@ -24,11 +24,11 @@ from google.cloud.spanner_v1.testing.mock_spanner import SpannerServicer from google.cloud.spanner_v1.transaction import Transaction from tests.mockserver_tests.mock_server_test_base import MockServerTestBase -from tests.mockserver_tests.mock_server_test_base import \ - _make_partial_result_sets +from tests.mockserver_tests.mock_server_test_base import _make_partial_result_sets from tests.mockserver_tests.mock_server_test_base import add_error -from tests.mockserver_tests.mock_server_test_base import \ - add_execute_streaming_sql_results +from tests.mockserver_tests.mock_server_test_base import ( + add_execute_streaming_sql_results, +) from tests.mockserver_tests.mock_server_test_base import add_select1_result from tests.mockserver_tests.mock_server_test_base import add_single_result from tests.mockserver_tests.mock_server_test_base import add_update_count @@ -36,7 +36,6 @@ class TestBasics(MockServerTestBase): - def setUp(self): super().setUp() super().setup_class() @@ -183,8 +182,11 @@ def test_last_statement_query(self): def test_execute_streaming_sql_last_field(self): partial_result_sets = _make_partial_result_sets( [("ID", TypeCode.INT64), ("NAME", TypeCode.STRING)], - [{"values": ["1", "ABC", "2", "DEF"]}, - {"values": ["3", "GHI"], "last": True}]) + [ + {"values": ["1", "ABC", "2", "DEF"]}, + {"values": ["3", "GHI"], "last": True}, + ], + ) sql = "select * from my_table" add_execute_streaming_sql_results(sql, partial_result_sets) @@ -202,6 +204,7 @@ def test_execute_streaming_sql_last_field(self): self.assertTrue(isinstance(requests[0], BatchCreateSessionsRequest)) self.assertTrue(isinstance(requests[1], ExecuteSqlRequest)) + def _execute_query(transaction: Transaction, sql: str): rows = transaction.execute_sql(sql, last_statement=True) for _ in rows: From dd4d67342f9d7a2dcf7ec0e37389cbac0ebc5d12 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Mon, 9 Jun 2025 11:10:51 +0530 Subject: [PATCH 05/11] Fix None issue --- google/cloud/spanner_v1/testing/mock_spanner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/cloud/spanner_v1/testing/mock_spanner.py b/google/cloud/spanner_v1/testing/mock_spanner.py index b0a9fb795d..e3c2198d68 100644 --- a/google/cloud/spanner_v1/testing/mock_spanner.py +++ b/google/cloud/spanner_v1/testing/mock_spanner.py @@ -64,7 +64,7 @@ def pop_error(self, context): def get_execute_streaming_sql_results( self, sql: str, started_transaction: transaction.Transaction ) -> list[result_set.PartialResultSet]: - if self.execute_streaming_sql_results[sql.lower().strip()]: + if self.execute_streaming_sql_results.get(sql.lower().strip()): partials = self.execute_streaming_sql_results[sql.lower().strip()] else: partials = self.get_result_as_partial_result_sets(sql) From c48eea62a24c4fab56b1ec1ef5339376a97fd4d6 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Mon, 9 Jun 2025 11:51:49 +0530 Subject: [PATCH 06/11] Optimize imports --- tests/mockserver_tests/test_basics.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/mockserver_tests/test_basics.py b/tests/mockserver_tests/test_basics.py index 5707137b0d..94aa022af2 100644 --- a/tests/mockserver_tests/test_basics.py +++ b/tests/mockserver_tests/test_basics.py @@ -23,16 +23,17 @@ from google.cloud.spanner_v1 import TypeCode from google.cloud.spanner_v1.testing.mock_spanner import SpannerServicer from google.cloud.spanner_v1.transaction import Transaction -from tests.mockserver_tests.mock_server_test_base import MockServerTestBase -from tests.mockserver_tests.mock_server_test_base import _make_partial_result_sets -from tests.mockserver_tests.mock_server_test_base import add_error + from tests.mockserver_tests.mock_server_test_base import ( + MockServerTestBase, + _make_partial_result_sets, + add_error, + add_select1_result, + add_single_result, + add_update_count, + unavailable_status, add_execute_streaming_sql_results, ) -from tests.mockserver_tests.mock_server_test_base import add_select1_result -from tests.mockserver_tests.mock_server_test_base import add_single_result -from tests.mockserver_tests.mock_server_test_base import add_update_count -from tests.mockserver_tests.mock_server_test_base import unavailable_status class TestBasics(MockServerTestBase): From d11bc9a852d4bb5a467c7846b19541ae736286a7 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Mon, 9 Jun 2025 12:11:48 +0530 Subject: [PATCH 07/11] optimize imports --- .../mockserver_tests/mock_server_test_base.py | 23 ++++++++++++------- tests/mockserver_tests/test_basics.py | 16 +++++++------ 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/tests/mockserver_tests/mock_server_test_base.py b/tests/mockserver_tests/mock_server_test_base.py index a1ccf9d484..f2283b9bcc 100644 --- a/tests/mockserver_tests/mock_server_test_base.py +++ b/tests/mockserver_tests/mock_server_test_base.py @@ -24,8 +24,11 @@ from google.cloud.spanner_v1 import PartialResultSet from google.protobuf.duration_pb2 import Duration -from google.rpc import code_pb2 -from google.rpc import status_pb2 +from google.rpc import ( + code_pb2, + status_pb2 +) + from google.rpc.error_details_pb2 import RetryInfo from grpc_status._common import code_to_grpc_status_code from grpc_status.rpc_status import _Status @@ -33,15 +36,19 @@ import google.cloud.spanner_v1.types.result_set as result_set import google.cloud.spanner_v1.types.type as spanner_type from google.cloud.spanner_dbapi.parsed_statement import AutocommitDmlMode -from google.cloud.spanner_v1 import Client -from google.cloud.spanner_v1 import FixedSizePool -from google.cloud.spanner_v1 import ResultSetMetadata -from google.cloud.spanner_v1 import TypeCode +from google.cloud.spanner_v1 import ( + Client, + FixedSizePool, + ResultSetMetadata, + TypeCode +) from google.cloud.spanner_v1.database import Database from google.cloud.spanner_v1.instance import Instance from google.cloud.spanner_v1.testing.mock_database_admin import DatabaseAdminServicer -from google.cloud.spanner_v1.testing.mock_spanner import SpannerServicer -from google.cloud.spanner_v1.testing.mock_spanner import start_mock_server +from google.cloud.spanner_v1.testing.mock_spanner import ( + SpannerServicer, + start_mock_server +) # Creates an aborted status with the smallest possible retry delay. diff --git a/tests/mockserver_tests/test_basics.py b/tests/mockserver_tests/test_basics.py index 94aa022af2..3c8804de65 100644 --- a/tests/mockserver_tests/test_basics.py +++ b/tests/mockserver_tests/test_basics.py @@ -15,22 +15,24 @@ from google.cloud.spanner_admin_database_v1.types import spanner_database_admin from google.cloud.spanner_dbapi import Connection from google.cloud.spanner_dbapi.parsed_statement import AutocommitDmlMode -from google.cloud.spanner_v1 import BatchCreateSessionsRequest -from google.cloud.spanner_v1 import BeginTransactionRequest -from google.cloud.spanner_v1 import ExecuteBatchDmlRequest -from google.cloud.spanner_v1 import ExecuteSqlRequest -from google.cloud.spanner_v1 import TransactionOptions -from google.cloud.spanner_v1 import TypeCode +from google.cloud.spanner_v1 import ( + BatchCreateSessionsRequest, + BeginTransactionRequest, + ExecuteBatchDmlRequest, + ExecuteSqlRequest, + TransactionOptions, + TypeCode +) from google.cloud.spanner_v1.testing.mock_spanner import SpannerServicer from google.cloud.spanner_v1.transaction import Transaction from tests.mockserver_tests.mock_server_test_base import ( MockServerTestBase, _make_partial_result_sets, - add_error, add_select1_result, add_single_result, add_update_count, + add_error, unavailable_status, add_execute_streaming_sql_results, ) From 1a66df08dc0a9b1cfe83d828cfd088a4308a144c Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Mon, 9 Jun 2025 06:44:13 +0000 Subject: [PATCH 08/11] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20?= =?UTF-8?q?post-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 --- tests/mockserver_tests/mock_server_test_base.py | 14 +++----------- tests/mockserver_tests/test_basics.py | 2 +- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/tests/mockserver_tests/mock_server_test_base.py b/tests/mockserver_tests/mock_server_test_base.py index f2283b9bcc..1b56ca6aa0 100644 --- a/tests/mockserver_tests/mock_server_test_base.py +++ b/tests/mockserver_tests/mock_server_test_base.py @@ -24,10 +24,7 @@ from google.cloud.spanner_v1 import PartialResultSet from google.protobuf.duration_pb2 import Duration -from google.rpc import ( - code_pb2, - status_pb2 -) +from google.rpc import code_pb2, status_pb2 from google.rpc.error_details_pb2 import RetryInfo from grpc_status._common import code_to_grpc_status_code @@ -36,18 +33,13 @@ import google.cloud.spanner_v1.types.result_set as result_set import google.cloud.spanner_v1.types.type as spanner_type from google.cloud.spanner_dbapi.parsed_statement import AutocommitDmlMode -from google.cloud.spanner_v1 import ( - Client, - FixedSizePool, - ResultSetMetadata, - TypeCode -) +from google.cloud.spanner_v1 import Client, FixedSizePool, ResultSetMetadata, TypeCode from google.cloud.spanner_v1.database import Database from google.cloud.spanner_v1.instance import Instance from google.cloud.spanner_v1.testing.mock_database_admin import DatabaseAdminServicer from google.cloud.spanner_v1.testing.mock_spanner import ( SpannerServicer, - start_mock_server + start_mock_server, ) diff --git a/tests/mockserver_tests/test_basics.py b/tests/mockserver_tests/test_basics.py index 3c8804de65..3ec1f04439 100644 --- a/tests/mockserver_tests/test_basics.py +++ b/tests/mockserver_tests/test_basics.py @@ -21,7 +21,7 @@ ExecuteBatchDmlRequest, ExecuteSqlRequest, TransactionOptions, - TypeCode + TypeCode, ) from google.cloud.spanner_v1.testing.mock_spanner import SpannerServicer from google.cloud.spanner_v1.transaction import Transaction From 2bc6f6e5ffc098a6d5f03fdd313096e5c9cfabd8 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Mon, 9 Jun 2025 13:12:41 +0530 Subject: [PATCH 09/11] Remove setup --- .python-version | 1 + tests/mockserver_tests/test_basics.py | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) create mode 100644 .python-version diff --git a/.python-version b/.python-version new file mode 100644 index 0000000000..e4fba21835 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/tests/mockserver_tests/test_basics.py b/tests/mockserver_tests/test_basics.py index 3ec1f04439..5e5c539d93 100644 --- a/tests/mockserver_tests/test_basics.py +++ b/tests/mockserver_tests/test_basics.py @@ -39,9 +39,6 @@ class TestBasics(MockServerTestBase): - def setUp(self): - super().setUp() - super().setup_class() def test_select1(self): add_select1_result() From 41555df8d715482ff1448ae74afc5b141b114794 Mon Sep 17 00:00:00 2001 From: Owl Bot Date: Mon, 9 Jun 2025 07:44:52 +0000 Subject: [PATCH 10/11] =?UTF-8?q?=F0=9F=A6=89=20Updates=20from=20OwlBot=20?= =?UTF-8?q?post-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 --- tests/mockserver_tests/test_basics.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/mockserver_tests/test_basics.py b/tests/mockserver_tests/test_basics.py index 5e5c539d93..0dab935a16 100644 --- a/tests/mockserver_tests/test_basics.py +++ b/tests/mockserver_tests/test_basics.py @@ -39,7 +39,6 @@ class TestBasics(MockServerTestBase): - def test_select1(self): add_select1_result() with self.database.snapshot() as snapshot: From b118ce065fda474d6e7158bae5b3c25f46e9c878 Mon Sep 17 00:00:00 2001 From: Sakthivel Subramanian Date: Mon, 9 Jun 2025 13:22:37 +0530 Subject: [PATCH 11/11] Remove .python-version --- .python-version | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .python-version diff --git a/.python-version b/.python-version deleted file mode 100644 index e4fba21835..0000000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.12