diff --git a/google/cloud/spanner_admin_database_v1/services/database_admin/async_client.py b/google/cloud/spanner_admin_database_v1/services/database_admin/async_client.py index d9178c81a4..748d89b811 100644 --- a/google/cloud/spanner_admin_database_v1/services/database_admin/async_client.py +++ b/google/cloud/spanner_admin_database_v1/services/database_admin/async_client.py @@ -1928,6 +1928,12 @@ async def list_backup_operations( # 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/spanner_admin_database_v1/services/database_admin/client.py b/google/cloud/spanner_admin_database_v1/services/database_admin/client.py index 1100d160c5..6f0cf9c5c9 100644 --- a/google/cloud/spanner_admin_database_v1/services/database_admin/client.py +++ b/google/cloud/spanner_admin_database_v1/services/database_admin/client.py @@ -17,7 +17,7 @@ from distutils import util import os import re -from typing import Callable, Dict, Optional, Sequence, Tuple, Type, Union +from typing import Dict, Optional, Sequence, Tuple, Type, Union import pkg_resources from google.api_core import client_options as client_options_lib # type: ignore @@ -435,15 +435,12 @@ 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 list_databases( self, - request: spanner_database_admin.ListDatabasesRequest = None, + request: Union[spanner_database_admin.ListDatabasesRequest, dict] = None, *, parent: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -453,7 +450,7 @@ def list_databases( r"""Lists Cloud Spanner databases. Args: - request (google.cloud.spanner_admin_database_v1.types.ListDatabasesRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.ListDatabasesRequest, dict]): The request object. The request for [ListDatabases][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabases]. parent (str): @@ -524,7 +521,7 @@ def list_databases( def create_database( self, - request: spanner_database_admin.CreateDatabaseRequest = None, + request: Union[spanner_database_admin.CreateDatabaseRequest, dict] = None, *, parent: str = None, create_statement: str = None, @@ -544,7 +541,7 @@ def create_database( successful. Args: - request (google.cloud.spanner_admin_database_v1.types.CreateDatabaseRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.CreateDatabaseRequest, dict]): The request object. The request for [CreateDatabase][google.spanner.admin.database.v1.DatabaseAdmin.CreateDatabase]. parent (str): @@ -631,7 +628,7 @@ def create_database( def get_database( self, - request: spanner_database_admin.GetDatabaseRequest = None, + request: Union[spanner_database_admin.GetDatabaseRequest, dict] = None, *, name: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -641,7 +638,7 @@ def get_database( r"""Gets the state of a Cloud Spanner database. Args: - request (google.cloud.spanner_admin_database_v1.types.GetDatabaseRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.GetDatabaseRequest, dict]): The request object. The request for [GetDatabase][google.spanner.admin.database.v1.DatabaseAdmin.GetDatabase]. name (str): @@ -701,7 +698,7 @@ def get_database( def update_database_ddl( self, - request: spanner_database_admin.UpdateDatabaseDdlRequest = None, + request: Union[spanner_database_admin.UpdateDatabaseDdlRequest, dict] = None, *, database: str = None, statements: Sequence[str] = None, @@ -720,7 +717,7 @@ def update_database_ddl( The operation has no response. Args: - request (google.cloud.spanner_admin_database_v1.types.UpdateDatabaseDdlRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.UpdateDatabaseDdlRequest, dict]): The request object. Enqueues the given DDL statements to be applied, in order but not necessarily all at once, to the database schema at some point (or points) in the @@ -826,7 +823,7 @@ def update_database_ddl( def drop_database( self, - request: spanner_database_admin.DropDatabaseRequest = None, + request: Union[spanner_database_admin.DropDatabaseRequest, dict] = None, *, database: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -838,7 +835,7 @@ def drop_database( ``expire_time``. Args: - request (google.cloud.spanner_admin_database_v1.types.DropDatabaseRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.DropDatabaseRequest, dict]): The request object. The request for [DropDatabase][google.spanner.admin.database.v1.DatabaseAdmin.DropDatabase]. database (str): @@ -890,7 +887,7 @@ def drop_database( def get_database_ddl( self, - request: spanner_database_admin.GetDatabaseDdlRequest = None, + request: Union[spanner_database_admin.GetDatabaseDdlRequest, dict] = None, *, database: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -903,7 +900,7 @@ def get_database_ddl( [Operations][google.longrunning.Operations] API. Args: - request (google.cloud.spanner_admin_database_v1.types.GetDatabaseDdlRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.GetDatabaseDdlRequest, dict]): The request object. The request for [GetDatabaseDdl][google.spanner.admin.database.v1.DatabaseAdmin.GetDatabaseDdl]. database (str): @@ -965,7 +962,7 @@ def get_database_ddl( def set_iam_policy( self, - request: iam_policy_pb2.SetIamPolicyRequest = None, + request: Union[iam_policy_pb2.SetIamPolicyRequest, dict] = None, *, resource: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -983,7 +980,7 @@ def set_iam_policy( [resource][google.iam.v1.SetIamPolicyRequest.resource]. Args: - request (google.iam.v1.iam_policy_pb2.SetIamPolicyRequest): + request (Union[google.iam.v1.iam_policy_pb2.SetIamPolicyRequest, dict]): The request object. Request message for `SetIamPolicy` method. resource (str): @@ -1098,7 +1095,7 @@ def set_iam_policy( def get_iam_policy( self, - request: iam_policy_pb2.GetIamPolicyRequest = None, + request: Union[iam_policy_pb2.GetIamPolicyRequest, dict] = None, *, resource: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -1117,7 +1114,7 @@ def get_iam_policy( [resource][google.iam.v1.GetIamPolicyRequest.resource]. Args: - request (google.iam.v1.iam_policy_pb2.GetIamPolicyRequest): + request (Union[google.iam.v1.iam_policy_pb2.GetIamPolicyRequest, dict]): The request object. Request message for `GetIamPolicy` method. resource (str): @@ -1232,7 +1229,7 @@ def get_iam_policy( def test_iam_permissions( self, - request: iam_policy_pb2.TestIamPermissionsRequest = None, + request: Union[iam_policy_pb2.TestIamPermissionsRequest, dict] = None, *, resource: str = None, permissions: Sequence[str] = None, @@ -1252,7 +1249,7 @@ def test_iam_permissions( permission on the containing instance. Args: - request (google.iam.v1.iam_policy_pb2.TestIamPermissionsRequest): + request (Union[google.iam.v1.iam_policy_pb2.TestIamPermissionsRequest, dict]): The request object. Request message for `TestIamPermissions` method. resource (str): @@ -1323,7 +1320,7 @@ def test_iam_permissions( def create_backup( self, - request: gsad_backup.CreateBackupRequest = None, + request: Union[gsad_backup.CreateBackupRequest, dict] = None, *, parent: str = None, backup: gsad_backup.Backup = None, @@ -1347,7 +1344,7 @@ def create_backup( databases can run concurrently. Args: - request (google.cloud.spanner_admin_database_v1.types.CreateBackupRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.CreateBackupRequest, dict]): The request object. The request for [CreateBackup][google.spanner.admin.database.v1.DatabaseAdmin.CreateBackup]. parent (str): @@ -1442,7 +1439,7 @@ def create_backup( def get_backup( self, - request: backup.GetBackupRequest = None, + request: Union[backup.GetBackupRequest, dict] = None, *, name: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -1453,7 +1450,7 @@ def get_backup( [Backup][google.spanner.admin.database.v1.Backup]. Args: - request (google.cloud.spanner_admin_database_v1.types.GetBackupRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.GetBackupRequest, dict]): The request object. The request for [GetBackup][google.spanner.admin.database.v1.DatabaseAdmin.GetBackup]. name (str): @@ -1512,7 +1509,7 @@ def get_backup( def update_backup( self, - request: gsad_backup.UpdateBackupRequest = None, + request: Union[gsad_backup.UpdateBackupRequest, dict] = None, *, backup: gsad_backup.Backup = None, update_mask: field_mask_pb2.FieldMask = None, @@ -1524,7 +1521,7 @@ def update_backup( [Backup][google.spanner.admin.database.v1.Backup]. Args: - request (google.cloud.spanner_admin_database_v1.types.UpdateBackupRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.UpdateBackupRequest, dict]): The request object. The request for [UpdateBackup][google.spanner.admin.database.v1.DatabaseAdmin.UpdateBackup]. backup (google.cloud.spanner_admin_database_v1.types.Backup): @@ -1603,7 +1600,7 @@ def update_backup( def delete_backup( self, - request: backup.DeleteBackupRequest = None, + request: Union[backup.DeleteBackupRequest, dict] = None, *, name: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -1614,7 +1611,7 @@ def delete_backup( [Backup][google.spanner.admin.database.v1.Backup]. Args: - request (google.cloud.spanner_admin_database_v1.types.DeleteBackupRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.DeleteBackupRequest, dict]): The request object. The request for [DeleteBackup][google.spanner.admin.database.v1.DatabaseAdmin.DeleteBackup]. name (str): @@ -1669,7 +1666,7 @@ def delete_backup( def list_backups( self, - request: backup.ListBackupsRequest = None, + request: Union[backup.ListBackupsRequest, dict] = None, *, parent: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -1681,7 +1678,7 @@ def list_backups( the most recent ``create_time``. Args: - request (google.cloud.spanner_admin_database_v1.types.ListBackupsRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.ListBackupsRequest, dict]): The request object. The request for [ListBackups][google.spanner.admin.database.v1.DatabaseAdmin.ListBackups]. parent (str): @@ -1751,7 +1748,7 @@ def list_backups( def restore_database( self, - request: spanner_database_admin.RestoreDatabaseRequest = None, + request: Union[spanner_database_admin.RestoreDatabaseRequest, dict] = None, *, parent: str = None, database_id: str = None, @@ -1781,7 +1778,7 @@ def restore_database( first restore to complete. Args: - request (google.cloud.spanner_admin_database_v1.types.RestoreDatabaseRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.RestoreDatabaseRequest, dict]): The request object. The request for [RestoreDatabase][google.spanner.admin.database.v1.DatabaseAdmin.RestoreDatabase]. parent (str): @@ -1878,7 +1875,9 @@ def restore_database( def list_database_operations( self, - request: spanner_database_admin.ListDatabaseOperationsRequest = None, + request: Union[ + spanner_database_admin.ListDatabaseOperationsRequest, dict + ] = None, *, parent: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -1897,7 +1896,7 @@ def list_database_operations( operations. Args: - request (google.cloud.spanner_admin_database_v1.types.ListDatabaseOperationsRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.ListDatabaseOperationsRequest, dict]): The request object. The request for [ListDatabaseOperations][google.spanner.admin.database.v1.DatabaseAdmin.ListDatabaseOperations]. parent (str): @@ -1970,7 +1969,7 @@ def list_database_operations( def list_backup_operations( self, - request: backup.ListBackupOperationsRequest = None, + request: Union[backup.ListBackupOperationsRequest, dict] = None, *, parent: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -1991,7 +1990,7 @@ def list_backup_operations( order starting from the most recently started operation. Args: - request (google.cloud.spanner_admin_database_v1.types.ListBackupOperationsRequest): + request (Union[google.cloud.spanner_admin_database_v1.types.ListBackupOperationsRequest, dict]): The request object. The request for [ListBackupOperations][google.spanner.admin.database.v1.DatabaseAdmin.ListBackupOperations]. parent (str): @@ -2060,6 +2059,19 @@ def list_backup_operations( # 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/spanner_admin_database_v1/services/database_admin/pagers.py b/google/cloud/spanner_admin_database_v1/services/database_admin/pagers.py index 552f761751..a14ed07855 100644 --- a/google/cloud/spanner_admin_database_v1/services/database_admin/pagers.py +++ b/google/cloud/spanner_admin_database_v1/services/database_admin/pagers.py @@ -15,13 +15,13 @@ # from typing import ( Any, - AsyncIterable, + AsyncIterator, Awaitable, Callable, - Iterable, Sequence, Tuple, Optional, + Iterator, ) from google.cloud.spanner_admin_database_v1.types import backup @@ -76,14 +76,14 @@ def __getattr__(self, name: str) -> Any: return getattr(self._response, name) @property - def pages(self) -> Iterable[spanner_database_admin.ListDatabasesResponse]: + def pages(self) -> Iterator[spanner_database_admin.ListDatabasesResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = self._method(self._request, metadata=self._metadata) yield self._response - def __iter__(self) -> Iterable[spanner_database_admin.Database]: + def __iter__(self) -> Iterator[spanner_database_admin.Database]: for page in self.pages: yield from page.databases @@ -140,14 +140,14 @@ def __getattr__(self, name: str) -> Any: @property async def pages( self, - ) -> AsyncIterable[spanner_database_admin.ListDatabasesResponse]: + ) -> AsyncIterator[spanner_database_admin.ListDatabasesResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = await self._method(self._request, metadata=self._metadata) yield self._response - def __aiter__(self) -> AsyncIterable[spanner_database_admin.Database]: + def __aiter__(self) -> AsyncIterator[spanner_database_admin.Database]: async def async_generator(): async for page in self.pages: for response in page.databases: @@ -206,14 +206,14 @@ def __getattr__(self, name: str) -> Any: return getattr(self._response, name) @property - def pages(self) -> Iterable[backup.ListBackupsResponse]: + def pages(self) -> Iterator[backup.ListBackupsResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = self._method(self._request, metadata=self._metadata) yield self._response - def __iter__(self) -> Iterable[backup.Backup]: + def __iter__(self) -> Iterator[backup.Backup]: for page in self.pages: yield from page.backups @@ -268,14 +268,14 @@ def __getattr__(self, name: str) -> Any: return getattr(self._response, name) @property - async def pages(self) -> AsyncIterable[backup.ListBackupsResponse]: + async def pages(self) -> AsyncIterator[backup.ListBackupsResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = await self._method(self._request, metadata=self._metadata) yield self._response - def __aiter__(self) -> AsyncIterable[backup.Backup]: + def __aiter__(self) -> AsyncIterator[backup.Backup]: async def async_generator(): async for page in self.pages: for response in page.backups: @@ -334,14 +334,14 @@ def __getattr__(self, name: str) -> Any: return getattr(self._response, name) @property - def pages(self) -> Iterable[spanner_database_admin.ListDatabaseOperationsResponse]: + def pages(self) -> Iterator[spanner_database_admin.ListDatabaseOperationsResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = self._method(self._request, metadata=self._metadata) yield self._response - def __iter__(self) -> Iterable[operations_pb2.Operation]: + def __iter__(self) -> Iterator[operations_pb2.Operation]: for page in self.pages: yield from page.operations @@ -400,14 +400,14 @@ def __getattr__(self, name: str) -> Any: @property async def pages( self, - ) -> AsyncIterable[spanner_database_admin.ListDatabaseOperationsResponse]: + ) -> AsyncIterator[spanner_database_admin.ListDatabaseOperationsResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = await self._method(self._request, metadata=self._metadata) yield self._response - def __aiter__(self) -> AsyncIterable[operations_pb2.Operation]: + def __aiter__(self) -> AsyncIterator[operations_pb2.Operation]: async def async_generator(): async for page in self.pages: for response in page.operations: @@ -466,14 +466,14 @@ def __getattr__(self, name: str) -> Any: return getattr(self._response, name) @property - def pages(self) -> Iterable[backup.ListBackupOperationsResponse]: + def pages(self) -> Iterator[backup.ListBackupOperationsResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = self._method(self._request, metadata=self._metadata) yield self._response - def __iter__(self) -> Iterable[operations_pb2.Operation]: + def __iter__(self) -> Iterator[operations_pb2.Operation]: for page in self.pages: yield from page.operations @@ -528,14 +528,14 @@ def __getattr__(self, name: str) -> Any: return getattr(self._response, name) @property - async def pages(self) -> AsyncIterable[backup.ListBackupOperationsResponse]: + async def pages(self) -> AsyncIterator[backup.ListBackupOperationsResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = await self._method(self._request, metadata=self._metadata) yield self._response - def __aiter__(self) -> AsyncIterable[operations_pb2.Operation]: + def __aiter__(self) -> AsyncIterator[operations_pb2.Operation]: async def async_generator(): async for page in self.pages: for response in page.operations: diff --git a/google/cloud/spanner_admin_database_v1/services/database_admin/transports/base.py b/google/cloud/spanner_admin_database_v1/services/database_admin/transports/base.py index ec8cafa77f..097f7fdf2e 100644 --- a/google/cloud/spanner_admin_database_v1/services/database_admin/transports/base.py +++ b/google/cloud/spanner_admin_database_v1/services/database_admin/transports/base.py @@ -127,7 +127,7 @@ def __init__( **scopes_kwargs, quota_project_id=quota_project_id ) - # If the credentials is service account credentials, then always try to use self signed JWT. + # If the credentials are service account credentials, then always try to use self signed JWT. if ( always_use_jwt_access and isinstance(credentials, service_account.Credentials) @@ -363,6 +363,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/spanner_admin_database_v1/services/database_admin/transports/grpc.py b/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc.py index 00c46cf906..d79cb010e1 100644 --- a/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc.py +++ b/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc.py @@ -92,16 +92,16 @@ def __init__( api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. If provided, it overrides the ``host`` argument and tries to create a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or applicatin default SSL credentials. + ``client_cert_source`` or application default SSL credentials. client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): Deprecated. A callback to provide client SSL certificate bytes and private key bytes, both in PEM format. It is ignored if ``api_mtls_endpoint`` is None. ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for grpc channel. It is ignored if ``channel`` is provided. + for the grpc channel. It is ignored if ``channel`` is provided. client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure mutual TLS channel. It is + both in PEM format. It is used to configure a mutual TLS channel. It is ignored if ``channel`` or ``ssl_channel_credentials`` is provided. quota_project_id (Optional[str]): An optional project to use for billing and quota. @@ -815,5 +815,8 @@ def list_backup_operations( ) return self._stubs["list_backup_operations"] + def close(self): + self.grpc_channel.close() + __all__ = ("DatabaseAdminGrpcTransport",) diff --git a/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc_asyncio.py b/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc_asyncio.py index 49832746ea..2c5ef601af 100644 --- a/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc_asyncio.py +++ b/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc_asyncio.py @@ -139,16 +139,16 @@ def __init__( api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. If provided, it overrides the ``host`` argument and tries to create a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or applicatin default SSL credentials. + ``client_cert_source`` or application default SSL credentials. client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): Deprecated. A callback to provide client SSL certificate bytes and private key bytes, both in PEM format. It is ignored if ``api_mtls_endpoint`` is None. ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for grpc channel. It is ignored if ``channel`` is provided. + for the grpc channel. It is ignored if ``channel`` is provided. client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure mutual TLS channel. It is + both in PEM format. It is used to configure a mutual TLS channel. It is ignored if ``channel`` or ``ssl_channel_credentials`` is provided. quota_project_id (Optional[str]): An optional project to use for billing and quota. @@ -833,5 +833,8 @@ def list_backup_operations( ) return self._stubs["list_backup_operations"] + def close(self): + return self.grpc_channel.close() + __all__ = ("DatabaseAdminGrpcAsyncIOTransport",) diff --git a/google/cloud/spanner_admin_database_v1/types/backup.py b/google/cloud/spanner_admin_database_v1/types/backup.py index 0ddc815570..486503f344 100644 --- a/google/cloud/spanner_admin_database_v1/types/backup.py +++ b/google/cloud/spanner_admin_database_v1/types/backup.py @@ -42,6 +42,7 @@ class Backup(proto.Message): r"""A backup of a Cloud Spanner database. + Attributes: database (str): Required for the @@ -461,6 +462,7 @@ def raw_page(self): class BackupInfo(proto.Message): r"""Information about a backup. + Attributes: backup (str): Name of the backup. @@ -491,6 +493,7 @@ class BackupInfo(proto.Message): class CreateBackupEncryptionConfig(proto.Message): r"""Encryption configuration for the backup to create. + Attributes: encryption_type (google.cloud.spanner_admin_database_v1.types.CreateBackupEncryptionConfig.EncryptionType): Required. The encryption type of the backup. diff --git a/google/cloud/spanner_admin_database_v1/types/common.py b/google/cloud/spanner_admin_database_v1/types/common.py index 38020dcd4e..b0c47fdb66 100644 --- a/google/cloud/spanner_admin_database_v1/types/common.py +++ b/google/cloud/spanner_admin_database_v1/types/common.py @@ -47,6 +47,7 @@ class OperationProgress(proto.Message): class EncryptionConfig(proto.Message): r"""Encryption configuration for a Cloud Spanner database. + Attributes: kms_key_name (str): The Cloud KMS key to be used for encrypting and decrypting diff --git a/google/cloud/spanner_admin_database_v1/types/spanner_database_admin.py b/google/cloud/spanner_admin_database_v1/types/spanner_database_admin.py index e7aee2ac1e..2deae76895 100644 --- a/google/cloud/spanner_admin_database_v1/types/spanner_database_admin.py +++ b/google/cloud/spanner_admin_database_v1/types/spanner_database_admin.py @@ -55,6 +55,7 @@ class RestoreSourceType(proto.Enum): class RestoreInfo(proto.Message): r"""Information about the database restore. + Attributes: source_type (google.cloud.spanner_admin_database_v1.types.RestoreSourceType): The type of the restore source. @@ -71,6 +72,7 @@ class RestoreInfo(proto.Message): class Database(proto.Message): r"""A Cloud Spanner database. + Attributes: name (str): Required. The name of the database. Values are of the form @@ -547,6 +549,7 @@ class RestoreDatabaseRequest(proto.Message): class RestoreDatabaseEncryptionConfig(proto.Message): r"""Encryption configuration for the restored database. + Attributes: encryption_type (google.cloud.spanner_admin_database_v1.types.RestoreDatabaseEncryptionConfig.EncryptionType): Required. The encryption type of the restored diff --git a/google/cloud/spanner_admin_instance_v1/services/instance_admin/async_client.py b/google/cloud/spanner_admin_instance_v1/services/instance_admin/async_client.py index 2b52431771..1711f6f909 100644 --- a/google/cloud/spanner_admin_instance_v1/services/instance_admin/async_client.py +++ b/google/cloud/spanner_admin_instance_v1/services/instance_admin/async_client.py @@ -1275,6 +1275,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/spanner_admin_instance_v1/services/instance_admin/client.py b/google/cloud/spanner_admin_instance_v1/services/instance_admin/client.py index 2f6187e0a2..f7ff95654f 100644 --- a/google/cloud/spanner_admin_instance_v1/services/instance_admin/client.py +++ b/google/cloud/spanner_admin_instance_v1/services/instance_admin/client.py @@ -17,7 +17,7 @@ from distutils import util import os import re -from typing import Callable, Dict, Optional, Sequence, Tuple, Type, Union +from typing import Dict, Optional, Sequence, Tuple, Type, Union import pkg_resources from google.api_core import client_options as client_options_lib # type: ignore @@ -381,15 +381,12 @@ 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 list_instance_configs( self, - request: spanner_instance_admin.ListInstanceConfigsRequest = None, + request: Union[spanner_instance_admin.ListInstanceConfigsRequest, dict] = None, *, parent: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -400,7 +397,7 @@ def list_instance_configs( given project. Args: - request (google.cloud.spanner_admin_instance_v1.types.ListInstanceConfigsRequest): + request (Union[google.cloud.spanner_admin_instance_v1.types.ListInstanceConfigsRequest, dict]): The request object. The request for [ListInstanceConfigs][google.spanner.admin.instance.v1.InstanceAdmin.ListInstanceConfigs]. parent (str): @@ -471,7 +468,7 @@ def list_instance_configs( def get_instance_config( self, - request: spanner_instance_admin.GetInstanceConfigRequest = None, + request: Union[spanner_instance_admin.GetInstanceConfigRequest, dict] = None, *, name: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -482,7 +479,7 @@ def get_instance_config( configuration. Args: - request (google.cloud.spanner_admin_instance_v1.types.GetInstanceConfigRequest): + request (Union[google.cloud.spanner_admin_instance_v1.types.GetInstanceConfigRequest, dict]): The request object. The request for [GetInstanceConfigRequest][google.spanner.admin.instance.v1.InstanceAdmin.GetInstanceConfig]. name (str): @@ -546,7 +543,7 @@ def get_instance_config( def list_instances( self, - request: spanner_instance_admin.ListInstancesRequest = None, + request: Union[spanner_instance_admin.ListInstancesRequest, dict] = None, *, parent: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -556,7 +553,7 @@ def list_instances( r"""Lists all instances in the given project. Args: - request (google.cloud.spanner_admin_instance_v1.types.ListInstancesRequest): + request (Union[google.cloud.spanner_admin_instance_v1.types.ListInstancesRequest, dict]): The request object. The request for [ListInstances][google.spanner.admin.instance.v1.InstanceAdmin.ListInstances]. parent (str): @@ -627,7 +624,7 @@ def list_instances( def get_instance( self, - request: spanner_instance_admin.GetInstanceRequest = None, + request: Union[spanner_instance_admin.GetInstanceRequest, dict] = None, *, name: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -637,7 +634,7 @@ def get_instance( r"""Gets information about a particular instance. Args: - request (google.cloud.spanner_admin_instance_v1.types.GetInstanceRequest): + request (Union[google.cloud.spanner_admin_instance_v1.types.GetInstanceRequest, dict]): The request object. The request for [GetInstance][google.spanner.admin.instance.v1.InstanceAdmin.GetInstance]. name (str): @@ -699,7 +696,7 @@ def get_instance( def create_instance( self, - request: spanner_instance_admin.CreateInstanceRequest = None, + request: Union[spanner_instance_admin.CreateInstanceRequest, dict] = None, *, parent: str = None, instance_id: str = None, @@ -748,7 +745,7 @@ def create_instance( successful. Args: - request (google.cloud.spanner_admin_instance_v1.types.CreateInstanceRequest): + request (Union[google.cloud.spanner_admin_instance_v1.types.CreateInstanceRequest, dict]): The request object. The request for [CreateInstance][google.spanner.admin.instance.v1.InstanceAdmin.CreateInstance]. parent (str): @@ -841,7 +838,7 @@ def create_instance( def update_instance( self, - request: spanner_instance_admin.UpdateInstanceRequest = None, + request: Union[spanner_instance_admin.UpdateInstanceRequest, dict] = None, *, instance: spanner_instance_admin.Instance = None, field_mask: field_mask_pb2.FieldMask = None, @@ -896,7 +893,7 @@ def update_instance( [name][google.spanner.admin.instance.v1.Instance.name]. Args: - request (google.cloud.spanner_admin_instance_v1.types.UpdateInstanceRequest): + request (Union[google.cloud.spanner_admin_instance_v1.types.UpdateInstanceRequest, dict]): The request object. The request for [UpdateInstance][google.spanner.admin.instance.v1.InstanceAdmin.UpdateInstance]. instance (google.cloud.spanner_admin_instance_v1.types.Instance): @@ -988,7 +985,7 @@ def update_instance( def delete_instance( self, - request: spanner_instance_admin.DeleteInstanceRequest = None, + request: Union[spanner_instance_admin.DeleteInstanceRequest, dict] = None, *, name: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -1008,7 +1005,7 @@ def delete_instance( is permanently deleted. Args: - request (google.cloud.spanner_admin_instance_v1.types.DeleteInstanceRequest): + request (Union[google.cloud.spanner_admin_instance_v1.types.DeleteInstanceRequest, dict]): The request object. The request for [DeleteInstance][google.spanner.admin.instance.v1.InstanceAdmin.DeleteInstance]. name (str): @@ -1063,7 +1060,7 @@ def delete_instance( def set_iam_policy( self, - request: iam_policy_pb2.SetIamPolicyRequest = None, + request: Union[iam_policy_pb2.SetIamPolicyRequest, dict] = None, *, resource: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -1077,7 +1074,7 @@ def set_iam_policy( [resource][google.iam.v1.SetIamPolicyRequest.resource]. Args: - request (google.iam.v1.iam_policy_pb2.SetIamPolicyRequest): + request (Union[google.iam.v1.iam_policy_pb2.SetIamPolicyRequest, dict]): The request object. Request message for `SetIamPolicy` method. resource (str): @@ -1192,7 +1189,7 @@ def set_iam_policy( def get_iam_policy( self, - request: iam_policy_pb2.GetIamPolicyRequest = None, + request: Union[iam_policy_pb2.GetIamPolicyRequest, dict] = None, *, resource: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -1207,7 +1204,7 @@ def get_iam_policy( [resource][google.iam.v1.GetIamPolicyRequest.resource]. Args: - request (google.iam.v1.iam_policy_pb2.GetIamPolicyRequest): + request (Union[google.iam.v1.iam_policy_pb2.GetIamPolicyRequest, dict]): The request object. Request message for `GetIamPolicy` method. resource (str): @@ -1322,7 +1319,7 @@ def get_iam_policy( def test_iam_permissions( self, - request: iam_policy_pb2.TestIamPermissionsRequest = None, + request: Union[iam_policy_pb2.TestIamPermissionsRequest, dict] = None, *, resource: str = None, permissions: Sequence[str] = None, @@ -1339,7 +1336,7 @@ def test_iam_permissions( Cloud Project. Otherwise returns an empty set of permissions. Args: - request (google.iam.v1.iam_policy_pb2.TestIamPermissionsRequest): + request (Union[google.iam.v1.iam_policy_pb2.TestIamPermissionsRequest, dict]): The request object. Request message for `TestIamPermissions` method. resource (str): @@ -1408,6 +1405,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/spanner_admin_instance_v1/services/instance_admin/pagers.py b/google/cloud/spanner_admin_instance_v1/services/instance_admin/pagers.py index ba00792d47..670978ab27 100644 --- a/google/cloud/spanner_admin_instance_v1/services/instance_admin/pagers.py +++ b/google/cloud/spanner_admin_instance_v1/services/instance_admin/pagers.py @@ -15,13 +15,13 @@ # from typing import ( Any, - AsyncIterable, + AsyncIterator, Awaitable, Callable, - Iterable, Sequence, Tuple, Optional, + Iterator, ) from google.cloud.spanner_admin_instance_v1.types import spanner_instance_admin @@ -74,14 +74,14 @@ def __getattr__(self, name: str) -> Any: return getattr(self._response, name) @property - def pages(self) -> Iterable[spanner_instance_admin.ListInstanceConfigsResponse]: + def pages(self) -> Iterator[spanner_instance_admin.ListInstanceConfigsResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = self._method(self._request, metadata=self._metadata) yield self._response - def __iter__(self) -> Iterable[spanner_instance_admin.InstanceConfig]: + def __iter__(self) -> Iterator[spanner_instance_admin.InstanceConfig]: for page in self.pages: yield from page.instance_configs @@ -140,14 +140,14 @@ def __getattr__(self, name: str) -> Any: @property async def pages( self, - ) -> AsyncIterable[spanner_instance_admin.ListInstanceConfigsResponse]: + ) -> AsyncIterator[spanner_instance_admin.ListInstanceConfigsResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = await self._method(self._request, metadata=self._metadata) yield self._response - def __aiter__(self) -> AsyncIterable[spanner_instance_admin.InstanceConfig]: + def __aiter__(self) -> AsyncIterator[spanner_instance_admin.InstanceConfig]: async def async_generator(): async for page in self.pages: for response in page.instance_configs: @@ -206,14 +206,14 @@ def __getattr__(self, name: str) -> Any: return getattr(self._response, name) @property - def pages(self) -> Iterable[spanner_instance_admin.ListInstancesResponse]: + def pages(self) -> Iterator[spanner_instance_admin.ListInstancesResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = self._method(self._request, metadata=self._metadata) yield self._response - def __iter__(self) -> Iterable[spanner_instance_admin.Instance]: + def __iter__(self) -> Iterator[spanner_instance_admin.Instance]: for page in self.pages: yield from page.instances @@ -270,14 +270,14 @@ def __getattr__(self, name: str) -> Any: @property async def pages( self, - ) -> AsyncIterable[spanner_instance_admin.ListInstancesResponse]: + ) -> AsyncIterator[spanner_instance_admin.ListInstancesResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = await self._method(self._request, metadata=self._metadata) yield self._response - def __aiter__(self) -> AsyncIterable[spanner_instance_admin.Instance]: + def __aiter__(self) -> AsyncIterator[spanner_instance_admin.Instance]: async def async_generator(): async for page in self.pages: for response in page.instances: diff --git a/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/base.py b/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/base.py index 78ff62b585..0d9d7e477e 100644 --- a/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/base.py +++ b/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/base.py @@ -125,7 +125,7 @@ def __init__( **scopes_kwargs, quota_project_id=quota_project_id ) - # If the credentials is service account credentials, then always try to use self signed JWT. + # If the credentials are service account credentials, then always try to use self signed JWT. if ( always_use_jwt_access and isinstance(credentials, service_account.Credentials) @@ -268,6 +268,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/spanner_admin_instance_v1/services/instance_admin/transports/grpc.py b/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc.py index 6f2c4caa6e..6d0288696d 100644 --- a/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc.py +++ b/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc.py @@ -105,16 +105,16 @@ def __init__( api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. If provided, it overrides the ``host`` argument and tries to create a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or applicatin default SSL credentials. + ``client_cert_source`` or application default SSL credentials. client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): Deprecated. A callback to provide client SSL certificate bytes and private key bytes, both in PEM format. It is ignored if ``api_mtls_endpoint`` is None. ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for grpc channel. It is ignored if ``channel`` is provided. + for the grpc channel. It is ignored if ``channel`` is provided. client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure mutual TLS channel. It is + both in PEM format. It is used to configure a mutual TLS channel. It is ignored if ``channel`` or ``ssl_channel_credentials`` is provided. quota_project_id (Optional[str]): An optional project to use for billing and quota. @@ -651,5 +651,8 @@ def test_iam_permissions( ) return self._stubs["test_iam_permissions"] + def close(self): + self.grpc_channel.close() + __all__ = ("InstanceAdminGrpcTransport",) diff --git a/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc_asyncio.py b/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc_asyncio.py index 3e573e71c0..312b5846ed 100644 --- a/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc_asyncio.py +++ b/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc_asyncio.py @@ -152,16 +152,16 @@ def __init__( api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. If provided, it overrides the ``host`` argument and tries to create a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or applicatin default SSL credentials. + ``client_cert_source`` or application default SSL credentials. client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): Deprecated. A callback to provide client SSL certificate bytes and private key bytes, both in PEM format. It is ignored if ``api_mtls_endpoint`` is None. ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for grpc channel. It is ignored if ``channel`` is provided. + for the grpc channel. It is ignored if ``channel`` is provided. client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure mutual TLS channel. It is + both in PEM format. It is used to configure a mutual TLS channel. It is ignored if ``channel`` or ``ssl_channel_credentials`` is provided. quota_project_id (Optional[str]): An optional project to use for billing and quota. @@ -661,5 +661,8 @@ def test_iam_permissions( ) return self._stubs["test_iam_permissions"] + def close(self): + return self.grpc_channel.close() + __all__ = ("InstanceAdminGrpcAsyncIOTransport",) diff --git a/google/cloud/spanner_admin_instance_v1/types/spanner_instance_admin.py b/google/cloud/spanner_admin_instance_v1/types/spanner_instance_admin.py index e55a5961b0..51d4fbcc25 100644 --- a/google/cloud/spanner_admin_instance_v1/types/spanner_instance_admin.py +++ b/google/cloud/spanner_admin_instance_v1/types/spanner_instance_admin.py @@ -42,6 +42,7 @@ class ReplicaInfo(proto.Message): r""" + Attributes: location (str): The location of the serving resources, e.g. diff --git a/google/cloud/spanner_v1/services/spanner/async_client.py b/google/cloud/spanner_v1/services/spanner/async_client.py index 6b8e199b8f..d162c466c0 100644 --- a/google/cloud/spanner_v1/services/spanner/async_client.py +++ b/google/cloud/spanner_v1/services/spanner/async_client.py @@ -1440,6 +1440,12 @@ async def partition_read( # 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/spanner_v1/services/spanner/client.py b/google/cloud/spanner_v1/services/spanner/client.py index 0acc775d60..123707cf27 100644 --- a/google/cloud/spanner_v1/services/spanner/client.py +++ b/google/cloud/spanner_v1/services/spanner/client.py @@ -17,7 +17,7 @@ from distutils import util import os import re -from typing import Callable, Dict, Optional, Iterable, Sequence, Tuple, Type, Union +from typing import Dict, Optional, Iterable, Sequence, Tuple, Type, Union import pkg_resources from google.api_core import client_options as client_options_lib # type: ignore @@ -368,15 +368,12 @@ 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_session( self, - request: spanner.CreateSessionRequest = None, + request: Union[spanner.CreateSessionRequest, dict] = None, *, database: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -404,7 +401,7 @@ def create_session( periodically, e.g., ``"SELECT 1"``. Args: - request (google.cloud.spanner_v1.types.CreateSessionRequest): + request (Union[google.cloud.spanner_v1.types.CreateSessionRequest, dict]): The request object. The request for [CreateSession][google.spanner.v1.Spanner.CreateSession]. database (str): @@ -463,7 +460,7 @@ def create_session( def batch_create_sessions( self, - request: spanner.BatchCreateSessionsRequest = None, + request: Union[spanner.BatchCreateSessionsRequest, dict] = None, *, database: str = None, session_count: int = None, @@ -477,7 +474,7 @@ def batch_create_sessions( practices on session cache management. Args: - request (google.cloud.spanner_v1.types.BatchCreateSessionsRequest): + request (Union[google.cloud.spanner_v1.types.BatchCreateSessionsRequest, dict]): The request object. The request for [BatchCreateSessions][google.spanner.v1.Spanner.BatchCreateSessions]. database (str): @@ -552,7 +549,7 @@ def batch_create_sessions( def get_session( self, - request: spanner.GetSessionRequest = None, + request: Union[spanner.GetSessionRequest, dict] = None, *, name: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -564,7 +561,7 @@ def get_session( is still alive. Args: - request (google.cloud.spanner_v1.types.GetSessionRequest): + request (Union[google.cloud.spanner_v1.types.GetSessionRequest, dict]): The request object. The request for [GetSession][google.spanner.v1.Spanner.GetSession]. name (str): @@ -623,7 +620,7 @@ def get_session( def list_sessions( self, - request: spanner.ListSessionsRequest = None, + request: Union[spanner.ListSessionsRequest, dict] = None, *, database: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -633,7 +630,7 @@ def list_sessions( r"""Lists all sessions in a given database. Args: - request (google.cloud.spanner_v1.types.ListSessionsRequest): + request (Union[google.cloud.spanner_v1.types.ListSessionsRequest, dict]): The request object. The request for [ListSessions][google.spanner.v1.Spanner.ListSessions]. database (str): @@ -703,7 +700,7 @@ def list_sessions( def delete_session( self, - request: spanner.DeleteSessionRequest = None, + request: Union[spanner.DeleteSessionRequest, dict] = None, *, name: str = None, retry: retries.Retry = gapic_v1.method.DEFAULT, @@ -715,7 +712,7 @@ def delete_session( of any operations that are running with this session. Args: - request (google.cloud.spanner_v1.types.DeleteSessionRequest): + request (Union[google.cloud.spanner_v1.types.DeleteSessionRequest, dict]): The request object. The request for [DeleteSession][google.spanner.v1.Spanner.DeleteSession]. name (str): @@ -769,7 +766,7 @@ def delete_session( def execute_sql( self, - request: spanner.ExecuteSqlRequest = None, + request: Union[spanner.ExecuteSqlRequest, dict] = None, *, retry: retries.Retry = gapic_v1.method.DEFAULT, timeout: float = None, @@ -791,7 +788,7 @@ def execute_sql( instead. Args: - request (google.cloud.spanner_v1.types.ExecuteSqlRequest): + request (Union[google.cloud.spanner_v1.types.ExecuteSqlRequest, dict]): The request object. The request for [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql]. @@ -833,7 +830,7 @@ def execute_sql( def execute_streaming_sql( self, - request: spanner.ExecuteSqlRequest = None, + request: Union[spanner.ExecuteSqlRequest, dict] = None, *, retry: retries.Retry = gapic_v1.method.DEFAULT, timeout: float = None, @@ -847,7 +844,7 @@ def execute_streaming_sql( column value can exceed 10 MiB. Args: - request (google.cloud.spanner_v1.types.ExecuteSqlRequest): + request (Union[google.cloud.spanner_v1.types.ExecuteSqlRequest, dict]): The request object. The request for [ExecuteSql][google.spanner.v1.Spanner.ExecuteSql] and [ExecuteStreamingSql][google.spanner.v1.Spanner.ExecuteStreamingSql]. @@ -892,7 +889,7 @@ def execute_streaming_sql( def execute_batch_dml( self, - request: spanner.ExecuteBatchDmlRequest = None, + request: Union[spanner.ExecuteBatchDmlRequest, dict] = None, *, retry: retries.Retry = gapic_v1.method.DEFAULT, timeout: float = None, @@ -914,7 +911,7 @@ def execute_batch_dml( statements are not executed. Args: - request (google.cloud.spanner_v1.types.ExecuteBatchDmlRequest): + request (Union[google.cloud.spanner_v1.types.ExecuteBatchDmlRequest, dict]): The request object. The request for [ExecuteBatchDml][google.spanner.v1.Spanner.ExecuteBatchDml]. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -992,7 +989,7 @@ def execute_batch_dml( def read( self, - request: spanner.ReadRequest = None, + request: Union[spanner.ReadRequest, dict] = None, *, retry: retries.Retry = gapic_v1.method.DEFAULT, timeout: float = None, @@ -1015,7 +1012,7 @@ def read( instead. Args: - request (google.cloud.spanner_v1.types.ReadRequest): + request (Union[google.cloud.spanner_v1.types.ReadRequest, dict]): The request object. The request for [Read][google.spanner.v1.Spanner.Read] and [StreamingRead][google.spanner.v1.Spanner.StreamingRead]. @@ -1057,7 +1054,7 @@ def read( def streaming_read( self, - request: spanner.ReadRequest = None, + request: Union[spanner.ReadRequest, dict] = None, *, retry: retries.Retry = gapic_v1.method.DEFAULT, timeout: float = None, @@ -1071,7 +1068,7 @@ def streaming_read( exceed 10 MiB. Args: - request (google.cloud.spanner_v1.types.ReadRequest): + request (Union[google.cloud.spanner_v1.types.ReadRequest, dict]): The request object. The request for [Read][google.spanner.v1.Spanner.Read] and [StreamingRead][google.spanner.v1.Spanner.StreamingRead]. @@ -1116,7 +1113,7 @@ def streaming_read( def begin_transaction( self, - request: spanner.BeginTransactionRequest = None, + request: Union[spanner.BeginTransactionRequest, dict] = None, *, session: str = None, options: transaction.TransactionOptions = None, @@ -1131,7 +1128,7 @@ def begin_transaction( transaction as a side-effect. Args: - request (google.cloud.spanner_v1.types.BeginTransactionRequest): + request (Union[google.cloud.spanner_v1.types.BeginTransactionRequest, dict]): The request object. The request for [BeginTransaction][google.spanner.v1.Spanner.BeginTransaction]. session (str): @@ -1199,7 +1196,7 @@ def begin_transaction( def commit( self, - request: spanner.CommitRequest = None, + request: Union[spanner.CommitRequest, dict] = None, *, session: str = None, transaction_id: bytes = None, @@ -1227,7 +1224,7 @@ def commit( things as they are now. Args: - request (google.cloud.spanner_v1.types.CommitRequest): + request (Union[google.cloud.spanner_v1.types.CommitRequest, dict]): The request object. The request for [Commit][google.spanner.v1.Spanner.Commit]. session (str): @@ -1327,7 +1324,7 @@ def commit( def rollback( self, - request: spanner.RollbackRequest = None, + request: Union[spanner.RollbackRequest, dict] = None, *, session: str = None, transaction_id: bytes = None, @@ -1347,7 +1344,7 @@ def rollback( ``ABORTED``. Args: - request (google.cloud.spanner_v1.types.RollbackRequest): + request (Union[google.cloud.spanner_v1.types.RollbackRequest, dict]): The request object. The request for [Rollback][google.spanner.v1.Spanner.Rollback]. session (str): @@ -1410,7 +1407,7 @@ def rollback( def partition_query( self, - request: spanner.PartitionQueryRequest = None, + request: Union[spanner.PartitionQueryRequest, dict] = None, *, retry: retries.Retry = gapic_v1.method.DEFAULT, timeout: float = None, @@ -1432,7 +1429,7 @@ def partition_query( from the beginning. Args: - request (google.cloud.spanner_v1.types.PartitionQueryRequest): + request (Union[google.cloud.spanner_v1.types.PartitionQueryRequest, dict]): The request object. The request for [PartitionQuery][google.spanner.v1.Spanner.PartitionQuery] retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -1474,7 +1471,7 @@ def partition_query( def partition_read( self, - request: spanner.PartitionReadRequest = None, + request: Union[spanner.PartitionReadRequest, dict] = None, *, retry: retries.Retry = gapic_v1.method.DEFAULT, timeout: float = None, @@ -1499,7 +1496,7 @@ def partition_read( from the beginning. Args: - request (google.cloud.spanner_v1.types.PartitionReadRequest): + request (Union[google.cloud.spanner_v1.types.PartitionReadRequest, dict]): The request object. The request for [PartitionRead][google.spanner.v1.Spanner.PartitionRead] retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -1539,6 +1536,19 @@ def partition_read( # 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/spanner_v1/services/spanner/pagers.py b/google/cloud/spanner_v1/services/spanner/pagers.py index 4fea920f68..8b73b00fda 100644 --- a/google/cloud/spanner_v1/services/spanner/pagers.py +++ b/google/cloud/spanner_v1/services/spanner/pagers.py @@ -15,13 +15,13 @@ # from typing import ( Any, - AsyncIterable, + AsyncIterator, Awaitable, Callable, - Iterable, Sequence, Tuple, Optional, + Iterator, ) from google.cloud.spanner_v1.types import spanner @@ -74,14 +74,14 @@ def __getattr__(self, name: str) -> Any: return getattr(self._response, name) @property - def pages(self) -> Iterable[spanner.ListSessionsResponse]: + def pages(self) -> Iterator[spanner.ListSessionsResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = self._method(self._request, metadata=self._metadata) yield self._response - def __iter__(self) -> Iterable[spanner.Session]: + def __iter__(self) -> Iterator[spanner.Session]: for page in self.pages: yield from page.sessions @@ -136,14 +136,14 @@ def __getattr__(self, name: str) -> Any: return getattr(self._response, name) @property - async def pages(self) -> AsyncIterable[spanner.ListSessionsResponse]: + async def pages(self) -> AsyncIterator[spanner.ListSessionsResponse]: yield self._response while self._response.next_page_token: self._request.page_token = self._response.next_page_token self._response = await self._method(self._request, metadata=self._metadata) yield self._response - def __aiter__(self) -> AsyncIterable[spanner.Session]: + def __aiter__(self) -> AsyncIterator[spanner.Session]: async def async_generator(): async for page in self.pages: for response in page.sessions: diff --git a/google/cloud/spanner_v1/services/spanner/transports/base.py b/google/cloud/spanner_v1/services/spanner/transports/base.py index d230d79bc1..2a09c02013 100644 --- a/google/cloud/spanner_v1/services/spanner/transports/base.py +++ b/google/cloud/spanner_v1/services/spanner/transports/base.py @@ -122,7 +122,7 @@ def __init__( **scopes_kwargs, quota_project_id=quota_project_id ) - # If the credentials is service account credentials, then always try to use self signed JWT. + # If the credentials are service account credentials, then always try to use self signed JWT. if ( always_use_jwt_access and isinstance(credentials, service_account.Credentials) @@ -351,6 +351,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 create_session( self, diff --git a/google/cloud/spanner_v1/services/spanner/transports/grpc.py b/google/cloud/spanner_v1/services/spanner/transports/grpc.py index 66e9227290..48d8d28e97 100644 --- a/google/cloud/spanner_v1/services/spanner/transports/grpc.py +++ b/google/cloud/spanner_v1/services/spanner/transports/grpc.py @@ -86,16 +86,16 @@ def __init__( api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. If provided, it overrides the ``host`` argument and tries to create a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or applicatin default SSL credentials. + ``client_cert_source`` or application default SSL credentials. client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): Deprecated. A callback to provide client SSL certificate bytes and private key bytes, both in PEM format. It is ignored if ``api_mtls_endpoint`` is None. ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for grpc channel. It is ignored if ``channel`` is provided. + for the grpc channel. It is ignored if ``channel`` is provided. client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure mutual TLS channel. It is + both in PEM format. It is used to configure a mutual TLS channel. It is ignored if ``channel`` or ``ssl_channel_credentials`` is provided. quota_project_id (Optional[str]): An optional project to use for billing and quota. @@ -749,5 +749,8 @@ def partition_read( ) return self._stubs["partition_read"] + def close(self): + self.grpc_channel.close() + __all__ = ("SpannerGrpcTransport",) diff --git a/google/cloud/spanner_v1/services/spanner/transports/grpc_asyncio.py b/google/cloud/spanner_v1/services/spanner/transports/grpc_asyncio.py index ad78c2325e..f864e38e0f 100644 --- a/google/cloud/spanner_v1/services/spanner/transports/grpc_asyncio.py +++ b/google/cloud/spanner_v1/services/spanner/transports/grpc_asyncio.py @@ -133,16 +133,16 @@ def __init__( api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint. If provided, it overrides the ``host`` argument and tries to create a mutual TLS channel with client SSL credentials from - ``client_cert_source`` or applicatin default SSL credentials. + ``client_cert_source`` or application default SSL credentials. client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]): Deprecated. A callback to provide client SSL certificate bytes and private key bytes, both in PEM format. It is ignored if ``api_mtls_endpoint`` is None. ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials - for grpc channel. It is ignored if ``channel`` is provided. + for the grpc channel. It is ignored if ``channel`` is provided. client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]): A callback to provide client certificate bytes and private key bytes, - both in PEM format. It is used to configure mutual TLS channel. It is + both in PEM format. It is used to configure a mutual TLS channel. It is ignored if ``channel`` or ``ssl_channel_credentials`` is provided. quota_project_id (Optional[str]): An optional project to use for billing and quota. @@ -765,5 +765,8 @@ def partition_read( ) return self._stubs["partition_read"] + def close(self): + return self.grpc_channel.close() + __all__ = ("SpannerGrpcAsyncIOTransport",) diff --git a/google/cloud/spanner_v1/types/commit_response.py b/google/cloud/spanner_v1/types/commit_response.py index 1d20714bbd..1c9ccab0e8 100644 --- a/google/cloud/spanner_v1/types/commit_response.py +++ b/google/cloud/spanner_v1/types/commit_response.py @@ -23,6 +23,7 @@ class CommitResponse(proto.Message): r"""The response for [Commit][google.spanner.v1.Spanner.Commit]. + Attributes: commit_timestamp (google.protobuf.timestamp_pb2.Timestamp): The Cloud Spanner timestamp at which the @@ -35,6 +36,7 @@ class CommitResponse(proto.Message): class CommitStats(proto.Message): r"""Additional statistics about a commit. + Attributes: mutation_count (int): The total number of mutations for the transaction. Knowing diff --git a/google/cloud/spanner_v1/types/mutation.py b/google/cloud/spanner_v1/types/mutation.py index 632f77eaaf..00badf26a4 100644 --- a/google/cloud/spanner_v1/types/mutation.py +++ b/google/cloud/spanner_v1/types/mutation.py @@ -107,6 +107,7 @@ class Write(proto.Message): class Delete(proto.Message): r"""Arguments to [delete][google.spanner.v1.Mutation.delete] operations. + Attributes: table (str): Required. The table whose rows will be diff --git a/google/cloud/spanner_v1/types/spanner.py b/google/cloud/spanner_v1/types/spanner.py index bbfd28af92..1a8b82cc08 100644 --- a/google/cloud/spanner_v1/types/spanner.py +++ b/google/cloud/spanner_v1/types/spanner.py @@ -109,6 +109,7 @@ class BatchCreateSessionsResponse(proto.Message): class Session(proto.Message): r"""A session in the Cloud Spanner API. + Attributes: name (str): Output only. The name of the session. This is @@ -146,6 +147,7 @@ class Session(proto.Message): class GetSessionRequest(proto.Message): r"""The request for [GetSession][google.spanner.v1.Spanner.GetSession]. + Attributes: name (str): Required. The name of the session to @@ -227,6 +229,7 @@ class DeleteSessionRequest(proto.Message): class RequestOptions(proto.Message): r"""Common request options for various APIs. + Attributes: priority (google.cloud.spanner_v1.types.RequestOptions.Priority): Priority for the request. @@ -389,6 +392,7 @@ class QueryMode(proto.Enum): class QueryOptions(proto.Message): r"""Query optimizer configuration. + Attributes: optimizer_version (str): An option to control the selection of optimizer version. @@ -507,6 +511,7 @@ class ExecuteBatchDmlRequest(proto.Message): class Statement(proto.Message): r"""A single DML statement. + Attributes: sql (str): Required. The DML string. @@ -930,6 +935,7 @@ class BeginTransactionRequest(proto.Message): class CommitRequest(proto.Message): r"""The request for [Commit][google.spanner.v1.Spanner.Commit]. + Attributes: session (str): Required. The session in which the @@ -975,6 +981,7 @@ class CommitRequest(proto.Message): class RollbackRequest(proto.Message): r"""The request for [Rollback][google.spanner.v1.Spanner.Rollback]. + Attributes: session (str): Required. The session in which the diff --git a/google/cloud/spanner_v1/types/transaction.py b/google/cloud/spanner_v1/types/transaction.py index 42c71f65d1..7638585573 100644 --- a/google/cloud/spanner_v1/types/transaction.py +++ b/google/cloud/spanner_v1/types/transaction.py @@ -328,10 +328,12 @@ class TransactionOptions(proto.Message): class ReadWrite(proto.Message): r"""Message type to initiate a read-write transaction. Currently this transaction type has no options. - """ + + """ class PartitionedDml(proto.Message): - r"""Message type to initiate a Partitioned DML transaction. """ + r"""Message type to initiate a Partitioned DML transaction. + """ class ReadOnly(proto.Message): r"""Message type to initiate a read-only transaction. diff --git a/google/cloud/spanner_v1/types/type.py b/google/cloud/spanner_v1/types/type.py index 42754d974c..2c00626c7a 100644 --- a/google/cloud/spanner_v1/types/type.py +++ b/google/cloud/spanner_v1/types/type.py @@ -86,6 +86,7 @@ class StructType(proto.Message): class Field(proto.Message): r"""Message representing a single field of a struct. + Attributes: name (str): The name of the field. For reads, this is the column name. diff --git a/scripts/fixup_spanner_admin_database_v1_keywords.py b/scripts/fixup_spanner_admin_database_v1_keywords.py index 8a04d60b67..cc4c78d884 100644 --- a/scripts/fixup_spanner_admin_database_v1_keywords.py +++ b/scripts/fixup_spanner_admin_database_v1_keywords.py @@ -39,23 +39,23 @@ def partition( class spanner_admin_databaseCallTransformer(cst.CSTTransformer): CTRL_PARAMS: Tuple[str] = ('retry', 'timeout', 'metadata') METHOD_TO_PARAMS: Dict[str, Tuple[str]] = { - 'create_backup': ('parent', 'backup_id', 'backup', 'encryption_config', ), - 'create_database': ('parent', 'create_statement', 'extra_statements', 'encryption_config', ), - 'delete_backup': ('name', ), - 'drop_database': ('database', ), - 'get_backup': ('name', ), - 'get_database': ('name', ), - 'get_database_ddl': ('database', ), - 'get_iam_policy': ('resource', 'options', ), - 'list_backup_operations': ('parent', 'filter', 'page_size', 'page_token', ), - 'list_backups': ('parent', 'filter', 'page_size', 'page_token', ), - 'list_database_operations': ('parent', 'filter', 'page_size', 'page_token', ), - 'list_databases': ('parent', 'page_size', 'page_token', ), - 'restore_database': ('parent', 'database_id', 'backup', 'encryption_config', ), - 'set_iam_policy': ('resource', 'policy', ), - 'test_iam_permissions': ('resource', 'permissions', ), - 'update_backup': ('backup', 'update_mask', ), - 'update_database_ddl': ('database', 'statements', 'operation_id', ), + 'create_backup': ('parent', 'backup_id', 'backup', 'encryption_config', ), + 'create_database': ('parent', 'create_statement', 'extra_statements', 'encryption_config', ), + 'delete_backup': ('name', ), + 'drop_database': ('database', ), + 'get_backup': ('name', ), + 'get_database': ('name', ), + 'get_database_ddl': ('database', ), + 'get_iam_policy': ('resource', 'options', ), + 'list_backup_operations': ('parent', 'filter', 'page_size', 'page_token', ), + 'list_backups': ('parent', 'filter', 'page_size', 'page_token', ), + 'list_database_operations': ('parent', 'filter', 'page_size', 'page_token', ), + 'list_databases': ('parent', 'page_size', 'page_token', ), + 'restore_database': ('parent', 'database_id', 'backup', 'encryption_config', ), + 'set_iam_policy': ('resource', 'policy', ), + 'test_iam_permissions': ('resource', 'permissions', ), + 'update_backup': ('backup', 'update_mask', ), + 'update_database_ddl': ('database', 'statements', 'operation_id', ), } def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode: @@ -74,7 +74,7 @@ def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode: return updated kwargs, ctrl_kwargs = partition( - lambda a: not a.keyword.value in self.CTRL_PARAMS, + lambda a: a.keyword.value not in self.CTRL_PARAMS, kwargs ) diff --git a/scripts/fixup_spanner_admin_instance_v1_keywords.py b/scripts/fixup_spanner_admin_instance_v1_keywords.py index f52d1c5fe3..afbc7517bc 100644 --- a/scripts/fixup_spanner_admin_instance_v1_keywords.py +++ b/scripts/fixup_spanner_admin_instance_v1_keywords.py @@ -39,16 +39,16 @@ def partition( class spanner_admin_instanceCallTransformer(cst.CSTTransformer): CTRL_PARAMS: Tuple[str] = ('retry', 'timeout', 'metadata') METHOD_TO_PARAMS: Dict[str, Tuple[str]] = { - 'create_instance': ('parent', 'instance_id', 'instance', ), - 'delete_instance': ('name', ), - 'get_iam_policy': ('resource', 'options', ), - 'get_instance': ('name', 'field_mask', ), - 'get_instance_config': ('name', ), - 'list_instance_configs': ('parent', 'page_size', 'page_token', ), - 'list_instances': ('parent', 'page_size', 'page_token', 'filter', ), - 'set_iam_policy': ('resource', 'policy', ), - 'test_iam_permissions': ('resource', 'permissions', ), - 'update_instance': ('instance', 'field_mask', ), + 'create_instance': ('parent', 'instance_id', 'instance', ), + 'delete_instance': ('name', ), + 'get_iam_policy': ('resource', 'options', ), + 'get_instance': ('name', 'field_mask', ), + 'get_instance_config': ('name', ), + 'list_instance_configs': ('parent', 'page_size', 'page_token', ), + 'list_instances': ('parent', 'page_size', 'page_token', 'filter', ), + 'set_iam_policy': ('resource', 'policy', ), + 'test_iam_permissions': ('resource', 'permissions', ), + 'update_instance': ('instance', 'field_mask', ), } def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode: @@ -67,7 +67,7 @@ def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode: return updated kwargs, ctrl_kwargs = partition( - lambda a: not a.keyword.value in self.CTRL_PARAMS, + lambda a: a.keyword.value not in self.CTRL_PARAMS, kwargs ) diff --git a/scripts/fixup_spanner_v1_keywords.py b/scripts/fixup_spanner_v1_keywords.py index bff8352aa8..fec728843e 100644 --- a/scripts/fixup_spanner_v1_keywords.py +++ b/scripts/fixup_spanner_v1_keywords.py @@ -39,21 +39,21 @@ def partition( class spannerCallTransformer(cst.CSTTransformer): CTRL_PARAMS: Tuple[str] = ('retry', 'timeout', 'metadata') METHOD_TO_PARAMS: Dict[str, Tuple[str]] = { - 'batch_create_sessions': ('database', 'session_count', 'session_template', ), - 'begin_transaction': ('session', 'options', 'request_options', ), - 'commit': ('session', 'transaction_id', 'single_use_transaction', 'mutations', 'return_commit_stats', 'request_options', ), - 'create_session': ('database', 'session', ), - 'delete_session': ('name', ), - 'execute_batch_dml': ('session', 'transaction', 'statements', 'seqno', 'request_options', ), - 'execute_sql': ('session', 'sql', 'transaction', 'params', 'param_types', 'resume_token', 'query_mode', 'partition_token', 'seqno', 'query_options', 'request_options', ), - 'execute_streaming_sql': ('session', 'sql', 'transaction', 'params', 'param_types', 'resume_token', 'query_mode', 'partition_token', 'seqno', 'query_options', 'request_options', ), - 'get_session': ('name', ), - 'list_sessions': ('database', 'page_size', 'page_token', 'filter', ), - 'partition_query': ('session', 'sql', 'transaction', 'params', 'param_types', 'partition_options', ), - 'partition_read': ('session', 'table', 'key_set', 'transaction', 'index', 'columns', 'partition_options', ), - 'read': ('session', 'table', 'columns', 'key_set', 'transaction', 'index', 'limit', 'resume_token', 'partition_token', 'request_options', ), - 'rollback': ('session', 'transaction_id', ), - 'streaming_read': ('session', 'table', 'columns', 'key_set', 'transaction', 'index', 'limit', 'resume_token', 'partition_token', 'request_options', ), + 'batch_create_sessions': ('database', 'session_count', 'session_template', ), + 'begin_transaction': ('session', 'options', 'request_options', ), + 'commit': ('session', 'transaction_id', 'single_use_transaction', 'mutations', 'return_commit_stats', 'request_options', ), + 'create_session': ('database', 'session', ), + 'delete_session': ('name', ), + 'execute_batch_dml': ('session', 'transaction', 'statements', 'seqno', 'request_options', ), + 'execute_sql': ('session', 'sql', 'transaction', 'params', 'param_types', 'resume_token', 'query_mode', 'partition_token', 'seqno', 'query_options', 'request_options', ), + 'execute_streaming_sql': ('session', 'sql', 'transaction', 'params', 'param_types', 'resume_token', 'query_mode', 'partition_token', 'seqno', 'query_options', 'request_options', ), + 'get_session': ('name', ), + 'list_sessions': ('database', 'page_size', 'page_token', 'filter', ), + 'partition_query': ('session', 'sql', 'transaction', 'params', 'param_types', 'partition_options', ), + 'partition_read': ('session', 'table', 'key_set', 'transaction', 'index', 'columns', 'partition_options', ), + 'read': ('session', 'table', 'columns', 'key_set', 'transaction', 'index', 'limit', 'resume_token', 'partition_token', 'request_options', ), + 'rollback': ('session', 'transaction_id', ), + 'streaming_read': ('session', 'table', 'columns', 'key_set', 'transaction', 'index', 'limit', 'resume_token', 'partition_token', 'request_options', ), } def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode: @@ -72,7 +72,7 @@ def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode: return updated kwargs, ctrl_kwargs = partition( - lambda a: not a.keyword.value in self.CTRL_PARAMS, + lambda a: a.keyword.value not in self.CTRL_PARAMS, kwargs ) diff --git a/tests/unit/gapic/spanner_admin_database_v1/test_database_admin.py b/tests/unit/gapic/spanner_admin_database_v1/test_database_admin.py index 1ca405899b..b611b2ceeb 100644 --- a/tests/unit/gapic/spanner_admin_database_v1/test_database_admin.py +++ b/tests/unit/gapic/spanner_admin_database_v1/test_database_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.spanner_admin_database_v1.services.database_admin import ( @@ -4871,6 +4872,9 @@ def test_database_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): @@ -5511,3 +5515,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 = DatabaseAdminAsyncClient( + 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 = DatabaseAdminClient( + 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 = DatabaseAdminClient( + 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/spanner_admin_instance_v1/test_instance_admin.py b/tests/unit/gapic/spanner_admin_instance_v1/test_instance_admin.py index 567d56d3c6..8172c65757 100644 --- a/tests/unit/gapic/spanner_admin_instance_v1/test_instance_admin.py +++ b/tests/unit/gapic/spanner_admin_instance_v1/test_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.spanner_admin_instance_v1.services.instance_admin import ( @@ -3150,6 +3151,9 @@ def test_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): @@ -3702,3 +3706,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 = InstanceAdminAsyncClient( + 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 = InstanceAdminClient( + 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 = InstanceAdminClient( + 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/spanner_v1/test_spanner.py b/tests/unit/gapic/spanner_v1/test_spanner.py index 86557f33e4..e4fd8aee34 100644 --- a/tests/unit/gapic/spanner_v1/test_spanner.py +++ b/tests/unit/gapic/spanner_v1/test_spanner.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.spanner_v1.services.spanner import SpannerAsyncClient @@ -3270,6 +3271,9 @@ def test_spanner_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_spanner_base_transport_with_credentials_file(): @@ -3782,3 +3786,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 = SpannerAsyncClient( + 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 = SpannerClient( + 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 = SpannerClient( + 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()