From 9e867166f36a12a1255f223eebc85372f73ae818 Mon Sep 17 00:00:00 2001 From: anweshadas Date: Tue, 23 Jun 2026 20:10:03 +0000 Subject: [PATCH 1/7] fix: ensure Value object type is set to string in _format_execute_query_view_params --- .../bigtable/data/execute_query/_parameters_formatting.py | 4 +++- .../tests/unit/data/_async/test_client.py | 1 + .../tests/unit/data/_sync_autogen/test_client.py | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py b/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py index 816e9fbe1180..10aea2e48c94 100644 --- a/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py +++ b/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py @@ -39,7 +39,9 @@ def _format_execute_query_view_params( raise TypeError( f"View parameter {key} must be a string, got {type(value).__name__}" ) - result_values[key] = Value(string_value=value) + result_values[key] = Value( + string_value=value, type_=SqlType.String()._to_type_pb_dict() + ) return result_values diff --git a/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py b/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py index 8d2aa9872d01..5baea03fb5f3 100644 --- a/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py +++ b/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py @@ -3558,6 +3558,7 @@ async def test_execute_query_with_view_parameters( request = execute_query_mock.call_args[0][0] assert "user_id" in request.view_parameters assert request.view_parameters["user_id"].string_value == "alice" + assert request.view_parameters["user_id"].type_ == {"string_type": {}} @CrossSync.pytest async def test_execute_query_with_view_parameters_invalid_type( diff --git a/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py b/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py index ca5158381774..8a78343392c4 100644 --- a/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py +++ b/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py @@ -3019,6 +3019,7 @@ def test_execute_query_with_view_parameters( request = execute_query_mock.call_args[0][0] assert "user_id" in request.view_parameters assert request.view_parameters["user_id"].string_value == "alice" + assert request.view_parameters["user_id"].type_ == {"string_type": {}} def test_execute_query_with_view_parameters_invalid_type( self, client, execute_query_mock, prepare_mock From 5f35bf2108280750c5055d1a79249d47d16cf457 Mon Sep 17 00:00:00 2001 From: anweshadas Date: Wed, 24 Jun 2026 00:28:58 +0000 Subject: [PATCH 2/7] refactor: leverage _convert_value_to_pb_value_dict in _format_execute_query_view_params --- .../bigtable/data/execute_query/_parameters_formatting.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py b/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py index 10aea2e48c94..878d4650a71b 100644 --- a/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py +++ b/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py @@ -39,9 +39,7 @@ def _format_execute_query_view_params( raise TypeError( f"View parameter {key} must be a string, got {type(value).__name__}" ) - result_values[key] = Value( - string_value=value, type_=SqlType.String()._to_type_pb_dict() - ) + result_values[key] = _convert_value_to_pb_value_dict(value, SqlType.String()) return result_values From 265fddf78a359b962292b6607e1bd96edb22e11c Mon Sep 17 00:00:00 2001 From: anweshadas Date: Wed, 24 Jun 2026 00:31:37 +0000 Subject: [PATCH 3/7] test: address PR review comments by using to_dict for proto-plus message assertions --- .../tests/unit/data/_async/test_client.py | 7 ++++++- .../tests/unit/data/_sync_autogen/test_client.py | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py b/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py index 5baea03fb5f3..cab28339457d 100644 --- a/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py +++ b/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py @@ -3558,7 +3558,12 @@ async def test_execute_query_with_view_parameters( request = execute_query_mock.call_args[0][0] assert "user_id" in request.view_parameters assert request.view_parameters["user_id"].string_value == "alice" - assert request.view_parameters["user_id"].type_ == {"string_type": {}} + assert ( + type(request.view_parameters["user_id"].type_).to_dict( + request.view_parameters["user_id"].type_ + ) + == {"string_type": {}} + ) @CrossSync.pytest async def test_execute_query_with_view_parameters_invalid_type( diff --git a/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py b/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py index 8a78343392c4..ae32dcdf86a9 100644 --- a/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py +++ b/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py @@ -3019,7 +3019,12 @@ def test_execute_query_with_view_parameters( request = execute_query_mock.call_args[0][0] assert "user_id" in request.view_parameters assert request.view_parameters["user_id"].string_value == "alice" - assert request.view_parameters["user_id"].type_ == {"string_type": {}} + assert ( + type(request.view_parameters["user_id"].type_).to_dict( + request.view_parameters["user_id"].type_ + ) + == {"string_type": {}} + ) def test_execute_query_with_view_parameters_invalid_type( self, client, execute_query_mock, prepare_mock From a986d81174eb877391614eb2d1c3a733225f2d70 Mon Sep 17 00:00:00 2001 From: anweshadas Date: Wed, 24 Jun 2026 00:51:43 +0000 Subject: [PATCH 4/7] style: format _convert_value_to_pb_value_dict call to conform to 88-char line length limit --- .../bigtable/data/execute_query/_parameters_formatting.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py b/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py index 878d4650a71b..7b263eaaa2bd 100644 --- a/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py +++ b/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py @@ -39,7 +39,9 @@ def _format_execute_query_view_params( raise TypeError( f"View parameter {key} must be a string, got {type(value).__name__}" ) - result_values[key] = _convert_value_to_pb_value_dict(value, SqlType.String()) + result_values[key] = _convert_value_to_pb_value_dict( + value, SqlType.String() + ) return result_values From cd6b2012d20f9e152260200d89472cc8c0f6631d Mon Sep 17 00:00:00 2001 From: anweshadas Date: Wed, 24 Jun 2026 01:49:40 +0000 Subject: [PATCH 5/7] style: format test assertions and test files for Ruff formatting compliance --- .../execute_query/_parameters_formatting.py | 4 +-- .../tests/unit/data/_async/test_client.py | 34 +++++++------------ .../unit/data/_sync_autogen/test_client.py | 34 +++++++------------ 3 files changed, 27 insertions(+), 45 deletions(-) diff --git a/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py b/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py index 7b263eaaa2bd..878d4650a71b 100644 --- a/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py +++ b/packages/google-cloud-bigtable/google/cloud/bigtable/data/execute_query/_parameters_formatting.py @@ -39,9 +39,7 @@ def _format_execute_query_view_params( raise TypeError( f"View parameter {key} must be a string, got {type(value).__name__}" ) - result_values[key] = _convert_value_to_pb_value_dict( - value, SqlType.String() - ) + result_values[key] = _convert_value_to_pb_value_dict(value, SqlType.String()) return result_values diff --git a/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py b/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py index cab28339457d..9dbc65ce8bb4 100644 --- a/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py +++ b/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py @@ -285,10 +285,8 @@ async def test__ping_and_warm_instances(self): test ping and warm with mocked asyncio.gather """ client_mock = mock.Mock() - client_mock._execute_ping_and_warms = ( - lambda *args: self._get_target_class()._execute_ping_and_warms( - client_mock, *args - ) + client_mock._execute_ping_and_warms = lambda *args: ( + self._get_target_class()._execute_ping_and_warms(client_mock, *args) ) with mock.patch.object( CrossSync, "gather_partials", CrossSync.Mock() @@ -342,10 +340,8 @@ async def test__ping_and_warm_single_instance(self): should be able to call ping and warm with single instance """ client_mock = mock.Mock() - client_mock._execute_ping_and_warms = ( - lambda *args: self._get_target_class()._execute_ping_and_warms( - client_mock, *args - ) + client_mock._execute_ping_and_warms = lambda *args: ( + self._get_target_class()._execute_ping_and_warms(client_mock, *args) ) with mock.patch.object( CrossSync, "gather_partials", CrossSync.Mock() @@ -1645,11 +1641,11 @@ def _make_client(self, *args, **kwargs): @CrossSync.convert def _make_table(self, *args, **kwargs): client_mock = mock.Mock() - client_mock._register_instance.side_effect = ( - lambda *args, **kwargs: CrossSync.yield_to_event_loop() + client_mock._register_instance.side_effect = lambda *args, **kwargs: ( + CrossSync.yield_to_event_loop() ) - client_mock._remove_instance_registration.side_effect = ( - lambda *args, **kwargs: CrossSync.yield_to_event_loop() + client_mock._remove_instance_registration.side_effect = lambda *args, **kwargs: ( + CrossSync.yield_to_event_loop() ) kwargs["instance_id"] = kwargs.get( "instance_id", args[0] if args else "instance" @@ -2206,9 +2202,8 @@ async def test_read_rows_sharded_multiple_queries(self): with mock.patch.object( table.client._gapic_client, "read_rows" ) as read_rows: - read_rows.side_effect = ( - lambda *args, - **kwargs: CrossSync.TestReadRows._make_gapic_stream( + read_rows.side_effect = lambda *args, **kwargs: ( + CrossSync.TestReadRows._make_gapic_stream( [ CrossSync.TestReadRows._make_chunk(row_key=k) for k in args[0].rows.row_keys @@ -3558,12 +3553,9 @@ async def test_execute_query_with_view_parameters( request = execute_query_mock.call_args[0][0] assert "user_id" in request.view_parameters assert request.view_parameters["user_id"].string_value == "alice" - assert ( - type(request.view_parameters["user_id"].type_).to_dict( - request.view_parameters["user_id"].type_ - ) - == {"string_type": {}} - ) + assert type(request.view_parameters["user_id"].type_).to_dict( + request.view_parameters["user_id"].type_ + ) == {"string_type": {}} @CrossSync.pytest async def test_execute_query_with_view_parameters_invalid_type( diff --git a/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py b/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py index ae32dcdf86a9..6c3d02cfb056 100644 --- a/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py +++ b/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py @@ -223,10 +223,8 @@ def test__start_background_channel_refresh(self): def test__ping_and_warm_instances(self): """test ping and warm with mocked asyncio.gather""" client_mock = mock.Mock() - client_mock._execute_ping_and_warms = ( - lambda *args: self._get_target_class()._execute_ping_and_warms( - client_mock, *args - ) + client_mock._execute_ping_and_warms = lambda *args: ( + self._get_target_class()._execute_ping_and_warms(client_mock, *args) ) with mock.patch.object( CrossSync._Sync_Impl, "gather_partials", CrossSync._Sync_Impl.Mock() @@ -269,10 +267,8 @@ def test__ping_and_warm_instances(self): def test__ping_and_warm_single_instance(self): """should be able to call ping and warm with single instance""" client_mock = mock.Mock() - client_mock._execute_ping_and_warms = ( - lambda *args: self._get_target_class()._execute_ping_and_warms( - client_mock, *args - ) + client_mock._execute_ping_and_warms = lambda *args: ( + self._get_target_class()._execute_ping_and_warms(client_mock, *args) ) with mock.patch.object( CrossSync._Sync_Impl, "gather_partials", CrossSync._Sync_Impl.Mock() @@ -1344,11 +1340,11 @@ def _make_client(self, *args, **kwargs): def _make_table(self, *args, **kwargs): client_mock = mock.Mock() - client_mock._register_instance.side_effect = ( - lambda *args, **kwargs: CrossSync._Sync_Impl.yield_to_event_loop() + client_mock._register_instance.side_effect = lambda *args, **kwargs: ( + CrossSync._Sync_Impl.yield_to_event_loop() ) - client_mock._remove_instance_registration.side_effect = ( - lambda *args, **kwargs: CrossSync._Sync_Impl.yield_to_event_loop() + client_mock._remove_instance_registration.side_effect = lambda *args, **kwargs: ( + CrossSync._Sync_Impl.yield_to_event_loop() ) kwargs["instance_id"] = kwargs.get( "instance_id", args[0] if args else "instance" @@ -1824,9 +1820,8 @@ def test_read_rows_sharded_multiple_queries(self): with mock.patch.object( table.client._gapic_client, "read_rows" ) as read_rows: - read_rows.side_effect = ( - lambda *args, - **kwargs: CrossSync._Sync_Impl.TestReadRows._make_gapic_stream( + read_rows.side_effect = lambda *args, **kwargs: ( + CrossSync._Sync_Impl.TestReadRows._make_gapic_stream( [ CrossSync._Sync_Impl.TestReadRows._make_chunk(row_key=k) for k in args[0].rows.row_keys @@ -3019,12 +3014,9 @@ def test_execute_query_with_view_parameters( request = execute_query_mock.call_args[0][0] assert "user_id" in request.view_parameters assert request.view_parameters["user_id"].string_value == "alice" - assert ( - type(request.view_parameters["user_id"].type_).to_dict( - request.view_parameters["user_id"].type_ - ) - == {"string_type": {}} - ) + assert type(request.view_parameters["user_id"].type_).to_dict( + request.view_parameters["user_id"].type_ + ) == {"string_type": {}} def test_execute_query_with_view_parameters_invalid_type( self, client, execute_query_mock, prepare_mock From 47a1aa9570ae15dad9ecf910e033a0bf101be8ec Mon Sep 17 00:00:00 2001 From: anweshadas Date: Wed, 24 Jun 2026 02:11:59 +0000 Subject: [PATCH 6/7] style: use local variable in type assertions to guarantee stable formatting across all Ruff versions --- .../tests/unit/data/_async/test_client.py | 5 ++--- .../tests/unit/data/_sync_autogen/test_client.py | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py b/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py index 9dbc65ce8bb4..a1ccafaca083 100644 --- a/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py +++ b/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py @@ -3553,9 +3553,8 @@ async def test_execute_query_with_view_parameters( request = execute_query_mock.call_args[0][0] assert "user_id" in request.view_parameters assert request.view_parameters["user_id"].string_value == "alice" - assert type(request.view_parameters["user_id"].type_).to_dict( - request.view_parameters["user_id"].type_ - ) == {"string_type": {}} + val_type = request.view_parameters["user_id"].type_ + assert type(val_type).to_dict(val_type) == {"string_type": {}} @CrossSync.pytest async def test_execute_query_with_view_parameters_invalid_type( diff --git a/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py b/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py index 6c3d02cfb056..6bc638dde546 100644 --- a/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py +++ b/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py @@ -3014,9 +3014,8 @@ def test_execute_query_with_view_parameters( request = execute_query_mock.call_args[0][0] assert "user_id" in request.view_parameters assert request.view_parameters["user_id"].string_value == "alice" - assert type(request.view_parameters["user_id"].type_).to_dict( - request.view_parameters["user_id"].type_ - ) == {"string_type": {}} + val_type = request.view_parameters["user_id"].type_ + assert type(val_type).to_dict(val_type) == {"string_type": {}} def test_execute_query_with_view_parameters_invalid_type( self, client, execute_query_mock, prepare_mock From ad6c589704fadb9a9f2a0cbd1e9180c72741554b Mon Sep 17 00:00:00 2001 From: anweshadas Date: Wed, 24 Jun 2026 02:20:34 +0000 Subject: [PATCH 7/7] style: revert broad formatting changes in test_client.py to keep Ruff 0.14 compatibility --- .../tests/unit/data/_async/test_client.py | 25 +++++++++++-------- .../unit/data/_sync_autogen/test_client.py | 25 +++++++++++-------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py b/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py index a1ccafaca083..626eb1bf9085 100644 --- a/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py +++ b/packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py @@ -285,8 +285,10 @@ async def test__ping_and_warm_instances(self): test ping and warm with mocked asyncio.gather """ client_mock = mock.Mock() - client_mock._execute_ping_and_warms = lambda *args: ( - self._get_target_class()._execute_ping_and_warms(client_mock, *args) + client_mock._execute_ping_and_warms = ( + lambda *args: self._get_target_class()._execute_ping_and_warms( + client_mock, *args + ) ) with mock.patch.object( CrossSync, "gather_partials", CrossSync.Mock() @@ -340,8 +342,10 @@ async def test__ping_and_warm_single_instance(self): should be able to call ping and warm with single instance """ client_mock = mock.Mock() - client_mock._execute_ping_and_warms = lambda *args: ( - self._get_target_class()._execute_ping_and_warms(client_mock, *args) + client_mock._execute_ping_and_warms = ( + lambda *args: self._get_target_class()._execute_ping_and_warms( + client_mock, *args + ) ) with mock.patch.object( CrossSync, "gather_partials", CrossSync.Mock() @@ -1641,11 +1645,11 @@ def _make_client(self, *args, **kwargs): @CrossSync.convert def _make_table(self, *args, **kwargs): client_mock = mock.Mock() - client_mock._register_instance.side_effect = lambda *args, **kwargs: ( - CrossSync.yield_to_event_loop() + client_mock._register_instance.side_effect = ( + lambda *args, **kwargs: CrossSync.yield_to_event_loop() ) - client_mock._remove_instance_registration.side_effect = lambda *args, **kwargs: ( - CrossSync.yield_to_event_loop() + client_mock._remove_instance_registration.side_effect = ( + lambda *args, **kwargs: CrossSync.yield_to_event_loop() ) kwargs["instance_id"] = kwargs.get( "instance_id", args[0] if args else "instance" @@ -2202,8 +2206,9 @@ async def test_read_rows_sharded_multiple_queries(self): with mock.patch.object( table.client._gapic_client, "read_rows" ) as read_rows: - read_rows.side_effect = lambda *args, **kwargs: ( - CrossSync.TestReadRows._make_gapic_stream( + read_rows.side_effect = ( + lambda *args, + **kwargs: CrossSync.TestReadRows._make_gapic_stream( [ CrossSync.TestReadRows._make_chunk(row_key=k) for k in args[0].rows.row_keys diff --git a/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py b/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py index 6bc638dde546..f21900e7aaa3 100644 --- a/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py +++ b/packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py @@ -223,8 +223,10 @@ def test__start_background_channel_refresh(self): def test__ping_and_warm_instances(self): """test ping and warm with mocked asyncio.gather""" client_mock = mock.Mock() - client_mock._execute_ping_and_warms = lambda *args: ( - self._get_target_class()._execute_ping_and_warms(client_mock, *args) + client_mock._execute_ping_and_warms = ( + lambda *args: self._get_target_class()._execute_ping_and_warms( + client_mock, *args + ) ) with mock.patch.object( CrossSync._Sync_Impl, "gather_partials", CrossSync._Sync_Impl.Mock() @@ -267,8 +269,10 @@ def test__ping_and_warm_instances(self): def test__ping_and_warm_single_instance(self): """should be able to call ping and warm with single instance""" client_mock = mock.Mock() - client_mock._execute_ping_and_warms = lambda *args: ( - self._get_target_class()._execute_ping_and_warms(client_mock, *args) + client_mock._execute_ping_and_warms = ( + lambda *args: self._get_target_class()._execute_ping_and_warms( + client_mock, *args + ) ) with mock.patch.object( CrossSync._Sync_Impl, "gather_partials", CrossSync._Sync_Impl.Mock() @@ -1340,11 +1344,11 @@ def _make_client(self, *args, **kwargs): def _make_table(self, *args, **kwargs): client_mock = mock.Mock() - client_mock._register_instance.side_effect = lambda *args, **kwargs: ( - CrossSync._Sync_Impl.yield_to_event_loop() + client_mock._register_instance.side_effect = ( + lambda *args, **kwargs: CrossSync._Sync_Impl.yield_to_event_loop() ) - client_mock._remove_instance_registration.side_effect = lambda *args, **kwargs: ( - CrossSync._Sync_Impl.yield_to_event_loop() + client_mock._remove_instance_registration.side_effect = ( + lambda *args, **kwargs: CrossSync._Sync_Impl.yield_to_event_loop() ) kwargs["instance_id"] = kwargs.get( "instance_id", args[0] if args else "instance" @@ -1820,8 +1824,9 @@ def test_read_rows_sharded_multiple_queries(self): with mock.patch.object( table.client._gapic_client, "read_rows" ) as read_rows: - read_rows.side_effect = lambda *args, **kwargs: ( - CrossSync._Sync_Impl.TestReadRows._make_gapic_stream( + read_rows.side_effect = ( + lambda *args, + **kwargs: CrossSync._Sync_Impl.TestReadRows._make_gapic_stream( [ CrossSync._Sync_Impl.TestReadRows._make_chunk(row_key=k) for k in args[0].rows.row_keys