From bcac8a267ef35209ff96342dd1d55e63a90cefd3 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 2 Mar 2026 16:00:40 -0800 Subject: [PATCH 1/2] create separate transport registry for async class --- .../services/bigtable/async_client.py | 38 ++++++++++++++++++- .../bigtable_v2/services/bigtable/client.py | 1 - 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/google/cloud/bigtable_v2/services/bigtable/async_client.py b/google/cloud/bigtable_v2/services/bigtable/async_client.py index 0a9442287..9995c9e93 100644 --- a/google/cloud/bigtable_v2/services/bigtable/async_client.py +++ b/google/cloud/bigtable_v2/services/bigtable/async_client.py @@ -65,6 +65,41 @@ _LOGGER = std_logging.getLogger(__name__) +class BigtableAsyncClientMeta(type): + """Metaclass for the Bigtable async client. + + This provides class-level methods for building and retrieving + support objects (e.g. transport) without polluting the client instance + objects. + """ + + _transport_registry = OrderedDict() # type: Dict[str, Type[BigtableTransport]] + _transport_registry["grpc_asyncio"] = BigtableGrpcAsyncIOTransport + + def get_transport_class( + cls, + label: Optional[str] = None, + ) -> Type[BigtableTransport]: + """Returns an appropriate transport class. + + Args: + label: The name of the desired transport. If none is + provided, then the first transport in the registry is used. + + Returns: + The transport class to use. + """ + # If a specific transport is requested, return that one. + if label: + return cls._transport_registry[label] + + # No transport is requested; return the default (that is, the first one + # in the dictionary). + return next(iter(cls._transport_registry.values())) + + + + class BigtableAsyncClient: """Service for reading from and writing to existing Bigtable tables. @@ -264,9 +299,10 @@ def __init__( google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport creation failed for any reason. """ + transport_cls = BigtableAsyncClient.get_transport_class(transport) self._client = BigtableClient( credentials=credentials, - transport=transport, + transport=transport_cls, client_options=client_options, client_info=client_info, ) diff --git a/google/cloud/bigtable_v2/services/bigtable/client.py b/google/cloud/bigtable_v2/services/bigtable/client.py index 5eb6ba894..e5812952f 100644 --- a/google/cloud/bigtable_v2/services/bigtable/client.py +++ b/google/cloud/bigtable_v2/services/bigtable/client.py @@ -82,7 +82,6 @@ class BigtableClientMeta(type): _transport_registry = OrderedDict() # type: Dict[str, Type[BigtableTransport]] _transport_registry["grpc"] = BigtableGrpcTransport - _transport_registry["grpc_asyncio"] = BigtableGrpcAsyncIOTransport _transport_registry["rest"] = BigtableRestTransport def get_transport_class( From 5303b6135911bc8f747f8d829f2ad8f72b51f629 Mon Sep 17 00:00:00 2001 From: Daniel Sanche Date: Mon, 2 Mar 2026 16:05:21 -0800 Subject: [PATCH 2/2] use metaclass --- google/cloud/bigtable_v2/services/bigtable/async_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/cloud/bigtable_v2/services/bigtable/async_client.py b/google/cloud/bigtable_v2/services/bigtable/async_client.py index 9995c9e93..7240f24c9 100644 --- a/google/cloud/bigtable_v2/services/bigtable/async_client.py +++ b/google/cloud/bigtable_v2/services/bigtable/async_client.py @@ -100,7 +100,7 @@ def get_transport_class( -class BigtableAsyncClient: +class BigtableAsyncClient(metaclass=BigtableAsyncClientMeta): """Service for reading from and writing to existing Bigtable tables. """