From a3d2cf18b49cddc91e5e6448c46d6b936d86954d Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Fri, 8 Oct 2021 14:16:28 +0000 Subject: [PATCH] feat: add context manager support in client (#440) - [ ] Regenerate this pull request now. chore: fix docstring for first attribute of protos committer: @busunkim96 PiperOrigin-RevId: 401271153 Source-Link: https://github.com/googleapis/googleapis/commit/787f8c9a731f44e74a90b9847d48659ca9462d10 Source-Link: https://github.com/googleapis/googleapis-gen/commit/81decffe9fc72396a8153e756d1d67a6eecfd620 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiODFkZWNmZmU5ZmM3MjM5NmE4MTUzZTc1NmQxZDY3YTZlZWNmZDYyMCJ9 --- .../bigtable_instance_admin/async_client.py | 6 +++ .../bigtable_instance_admin/client.py | 18 +++++-- .../transports/base.py | 9 ++++ .../transports/grpc.py | 3 ++ .../transports/grpc_asyncio.py | 3 ++ .../bigtable_table_admin/async_client.py | 6 +++ .../services/bigtable_table_admin/client.py | 18 +++++-- .../bigtable_table_admin/transports/base.py | 9 ++++ .../bigtable_table_admin/transports/grpc.py | 3 ++ .../transports/grpc_asyncio.py | 3 ++ .../types/bigtable_instance_admin.py | 23 ++++++++- .../types/bigtable_table_admin.py | 2 + google/cloud/bigtable_admin_v2/types/table.py | 6 +++ .../services/bigtable/async_client.py | 6 +++ .../bigtable_v2/services/bigtable/client.py | 18 +++++-- .../services/bigtable/transports/base.py | 9 ++++ .../services/bigtable/transports/grpc.py | 3 ++ .../bigtable/transports/grpc_asyncio.py | 3 ++ google/cloud/bigtable_v2/types/bigtable.py | 15 +++++- google/cloud/bigtable_v2/types/data.py | 8 ++- .../test_bigtable_instance_admin.py | 50 +++++++++++++++++++ .../test_bigtable_table_admin.py | 50 +++++++++++++++++++ tests/unit/gapic/bigtable_v2/test_bigtable.py | 50 +++++++++++++++++++ 23 files changed, 306 insertions(+), 15 deletions(-) diff --git a/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/async_client.py b/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/async_client.py index c118257de..b0290a66d 100644 --- a/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/async_client.py +++ b/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/async_client.py @@ -1931,6 +1931,12 @@ async def test_iam_permissions( # Done; return the response. return response + async def __aenter__(self): + return self + + async def __aexit__(self, exc_type, exc, tb): + await self.transport.close() + try: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/client.py b/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/client.py index 9c9a8a152..5ec1c2ed6 100644 --- a/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/client.py +++ b/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/client.py @@ -408,10 +408,7 @@ def __init__( client_cert_source_for_mtls=client_cert_source_func, quota_project_id=client_options.quota_project_id, client_info=client_info, - always_use_jwt_access=( - Transport == type(self).get_transport_class("grpc") - or Transport == type(self).get_transport_class("grpc_asyncio") - ), + always_use_jwt_access=True, ) def create_instance( @@ -2041,6 +2038,19 @@ def test_iam_permissions( # Done; return the response. return response + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + """Releases underlying transport's resources. + + .. warning:: + ONLY use as a context manager if the transport is NOT shared + with other clients! Exiting the with block will CLOSE the transport + and may cause errors in other clients! + """ + self.transport.close() + try: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/base.py b/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/base.py index fa1456714..10dac01a2 100644 --- a/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/base.py +++ b/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/base.py @@ -371,6 +371,15 @@ def _prep_wrapped_messages(self, client_info): ), } + def close(self): + """Closes resources associated with the transport. + + .. warning:: + Only call this method if the transport is NOT shared + with other clients - this may cause errors in other clients! + """ + raise NotImplementedError() + @property def operations_client(self) -> operations_v1.OperationsClient: """Return the client designed to process long-running operations.""" diff --git a/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/grpc.py b/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/grpc.py index 7e2e51611..40c722c7e 100644 --- a/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/grpc.py +++ b/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/grpc.py @@ -770,5 +770,8 @@ def test_iam_permissions( ) return self._stubs["test_iam_permissions"] + def close(self): + self.grpc_channel.close() + __all__ = ("BigtableInstanceAdminGrpcTransport",) diff --git a/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/grpc_asyncio.py b/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/grpc_asyncio.py index 9eddeaa02..70a0e8795 100644 --- a/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/grpc_asyncio.py +++ b/google/cloud/bigtable_admin_v2/services/bigtable_instance_admin/transports/grpc_asyncio.py @@ -796,5 +796,8 @@ def test_iam_permissions( ) return self._stubs["test_iam_permissions"] + def close(self): + return self.grpc_channel.close() + __all__ = ("BigtableInstanceAdminGrpcAsyncIOTransport",) diff --git a/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/async_client.py b/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/async_client.py index 62bef2e7b..5a5a3f039 100644 --- a/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/async_client.py +++ b/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/async_client.py @@ -2271,6 +2271,12 @@ async def test_iam_permissions( # Done; return the response. return response + async def __aenter__(self): + return self + + async def __aexit__(self, exc_type, exc, tb): + await self.transport.close() + try: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/client.py b/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/client.py index 8c891fd87..ece1e880f 100644 --- a/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/client.py +++ b/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/client.py @@ -446,10 +446,7 @@ def __init__( client_cert_source_for_mtls=client_cert_source_func, quota_project_id=client_options.quota_project_id, client_info=client_info, - always_use_jwt_access=( - Transport == type(self).get_transport_class("grpc") - or Transport == type(self).get_transport_class("grpc_asyncio") - ), + always_use_jwt_access=True, ) def create_table( @@ -2443,6 +2440,19 @@ def test_iam_permissions( # Done; return the response. return response + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + """Releases underlying transport's resources. + + .. warning:: + ONLY use as a context manager if the transport is NOT shared + with other clients! Exiting the with block will CLOSE the transport + and may cause errors in other clients! + """ + self.transport.close() + try: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/base.py b/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/base.py index e136c81c6..5a4201bbe 100644 --- a/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/base.py +++ b/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/base.py @@ -360,6 +360,15 @@ def _prep_wrapped_messages(self, client_info): ), } + def close(self): + """Closes resources associated with the transport. + + .. warning:: + Only call this method if the transport is NOT shared + with other clients - this may cause errors in other clients! + """ + raise NotImplementedError() + @property def operations_client(self) -> operations_v1.OperationsClient: """Return the client designed to process long-running operations.""" diff --git a/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/grpc.py b/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/grpc.py index 37ecdb039..eaf333baf 100644 --- a/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/grpc.py +++ b/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/grpc.py @@ -920,5 +920,8 @@ def test_iam_permissions( ) return self._stubs["test_iam_permissions"] + def close(self): + self.grpc_channel.close() + __all__ = ("BigtableTableAdminGrpcTransport",) diff --git a/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/grpc_asyncio.py b/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/grpc_asyncio.py index e797ff875..438571f88 100644 --- a/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/grpc_asyncio.py +++ b/google/cloud/bigtable_admin_v2/services/bigtable_table_admin/transports/grpc_asyncio.py @@ -942,5 +942,8 @@ def test_iam_permissions( ) return self._stubs["test_iam_permissions"] + def close(self): + return self.grpc_channel.close() + __all__ = ("BigtableTableAdminGrpcAsyncIOTransport",) diff --git a/google/cloud/bigtable_admin_v2/types/bigtable_instance_admin.py b/google/cloud/bigtable_admin_v2/types/bigtable_instance_admin.py index 69b251f65..a5753b613 100644 --- a/google/cloud/bigtable_admin_v2/types/bigtable_instance_admin.py +++ b/google/cloud/bigtable_admin_v2/types/bigtable_instance_admin.py @@ -51,6 +51,7 @@ class CreateInstanceRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.CreateInstance. + Attributes: parent (str): Required. The unique name of the project in which to create @@ -82,6 +83,7 @@ class CreateInstanceRequest(proto.Message): class GetInstanceRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.GetInstance. + Attributes: name (str): Required. The unique name of the requested instance. Values @@ -93,6 +95,7 @@ class GetInstanceRequest(proto.Message): class ListInstancesRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.ListInstances. + Attributes: parent (str): Required. The unique name of the project for which a list of @@ -108,6 +111,7 @@ class ListInstancesRequest(proto.Message): class ListInstancesResponse(proto.Message): r"""Response message for BigtableInstanceAdmin.ListInstances. + Attributes: instances (Sequence[google.cloud.bigtable_admin_v2.types.Instance]): The list of requested instances. @@ -155,6 +159,7 @@ class PartialUpdateInstanceRequest(proto.Message): class DeleteInstanceRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.DeleteInstance. + Attributes: name (str): Required. The unique name of the instance to be deleted. @@ -167,6 +172,7 @@ class DeleteInstanceRequest(proto.Message): class CreateClusterRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.CreateCluster. + Attributes: parent (str): Required. The unique name of the instance in which to create @@ -189,6 +195,7 @@ class CreateClusterRequest(proto.Message): class GetClusterRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.GetCluster. + Attributes: name (str): Required. The unique name of the requested cluster. Values @@ -201,6 +208,7 @@ class GetClusterRequest(proto.Message): class ListClustersRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.ListClusters. + Attributes: parent (str): Required. The unique name of the instance for which a list @@ -218,6 +226,7 @@ class ListClustersRequest(proto.Message): class ListClustersResponse(proto.Message): r"""Response message for BigtableInstanceAdmin.ListClusters. + Attributes: clusters (Sequence[google.cloud.bigtable_admin_v2.types.Cluster]): The list of requested clusters. @@ -245,6 +254,7 @@ def raw_page(self): class DeleteClusterRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.DeleteCluster. + Attributes: name (str): Required. The unique name of the cluster to be deleted. @@ -257,6 +267,7 @@ class DeleteClusterRequest(proto.Message): class CreateInstanceMetadata(proto.Message): r"""The metadata for the Operation returned by CreateInstance. + Attributes: original_request (google.cloud.bigtable_admin_v2.types.CreateInstanceRequest): The request that prompted the initiation of @@ -280,6 +291,7 @@ class CreateInstanceMetadata(proto.Message): class UpdateInstanceMetadata(proto.Message): r"""The metadata for the Operation returned by UpdateInstance. + Attributes: original_request (google.cloud.bigtable_admin_v2.types.PartialUpdateInstanceRequest): The request that prompted the initiation of @@ -303,6 +315,7 @@ class UpdateInstanceMetadata(proto.Message): class CreateClusterMetadata(proto.Message): r"""The metadata for the Operation returned by CreateCluster. + Attributes: original_request (google.cloud.bigtable_admin_v2.types.CreateClusterRequest): The request that prompted the initiation of @@ -326,6 +339,7 @@ class CreateClusterMetadata(proto.Message): class UpdateClusterMetadata(proto.Message): r"""The metadata for the Operation returned by UpdateCluster. + Attributes: original_request (google.cloud.bigtable_admin_v2.types.Cluster): The request that prompted the initiation of @@ -349,6 +363,7 @@ class UpdateClusterMetadata(proto.Message): class CreateAppProfileRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.CreateAppProfile. + Attributes: parent (str): Required. The unique name of the instance in which to create @@ -375,6 +390,7 @@ class CreateAppProfileRequest(proto.Message): class GetAppProfileRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.GetAppProfile. + Attributes: name (str): Required. The unique name of the requested app profile. @@ -387,6 +403,7 @@ class GetAppProfileRequest(proto.Message): class ListAppProfilesRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.ListAppProfiles. + Attributes: parent (str): Required. The unique name of the instance for which a list @@ -418,6 +435,7 @@ class ListAppProfilesRequest(proto.Message): class ListAppProfilesResponse(proto.Message): r"""Response message for BigtableInstanceAdmin.ListAppProfiles. + Attributes: app_profiles (Sequence[google.cloud.bigtable_admin_v2.types.AppProfile]): The list of requested app profiles. @@ -446,6 +464,7 @@ def raw_page(self): class UpdateAppProfileRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.UpdateAppProfile. + Attributes: app_profile (google.cloud.bigtable_admin_v2.types.AppProfile): Required. The app profile which will @@ -468,6 +487,7 @@ class UpdateAppProfileRequest(proto.Message): class DeleteAppProfileRequest(proto.Message): r"""Request message for BigtableInstanceAdmin.DeleteAppProfile. + Attributes: name (str): Required. The unique name of the app profile to be deleted. @@ -483,7 +503,8 @@ class DeleteAppProfileRequest(proto.Message): class UpdateAppProfileMetadata(proto.Message): - r"""The metadata for the Operation returned by UpdateAppProfile. """ + r"""The metadata for the Operation returned by UpdateAppProfile. + """ __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/cloud/bigtable_admin_v2/types/bigtable_table_admin.py b/google/cloud/bigtable_admin_v2/types/bigtable_table_admin.py index 1d93991ad..2a89d1174 100644 --- a/google/cloud/bigtable_admin_v2/types/bigtable_table_admin.py +++ b/google/cloud/bigtable_admin_v2/types/bigtable_table_admin.py @@ -183,6 +183,7 @@ class CreateTableRequest(proto.Message): class Split(proto.Message): r"""An initial split point for a newly created table. + Attributes: key (bytes): Row key to use as an initial tablet boundary. @@ -357,6 +358,7 @@ class ModifyColumnFamiliesRequest(proto.Message): class Modification(proto.Message): r"""A create, update, or delete of a particular column family. + Attributes: id (str): The ID of the column family to be modified. diff --git a/google/cloud/bigtable_admin_v2/types/table.py b/google/cloud/bigtable_admin_v2/types/table.py index 75ceaf263..e90d58738 100644 --- a/google/cloud/bigtable_admin_v2/types/table.py +++ b/google/cloud/bigtable_admin_v2/types/table.py @@ -44,6 +44,7 @@ class RestoreSourceType(proto.Enum): class RestoreInfo(proto.Message): r"""Information about a table restore. + Attributes: source_type (google.cloud.bigtable_admin_v2.types.RestoreSourceType): The type of the restore source. @@ -111,6 +112,7 @@ class View(proto.Enum): class ClusterState(proto.Message): r"""The state of a table's data in a particular cluster. + Attributes: replication_state (google.cloud.bigtable_admin_v2.types.Table.ClusterState.ReplicationState): Output only. The state of replication for the @@ -193,6 +195,7 @@ class GcRule(proto.Message): class Intersection(proto.Message): r"""A GcRule which deletes cells matching all of the given rules. + Attributes: rules (Sequence[google.cloud.bigtable_admin_v2.types.GcRule]): Only delete cells which would be deleted by every element of @@ -203,6 +206,7 @@ class Intersection(proto.Message): class Union(proto.Message): r"""A GcRule which deletes cells matching any of the given rules. + Attributes: rules (Sequence[google.cloud.bigtable_admin_v2.types.GcRule]): Delete cells which would be deleted by any element of @@ -310,6 +314,7 @@ class State(proto.Enum): class Backup(proto.Message): r"""A backup of a Cloud Bigtable table. + Attributes: name (str): Output only. A globally unique identifier for the backup @@ -369,6 +374,7 @@ class State(proto.Enum): class BackupInfo(proto.Message): r"""Information about a backup. + Attributes: backup (str): Output only. Name of the backup. diff --git a/google/cloud/bigtable_v2/services/bigtable/async_client.py b/google/cloud/bigtable_v2/services/bigtable/async_client.py index 9aa15e391..03e99eda2 100644 --- a/google/cloud/bigtable_v2/services/bigtable/async_client.py +++ b/google/cloud/bigtable_v2/services/bigtable/async_client.py @@ -864,6 +864,12 @@ async def read_modify_write_row( # Done; return the response. return response + async def __aenter__(self): + return self + + async def __aexit__(self, exc_type, exc, tb): + await self.transport.close() + try: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/google/cloud/bigtable_v2/services/bigtable/client.py b/google/cloud/bigtable_v2/services/bigtable/client.py index 32dd6739c..beeed24d1 100644 --- a/google/cloud/bigtable_v2/services/bigtable/client.py +++ b/google/cloud/bigtable_v2/services/bigtable/client.py @@ -344,10 +344,7 @@ def __init__( client_cert_source_for_mtls=client_cert_source_func, quota_project_id=client_options.quota_project_id, client_info=client_info, - always_use_jwt_access=( - Transport == type(self).get_transport_class("grpc") - or Transport == type(self).get_transport_class("grpc_asyncio") - ), + always_use_jwt_access=True, ) def read_rows( @@ -1014,6 +1011,19 @@ def read_modify_write_row( # Done; return the response. return response + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + """Releases underlying transport's resources. + + .. warning:: + ONLY use as a context manager if the transport is NOT shared + with other clients! Exiting the with block will CLOSE the transport + and may cause errors in other clients! + """ + self.transport.close() + try: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/google/cloud/bigtable_v2/services/bigtable/transports/base.py b/google/cloud/bigtable_v2/services/bigtable/transports/base.py index a6dbca220..d89c01d22 100644 --- a/google/cloud/bigtable_v2/services/bigtable/transports/base.py +++ b/google/cloud/bigtable_v2/services/bigtable/transports/base.py @@ -236,6 +236,15 @@ def _prep_wrapped_messages(self, client_info): ), } + def close(self): + """Closes resources associated with the transport. + + .. warning:: + Only call this method if the transport is NOT shared + with other clients - this may cause errors in other clients! + """ + raise NotImplementedError() + @property def read_rows( self, diff --git a/google/cloud/bigtable_v2/services/bigtable/transports/grpc.py b/google/cloud/bigtable_v2/services/bigtable/transports/grpc.py index 2df844a9c..fd9d1134f 100644 --- a/google/cloud/bigtable_v2/services/bigtable/transports/grpc.py +++ b/google/cloud/bigtable_v2/services/bigtable/transports/grpc.py @@ -405,5 +405,8 @@ def read_modify_write_row( ) return self._stubs["read_modify_write_row"] + def close(self): + self.grpc_channel.close() + __all__ = ("BigtableGrpcTransport",) diff --git a/google/cloud/bigtable_v2/services/bigtable/transports/grpc_asyncio.py b/google/cloud/bigtable_v2/services/bigtable/transports/grpc_asyncio.py index 56bf684bd..c0560526e 100644 --- a/google/cloud/bigtable_v2/services/bigtable/transports/grpc_asyncio.py +++ b/google/cloud/bigtable_v2/services/bigtable/transports/grpc_asyncio.py @@ -412,5 +412,8 @@ def read_modify_write_row( ) return self._stubs["read_modify_write_row"] + def close(self): + return self.grpc_channel.close() + __all__ = ("BigtableGrpcAsyncIOTransport",) diff --git a/google/cloud/bigtable_v2/types/bigtable.py b/google/cloud/bigtable_v2/types/bigtable.py index 35a19e2d1..2c18a5155 100644 --- a/google/cloud/bigtable_v2/types/bigtable.py +++ b/google/cloud/bigtable_v2/types/bigtable.py @@ -41,6 +41,7 @@ class ReadRowsRequest(proto.Message): r"""Request message for Bigtable.ReadRows. + Attributes: table_name (str): Required. The unique name of the table from which to read. @@ -72,6 +73,7 @@ class ReadRowsRequest(proto.Message): class ReadRowsResponse(proto.Message): r"""Response message for Bigtable.ReadRows. + Attributes: chunks (Sequence[google.cloud.bigtable_v2.types.ReadRowsResponse.CellChunk]): A collection of a row's contents as part of @@ -169,6 +171,7 @@ class CellChunk(proto.Message): class SampleRowKeysRequest(proto.Message): r"""Request message for Bigtable.SampleRowKeys. + Attributes: table_name (str): Required. The unique name of the table from which to sample @@ -186,6 +189,7 @@ class SampleRowKeysRequest(proto.Message): class SampleRowKeysResponse(proto.Message): r"""Response message for Bigtable.SampleRowKeys. + Attributes: row_key (bytes): Sorted streamed sequence of sample row keys @@ -213,6 +217,7 @@ class SampleRowKeysResponse(proto.Message): class MutateRowRequest(proto.Message): r"""Request message for Bigtable.MutateRow. + Attributes: table_name (str): Required. The unique name of the table to which the mutation @@ -240,11 +245,13 @@ class MutateRowRequest(proto.Message): class MutateRowResponse(proto.Message): - r"""Response message for Bigtable.MutateRow. """ + r"""Response message for Bigtable.MutateRow. + """ class MutateRowsRequest(proto.Message): r"""Request message for BigtableService.MutateRows. + Attributes: table_name (str): Required. The unique name of the table to @@ -265,6 +272,7 @@ class MutateRowsRequest(proto.Message): class Entry(proto.Message): r"""A mutation for a given row. + Attributes: row_key (bytes): The key of the row to which the ``mutations`` should be @@ -287,6 +295,7 @@ class Entry(proto.Message): class MutateRowsResponse(proto.Message): r"""Response message for BigtableService.MutateRows. + Attributes: entries (Sequence[google.cloud.bigtable_v2.types.MutateRowsResponse.Entry]): One or more results for Entries from the @@ -317,6 +326,7 @@ class Entry(proto.Message): class CheckAndMutateRowRequest(proto.Message): r"""Request message for Bigtable.CheckAndMutateRow. + Attributes: table_name (str): Required. The unique name of the table to which the @@ -366,6 +376,7 @@ class CheckAndMutateRowRequest(proto.Message): class CheckAndMutateRowResponse(proto.Message): r"""Response message for Bigtable.CheckAndMutateRow. + Attributes: predicate_matched (bool): Whether or not the request's ``predicate_filter`` yielded @@ -377,6 +388,7 @@ class CheckAndMutateRowResponse(proto.Message): class ReadModifyWriteRowRequest(proto.Message): r"""Request message for Bigtable.ReadModifyWriteRow. + Attributes: table_name (str): Required. The unique name of the table to which the @@ -408,6 +420,7 @@ class ReadModifyWriteRowRequest(proto.Message): class ReadModifyWriteRowResponse(proto.Message): r"""Response message for Bigtable.ReadModifyWriteRow. + Attributes: row (google.cloud.bigtable_v2.types.Row): A Row containing the new contents of all diff --git a/google/cloud/bigtable_v2/types/data.py b/google/cloud/bigtable_v2/types/data.py index ca2302889..2b97ac0f7 100644 --- a/google/cloud/bigtable_v2/types/data.py +++ b/google/cloud/bigtable_v2/types/data.py @@ -129,6 +129,7 @@ class Cell(proto.Message): class RowRange(proto.Message): r"""Specifies a contiguous range of rows. + Attributes: start_key_closed (bytes): Used when giving an inclusive lower bound for @@ -152,6 +153,7 @@ class RowRange(proto.Message): class RowSet(proto.Message): r"""Specifies a non-contiguous set of rows. + Attributes: row_keys (Sequence[bytes]): Single rows included in the set. @@ -198,6 +200,7 @@ class ColumnRange(proto.Message): class TimestampRange(proto.Message): r"""Specified a contiguous range of microsecond timestamps. + Attributes: start_timestamp_micros (int): Inclusive lower bound. If left empty, @@ -213,6 +216,7 @@ class TimestampRange(proto.Message): class ValueRange(proto.Message): r"""Specifies a contiguous range of raw byte values. + Attributes: start_value_closed (bytes): Used when giving an inclusive lower bound for @@ -567,6 +571,7 @@ class Mutation(proto.Message): class SetCell(proto.Message): r"""A Mutation which sets the value of the specified cell. + Attributes: family_name (str): The name of the family into which new data should be @@ -627,7 +632,8 @@ class DeleteFromFamily(proto.Message): family_name = proto.Field(proto.STRING, number=1,) class DeleteFromRow(proto.Message): - r"""A Mutation which deletes all cells from the containing row. """ + r"""A Mutation which deletes all cells from the containing row. + """ set_cell = proto.Field(proto.MESSAGE, number=1, oneof="mutation", message=SetCell,) delete_from_column = proto.Field( diff --git a/tests/unit/gapic/bigtable_admin_v2/test_bigtable_instance_admin.py b/tests/unit/gapic/bigtable_admin_v2/test_bigtable_instance_admin.py index 029ed196f..f7fb223ee 100644 --- a/tests/unit/gapic/bigtable_admin_v2/test_bigtable_instance_admin.py +++ b/tests/unit/gapic/bigtable_admin_v2/test_bigtable_instance_admin.py @@ -32,6 +32,7 @@ from google.api_core import grpc_helpers_async from google.api_core import operation_async # type: ignore from google.api_core import operations_v1 +from google.api_core import path_template from google.auth import credentials as ga_credentials from google.auth.exceptions import MutualTLSChannelError from google.cloud.bigtable_admin_v2.services.bigtable_instance_admin import ( @@ -4936,6 +4937,9 @@ def test_bigtable_instance_admin_base_transport(): with pytest.raises(NotImplementedError): getattr(transport, method)(request=object()) + with pytest.raises(NotImplementedError): + transport.close() + # Additionally, the LRO client (a property) should # also raise NotImplementedError with pytest.raises(NotImplementedError): @@ -5585,3 +5589,49 @@ def test_client_withDEFAULT_CLIENT_INFO(): credentials=ga_credentials.AnonymousCredentials(), client_info=client_info, ) prep.assert_called_once_with(client_info) + + +@pytest.mark.asyncio +async def test_transport_close_async(): + client = BigtableInstanceAdminAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), transport="grpc_asyncio", + ) + with mock.patch.object( + type(getattr(client.transport, "grpc_channel")), "close" + ) as close: + async with client: + close.assert_not_called() + close.assert_called_once() + + +def test_transport_close(): + transports = { + "grpc": "_grpc_channel", + } + + for transport, close_name in transports.items(): + client = BigtableInstanceAdminClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport + ) + with mock.patch.object( + type(getattr(client.transport, close_name)), "close" + ) as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +def test_client_ctx(): + transports = [ + "grpc", + ] + for transport in transports: + client = BigtableInstanceAdminClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport + ) + # Test client calls underlying transport. + with mock.patch.object(type(client.transport), "close") as close: + close.assert_not_called() + with client: + pass + close.assert_called() diff --git a/tests/unit/gapic/bigtable_admin_v2/test_bigtable_table_admin.py b/tests/unit/gapic/bigtable_admin_v2/test_bigtable_table_admin.py index 6bfe7d012..95739fc94 100644 --- a/tests/unit/gapic/bigtable_admin_v2/test_bigtable_table_admin.py +++ b/tests/unit/gapic/bigtable_admin_v2/test_bigtable_table_admin.py @@ -32,6 +32,7 @@ from google.api_core import grpc_helpers_async from google.api_core import operation_async # type: ignore from google.api_core import operations_v1 +from google.api_core import path_template from google.auth import credentials as ga_credentials from google.auth.exceptions import MutualTLSChannelError from google.cloud.bigtable_admin_v2.services.bigtable_table_admin import ( @@ -5784,6 +5785,9 @@ def test_bigtable_table_admin_base_transport(): with pytest.raises(NotImplementedError): getattr(transport, method)(request=object()) + with pytest.raises(NotImplementedError): + transport.close() + # Additionally, the LRO client (a property) should # also raise NotImplementedError with pytest.raises(NotImplementedError): @@ -6482,3 +6486,49 @@ def test_client_withDEFAULT_CLIENT_INFO(): credentials=ga_credentials.AnonymousCredentials(), client_info=client_info, ) prep.assert_called_once_with(client_info) + + +@pytest.mark.asyncio +async def test_transport_close_async(): + client = BigtableTableAdminAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), transport="grpc_asyncio", + ) + with mock.patch.object( + type(getattr(client.transport, "grpc_channel")), "close" + ) as close: + async with client: + close.assert_not_called() + close.assert_called_once() + + +def test_transport_close(): + transports = { + "grpc": "_grpc_channel", + } + + for transport, close_name in transports.items(): + client = BigtableTableAdminClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport + ) + with mock.patch.object( + type(getattr(client.transport, close_name)), "close" + ) as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +def test_client_ctx(): + transports = [ + "grpc", + ] + for transport in transports: + client = BigtableTableAdminClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport + ) + # Test client calls underlying transport. + with mock.patch.object(type(client.transport), "close") as close: + close.assert_not_called() + with client: + pass + close.assert_called() diff --git a/tests/unit/gapic/bigtable_v2/test_bigtable.py b/tests/unit/gapic/bigtable_v2/test_bigtable.py index 3735f1074..95fd03bb3 100644 --- a/tests/unit/gapic/bigtable_v2/test_bigtable.py +++ b/tests/unit/gapic/bigtable_v2/test_bigtable.py @@ -29,6 +29,7 @@ from google.api_core import gapic_v1 from google.api_core import grpc_helpers from google.api_core import grpc_helpers_async +from google.api_core import path_template from google.auth import credentials as ga_credentials from google.auth.exceptions import MutualTLSChannelError from google.cloud.bigtable_v2.services.bigtable import BigtableAsyncClient @@ -2022,6 +2023,9 @@ def test_bigtable_base_transport(): with pytest.raises(NotImplementedError): getattr(transport, method)(request=object()) + with pytest.raises(NotImplementedError): + transport.close() + @requires_google_auth_gte_1_25_0 def test_bigtable_base_transport_with_credentials_file(): @@ -2536,3 +2540,49 @@ def test_client_withDEFAULT_CLIENT_INFO(): credentials=ga_credentials.AnonymousCredentials(), client_info=client_info, ) prep.assert_called_once_with(client_info) + + +@pytest.mark.asyncio +async def test_transport_close_async(): + client = BigtableAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), transport="grpc_asyncio", + ) + with mock.patch.object( + type(getattr(client.transport, "grpc_channel")), "close" + ) as close: + async with client: + close.assert_not_called() + close.assert_called_once() + + +def test_transport_close(): + transports = { + "grpc": "_grpc_channel", + } + + for transport, close_name in transports.items(): + client = BigtableClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport + ) + with mock.patch.object( + type(getattr(client.transport, close_name)), "close" + ) as close: + with client: + close.assert_not_called() + close.assert_called_once() + + +def test_client_ctx(): + transports = [ + "grpc", + ] + for transport in transports: + client = BigtableClient( + credentials=ga_credentials.AnonymousCredentials(), transport=transport + ) + # Test client calls underlying transport. + with mock.patch.object(type(client.transport), "close") as close: + close.assert_not_called() + with client: + pass + close.assert_called()