diff --git a/CHANGELOG.md b/CHANGELOG.md index f2e2383..ee5bdf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +### [1.0.1](https://www.github.com/googleapis/python-essential-contacts/compare/v1.0.0...v1.0.1) (2021-11-01) + + +### Bug Fixes + +* **deps:** drop packaging dependency ([81ae849](https://www.github.com/googleapis/python-essential-contacts/commit/81ae849e2bf9dbd41f23c3846f3a54177e615ad5)) +* **deps:** require google-api-core >= 1.28.0 ([81ae849](https://www.github.com/googleapis/python-essential-contacts/commit/81ae849e2bf9dbd41f23c3846f3a54177e615ad5)) + + +### Documentation + +* list oneofs in docstring ([81ae849](https://www.github.com/googleapis/python-essential-contacts/commit/81ae849e2bf9dbd41f23c3846f3a54177e615ad5)) + ## [1.0.0](https://www.github.com/googleapis/python-essential-contacts/compare/v0.4.0...v1.0.0) (2021-10-25) diff --git a/google/cloud/essential_contacts_v1/services/essential_contacts_service/async_client.py b/google/cloud/essential_contacts_v1/services/essential_contacts_service/async_client.py index 74acae8..cbaad58 100644 --- a/google/cloud/essential_contacts_v1/services/essential_contacts_service/async_client.py +++ b/google/cloud/essential_contacts_v1/services/essential_contacts_service/async_client.py @@ -19,13 +19,15 @@ from typing import Dict, Sequence, Tuple, Type, Union import pkg_resources -import google.api_core.client_options as ClientOptions # type: ignore +from google.api_core.client_options import ClientOptions # type: ignore from google.api_core import exceptions as core_exceptions # type: ignore from google.api_core import gapic_v1 # type: ignore from google.api_core import retry as retries # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.cloud.essential_contacts_v1.services.essential_contacts_service import ( pagers, ) @@ -173,18 +175,18 @@ def __init__( async def create_contact( self, - request: service.CreateContactRequest = None, + request: Union[service.CreateContactRequest, dict] = None, *, parent: str = None, contact: service.Contact = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.Contact: r"""Adds a new contact for a resource. Args: - request (:class:`google.cloud.essential_contacts_v1.types.CreateContactRequest`): + request (Union[google.cloud.essential_contacts_v1.types.CreateContactRequest, dict]): The request object. Request message for the CreateContact method. parent (:class:`str`): @@ -256,11 +258,11 @@ async def create_contact( async def update_contact( self, - request: service.UpdateContactRequest = None, + request: Union[service.UpdateContactRequest, dict] = None, *, contact: service.Contact = None, update_mask: field_mask_pb2.FieldMask = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.Contact: @@ -268,7 +270,7 @@ async def update_contact( Note: A contact's email address cannot be changed. Args: - request (:class:`google.cloud.essential_contacts_v1.types.UpdateContactRequest`): + request (Union[google.cloud.essential_contacts_v1.types.UpdateContactRequest, dict]): The request object. Request message for the UpdateContact method. contact (:class:`google.cloud.essential_contacts_v1.types.Contact`): @@ -343,17 +345,17 @@ async def update_contact( async def list_contacts( self, - request: service.ListContactsRequest = None, + request: Union[service.ListContactsRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListContactsAsyncPager: r"""Lists the contacts that have been set on a resource. Args: - request (:class:`google.cloud.essential_contacts_v1.types.ListContactsRequest`): + request (Union[google.cloud.essential_contacts_v1.types.ListContactsRequest, dict]): The request object. Request message for the ListContacts method. parent (:class:`str`): @@ -433,17 +435,17 @@ async def list_contacts( async def get_contact( self, - request: service.GetContactRequest = None, + request: Union[service.GetContactRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.Contact: r"""Gets a single contact. Args: - request (:class:`google.cloud.essential_contacts_v1.types.GetContactRequest`): + request (Union[google.cloud.essential_contacts_v1.types.GetContactRequest, dict]): The request object. Request message for the GetContact method. name (:class:`str`): @@ -515,17 +517,17 @@ async def get_contact( async def delete_contact( self, - request: service.DeleteContactRequest = None, + request: Union[service.DeleteContactRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes a contact. Args: - request (:class:`google.cloud.essential_contacts_v1.types.DeleteContactRequest`): + request (Union[google.cloud.essential_contacts_v1.types.DeleteContactRequest, dict]): The request object. Request message for the DeleteContact method. name (:class:`str`): @@ -581,9 +583,9 @@ async def delete_contact( async def compute_contacts( self, - request: service.ComputeContactsRequest = None, + request: Union[service.ComputeContactsRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ComputeContactsAsyncPager: @@ -592,7 +594,7 @@ async def compute_contacts( including contacts inherited from any parent resources. Args: - request (:class:`google.cloud.essential_contacts_v1.types.ComputeContactsRequest`): + request (Union[google.cloud.essential_contacts_v1.types.ComputeContactsRequest, dict]): The request object. Request message for the ComputeContacts method. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -641,9 +643,9 @@ async def compute_contacts( async def send_test_message( self, - request: service.SendTestMessageRequest = None, + request: Union[service.SendTestMessageRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -651,7 +653,7 @@ async def send_test_message( contact to verify that it has been configured correctly. Args: - request (:class:`google.cloud.essential_contacts_v1.types.SendTestMessageRequest`): + request (Union[google.cloud.essential_contacts_v1.types.SendTestMessageRequest, dict]): The request object. Request message for the SendTestMessage method. retry (google.api_core.retry.Retry): Designation of what errors, if any, diff --git a/google/cloud/essential_contacts_v1/services/essential_contacts_service/client.py b/google/cloud/essential_contacts_v1/services/essential_contacts_service/client.py index d56859b..845ffbc 100644 --- a/google/cloud/essential_contacts_v1/services/essential_contacts_service/client.py +++ b/google/cloud/essential_contacts_v1/services/essential_contacts_service/client.py @@ -30,6 +30,8 @@ from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.oauth2 import service_account # type: ignore +OptionalRetry = Union[retries.Retry, object] + from google.cloud.essential_contacts_v1.services.essential_contacts_service import ( pagers, ) @@ -357,7 +359,7 @@ def create_contact( *, parent: str = None, contact: service.Contact = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.Contact: @@ -440,7 +442,7 @@ def update_contact( *, contact: service.Contact = None, update_mask: field_mask_pb2.FieldMask = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.Contact: @@ -526,7 +528,7 @@ def list_contacts( request: Union[service.ListContactsRequest, dict] = None, *, parent: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListContactsPager: @@ -607,7 +609,7 @@ def get_contact( request: Union[service.GetContactRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> service.Contact: @@ -680,7 +682,7 @@ def delete_contact( request: Union[service.DeleteContactRequest, dict] = None, *, name: str = None, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: @@ -745,7 +747,7 @@ def compute_contacts( self, request: Union[service.ComputeContactsRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ComputeContactsPager: @@ -806,7 +808,7 @@ def send_test_message( self, request: Union[service.SendTestMessageRequest, dict] = None, *, - retry: retries.Retry = gapic_v1.method.DEFAULT, + retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: float = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: diff --git a/google/cloud/essential_contacts_v1/services/essential_contacts_service/transports/base.py b/google/cloud/essential_contacts_v1/services/essential_contacts_service/transports/base.py index 63a04a2..a27012a 100644 --- a/google/cloud/essential_contacts_v1/services/essential_contacts_service/transports/base.py +++ b/google/cloud/essential_contacts_v1/services/essential_contacts_service/transports/base.py @@ -15,7 +15,6 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import packaging.version import pkg_resources import google.auth # type: ignore @@ -38,15 +37,6 @@ except pkg_resources.DistributionNotFound: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo() -try: - # google.auth.__version__ was added in 1.26.0 - _GOOGLE_AUTH_VERSION = google.auth.__version__ -except AttributeError: - try: # try pkg_resources if it is available - _GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version - except pkg_resources.DistributionNotFound: # pragma: NO COVER - _GOOGLE_AUTH_VERSION = None - class EssentialContactsServiceTransport(abc.ABC): """Abstract transport class for EssentialContactsService.""" @@ -96,7 +86,7 @@ def __init__( host += ":443" self._host = host - scopes_kwargs = self._get_scopes_kwargs(self._host, scopes) + scopes_kwargs = {"scopes": scopes, "default_scopes": self.AUTH_SCOPES} # Save the scopes. self._scopes = scopes @@ -129,29 +119,6 @@ def __init__( # Save the credentials. self._credentials = credentials - # TODO(busunkim): This method is in the base transport - # to avoid duplicating code across the transport classes. These functions - # should be deleted once the minimum required versions of google-auth is increased. - - # TODO: Remove this function once google-auth >= 1.25.0 is required - @classmethod - def _get_scopes_kwargs( - cls, host: str, scopes: Optional[Sequence[str]] - ) -> Dict[str, Optional[Sequence[str]]]: - """Returns scopes kwargs to pass to google-auth methods depending on the google-auth version""" - - scopes_kwargs = {} - - if _GOOGLE_AUTH_VERSION and ( - packaging.version.parse(_GOOGLE_AUTH_VERSION) - >= packaging.version.parse("1.25.0") - ): - scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES} - else: - scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES} - - return scopes_kwargs - def _prep_wrapped_messages(self, client_info): # Precompute the wrapped methods. self._wrapped_methods = { diff --git a/google/cloud/essential_contacts_v1/services/essential_contacts_service/transports/grpc_asyncio.py b/google/cloud/essential_contacts_v1/services/essential_contacts_service/transports/grpc_asyncio.py index c2ea2df..57ec8bd 100644 --- a/google/cloud/essential_contacts_v1/services/essential_contacts_service/transports/grpc_asyncio.py +++ b/google/cloud/essential_contacts_v1/services/essential_contacts_service/transports/grpc_asyncio.py @@ -20,7 +20,6 @@ from google.api_core import grpc_helpers_async # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore -import packaging.version import grpc # type: ignore from grpc.experimental import aio # type: ignore diff --git a/setup.py b/setup.py index dbb6102..52aeb7a 100644 --- a/setup.py +++ b/setup.py @@ -19,15 +19,14 @@ name = "google-cloud-essential-contacts" description = "Essential Contacts API client library" -version = "1.0.0" +version = "1.0.1" release_status = "Development Status :: 5 - Production/Stable" dependencies = [ # NOTE: Maintainers, please do not require google-api-core>=2.x.x # Until this issue is closed # https://github.com/googleapis/google-cloud-python/issues/10566 - "google-api-core[grpc] >= 1.26.0, <3.0.0dev", + "google-api-core[grpc] >= 1.28.0, <3.0.0dev", "proto-plus >= 1.15.0", - "packaging >= 14.3", ] package_root = os.path.abspath(os.path.dirname(__file__)) diff --git a/testing/constraints-3.6.txt b/testing/constraints-3.6.txt index aa6a0b9..aff6bee 100644 --- a/testing/constraints-3.6.txt +++ b/testing/constraints-3.6.txt @@ -5,7 +5,5 @@ # # e.g., if setup.py has "foo >= 1.14.0, < 2.0.0dev", # Then this file should have foo==1.14.0 -google-api-core==1.26.0 +google-api-core==1.28.0 proto-plus==1.15.0 -packaging==14.3 -google-auth==1.24.0 # TODO: remove when google-auth>=1.25.0 is transitively required through google-api-core \ No newline at end of file diff --git a/tests/unit/gapic/essential_contacts_v1/test_essential_contacts_service.py b/tests/unit/gapic/essential_contacts_v1/test_essential_contacts_service.py index ad500b8..222530b 100644 --- a/tests/unit/gapic/essential_contacts_v1/test_essential_contacts_service.py +++ b/tests/unit/gapic/essential_contacts_v1/test_essential_contacts_service.py @@ -15,7 +15,6 @@ # import os import mock -import packaging.version import grpc from grpc.experimental import aio @@ -44,9 +43,6 @@ from google.cloud.essential_contacts_v1.services.essential_contacts_service import ( transports, ) -from google.cloud.essential_contacts_v1.services.essential_contacts_service.transports.base import ( - _GOOGLE_AUTH_VERSION, -) from google.cloud.essential_contacts_v1.types import enums from google.cloud.essential_contacts_v1.types import service from google.oauth2 import service_account @@ -55,20 +51,6 @@ import google.auth -# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively -# through google-api-core: -# - Delete the auth "less than" test cases -# - Delete these pytest markers (Make the "greater than or equal to" tests the default). -requires_google_auth_lt_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"), - reason="This test requires google-auth < 1.25.0", -) -requires_google_auth_gte_1_25_0 = pytest.mark.skipif( - packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"), - reason="This test requires google-auth >= 1.25.0", -) - - def client_cert_source_callback(): return b"cert bytes", b"key bytes" @@ -236,7 +218,7 @@ def test_essential_contacts_service_client_client_options( options = client_options.ClientOptions(api_endpoint="squid.clam.whelk") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -253,7 +235,7 @@ def test_essential_contacts_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -270,7 +252,7 @@ def test_essential_contacts_service_client_client_options( with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}): with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -299,7 +281,7 @@ def test_essential_contacts_service_client_client_options( options = client_options.ClientOptions(quota_project_id="octopus") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -368,7 +350,7 @@ def test_essential_contacts_service_client_mtls_env_auto( ) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) if use_client_cert_env == "false": expected_client_cert_source = None @@ -410,7 +392,7 @@ def test_essential_contacts_service_client_mtls_env_auto( expected_client_cert_source = client_cert_source_callback patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -432,7 +414,7 @@ def test_essential_contacts_service_client_mtls_env_auto( return_value=False, ): patched.return_value = None - client = client_class() + client = client_class(transport=transport_name) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -467,7 +449,7 @@ def test_essential_contacts_service_client_client_options_scopes( options = client_options.ClientOptions(scopes=["1", "2"],) with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file=None, @@ -502,7 +484,7 @@ def test_essential_contacts_service_client_client_options_credentials_file( options = client_options.ClientOptions(credentials_file="credentials.json") with mock.patch.object(transport_class, "__init__") as patched: patched.return_value = None - client = client_class(client_options=options) + client = client_class(transport=transport_name, client_options=options) patched.assert_called_once_with( credentials=None, credentials_file="credentials.json", @@ -2308,7 +2290,6 @@ def test_essential_contacts_service_base_transport(): transport.close() -@requires_google_auth_gte_1_25_0 def test_essential_contacts_service_base_transport_with_credentials_file(): # Instantiate the base transport with a credentials file with mock.patch.object( @@ -2329,26 +2310,6 @@ def test_essential_contacts_service_base_transport_with_credentials_file(): ) -@requires_google_auth_lt_1_25_0 -def test_essential_contacts_service_base_transport_with_credentials_file_old_google_auth(): - # Instantiate the base transport with a credentials file - with mock.patch.object( - google.auth, "load_credentials_from_file", autospec=True - ) as load_creds, mock.patch( - "google.cloud.essential_contacts_v1.services.essential_contacts_service.transports.EssentialContactsServiceTransport._prep_wrapped_messages" - ) as Transport: - Transport.return_value = None - load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) - transport = transports.EssentialContactsServiceTransport( - credentials_file="credentials.json", quota_project_id="octopus", - ) - load_creds.assert_called_once_with( - "credentials.json", - scopes=("https://www.googleapis.com/auth/cloud-platform",), - quota_project_id="octopus", - ) - - def test_essential_contacts_service_base_transport_with_adc(): # Test the default credentials are used if credentials and credentials_file are None. with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch( @@ -2360,7 +2321,6 @@ def test_essential_contacts_service_base_transport_with_adc(): adc.assert_called_once() -@requires_google_auth_gte_1_25_0 def test_essential_contacts_service_auth_adc(): # If no credentials are provided, we should use ADC credentials. with mock.patch.object(google.auth, "default", autospec=True) as adc: @@ -2373,18 +2333,6 @@ def test_essential_contacts_service_auth_adc(): ) -@requires_google_auth_lt_1_25_0 -def test_essential_contacts_service_auth_adc_old_google_auth(): - # If no credentials are provided, we should use ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - EssentialContactsServiceClient() - adc.assert_called_once_with( - scopes=("https://www.googleapis.com/auth/cloud-platform",), - quota_project_id=None, - ) - - @pytest.mark.parametrize( "transport_class", [ @@ -2392,7 +2340,6 @@ def test_essential_contacts_service_auth_adc_old_google_auth(): transports.EssentialContactsServiceGrpcAsyncIOTransport, ], ) -@requires_google_auth_gte_1_25_0 def test_essential_contacts_service_transport_auth_adc(transport_class): # If credentials and host are not provided, the transport class should use # ADC credentials. @@ -2406,26 +2353,6 @@ def test_essential_contacts_service_transport_auth_adc(transport_class): ) -@pytest.mark.parametrize( - "transport_class", - [ - transports.EssentialContactsServiceGrpcTransport, - transports.EssentialContactsServiceGrpcAsyncIOTransport, - ], -) -@requires_google_auth_lt_1_25_0 -def test_essential_contacts_service_transport_auth_adc_old_google_auth(transport_class): - # If credentials and host are not provided, the transport class should use - # ADC credentials. - with mock.patch.object(google.auth, "default", autospec=True) as adc: - adc.return_value = (ga_credentials.AnonymousCredentials(), None) - transport_class(quota_project_id="octopus") - adc.assert_called_once_with( - scopes=("https://www.googleapis.com/auth/cloud-platform",), - quota_project_id="octopus", - ) - - @pytest.mark.parametrize( "transport_class,grpc_helpers", [