fix tests · googleapis/python-spanner@8899249 · GitHub | Latest TMZ Celebrity News & Gossip | Watch TMZ Live
Skip to content

Commit 8899249

Browse files
committed
fix tests
1 parent 08ae94c commit 8899249

20 files changed

+185
-75
lines changed

google/cloud/spanner_v1/_helpers.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,10 @@
2929
from google.rpc.error_details_pb2 import RetryInfo
3030

3131
from google.cloud._helpers import _date_from_iso8601_date
32-
from google.cloud.spanner_v1 import (
33-
ExecuteSqlRequest,
34-
Interval,
35-
JsonObject,
36-
TransactionOptions,
37-
TypeCode,
38-
)
32+
from google.cloud.spanner_v1.types.spanner import ExecuteSqlRequest
33+
from google.cloud.spanner_v1.data_types import Interval, JsonObject
34+
from google.cloud.spanner_v1.types.transaction import TransactionOptions
35+
from google.cloud.spanner_v1.types.type import TypeCode
3936
from google.cloud.spanner_v1.request_id_header import with_request_id
4037

4138
try:

google/cloud/spanner_v1/_opentelemetry_tracing.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
from datetime import datetime
1919
import os
2020

21-
from google.cloud.spanner_v1 import SpannerClient, gapic_version
21+
from google.cloud.spanner_v1.services.spanner import SpannerClient
22+
from google.cloud.spanner_v1 import gapic_version
2223
from google.cloud.spanner_v1._helpers import _metadata_with_span_context
2324

2425
try:

google/cloud/spanner_v1/batch.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818

1919
from google.api_core.exceptions import InternalServerError
2020

21-
from google.cloud.spanner_v1 import (
21+
from google.cloud.spanner_v1.types.spanner import (
2222
BatchWriteRequest,
2323
CommitRequest,
24-
Mutation,
25-
RequestOptions,
26-
TransactionOptions,
2724
)
25+
from google.cloud.spanner_v1.types.mutation import Mutation
26+
from google.cloud.spanner_v1.types import RequestOptions
27+
from google.cloud.spanner_v1.types.transaction import TransactionOptions
2828
from google.cloud.spanner_v1._helpers import (
2929
AtomicCounter,
3030
_check_rst_stream_error,

google/cloud/spanner_v1/client.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,9 @@
4545
from google.cloud.spanner_admin_instance_v1.services.instance_admin.transports.grpc import (
4646
InstanceAdminGrpcTransport,
4747
)
48-
from google.cloud.spanner_v1 import (
49-
DefaultTransactionOptions,
50-
ExecuteSqlRequest,
51-
__version__,
52-
)
48+
from google.cloud.spanner_v1.transaction import DefaultTransactionOptions
49+
from google.cloud.spanner_v1.types import ExecuteSqlRequest
50+
from google.cloud.spanner_v1 import __version__
5351
from google.cloud.spanner_v1._helpers import _merge_query_options, _metadata_with_prefix
5452
from google.cloud.spanner_v1.instance import Instance
5553
from google.cloud.spanner_v1.metrics.constants import (

google/cloud/spanner_v1/database.py

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,12 @@
3939
from google.cloud.spanner_admin_database_v1 import CreateDatabaseRequest
4040
from google.cloud.spanner_admin_database_v1 import Database as DatabasePB
4141
from google.cloud.spanner_admin_database_v1.types import DatabaseDialect
42-
from google.cloud.spanner_v1 import (
43-
DefaultTransactionOptions,
44-
ExecuteSqlRequest,
45-
RequestOptions,
46-
SpannerClient,
47-
TransactionOptions,
48-
TransactionSelector,
49-
Type,
50-
TypeCode,
51-
)
42+
from google.cloud.spanner_v1.transaction import DefaultTransactionOptions
43+
from google.cloud.spanner_v1.types.spanner import ExecuteSqlRequest
44+
from google.cloud.spanner_v1.types import RequestOptions
45+
from google.cloud.spanner_v1.services.spanner import SpannerClient
46+
from google.cloud.spanner_v1.types.transaction import TransactionOptions, TransactionSelector
47+
from google.cloud.spanner_v1.types.type import Type, TypeCode
5248
from google.cloud.spanner_v1._helpers import (
5349
_merge_query_options,
5450
_metadata_with_leader_aware_routing,
@@ -467,6 +463,38 @@ def session_options(self) -> SessionOptions:
467463
"""
468464
return self._instance._client.session_options
469465

466+
@property
467+
def _pool(self):
468+
"""Backward compatibility property for accessing the session pool.
469+
470+
:rtype: :class:`~google.cloud.spanner_v1.pool.AbstractSessionPool`
471+
:returns: the session pool from the session manager
472+
"""
473+
return self._session_manager._pool
474+
475+
def session(self, labels=None, database_role=None):
476+
"""Factory to create a session.
477+
478+
:type labels: dict (str -> str)
479+
:param labels: (Optional) user-assigned labels for the session.
480+
481+
:type database_role: str
482+
:param database_role: (Optional) user-assigned database_role for the session.
483+
484+
:rtype: :class:`~google.cloud.spanner_v1.session.Session`
485+
:returns: a new session bound to this database.
486+
"""
487+
from google.cloud.spanner_v1.session import Session
488+
489+
session_labels = labels or {}
490+
session_database_role = database_role or self.database_role
491+
492+
return Session(
493+
database=self,
494+
labels=session_labels,
495+
database_role=session_database_role
496+
)
497+
470498
def metadata_with_request_id(
471499
self, nth_request, nth_attempt, prior_metadata=[], span=None
472500
):

google/cloud/spanner_v1/database_sessions_manager.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class DatabaseSessionsManager(object):
4646

4747
def __init__(self, database, pool):
4848
self._database = database
49-
self._logger = database.logger
49+
self._logger = None # Lazy initialization to avoid triggering database.logger during __init__
5050

5151
# The session pool manages non-multiplexed sessions, and
5252
# will only be used if multiplexed sessions are not enabled.
@@ -64,6 +64,13 @@ def __init__(self, database, pool):
6464
self._multiplexed_session_lock = threading.Lock()
6565
self._is_multiplexed_sessions_disabled_event = threading.Event()
6666

67+
@property
68+
def logger(self):
69+
"""Get the logger, initializing it lazily to avoid triggering database.logger during __init__."""
70+
if self._logger is None:
71+
self._logger = self._database.logger
72+
return self._logger
73+
6774
def get_session(self, transaction_type: TransactionType) -> Session:
6875
"""Returns a session for the given transaction type from the database session manager.
6976
:rtype: :class:`~google.cloud.spanner_v1.session.Session`
@@ -157,7 +164,7 @@ def _build_multiplexed_session(self) -> Session:
157164

158165
session.create()
159166

160-
self._logger.info("Created multiplexed session.")
167+
self.logger.info("Created multiplexed session.")
161168

162169
return session
163170

@@ -169,12 +176,12 @@ def _disable_multiplexed_sessions(self) -> None:
169176
self._multiplexed_session.delete()
170177
except Exception as exc: # noqa: BLE001
171178
# Keep the client alive; best-effort cleanup.
172-
self._logger.warning(
179+
self.logger.warning(
173180
"Failed to delete multiplexed session during disable: %s", exc
174181
)
175182
self._multiplexed_session = None
176183
self._is_multiplexed_sessions_disabled_event.set()
177-
self._database.session_options.disable_multiplexed(self._logger)
184+
self._database.session_options.disable_multiplexed(self.logger)
178185

179186
def _build_maintenance_thread(self) -> threading.Thread:
180187
"""Builds and returns a multiplexed session maintenance thread for
@@ -241,7 +248,7 @@ def _maintain_multiplexed_session(session_manager_ref) -> None:
241248
try:
242249
session_manager._multiplexed_session.delete()
243250
except Exception as exc: # noqa: BLE001
244-
session_manager._logger.warning(
251+
session_manager.logger.warning(
245252
"Failed to delete multiplexed session during refresh: %s", exc
246253
)
247254

google/cloud/spanner_v1/keyset.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
"""Wrap representation of Spanner keys / ranges."""
1616

17-
from google.cloud.spanner_v1 import KeyRangePB, KeySetPB
17+
from google.cloud.spanner_v1.types.keys import KeyRange as KeyRangePB, KeySet as KeySetPB
1818
from google.cloud.spanner_v1._helpers import _make_list_value_pb, _make_list_value_pbs
1919

2020

google/cloud/spanner_v1/metrics/spanner_metrics_tracer_factory.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@
3535
# Override Resource detector logging to not warn when GCP resources are not detected
3636
import logging
3737

38-
import mmh3
39-
4038
logging.getLogger("opentelemetry.resourcedetector.gcp_resource_detector").setLevel(
4139
logging.ERROR
4240
)
@@ -145,17 +143,27 @@ def _generate_client_hash(client_uid: str) -> str:
145143
"""
146144
if not client_uid:
147145
return "000000"
148-
hashed_client = mmh3.hash64(client_uid)
146+
147+
if not HAS_OPENTELEMETRY_INSTALLED:
148+
# Fallback to a simple hash if mmh3 is not available
149+
return f"{hash(client_uid) % 0xFFFFFF:06x}"
150+
151+
try:
152+
import mmh3
153+
hashed_client = mmh3.hash64(client_uid)
149154

150-
# Join the hashes back together since mmh3 splits into high and low 32bits
151-
full_hash = (hashed_client[0] << 32) | (hashed_client[1] & 0xFFFFFFFF)
152-
unsigned_hash = full_hash & 0xFFFFFFFFFFFFFFFF
155+
# Join the hashes back together since mmh3 splits into high and low 32bits
156+
full_hash = (hashed_client[0] << 32) | (hashed_client[1] & 0xFFFFFFFF)
157+
unsigned_hash = full_hash & 0xFFFFFFFFFFFFFFFF
153158

154-
k_prefix_length = 10
155-
sig_figs = unsigned_hash >> (64 - k_prefix_length)
159+
k_prefix_length = 10
160+
sig_figs = unsigned_hash >> (64 - k_prefix_length)
156161

157-
# Return as 6 digit zero padded hex string
158-
return f"{sig_figs:06x}"
162+
# Return as 6 digit zero padded hex string
163+
return f"{sig_figs:06x}"
164+
except ImportError:
165+
# Fallback to a simple hash if mmh3 is not available
166+
return f"{hash(client_uid) % 0xFFFFFF:06x}"
159167

160168
@staticmethod
161169
def _get_location() -> str:

google/cloud/spanner_v1/param_types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from google.protobuf.internal.enum_type_wrapper import EnumTypeWrapper
1818
from google.protobuf.message import Message
1919

20-
from google.cloud.spanner_v1 import StructType, Type, TypeAnnotationCode, TypeCode
20+
from google.cloud.spanner_v1.types.type import StructType, Type, TypeAnnotationCode, TypeCode
2121

2222
# Scalar parameter types
2323
STRING = Type(code=TypeCode.STRING)

google/cloud/spanner_v1/pool.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
from warnings import warn
2121

2222
from google.cloud.exceptions import NotFound
23-
from google.cloud.spanner_v1 import BatchCreateSessionsRequest
24-
from google.cloud.spanner_v1 import Session as SessionPB
23+
from google.cloud.spanner_v1.types.spanner import BatchCreateSessionsRequest
24+
from google.cloud.spanner_v1.types import Session as SessionPB
2525
from google.cloud.spanner_v1._helpers import (
2626
_metadata_with_leader_aware_routing,
2727
_metadata_with_prefix,
@@ -131,9 +131,7 @@ def _new_session(self):
131131
:returns: new session instance.
132132
"""
133133
database_role = self.database_role or self._database.database_role
134-
return Session(
135-
database=self._database, labels=self.labels, database_role=database_role
136-
)
134+
return self._database.session(labels=self.labels, database_role=database_role)
137135

138136
def session(self, **kwargs):
139137
"""Return a context manager for a session from the pool.

google/cloud/spanner_v1/session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from google.api_core.exceptions import Aborted, GoogleAPICallError, NotFound
2222
from google.api_core.gapic_v1 import method
2323

24-
from google.cloud.spanner_v1 import CreateSessionRequest, ExecuteSqlRequest
24+
from google.cloud.spanner_v1.types.spanner import CreateSessionRequest, ExecuteSqlRequest
2525
from google.cloud.spanner_v1._helpers import (
2626
_delay_until_retry,
2727
_get_retry_delay,

google/cloud/spanner_v1/snapshot.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@
2626
)
2727
from google.protobuf.struct_pb2 import Struct
2828

29-
from google.cloud.spanner_v1 import (
29+
from google.cloud.spanner_v1.types.spanner import (
3030
ExecuteSqlRequest,
31-
PartitionOptions,
3231
PartitionQueryRequest,
3332
PartitionReadRequest,
3433
ReadRequest,
35-
RequestOptions,
34+
)
35+
from google.cloud.spanner_v1.types.spanner import PartitionOptions
36+
from google.cloud.spanner_v1.types import RequestOptions
37+
from google.cloud.spanner_v1.types.transaction import (
3638
TransactionOptions,
3739
TransactionSelector,
3840
)

google/cloud/spanner_v1/streamed.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
from google.protobuf.struct_pb2 import ListValue, Value
1818

1919
from google.cloud import exceptions
20-
from google.cloud.spanner_v1 import PartialResultSet, ResultSetMetadata, TypeCode
20+
from google.cloud.spanner_v1.types.result_set import PartialResultSet, ResultSetMetadata
21+
from google.cloud.spanner_v1.types.type import TypeCode
2122
from google.cloud.spanner_v1._helpers import _get_type_decoder, _parse_nullable
2223

2324

google/cloud/spanner_v1/testing/database_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import grpc
1717

1818
from google.cloud.spanner_admin_database_v1 import DatabaseDialect
19-
from google.cloud.spanner_v1 import SpannerClient
19+
from google.cloud.spanner_v1.services.spanner import SpannerClient
2020
from google.cloud.spanner_v1.database import SPANNER_DATA_SCOPE, Database
2121
from google.cloud.spanner_v1.services.spanner.transports import (
2222
SpannerGrpcTransport,

google/cloud/spanner_v1/transaction.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@
2222
from google.api_core.exceptions import InternalServerError
2323
from google.protobuf.struct_pb2 import Struct
2424

25-
from google.cloud.spanner_v1 import (
25+
from google.cloud.spanner_v1.types.spanner import (
2626
CommitRequest,
2727
ExecuteBatchDmlRequest,
2828
ExecuteSqlRequest,
29-
RequestOptions,
29+
)
30+
from google.cloud.spanner_v1.types import RequestOptions
31+
from google.cloud.spanner_v1.types.transaction import (
3032
TransactionOptions,
3133
TransactionSelector,
3234
)

test.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
from google.cloud import spanner
2-
from gooogle.cloud.spanner_v1 import RequestOptions
2+
from google.cloud.spanner_v1 import RequestOptions
33

44
client = spanner.Client()
55
instance = client.instance('test-instance')
66
database = instance.database('test-db')
77

88
with database.snapshot() as snapshot:
9-
results = snapshot.execute_sql("SELECT * in all_types LIMIT %s", )
9+
results = snapshot.execute_sql("SELECT * FROM all_types LIMIT 10")
10+
for row in results:
11+
print(row)
1012

11-
database.drop()
13+
# database.drop()

tests/unit/spanner_dbapi/test_connection.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,21 @@ def _make_pool():
160160

161161
@mock.patch("google.cloud.spanner_v1.database.Database")
162162
def test__session_checkout(self, mock_database):
163-
pool = self._make_pool()
164-
mock_database._pool = pool
163+
# Mock the session manager and its get_session method
164+
mock_session_manager = mock.MagicMock()
165+
mock_session = mock.MagicMock()
166+
mock_session_manager.get_session.return_value = mock_session
167+
mock_database._session_manager = mock_session_manager
168+
165169
connection = Connection(INSTANCE, mock_database)
166170

167171
connection._session_checkout()
168-
pool.get.assert_called_once_with()
169-
self.assertEqual(connection._session, pool.get.return_value)
172+
173+
# Verify that the session manager's get_session method was called
174+
# with the correct transaction type (READ_WRITE by default)
175+
from google.cloud.spanner_v1.session_options import TransactionType
176+
mock_session_manager.get_session.assert_called_once_with(TransactionType.READ_WRITE)
177+
self.assertEqual(connection._session, mock_session)
170178

171179
connection._session = "db_session"
172180
connection._session_checkout()
@@ -180,13 +188,17 @@ def test_session_checkout_database_error(self):
180188

181189
@mock.patch("google.cloud.spanner_v1.database.Database")
182190
def test__release_session(self, mock_database):
183-
pool = self._make_pool()
184-
mock_database._pool = pool
191+
# Mock the session manager and its put_session method
192+
mock_session_manager = mock.MagicMock()
193+
mock_database._session_manager = mock_session_manager
194+
185195
connection = Connection(INSTANCE, mock_database)
186196
connection._session = "session"
187197

188198
connection._release_session()
189-
pool.put.assert_called_once_with("session")
199+
200+
# Verify that the session manager's put_session method was called
201+
mock_session_manager.put_session.assert_called_once_with("session")
190202
self.assertIsNone(connection._session)
191203

192204
def test_release_session_database_error(self):

0 commit comments

Comments
 (0)

TMZ Celebrity News – Breaking Stories, Videos & Gossip

Looking for the latest TMZ celebrity news? You've come to the right place. From shocking Hollywood scandals to exclusive videos, TMZ delivers it all in real time.

Whether it’s a red carpet slip-up, a viral paparazzi moment, or a legal drama involving your favorite stars, TMZ news is always first to break the story. Stay in the loop with daily updates, insider tips, and jaw-dropping photos.

🎥 Watch TMZ Live

TMZ Live brings you daily celebrity news and interviews straight from the TMZ newsroom. Don’t miss a beat—watch now and see what’s trending in Hollywood.