diff --git a/.flake8 b/.flake8 index 29227d4..2e43874 100644 --- a/.flake8 +++ b/.flake8 @@ -16,7 +16,7 @@ # Generated by synthtool. DO NOT EDIT! [flake8] -ignore = E203, E266, E501, W503 +ignore = E203, E231, E266, E501, W503 exclude = # Exclude generated code. **/proto/** diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index 44c78f7..757c9dc 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:4e1991042fe54b991db9ca17c8fb386e61b22fe4d1472a568bf0fcac85dcf5d3 + digest: sha256:81ed5ecdfc7cac5b699ba4537376f3563f6f04122c4ec9e735d3b3dc1d43dd32 +# created: 2022-05-05T22:08:23.383410683Z diff --git a/.github/auto-approve.yml b/.github/auto-approve.yml new file mode 100644 index 0000000..311ebbb --- /dev/null +++ b/.github/auto-approve.yml @@ -0,0 +1,3 @@ +# https://github.com/googleapis/repo-automation-bots/tree/main/packages/auto-approve +processes: + - "OwlBotTemplateChanges" diff --git a/.github/auto-label.yaml b/.github/auto-label.yaml new file mode 100644 index 0000000..41bff0b --- /dev/null +++ b/.github/auto-label.yaml @@ -0,0 +1,15 @@ +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +requestsize: + enabled: true diff --git a/.github/release-please.yml b/.github/release-please.yml index 466597e..6def37a 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -1,2 +1,8 @@ releaseType: python handleGHRelease: true +# NOTE: this section is generated by synthtool.languages.python +# See https://github.com/googleapis/synthtool/blob/master/synthtool/languages/python.py +branches: +- branch: v0 + handleGHRelease: true + releaseType: python diff --git a/.kokoro/docker/docs/Dockerfile b/.kokoro/docker/docs/Dockerfile index 4e1b1fb..238b87b 100644 --- a/.kokoro/docker/docs/Dockerfile +++ b/.kokoro/docker/docs/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from ubuntu:20.04 +from ubuntu:22.04 ENV DEBIAN_FRONTEND noninteractive @@ -60,8 +60,24 @@ RUN apt-get update \ && rm -rf /var/lib/apt/lists/* \ && rm -f /var/cache/apt/archives/*.deb +###################### Install python 3.8.11 + +# Download python 3.8.11 +RUN wget https://www.python.org/ftp/python/3.8.11/Python-3.8.11.tgz + +# Extract files +RUN tar -xvf Python-3.8.11.tgz + +# Install python 3.8.11 +RUN ./Python-3.8.11/configure --enable-optimizations +RUN make altinstall + +###################### Install pip RUN wget -O /tmp/get-pip.py 'https://bootstrap.pypa.io/get-pip.py' \ - && python3.8 /tmp/get-pip.py \ + && python3 /tmp/get-pip.py \ && rm /tmp/get-pip.py +# Test pip +RUN python3 -m pip + CMD ["python3.8"] diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 62eb5a7..46d2371 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -22,7 +22,7 @@ repos: - id: end-of-file-fixer - id: check-yaml - repo: https://github.com/psf/black - rev: 19.10b0 + rev: 22.3.0 hooks: - id: black - repo: https://gitlab.com/pycqa/flake8 diff --git a/CHANGELOG.md b/CHANGELOG.md index c8cc49d..9850606 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,18 @@ # Changelog -### [1.3.1](https://github.com/googleapis/python-service-usage/compare/v1.3.0...v1.3.1) (2022-03-05) +## [1.3.2](https://github.com/googleapis/python-service-usage/compare/v1.3.1...v1.3.2) (2022-06-03) + + +### Bug Fixes + +* **deps:** require protobuf <4.0.0dev ([#115](https://github.com/googleapis/python-service-usage/issues/115)) ([fc546f2](https://github.com/googleapis/python-service-usage/commit/fc546f2dc727e8b358d62f4f9958006c04b35c4c)) + + +### Documentation + +* fix changelog header to consistent size ([#116](https://github.com/googleapis/python-service-usage/issues/116)) ([1c9df92](https://github.com/googleapis/python-service-usage/commit/1c9df92b379f9735477bd7c7d590a9280e944fbd)) + +## [1.3.1](https://github.com/googleapis/python-service-usage/compare/v1.3.0...v1.3.1) (2022-03-05) ### Bug Fixes @@ -24,7 +36,7 @@ * add generated snippets ([#79](https://github.com/googleapis/python-service-usage/issues/79)) ([dee08f1](https://github.com/googleapis/python-service-usage/commit/dee08f1d654cb5e04955ca51c824f77b13c000b9)) -### [1.2.1](https://www.github.com/googleapis/python-service-usage/compare/v1.2.0...v1.2.1) (2021-11-01) +## [1.2.1](https://www.github.com/googleapis/python-service-usage/compare/v1.2.0...v1.2.1) (2021-11-01) ### Bug Fixes @@ -56,7 +68,7 @@ * improper types in pagers generation ([b230f5f](https://www.github.com/googleapis/python-service-usage/commit/b230f5fd83f21b7ac86bb01dac85ce403d694228)) -### [1.0.1](https://www.github.com/googleapis/python-service-usage/compare/v1.0.0...v1.0.1) (2021-09-24) +## [1.0.1](https://www.github.com/googleapis/python-service-usage/compare/v1.0.0...v1.0.1) (2021-09-24) ### Bug Fixes @@ -70,7 +82,7 @@ * bump release level to production/stable ([#28](https://www.github.com/googleapis/python-service-usage/issues/28)) ([6627d2d](https://www.github.com/googleapis/python-service-usage/commit/6627d2dddf686a6ecc355891989928ca33003f00)) -### [0.2.2](https://www.github.com/googleapis/python-service-usage/compare/v0.2.1...v0.2.2) (2021-07-29) +## [0.2.2](https://www.github.com/googleapis/python-service-usage/compare/v0.2.1...v0.2.2) (2021-07-29) ### Bug Fixes @@ -87,7 +99,7 @@ * release as 0.2.2 ([#25](https://www.github.com/googleapis/python-service-usage/issues/25)) ([4f1ab38](https://www.github.com/googleapis/python-service-usage/commit/4f1ab3848cf43ae7385ebf5c4dcb5f1b9057f14d)) -### [0.2.1](https://www.github.com/googleapis/python-service-usage/compare/v0.2.0...v0.2.1) (2021-07-21) +## [0.2.1](https://www.github.com/googleapis/python-service-usage/compare/v0.2.0...v0.2.1) (2021-07-21) ### Bug Fixes diff --git a/docs/conf.py b/docs/conf.py index d5f3abc..bf98de5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -24,9 +24,9 @@ # All configuration values have a default; values that are commented out # serve to show the default. -import sys import os import shlex +import sys # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the @@ -361,7 +361,10 @@ intersphinx_mapping = { "python": ("https://python.readthedocs.org/en/latest/", None), "google-auth": ("https://googleapis.dev/python/google-auth/latest/", None), - "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None,), + "google.api_core": ( + "https://googleapis.dev/python/google-api-core/latest/", + None, + ), "grpc": ("https://grpc.github.io/grpc/python/", None), "proto-plus": ("https://proto-plus-python.readthedocs.io/en/latest/", None), "protobuf": ("https://googleapis.dev/python/protobuf/latest/", None), diff --git a/google/cloud/service_usage/__init__.py b/google/cloud/service_usage/__init__.py index ffdb561..a4c6c02 100644 --- a/google/cloud/service_usage/__init__.py +++ b/google/cloud/service_usage/__init__.py @@ -14,28 +14,31 @@ # limitations under the License. # +from google.cloud.service_usage_v1.services.service_usage.async_client import ( + ServiceUsageAsyncClient, +) from google.cloud.service_usage_v1.services.service_usage.client import ( ServiceUsageClient, ) -from google.cloud.service_usage_v1.services.service_usage.async_client import ( - ServiceUsageAsyncClient, +from google.cloud.service_usage_v1.types.resources import ( + OperationMetadata, + Service, + ServiceConfig, + State, +) +from google.cloud.service_usage_v1.types.serviceusage import ( + BatchEnableServicesRequest, + BatchEnableServicesResponse, + BatchGetServicesRequest, + BatchGetServicesResponse, + DisableServiceRequest, + DisableServiceResponse, + EnableServiceRequest, + EnableServiceResponse, + GetServiceRequest, + ListServicesRequest, + ListServicesResponse, ) - -from google.cloud.service_usage_v1.types.resources import OperationMetadata -from google.cloud.service_usage_v1.types.resources import Service -from google.cloud.service_usage_v1.types.resources import ServiceConfig -from google.cloud.service_usage_v1.types.resources import State -from google.cloud.service_usage_v1.types.serviceusage import BatchEnableServicesRequest -from google.cloud.service_usage_v1.types.serviceusage import BatchEnableServicesResponse -from google.cloud.service_usage_v1.types.serviceusage import BatchGetServicesRequest -from google.cloud.service_usage_v1.types.serviceusage import BatchGetServicesResponse -from google.cloud.service_usage_v1.types.serviceusage import DisableServiceRequest -from google.cloud.service_usage_v1.types.serviceusage import DisableServiceResponse -from google.cloud.service_usage_v1.types.serviceusage import EnableServiceRequest -from google.cloud.service_usage_v1.types.serviceusage import EnableServiceResponse -from google.cloud.service_usage_v1.types.serviceusage import GetServiceRequest -from google.cloud.service_usage_v1.types.serviceusage import ListServicesRequest -from google.cloud.service_usage_v1.types.serviceusage import ListServicesResponse __all__ = ( "ServiceUsageClient", diff --git a/google/cloud/service_usage_v1/__init__.py b/google/cloud/service_usage_v1/__init__.py index 70e93a3..643c446 100644 --- a/google/cloud/service_usage_v1/__init__.py +++ b/google/cloud/service_usage_v1/__init__.py @@ -14,24 +14,21 @@ # limitations under the License. # -from .services.service_usage import ServiceUsageClient -from .services.service_usage import ServiceUsageAsyncClient - -from .types.resources import OperationMetadata -from .types.resources import Service -from .types.resources import ServiceConfig -from .types.resources import State -from .types.serviceusage import BatchEnableServicesRequest -from .types.serviceusage import BatchEnableServicesResponse -from .types.serviceusage import BatchGetServicesRequest -from .types.serviceusage import BatchGetServicesResponse -from .types.serviceusage import DisableServiceRequest -from .types.serviceusage import DisableServiceResponse -from .types.serviceusage import EnableServiceRequest -from .types.serviceusage import EnableServiceResponse -from .types.serviceusage import GetServiceRequest -from .types.serviceusage import ListServicesRequest -from .types.serviceusage import ListServicesResponse +from .services.service_usage import ServiceUsageAsyncClient, ServiceUsageClient +from .types.resources import OperationMetadata, Service, ServiceConfig, State +from .types.serviceusage import ( + BatchEnableServicesRequest, + BatchEnableServicesResponse, + BatchGetServicesRequest, + BatchGetServicesResponse, + DisableServiceRequest, + DisableServiceResponse, + EnableServiceRequest, + EnableServiceResponse, + GetServiceRequest, + ListServicesRequest, + ListServicesResponse, +) __all__ = ( "ServiceUsageAsyncClient", diff --git a/google/cloud/service_usage_v1/services/service_usage/__init__.py b/google/cloud/service_usage_v1/services/service_usage/__init__.py index 27b2a87..a981dee 100644 --- a/google/cloud/service_usage_v1/services/service_usage/__init__.py +++ b/google/cloud/service_usage_v1/services/service_usage/__init__.py @@ -13,8 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from .client import ServiceUsageClient from .async_client import ServiceUsageAsyncClient +from .client import ServiceUsageClient __all__ = ( "ServiceUsageClient", diff --git a/google/cloud/service_usage_v1/services/service_usage/async_client.py b/google/cloud/service_usage_v1/services/service_usage/async_client.py index 8830a9a..2f5ef20 100644 --- a/google/cloud/service_usage_v1/services/service_usage/async_client.py +++ b/google/cloud/service_usage_v1/services/service_usage/async_client.py @@ -16,15 +16,15 @@ from collections import OrderedDict import functools import re -from typing import Dict, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -from google.api_core.client_options import ClientOptions from google.api_core import exceptions as core_exceptions from google.api_core import gapic_v1 from google.api_core import retry as retries +from google.api_core.client_options import ClientOptions from google.auth import credentials as ga_credentials # type: ignore from google.oauth2 import service_account # type: ignore +import pkg_resources try: OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault] @@ -33,12 +33,13 @@ from google.api_core import operation # type: ignore from google.api_core import operation_async # type: ignore + from google.cloud.service_usage_v1.services.service_usage import pagers -from google.cloud.service_usage_v1.types import resources -from google.cloud.service_usage_v1.types import serviceusage -from .transports.base import ServiceUsageTransport, DEFAULT_CLIENT_INFO -from .transports.grpc_asyncio import ServiceUsageGrpcAsyncIOTransport +from google.cloud.service_usage_v1.types import resources, serviceusage + from .client import ServiceUsageClient +from .transports.base import DEFAULT_CLIENT_INFO, ServiceUsageTransport +from .transports.grpc_asyncio import ServiceUsageGrpcAsyncIOTransport class ServiceUsageAsyncClient: @@ -216,14 +217,13 @@ async def enable_service( r"""Enable a service so that it can be used with a project. - .. code-block:: python from google.cloud import service_usage_v1 - def sample_enable_service(): + async def sample_enable_service(): # Create a client - client = service_usage_v1.ServiceUsageClient() + client = service_usage_v1.ServiceUsageAsyncClient() # Initialize request argument(s) request = service_usage_v1.EnableServiceRequest( @@ -234,7 +234,7 @@ def sample_enable_service(): print("Waiting for operation to complete...") - response = operation.result() + response = await operation.result() # Handle the response print(response) @@ -277,7 +277,12 @@ def sample_enable_service(): ) # Send the request. - response = await rpc(request, retry=retry, timeout=timeout, metadata=metadata,) + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) # Wrap the response in an operation future. response = operation_async.from_gapic( @@ -307,14 +312,13 @@ async def disable_service( ``FAILED_PRECONDITION`` status if the target service is not currently enabled. - .. code-block:: python from google.cloud import service_usage_v1 - def sample_disable_service(): + async def sample_disable_service(): # Create a client - client = service_usage_v1.ServiceUsageClient() + client = service_usage_v1.ServiceUsageAsyncClient() # Initialize request argument(s) request = service_usage_v1.DisableServiceRequest( @@ -325,7 +329,7 @@ def sample_disable_service(): print("Waiting for operation to complete...") - response = operation.result() + response = await operation.result() # Handle the response print(response) @@ -368,7 +372,12 @@ def sample_disable_service(): ) # Send the request. - response = await rpc(request, retry=retry, timeout=timeout, metadata=metadata,) + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) # Wrap the response in an operation future. response = operation_async.from_gapic( @@ -392,21 +401,20 @@ async def get_service( r"""Returns the service configuration and enabled state for a given service. - .. code-block:: python from google.cloud import service_usage_v1 - def sample_get_service(): + async def sample_get_service(): # Create a client - client = service_usage_v1.ServiceUsageClient() + client = service_usage_v1.ServiceUsageAsyncClient() # Initialize request argument(s) request = service_usage_v1.GetServiceRequest( ) # Make the request - response = client.get_service(request=request) + response = await client.get_service(request=request) # Handle the response print(response) @@ -445,7 +453,12 @@ def sample_get_service(): ) # Send the request. - response = await rpc(request, retry=retry, timeout=timeout, metadata=metadata,) + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) # Done; return the response. return response @@ -473,14 +486,13 @@ async def list_services( which provides higher throughput and richer filtering capability. - .. code-block:: python from google.cloud import service_usage_v1 - def sample_list_services(): + async def sample_list_services(): # Create a client - client = service_usage_v1.ServiceUsageClient() + client = service_usage_v1.ServiceUsageAsyncClient() # Initialize request argument(s) request = service_usage_v1.ListServicesRequest( @@ -490,7 +502,7 @@ def sample_list_services(): page_result = client.list_services(request=request) # Handle the response - for response in page_result: + async for response in page_result: print(response) Args: @@ -529,12 +541,20 @@ def sample_list_services(): ) # Send the request. - response = await rpc(request, retry=retry, timeout=timeout, metadata=metadata,) + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) # This method is paged; wrap the response in a pager, which provides # an `__aiter__` convenience method. response = pagers.ListServicesAsyncPager( - method=rpc, request=request, response=response, metadata=metadata, + method=rpc, + request=request, + response=response, + metadata=metadata, ) # Done; return the response. @@ -553,14 +573,13 @@ async def batch_enable_services( no state changes occur. To enable a single service, use the ``EnableService`` method instead. - .. code-block:: python from google.cloud import service_usage_v1 - def sample_batch_enable_services(): + async def sample_batch_enable_services(): # Create a client - client = service_usage_v1.ServiceUsageClient() + client = service_usage_v1.ServiceUsageAsyncClient() # Initialize request argument(s) request = service_usage_v1.BatchEnableServicesRequest( @@ -571,7 +590,7 @@ def sample_batch_enable_services(): print("Waiting for operation to complete...") - response = operation.result() + response = await operation.result() # Handle the response print(response) @@ -614,7 +633,12 @@ def sample_batch_enable_services(): ) # Send the request. - response = await rpc(request, retry=retry, timeout=timeout, metadata=metadata,) + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) # Wrap the response in an operation future. response = operation_async.from_gapic( @@ -638,21 +662,20 @@ async def batch_get_services( r"""Returns the service configurations and enabled states for a given list of services. - .. code-block:: python from google.cloud import service_usage_v1 - def sample_batch_get_services(): + async def sample_batch_get_services(): # Create a client - client = service_usage_v1.ServiceUsageClient() + client = service_usage_v1.ServiceUsageAsyncClient() # Initialize request argument(s) request = service_usage_v1.BatchGetServicesRequest( ) # Make the request - response = client.batch_get_services(request=request) + response = await client.batch_get_services(request=request) # Handle the response print(response) @@ -689,7 +712,12 @@ def sample_batch_get_services(): ) # Send the request. - response = await rpc(request, retry=retry, timeout=timeout, metadata=metadata,) + response = await rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) # Done; return the response. return response diff --git a/google/cloud/service_usage_v1/services/service_usage/client.py b/google/cloud/service_usage_v1/services/service_usage/client.py index e0f264a..de220e6 100644 --- a/google/cloud/service_usage_v1/services/service_usage/client.py +++ b/google/cloud/service_usage_v1/services/service_usage/client.py @@ -16,18 +16,18 @@ from collections import OrderedDict import os import re -from typing import Dict, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union from google.api_core import client_options as client_options_lib from google.api_core import exceptions as core_exceptions from google.api_core import gapic_v1 from google.api_core import retry as retries from google.auth import credentials as ga_credentials # type: ignore +from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.auth.transport import mtls # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore -from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.oauth2 import service_account # type: ignore +import pkg_resources try: OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault] @@ -36,10 +36,11 @@ from google.api_core import operation # type: ignore from google.api_core import operation_async # type: ignore + from google.cloud.service_usage_v1.services.service_usage import pagers -from google.cloud.service_usage_v1.types import resources -from google.cloud.service_usage_v1.types import serviceusage -from .transports.base import ServiceUsageTransport, DEFAULT_CLIENT_INFO +from google.cloud.service_usage_v1.types import resources, serviceusage + +from .transports.base import DEFAULT_CLIENT_INFO, ServiceUsageTransport from .transports.grpc import ServiceUsageGrpcTransport from .transports.grpc_asyncio import ServiceUsageGrpcAsyncIOTransport @@ -56,7 +57,10 @@ class ServiceUsageClientMeta(type): _transport_registry["grpc"] = ServiceUsageGrpcTransport _transport_registry["grpc_asyncio"] = ServiceUsageGrpcAsyncIOTransport - def get_transport_class(cls, label: str = None,) -> Type[ServiceUsageTransport]: + def get_transport_class( + cls, + label: str = None, + ) -> Type[ServiceUsageTransport]: """Returns an appropriate transport class. Args: @@ -167,7 +171,9 @@ def transport(self) -> ServiceUsageTransport: return self._transport @staticmethod - def common_billing_account_path(billing_account: str,) -> str: + def common_billing_account_path( + billing_account: str, + ) -> str: """Returns a fully-qualified billing_account string.""" return "billingAccounts/{billing_account}".format( billing_account=billing_account, @@ -180,9 +186,13 @@ def parse_common_billing_account_path(path: str) -> Dict[str, str]: return m.groupdict() if m else {} @staticmethod - def common_folder_path(folder: str,) -> str: + def common_folder_path( + folder: str, + ) -> str: """Returns a fully-qualified folder string.""" - return "folders/{folder}".format(folder=folder,) + return "folders/{folder}".format( + folder=folder, + ) @staticmethod def parse_common_folder_path(path: str) -> Dict[str, str]: @@ -191,9 +201,13 @@ def parse_common_folder_path(path: str) -> Dict[str, str]: return m.groupdict() if m else {} @staticmethod - def common_organization_path(organization: str,) -> str: + def common_organization_path( + organization: str, + ) -> str: """Returns a fully-qualified organization string.""" - return "organizations/{organization}".format(organization=organization,) + return "organizations/{organization}".format( + organization=organization, + ) @staticmethod def parse_common_organization_path(path: str) -> Dict[str, str]: @@ -202,9 +216,13 @@ def parse_common_organization_path(path: str) -> Dict[str, str]: return m.groupdict() if m else {} @staticmethod - def common_project_path(project: str,) -> str: + def common_project_path( + project: str, + ) -> str: """Returns a fully-qualified project string.""" - return "projects/{project}".format(project=project,) + return "projects/{project}".format( + project=project, + ) @staticmethod def parse_common_project_path(path: str) -> Dict[str, str]: @@ -213,10 +231,14 @@ def parse_common_project_path(path: str) -> Dict[str, str]: return m.groupdict() if m else {} @staticmethod - def common_location_path(project: str, location: str,) -> str: + def common_location_path( + project: str, + location: str, + ) -> str: """Returns a fully-qualified location string.""" return "projects/{project}/locations/{location}".format( - project=project, location=location, + project=project, + location=location, ) @staticmethod @@ -401,7 +423,6 @@ def enable_service( r"""Enable a service so that it can be used with a project. - .. code-block:: python from google.cloud import service_usage_v1 @@ -463,7 +484,12 @@ def sample_enable_service(): ) # Send the request. - response = rpc(request, retry=retry, timeout=timeout, metadata=metadata,) + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) # Wrap the response in an operation future. response = operation.from_gapic( @@ -493,7 +519,6 @@ def disable_service( ``FAILED_PRECONDITION`` status if the target service is not currently enabled. - .. code-block:: python from google.cloud import service_usage_v1 @@ -555,7 +580,12 @@ def sample_disable_service(): ) # Send the request. - response = rpc(request, retry=retry, timeout=timeout, metadata=metadata,) + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) # Wrap the response in an operation future. response = operation.from_gapic( @@ -579,7 +609,6 @@ def get_service( r"""Returns the service configuration and enabled state for a given service. - .. code-block:: python from google.cloud import service_usage_v1 @@ -633,7 +662,12 @@ def sample_get_service(): ) # Send the request. - response = rpc(request, retry=retry, timeout=timeout, metadata=metadata,) + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) # Done; return the response. return response @@ -661,7 +695,6 @@ def list_services( which provides higher throughput and richer filtering capability. - .. code-block:: python from google.cloud import service_usage_v1 @@ -718,12 +751,20 @@ def sample_list_services(): ) # Send the request. - response = rpc(request, retry=retry, timeout=timeout, metadata=metadata,) + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) # This method is paged; wrap the response in a pager, which provides # an `__iter__` convenience method. response = pagers.ListServicesPager( - method=rpc, request=request, response=response, metadata=metadata, + method=rpc, + request=request, + response=response, + metadata=metadata, ) # Done; return the response. @@ -742,7 +783,6 @@ def batch_enable_services( no state changes occur. To enable a single service, use the ``EnableService`` method instead. - .. code-block:: python from google.cloud import service_usage_v1 @@ -804,7 +844,12 @@ def sample_batch_enable_services(): ) # Send the request. - response = rpc(request, retry=retry, timeout=timeout, metadata=metadata,) + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) # Wrap the response in an operation future. response = operation.from_gapic( @@ -828,7 +873,6 @@ def batch_get_services( r"""Returns the service configurations and enabled states for a given list of services. - .. code-block:: python from google.cloud import service_usage_v1 @@ -880,7 +924,12 @@ def sample_batch_get_services(): ) # Send the request. - response = rpc(request, retry=retry, timeout=timeout, metadata=metadata,) + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) # Done; return the response. return response diff --git a/google/cloud/service_usage_v1/services/service_usage/pagers.py b/google/cloud/service_usage_v1/services/service_usage/pagers.py index 9473d67..7717d2f 100644 --- a/google/cloud/service_usage_v1/services/service_usage/pagers.py +++ b/google/cloud/service_usage_v1/services/service_usage/pagers.py @@ -18,14 +18,13 @@ AsyncIterator, Awaitable, Callable, + Iterator, + Optional, Sequence, Tuple, - Optional, - Iterator, ) -from google.cloud.service_usage_v1.types import resources -from google.cloud.service_usage_v1.types import serviceusage +from google.cloud.service_usage_v1.types import resources, serviceusage class ListServicesPager: diff --git a/google/cloud/service_usage_v1/services/service_usage/transports/__init__.py b/google/cloud/service_usage_v1/services/service_usage/transports/__init__.py index 6a69120..b2fd25f 100644 --- a/google/cloud/service_usage_v1/services/service_usage/transports/__init__.py +++ b/google/cloud/service_usage_v1/services/service_usage/transports/__init__.py @@ -20,7 +20,6 @@ from .grpc import ServiceUsageGrpcTransport from .grpc_asyncio import ServiceUsageGrpcAsyncIOTransport - # Compile a registry of transports. _transport_registry = OrderedDict() # type: Dict[str, Type[ServiceUsageTransport]] _transport_registry["grpc"] = ServiceUsageGrpcTransport diff --git a/google/cloud/service_usage_v1/services/service_usage/transports/base.py b/google/cloud/service_usage_v1/services/service_usage/transports/base.py index e6b8dc2..e993719 100644 --- a/google/cloud/service_usage_v1/services/service_usage/transports/base.py +++ b/google/cloud/service_usage_v1/services/service_usage/transports/base.py @@ -15,20 +15,18 @@ # import abc from typing import Awaitable, Callable, Dict, Optional, Sequence, Union -import pkg_resources -import google.auth # type: ignore import google.api_core from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 +from google.api_core import gapic_v1, operations_v1 from google.api_core import retry as retries -from google.api_core import operations_v1 +import google.auth # type: ignore from google.auth import credentials as ga_credentials # type: ignore +from google.longrunning import operations_pb2 # type: ignore from google.oauth2 import service_account # type: ignore +import pkg_resources -from google.cloud.service_usage_v1.types import resources -from google.cloud.service_usage_v1.types import serviceusage -from google.longrunning import operations_pb2 # type: ignore +from google.cloud.service_usage_v1.types import resources, serviceusage try: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( @@ -87,6 +85,7 @@ def __init__( always_use_jwt_access (Optional[bool]): Whether self signed JWT should be used for service account credentials. """ + # Save the hostname. Default to port 443 (HTTPS) if none is specified. if ":" not in host: host += ":443" @@ -128,16 +127,24 @@ def _prep_wrapped_messages(self, client_info): # Precompute the wrapped methods. self._wrapped_methods = { self.enable_service: gapic_v1.method.wrap_method( - self.enable_service, default_timeout=None, client_info=client_info, + self.enable_service, + default_timeout=None, + client_info=client_info, ), self.disable_service: gapic_v1.method.wrap_method( - self.disable_service, default_timeout=None, client_info=client_info, + self.disable_service, + default_timeout=None, + client_info=client_info, ), self.get_service: gapic_v1.method.wrap_method( - self.get_service, default_timeout=None, client_info=client_info, + self.get_service, + default_timeout=None, + client_info=client_info, ), self.list_services: gapic_v1.method.wrap_method( - self.list_services, default_timeout=None, client_info=client_info, + self.list_services, + default_timeout=None, + client_info=client_info, ), self.batch_enable_services: gapic_v1.method.wrap_method( self.batch_enable_services, @@ -145,16 +152,18 @@ def _prep_wrapped_messages(self, client_info): client_info=client_info, ), self.batch_get_services: gapic_v1.method.wrap_method( - self.batch_get_services, default_timeout=None, client_info=client_info, + self.batch_get_services, + default_timeout=None, + client_info=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! + .. warning:: + Only call this method if the transport is NOT shared + with other clients - this may cause errors in other clients! """ raise NotImplementedError() @@ -223,5 +232,9 @@ def batch_get_services( ]: raise NotImplementedError() + @property + def kind(self) -> str: + raise NotImplementedError() + __all__ = ("ServiceUsageTransport",) diff --git a/google/cloud/service_usage_v1/services/service_usage/transports/grpc.py b/google/cloud/service_usage_v1/services/service_usage/transports/grpc.py index ec53bc5..77796a1 100644 --- a/google/cloud/service_usage_v1/services/service_usage/transports/grpc.py +++ b/google/cloud/service_usage_v1/services/service_usage/transports/grpc.py @@ -13,22 +13,19 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import warnings from typing import Callable, Dict, Optional, Sequence, Tuple, Union +import warnings -from google.api_core import grpc_helpers -from google.api_core import operations_v1 -from google.api_core import gapic_v1 +from google.api_core import gapic_v1, grpc_helpers, operations_v1 import google.auth # type: ignore from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore - +from google.longrunning import operations_pb2 # type: ignore import grpc # type: ignore -from google.cloud.service_usage_v1.types import resources -from google.cloud.service_usage_v1.types import serviceusage -from google.longrunning import operations_pb2 # type: ignore -from .base import ServiceUsageTransport, DEFAULT_CLIENT_INFO +from google.cloud.service_usage_v1.types import resources, serviceusage + +from .base import DEFAULT_CLIENT_INFO, ServiceUsageTransport class ServiceUsageGrpcTransport(ServiceUsageTransport): @@ -233,8 +230,7 @@ def create_channel( @property def grpc_channel(self) -> grpc.Channel: - """Return the channel designed to connect to this service. - """ + """Return the channel designed to connect to this service.""" return self._grpc_channel @property @@ -440,5 +436,9 @@ def batch_get_services( def close(self): self.grpc_channel.close() + @property + def kind(self) -> str: + return "grpc" + __all__ = ("ServiceUsageGrpcTransport",) diff --git a/google/cloud/service_usage_v1/services/service_usage/transports/grpc_asyncio.py b/google/cloud/service_usage_v1/services/service_usage/transports/grpc_asyncio.py index 5f49896..3288fe2 100644 --- a/google/cloud/service_usage_v1/services/service_usage/transports/grpc_asyncio.py +++ b/google/cloud/service_usage_v1/services/service_usage/transports/grpc_asyncio.py @@ -13,22 +13,19 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import warnings from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union +import warnings -from google.api_core import gapic_v1 -from google.api_core import grpc_helpers_async -from google.api_core import operations_v1 +from google.api_core import gapic_v1, grpc_helpers_async, operations_v1 from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore - +from google.longrunning import operations_pb2 # type: ignore import grpc # type: ignore from grpc.experimental import aio # type: ignore -from google.cloud.service_usage_v1.types import resources -from google.cloud.service_usage_v1.types import serviceusage -from google.longrunning import operations_pb2 # type: ignore -from .base import ServiceUsageTransport, DEFAULT_CLIENT_INFO +from google.cloud.service_usage_v1.types import resources, serviceusage + +from .base import DEFAULT_CLIENT_INFO, ServiceUsageTransport from .grpc import ServiceUsageGrpcTransport diff --git a/google/cloud/service_usage_v1/types/__init__.py b/google/cloud/service_usage_v1/types/__init__.py index 9bb0b9e..61e39e8 100644 --- a/google/cloud/service_usage_v1/types/__init__.py +++ b/google/cloud/service_usage_v1/types/__init__.py @@ -13,12 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from .resources import ( - OperationMetadata, - Service, - ServiceConfig, - State, -) +from .resources import OperationMetadata, Service, ServiceConfig, State from .serviceusage import ( BatchEnableServicesRequest, BatchEnableServicesResponse, diff --git a/google/cloud/service_usage_v1/types/resources.py b/google/cloud/service_usage_v1/types/resources.py index ae890ab..1e4b4d8 100644 --- a/google/cloud/service_usage_v1/types/resources.py +++ b/google/cloud/service_usage_v1/types/resources.py @@ -13,8 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import proto # type: ignore - from google.api import auth_pb2 # type: ignore from google.api import documentation_pb2 # type: ignore from google.api import endpoint_pb2 # type: ignore @@ -23,11 +21,16 @@ from google.api import quota_pb2 # type: ignore from google.api import usage_pb2 # type: ignore from google.protobuf import api_pb2 # type: ignore - +import proto # type: ignore __protobuf__ = proto.module( package="google.api.serviceusage.v1", - manifest={"State", "Service", "ServiceConfig", "OperationMetadata",}, + manifest={ + "State", + "Service", + "ServiceConfig", + "OperationMetadata", + }, ) @@ -64,10 +67,24 @@ class Service(proto.Message): for use by the consumer. """ - name = proto.Field(proto.STRING, number=1,) - parent = proto.Field(proto.STRING, number=5,) - config = proto.Field(proto.MESSAGE, number=2, message="ServiceConfig",) - state = proto.Field(proto.ENUM, number=4, enum="State",) + name = proto.Field( + proto.STRING, + number=1, + ) + parent = proto.Field( + proto.STRING, + number=5, + ) + config = proto.Field( + proto.MESSAGE, + number=2, + message="ServiceConfig", + ) + state = proto.Field( + proto.ENUM, + number=4, + enum="State", + ) class ServiceConfig(proto.Message): @@ -110,19 +127,43 @@ class ServiceConfig(proto.Message): 'producer_destinations' field. """ - name = proto.Field(proto.STRING, number=1,) - title = proto.Field(proto.STRING, number=2,) - apis = proto.RepeatedField(proto.MESSAGE, number=3, message=api_pb2.Api,) + name = proto.Field( + proto.STRING, + number=1, + ) + title = proto.Field( + proto.STRING, + number=2, + ) + apis = proto.RepeatedField( + proto.MESSAGE, + number=3, + message=api_pb2.Api, + ) documentation = proto.Field( - proto.MESSAGE, number=6, message=documentation_pb2.Documentation, + proto.MESSAGE, + number=6, + message=documentation_pb2.Documentation, + ) + quota = proto.Field( + proto.MESSAGE, + number=10, + message=quota_pb2.Quota, ) - quota = proto.Field(proto.MESSAGE, number=10, message=quota_pb2.Quota,) authentication = proto.Field( - proto.MESSAGE, number=11, message=auth_pb2.Authentication, + proto.MESSAGE, + number=11, + message=auth_pb2.Authentication, + ) + usage = proto.Field( + proto.MESSAGE, + number=15, + message=usage_pb2.Usage, ) - usage = proto.Field(proto.MESSAGE, number=15, message=usage_pb2.Usage,) endpoints = proto.RepeatedField( - proto.MESSAGE, number=18, message=endpoint_pb2.Endpoint, + proto.MESSAGE, + number=18, + message=endpoint_pb2.Endpoint, ) monitored_resources = proto.RepeatedField( proto.MESSAGE, @@ -130,7 +171,9 @@ class ServiceConfig(proto.Message): message=monitored_resource_pb2.MonitoredResourceDescriptor, ) monitoring = proto.Field( - proto.MESSAGE, number=28, message=monitoring_pb2.Monitoring, + proto.MESSAGE, + number=28, + message=monitoring_pb2.Monitoring, ) @@ -144,7 +187,10 @@ class OperationMetadata(proto.Message): operation is directly associated with. """ - resource_names = proto.RepeatedField(proto.STRING, number=2,) + resource_names = proto.RepeatedField( + proto.STRING, + number=2, + ) __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/google/cloud/service_usage_v1/types/serviceusage.py b/google/cloud/service_usage_v1/types/serviceusage.py index 27651e6..59a0f0e 100644 --- a/google/cloud/service_usage_v1/types/serviceusage.py +++ b/google/cloud/service_usage_v1/types/serviceusage.py @@ -17,7 +17,6 @@ from google.cloud.service_usage_v1.types import resources - __protobuf__ = proto.module( package="google.api.serviceusage.v1", manifest={ @@ -54,7 +53,10 @@ class EnableServiceRequest(proto.Message): ``123`` is the project number. """ - name = proto.Field(proto.STRING, number=1,) + name = proto.Field( + proto.STRING, + number=1, + ) class EnableServiceResponse(proto.Message): @@ -67,7 +69,11 @@ class EnableServiceResponse(proto.Message): The new state of the service after enabling. """ - service = proto.Field(proto.MESSAGE, number=1, message=resources.Service,) + service = proto.Field( + proto.MESSAGE, + number=1, + message=resources.Service, + ) class DisableServiceRequest(proto.Message): @@ -104,10 +110,18 @@ class CheckIfServiceHasUsage(proto.Enum): SKIP = 1 CHECK = 2 - name = proto.Field(proto.STRING, number=1,) - disable_dependent_services = proto.Field(proto.BOOL, number=2,) + name = proto.Field( + proto.STRING, + number=1, + ) + disable_dependent_services = proto.Field( + proto.BOOL, + number=2, + ) check_if_service_has_usage = proto.Field( - proto.ENUM, number=3, enum=CheckIfServiceHasUsage, + proto.ENUM, + number=3, + enum=CheckIfServiceHasUsage, ) @@ -121,7 +135,11 @@ class DisableServiceResponse(proto.Message): The new state of the service after disabling. """ - service = proto.Field(proto.MESSAGE, number=1, message=resources.Service,) + service = proto.Field( + proto.MESSAGE, + number=1, + message=resources.Service, + ) class GetServiceRequest(proto.Message): @@ -137,7 +155,10 @@ class GetServiceRequest(proto.Message): ``123`` is the project number. """ - name = proto.Field(proto.STRING, number=1,) + name = proto.Field( + proto.STRING, + number=1, + ) class ListServicesRequest(proto.Message): @@ -162,10 +183,22 @@ class ListServicesRequest(proto.Message): ``state:DISABLED``. """ - parent = proto.Field(proto.STRING, number=1,) - page_size = proto.Field(proto.INT32, number=2,) - page_token = proto.Field(proto.STRING, number=3,) - filter = proto.Field(proto.STRING, number=4,) + parent = proto.Field( + proto.STRING, + number=1, + ) + page_size = proto.Field( + proto.INT32, + number=2, + ) + page_token = proto.Field( + proto.STRING, + number=3, + ) + filter = proto.Field( + proto.STRING, + number=4, + ) class ListServicesResponse(proto.Message): @@ -184,8 +217,15 @@ class ListServicesResponse(proto.Message): def raw_page(self): return self - services = proto.RepeatedField(proto.MESSAGE, number=1, message=resources.Service,) - next_page_token = proto.Field(proto.STRING, number=2,) + services = proto.RepeatedField( + proto.MESSAGE, + number=1, + message=resources.Service, + ) + next_page_token = proto.Field( + proto.STRING, + number=2, + ) class BatchEnableServicesRequest(proto.Message): @@ -216,8 +256,14 @@ class BatchEnableServicesRequest(proto.Message): changes will occur. """ - parent = proto.Field(proto.STRING, number=1,) - service_ids = proto.RepeatedField(proto.STRING, number=2,) + parent = proto.Field( + proto.STRING, + number=1, + ) + service_ids = proto.RepeatedField( + proto.STRING, + number=2, + ) class BatchEnableServicesResponse(proto.Message): @@ -246,11 +292,25 @@ class EnableFailure(proto.Message): could not be enabled. """ - service_id = proto.Field(proto.STRING, number=1,) - error_message = proto.Field(proto.STRING, number=2,) - - services = proto.RepeatedField(proto.MESSAGE, number=1, message=resources.Service,) - failures = proto.RepeatedField(proto.MESSAGE, number=2, message=EnableFailure,) + service_id = proto.Field( + proto.STRING, + number=1, + ) + error_message = proto.Field( + proto.STRING, + number=2, + ) + + services = proto.RepeatedField( + proto.MESSAGE, + number=1, + message=resources.Service, + ) + failures = proto.RepeatedField( + proto.MESSAGE, + number=2, + message=EnableFailure, + ) class BatchGetServicesRequest(proto.Message): @@ -272,8 +332,14 @@ class BatchGetServicesRequest(proto.Message): maximum of 30 services at a time. """ - parent = proto.Field(proto.STRING, number=1,) - names = proto.RepeatedField(proto.STRING, number=2,) + parent = proto.Field( + proto.STRING, + number=1, + ) + names = proto.RepeatedField( + proto.STRING, + number=2, + ) class BatchGetServicesResponse(proto.Message): @@ -284,7 +350,11 @@ class BatchGetServicesResponse(proto.Message): The requested Service states. """ - services = proto.RepeatedField(proto.MESSAGE, number=1, message=resources.Service,) + services = proto.RepeatedField( + proto.MESSAGE, + number=1, + message=resources.Service, + ) __all__ = tuple(sorted(__protobuf__.manifest)) diff --git a/noxfile.py b/noxfile.py index 2a2001c..7c1742d 100644 --- a/noxfile.py +++ b/noxfile.py @@ -17,19 +17,45 @@ # Generated by synthtool. DO NOT EDIT! from __future__ import absolute_import + import os import pathlib import shutil +import warnings import nox - -BLACK_VERSION = "black==19.10b0" -BLACK_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"] +BLACK_VERSION = "black==22.3.0" +ISORT_VERSION = "isort==5.10.1" +LINT_PATHS = ["docs", "google", "tests", "noxfile.py", "setup.py"] DEFAULT_PYTHON_VERSION = "3.8" -SYSTEM_TEST_PYTHON_VERSIONS = ["3.8"] + UNIT_TEST_PYTHON_VERSIONS = ["3.6", "3.7", "3.8", "3.9", "3.10"] +UNIT_TEST_STANDARD_DEPENDENCIES = [ + "mock", + "asyncmock", + "pytest", + "pytest-cov", + "pytest-asyncio", +] +UNIT_TEST_EXTERNAL_DEPENDENCIES = [] +UNIT_TEST_LOCAL_DEPENDENCIES = [] +UNIT_TEST_DEPENDENCIES = [] +UNIT_TEST_EXTRAS = [] +UNIT_TEST_EXTRAS_BY_PYTHON = {} + +SYSTEM_TEST_PYTHON_VERSIONS = ["3.8"] +SYSTEM_TEST_STANDARD_DEPENDENCIES = [ + "mock", + "pytest", + "google-cloud-testutils", +] +SYSTEM_TEST_EXTERNAL_DEPENDENCIES = [] +SYSTEM_TEST_LOCAL_DEPENDENCIES = [] +SYSTEM_TEST_DEPENDENCIES = [] +SYSTEM_TEST_EXTRAS = [] +SYSTEM_TEST_EXTRAS_BY_PYTHON = {} CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute() @@ -57,7 +83,9 @@ def lint(session): """ session.install("flake8", BLACK_VERSION) session.run( - "black", "--check", *BLACK_PATHS, + "black", + "--check", + *LINT_PATHS, ) session.run("flake8", "google", "tests") @@ -67,7 +95,28 @@ def blacken(session): """Run black. Format code to uniform standard.""" session.install(BLACK_VERSION) session.run( - "black", *BLACK_PATHS, + "black", + *LINT_PATHS, + ) + + +@nox.session(python=DEFAULT_PYTHON_VERSION) +def format(session): + """ + Run isort to sort imports. Then run black + to format code to uniform standard. + """ + session.install(BLACK_VERSION, ISORT_VERSION) + # Use the --fss option to sort imports using strict alphabetical order. + # See https://pycqa.github.io/isort/docs/configuration/options.html#force-sort-within-sections + session.run( + "isort", + "--fss", + *LINT_PATHS, + ) + session.run( + "black", + *LINT_PATHS, ) @@ -78,23 +127,41 @@ def lint_setup_py(session): session.run("python", "setup.py", "check", "--restructuredtext", "--strict") +def install_unittest_dependencies(session, *constraints): + standard_deps = UNIT_TEST_STANDARD_DEPENDENCIES + UNIT_TEST_DEPENDENCIES + session.install(*standard_deps, *constraints) + + if UNIT_TEST_EXTERNAL_DEPENDENCIES: + warnings.warn( + "'unit_test_external_dependencies' is deprecated. Instead, please " + "use 'unit_test_dependencies' or 'unit_test_local_dependencies'.", + DeprecationWarning, + ) + session.install(*UNIT_TEST_EXTERNAL_DEPENDENCIES, *constraints) + + if UNIT_TEST_LOCAL_DEPENDENCIES: + session.install(*UNIT_TEST_LOCAL_DEPENDENCIES, *constraints) + + if UNIT_TEST_EXTRAS_BY_PYTHON: + extras = UNIT_TEST_EXTRAS_BY_PYTHON.get(session.python, []) + elif UNIT_TEST_EXTRAS: + extras = UNIT_TEST_EXTRAS + else: + extras = [] + + if extras: + session.install("-e", f".[{','.join(extras)}]", *constraints) + else: + session.install("-e", ".", *constraints) + + def default(session): # Install all test dependencies, then install this package in-place. constraints_path = str( CURRENT_DIRECTORY / "testing" / f"constraints-{session.python}.txt" ) - session.install( - "mock", - "asyncmock", - "pytest", - "pytest-cov", - "pytest-asyncio", - "-c", - constraints_path, - ) - - session.install("-e", ".", "-c", constraints_path) + install_unittest_dependencies(session, "-c", constraints_path) # Run py.test against the unit tests. session.run( @@ -118,6 +185,35 @@ def unit(session): default(session) +def install_systemtest_dependencies(session, *constraints): + + # Use pre-release gRPC for system tests. + session.install("--pre", "grpcio") + + session.install(*SYSTEM_TEST_STANDARD_DEPENDENCIES, *constraints) + + if SYSTEM_TEST_EXTERNAL_DEPENDENCIES: + session.install(*SYSTEM_TEST_EXTERNAL_DEPENDENCIES, *constraints) + + if SYSTEM_TEST_LOCAL_DEPENDENCIES: + session.install("-e", *SYSTEM_TEST_LOCAL_DEPENDENCIES, *constraints) + + if SYSTEM_TEST_DEPENDENCIES: + session.install("-e", *SYSTEM_TEST_DEPENDENCIES, *constraints) + + if SYSTEM_TEST_EXTRAS_BY_PYTHON: + extras = SYSTEM_TEST_EXTRAS_BY_PYTHON.get(session.python, []) + elif SYSTEM_TEST_EXTRAS: + extras = SYSTEM_TEST_EXTRAS + else: + extras = [] + + if extras: + session.install("-e", f".[{','.join(extras)}]", *constraints) + else: + session.install("-e", ".", *constraints) + + @nox.session(python=SYSTEM_TEST_PYTHON_VERSIONS) def system(session): """Run the system test suite.""" @@ -140,13 +236,7 @@ def system(session): if not system_test_exists and not system_test_folder_exists: session.skip("System tests were not found") - # Use pre-release gRPC for system tests. - session.install("--pre", "grpcio") - - # Install all test dependencies, then install this package into the - # virtualenv's dist-packages. - session.install("mock", "pytest", "google-cloud-testutils", "-c", constraints_path) - session.install("-e", ".", "-c", constraints_path) + install_systemtest_dependencies(session, "-c", constraints_path) # Run py.test against the system tests. if system_test_exists: diff --git a/samples/generated_samples/snippet_metadata_service usage_v1.json b/samples/generated_samples/snippet_metadata_service usage_v1.json index 25261c9..895e740 100644 --- a/samples/generated_samples/snippet_metadata_service usage_v1.json +++ b/samples/generated_samples/snippet_metadata_service usage_v1.json @@ -1,16 +1,57 @@ { + "clientLibrary": { + "apis": [ + { + "id": "google.api.serviceusage.v1", + "version": "v1" + } + ], + "language": "PYTHON", + "name": "google-cloud-service-usage" + }, "snippets": [ { + "canonical": true, "clientMethod": { "async": true, + "client": { + "fullName": "google.cloud.service_usage_v1.ServiceUsageAsyncClient", + "shortName": "ServiceUsageAsyncClient" + }, + "fullName": "google.cloud.service_usage_v1.ServiceUsageAsyncClient.batch_enable_services", "method": { + "fullName": "google.api.serviceusage.v1.ServiceUsage.BatchEnableServices", "service": { + "fullName": "google.api.serviceusage.v1.ServiceUsage", "shortName": "ServiceUsage" }, "shortName": "BatchEnableServices" - } + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.service_usage_v1.types.BatchEnableServicesRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation_async.AsyncOperation", + "shortName": "batch_enable_services" }, + "description": "Sample for BatchEnableServices", "file": "serviceusage_v1_generated_service_usage_batch_enable_services_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", "regionTag": "serviceusage_v1_generated_ServiceUsage_BatchEnableServices_async", "segments": [ { @@ -43,18 +84,50 @@ "start": 45, "type": "RESPONSE_HANDLING" } - ] + ], + "title": "serviceusage_v1_generated_service_usage_batch_enable_services_async.py" }, { + "canonical": true, "clientMethod": { + "client": { + "fullName": "google.cloud.service_usage_v1.ServiceUsageClient", + "shortName": "ServiceUsageClient" + }, + "fullName": "google.cloud.service_usage_v1.ServiceUsageClient.batch_enable_services", "method": { + "fullName": "google.api.serviceusage.v1.ServiceUsage.BatchEnableServices", "service": { + "fullName": "google.api.serviceusage.v1.ServiceUsage", "shortName": "ServiceUsage" }, "shortName": "BatchEnableServices" - } + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.service_usage_v1.types.BatchEnableServicesRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation.Operation", + "shortName": "batch_enable_services" }, + "description": "Sample for BatchEnableServices", "file": "serviceusage_v1_generated_service_usage_batch_enable_services_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", "regionTag": "serviceusage_v1_generated_ServiceUsage_BatchEnableServices_sync", "segments": [ { @@ -87,19 +160,51 @@ "start": 45, "type": "RESPONSE_HANDLING" } - ] + ], + "title": "serviceusage_v1_generated_service_usage_batch_enable_services_sync.py" }, { + "canonical": true, "clientMethod": { "async": true, + "client": { + "fullName": "google.cloud.service_usage_v1.ServiceUsageAsyncClient", + "shortName": "ServiceUsageAsyncClient" + }, + "fullName": "google.cloud.service_usage_v1.ServiceUsageAsyncClient.batch_get_services", "method": { + "fullName": "google.api.serviceusage.v1.ServiceUsage.BatchGetServices", "service": { + "fullName": "google.api.serviceusage.v1.ServiceUsage", "shortName": "ServiceUsage" }, "shortName": "BatchGetServices" - } + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.service_usage_v1.types.BatchGetServicesRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.service_usage_v1.types.BatchGetServicesResponse", + "shortName": "batch_get_services" }, + "description": "Sample for BatchGetServices", "file": "serviceusage_v1_generated_service_usage_batch_get_services_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", "regionTag": "serviceusage_v1_generated_ServiceUsage_BatchGetServices_async", "segments": [ { @@ -132,18 +237,50 @@ "start": 41, "type": "RESPONSE_HANDLING" } - ] + ], + "title": "serviceusage_v1_generated_service_usage_batch_get_services_async.py" }, { + "canonical": true, "clientMethod": { + "client": { + "fullName": "google.cloud.service_usage_v1.ServiceUsageClient", + "shortName": "ServiceUsageClient" + }, + "fullName": "google.cloud.service_usage_v1.ServiceUsageClient.batch_get_services", "method": { + "fullName": "google.api.serviceusage.v1.ServiceUsage.BatchGetServices", "service": { + "fullName": "google.api.serviceusage.v1.ServiceUsage", "shortName": "ServiceUsage" }, "shortName": "BatchGetServices" - } + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.service_usage_v1.types.BatchGetServicesRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.service_usage_v1.types.BatchGetServicesResponse", + "shortName": "batch_get_services" }, + "description": "Sample for BatchGetServices", "file": "serviceusage_v1_generated_service_usage_batch_get_services_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", "regionTag": "serviceusage_v1_generated_ServiceUsage_BatchGetServices_sync", "segments": [ { @@ -176,19 +313,51 @@ "start": 41, "type": "RESPONSE_HANDLING" } - ] + ], + "title": "serviceusage_v1_generated_service_usage_batch_get_services_sync.py" }, { + "canonical": true, "clientMethod": { "async": true, + "client": { + "fullName": "google.cloud.service_usage_v1.ServiceUsageAsyncClient", + "shortName": "ServiceUsageAsyncClient" + }, + "fullName": "google.cloud.service_usage_v1.ServiceUsageAsyncClient.disable_service", "method": { + "fullName": "google.api.serviceusage.v1.ServiceUsage.DisableService", "service": { + "fullName": "google.api.serviceusage.v1.ServiceUsage", "shortName": "ServiceUsage" }, "shortName": "DisableService" - } + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.service_usage_v1.types.DisableServiceRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation_async.AsyncOperation", + "shortName": "disable_service" }, + "description": "Sample for DisableService", "file": "serviceusage_v1_generated_service_usage_disable_service_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", "regionTag": "serviceusage_v1_generated_ServiceUsage_DisableService_async", "segments": [ { @@ -221,18 +390,50 @@ "start": 45, "type": "RESPONSE_HANDLING" } - ] + ], + "title": "serviceusage_v1_generated_service_usage_disable_service_async.py" }, { + "canonical": true, "clientMethod": { + "client": { + "fullName": "google.cloud.service_usage_v1.ServiceUsageClient", + "shortName": "ServiceUsageClient" + }, + "fullName": "google.cloud.service_usage_v1.ServiceUsageClient.disable_service", "method": { + "fullName": "google.api.serviceusage.v1.ServiceUsage.DisableService", "service": { + "fullName": "google.api.serviceusage.v1.ServiceUsage", "shortName": "ServiceUsage" }, "shortName": "DisableService" - } + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.service_usage_v1.types.DisableServiceRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation.Operation", + "shortName": "disable_service" }, + "description": "Sample for DisableService", "file": "serviceusage_v1_generated_service_usage_disable_service_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", "regionTag": "serviceusage_v1_generated_ServiceUsage_DisableService_sync", "segments": [ { @@ -265,19 +466,51 @@ "start": 45, "type": "RESPONSE_HANDLING" } - ] + ], + "title": "serviceusage_v1_generated_service_usage_disable_service_sync.py" }, { + "canonical": true, "clientMethod": { "async": true, + "client": { + "fullName": "google.cloud.service_usage_v1.ServiceUsageAsyncClient", + "shortName": "ServiceUsageAsyncClient" + }, + "fullName": "google.cloud.service_usage_v1.ServiceUsageAsyncClient.enable_service", "method": { + "fullName": "google.api.serviceusage.v1.ServiceUsage.EnableService", "service": { + "fullName": "google.api.serviceusage.v1.ServiceUsage", "shortName": "ServiceUsage" }, "shortName": "EnableService" - } + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.service_usage_v1.types.EnableServiceRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation_async.AsyncOperation", + "shortName": "enable_service" }, + "description": "Sample for EnableService", "file": "serviceusage_v1_generated_service_usage_enable_service_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", "regionTag": "serviceusage_v1_generated_ServiceUsage_EnableService_async", "segments": [ { @@ -310,18 +543,50 @@ "start": 45, "type": "RESPONSE_HANDLING" } - ] + ], + "title": "serviceusage_v1_generated_service_usage_enable_service_async.py" }, { + "canonical": true, "clientMethod": { + "client": { + "fullName": "google.cloud.service_usage_v1.ServiceUsageClient", + "shortName": "ServiceUsageClient" + }, + "fullName": "google.cloud.service_usage_v1.ServiceUsageClient.enable_service", "method": { + "fullName": "google.api.serviceusage.v1.ServiceUsage.EnableService", "service": { + "fullName": "google.api.serviceusage.v1.ServiceUsage", "shortName": "ServiceUsage" }, "shortName": "EnableService" - } + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.service_usage_v1.types.EnableServiceRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.api_core.operation.Operation", + "shortName": "enable_service" }, + "description": "Sample for EnableService", "file": "serviceusage_v1_generated_service_usage_enable_service_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", "regionTag": "serviceusage_v1_generated_ServiceUsage_EnableService_sync", "segments": [ { @@ -354,19 +619,51 @@ "start": 45, "type": "RESPONSE_HANDLING" } - ] + ], + "title": "serviceusage_v1_generated_service_usage_enable_service_sync.py" }, { + "canonical": true, "clientMethod": { "async": true, + "client": { + "fullName": "google.cloud.service_usage_v1.ServiceUsageAsyncClient", + "shortName": "ServiceUsageAsyncClient" + }, + "fullName": "google.cloud.service_usage_v1.ServiceUsageAsyncClient.get_service", "method": { + "fullName": "google.api.serviceusage.v1.ServiceUsage.GetService", "service": { + "fullName": "google.api.serviceusage.v1.ServiceUsage", "shortName": "ServiceUsage" }, "shortName": "GetService" - } + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.service_usage_v1.types.GetServiceRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.service_usage_v1.types.Service", + "shortName": "get_service" }, + "description": "Sample for GetService", "file": "serviceusage_v1_generated_service_usage_get_service_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", "regionTag": "serviceusage_v1_generated_ServiceUsage_GetService_async", "segments": [ { @@ -399,18 +696,50 @@ "start": 41, "type": "RESPONSE_HANDLING" } - ] + ], + "title": "serviceusage_v1_generated_service_usage_get_service_async.py" }, { + "canonical": true, "clientMethod": { + "client": { + "fullName": "google.cloud.service_usage_v1.ServiceUsageClient", + "shortName": "ServiceUsageClient" + }, + "fullName": "google.cloud.service_usage_v1.ServiceUsageClient.get_service", "method": { + "fullName": "google.api.serviceusage.v1.ServiceUsage.GetService", "service": { + "fullName": "google.api.serviceusage.v1.ServiceUsage", "shortName": "ServiceUsage" }, "shortName": "GetService" - } + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.service_usage_v1.types.GetServiceRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.service_usage_v1.types.Service", + "shortName": "get_service" }, + "description": "Sample for GetService", "file": "serviceusage_v1_generated_service_usage_get_service_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", "regionTag": "serviceusage_v1_generated_ServiceUsage_GetService_sync", "segments": [ { @@ -443,19 +772,51 @@ "start": 41, "type": "RESPONSE_HANDLING" } - ] + ], + "title": "serviceusage_v1_generated_service_usage_get_service_sync.py" }, { + "canonical": true, "clientMethod": { "async": true, + "client": { + "fullName": "google.cloud.service_usage_v1.ServiceUsageAsyncClient", + "shortName": "ServiceUsageAsyncClient" + }, + "fullName": "google.cloud.service_usage_v1.ServiceUsageAsyncClient.list_services", "method": { + "fullName": "google.api.serviceusage.v1.ServiceUsage.ListServices", "service": { + "fullName": "google.api.serviceusage.v1.ServiceUsage", "shortName": "ServiceUsage" }, "shortName": "ListServices" - } + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.service_usage_v1.types.ListServicesRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.service_usage_v1.services.service_usage.pagers.ListServicesAsyncPager", + "shortName": "list_services" }, + "description": "Sample for ListServices", "file": "serviceusage_v1_generated_service_usage_list_services_async.py", + "language": "PYTHON", + "origin": "API_DEFINITION", "regionTag": "serviceusage_v1_generated_ServiceUsage_ListServices_async", "segments": [ { @@ -488,18 +849,50 @@ "start": 41, "type": "RESPONSE_HANDLING" } - ] + ], + "title": "serviceusage_v1_generated_service_usage_list_services_async.py" }, { + "canonical": true, "clientMethod": { + "client": { + "fullName": "google.cloud.service_usage_v1.ServiceUsageClient", + "shortName": "ServiceUsageClient" + }, + "fullName": "google.cloud.service_usage_v1.ServiceUsageClient.list_services", "method": { + "fullName": "google.api.serviceusage.v1.ServiceUsage.ListServices", "service": { + "fullName": "google.api.serviceusage.v1.ServiceUsage", "shortName": "ServiceUsage" }, "shortName": "ListServices" - } + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.service_usage_v1.types.ListServicesRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, str]" + } + ], + "resultType": "google.cloud.service_usage_v1.services.service_usage.pagers.ListServicesPager", + "shortName": "list_services" }, + "description": "Sample for ListServices", "file": "serviceusage_v1_generated_service_usage_list_services_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", "regionTag": "serviceusage_v1_generated_ServiceUsage_ListServices_sync", "segments": [ { @@ -532,7 +925,8 @@ "start": 41, "type": "RESPONSE_HANDLING" } - ] + ], + "title": "serviceusage_v1_generated_service_usage_list_services_sync.py" } ] } diff --git a/scripts/readme-gen/readme_gen.py b/scripts/readme-gen/readme_gen.py index d309d6e..91b5967 100644 --- a/scripts/readme-gen/readme_gen.py +++ b/scripts/readme-gen/readme_gen.py @@ -28,7 +28,10 @@ jinja_env = jinja2.Environment( trim_blocks=True, loader=jinja2.FileSystemLoader( - os.path.abspath(os.path.join(os.path.dirname(__file__), 'templates')))) + os.path.abspath(os.path.join(os.path.dirname(__file__), "templates")) + ), + autoescape=True, +) README_TMPL = jinja_env.get_template('README.tmpl.rst') diff --git a/setup.py b/setup.py index 64541f2..e8fc105 100644 --- a/setup.py +++ b/setup.py @@ -19,10 +19,9 @@ import setuptools - name = "google-cloud-service-usage" description = "Service Usage API client library" -version = "1.3.1" +version = "1.3.2" release_status = "Development Status :: 5 - Production/Stable" url = "https://github.com/googleapis/python-service-usage" dependencies = [ @@ -30,7 +29,8 @@ # Until this issue is closed # https://github.com/googleapis/google-cloud-python/issues/10566 "google-api-core[grpc] >= 1.31.5, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.0", - "proto-plus >= 1.15.0", + "proto-plus >= 1.15.0, <2.0.0dev", + "protobuf >= 3.19.0, <4.0.0dev", ] package_root = os.path.abspath(os.path.dirname(__file__)) diff --git a/testing/constraints-3.6.txt b/testing/constraints-3.6.txt index be5a64f..786e637 100644 --- a/testing/constraints-3.6.txt +++ b/testing/constraints-3.6.txt @@ -6,3 +6,4 @@ # Then this file should have google-cloud-foo==1.14.0 google-api-core==1.31.5 proto-plus==1.15.0 +protobuf==3.19.0 diff --git a/testing/constraints-3.7.txt b/testing/constraints-3.7.txt index e69de29..786e637 100644 --- a/testing/constraints-3.7.txt +++ b/testing/constraints-3.7.txt @@ -0,0 +1,9 @@ +# This constraints file is used to check that lower bounds +# are correct in setup.py +# List all library dependencies and extras in this file. +# Pin the version to the lower bound. +# e.g., if setup.py has "google-cloud-foo >= 1.14.0, < 2.0.0dev", +# Then this file should have google-cloud-foo==1.14.0 +google-api-core==1.31.5 +proto-plus==1.15.0 +protobuf==3.19.0 diff --git a/tests/unit/gapic/service_usage_v1/test_service_usage.py b/tests/unit/gapic/service_usage_v1/test_service_usage.py index a78448a..60fc377 100644 --- a/tests/unit/gapic/service_usage_v1/test_service_usage.py +++ b/tests/unit/gapic/service_usage_v1/test_service_usage.py @@ -14,36 +14,45 @@ # limitations under the License. # import os -import mock -import grpc -from grpc.experimental import aio -import math -import pytest -from proto.marshal.rules.dates import DurationRule, TimestampRule +# try/except added for compatibility with python < 3.8 +try: + from unittest import mock + from unittest.mock import AsyncMock +except ImportError: + import mock +import math +from google.api_core import ( + future, + gapic_v1, + grpc_helpers, + grpc_helpers_async, + operation, + operations_v1, + path_template, +) from google.api_core import client_options from google.api_core import exceptions as core_exceptions -from google.api_core import future -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 operation from google.api_core import operation_async # type: ignore -from google.api_core import operations_v1 -from google.api_core import path_template +import google.auth from google.auth import credentials as ga_credentials from google.auth.exceptions import MutualTLSChannelError -from google.cloud.service_usage_v1.services.service_usage import ServiceUsageAsyncClient -from google.cloud.service_usage_v1.services.service_usage import ServiceUsageClient -from google.cloud.service_usage_v1.services.service_usage import pagers -from google.cloud.service_usage_v1.services.service_usage import transports -from google.cloud.service_usage_v1.types import resources -from google.cloud.service_usage_v1.types import serviceusage from google.longrunning import operations_pb2 from google.oauth2 import service_account -import google.auth +import grpc +from grpc.experimental import aio +from proto.marshal.rules.dates import DurationRule, TimestampRule +import pytest + +from google.cloud.service_usage_v1.services.service_usage import ( + ServiceUsageAsyncClient, + ServiceUsageClient, + pagers, + transports, +) +from google.cloud.service_usage_v1.types import resources, serviceusage def client_cert_source_callback(): @@ -87,19 +96,25 @@ def test__get_default_mtls_endpoint(): assert ServiceUsageClient._get_default_mtls_endpoint(non_googleapi) == non_googleapi -@pytest.mark.parametrize("client_class", [ServiceUsageClient, ServiceUsageAsyncClient,]) -def test_service_usage_client_from_service_account_info(client_class): +@pytest.mark.parametrize( + "client_class,transport_name", + [ + (ServiceUsageClient, "grpc"), + (ServiceUsageAsyncClient, "grpc_asyncio"), + ], +) +def test_service_usage_client_from_service_account_info(client_class, transport_name): creds = ga_credentials.AnonymousCredentials() with mock.patch.object( service_account.Credentials, "from_service_account_info" ) as factory: factory.return_value = creds info = {"valid": True} - client = client_class.from_service_account_info(info) + client = client_class.from_service_account_info(info, transport=transport_name) assert client.transport._credentials == creds assert isinstance(client, client_class) - assert client.transport._host == "serviceusage.googleapis.com:443" + assert client.transport._host == ("serviceusage.googleapis.com:443") @pytest.mark.parametrize( @@ -127,22 +142,32 @@ def test_service_usage_client_service_account_always_use_jwt( use_jwt.assert_not_called() -@pytest.mark.parametrize("client_class", [ServiceUsageClient, ServiceUsageAsyncClient,]) -def test_service_usage_client_from_service_account_file(client_class): +@pytest.mark.parametrize( + "client_class,transport_name", + [ + (ServiceUsageClient, "grpc"), + (ServiceUsageAsyncClient, "grpc_asyncio"), + ], +) +def test_service_usage_client_from_service_account_file(client_class, transport_name): creds = ga_credentials.AnonymousCredentials() with mock.patch.object( service_account.Credentials, "from_service_account_file" ) as factory: factory.return_value = creds - client = client_class.from_service_account_file("dummy/file/path.json") + client = client_class.from_service_account_file( + "dummy/file/path.json", transport=transport_name + ) assert client.transport._credentials == creds assert isinstance(client, client_class) - client = client_class.from_service_account_json("dummy/file/path.json") + client = client_class.from_service_account_json( + "dummy/file/path.json", transport=transport_name + ) assert client.transport._credentials == creds assert isinstance(client, client_class) - assert client.transport._host == "serviceusage.googleapis.com:443" + assert client.transport._host == ("serviceusage.googleapis.com:443") def test_service_usage_client_get_transport_class(): @@ -482,7 +507,9 @@ def test_service_usage_client_client_options_scopes( client_class, transport_class, transport_name ): # Check the case scopes are provided. - options = client_options.ClientOptions(scopes=["1", "2"],) + 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, transport=transport_name) @@ -624,10 +651,17 @@ def test_service_usage_client_create_channel_credentials_file( ) -@pytest.mark.parametrize("request_type", [serviceusage.EnableServiceRequest, dict,]) +@pytest.mark.parametrize( + "request_type", + [ + serviceusage.EnableServiceRequest, + dict, + ], +) def test_enable_service(request_type, transport: str = "grpc"): client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # Everything is optional in proto3 as far as the runtime is concerned, @@ -653,7 +687,8 @@ def test_enable_service_empty_call(): # This test is a coverage failsafe to make sure that totally empty calls, # i.e. request == None and no flattened fields passed, work. client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport="grpc", + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", ) # Mock the actual call within the gRPC stub, and fake the request. @@ -669,7 +704,8 @@ async def test_enable_service_async( transport: str = "grpc_asyncio", request_type=serviceusage.EnableServiceRequest ): client = ServiceUsageAsyncClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # Everything is optional in proto3 as far as the runtime is concerned, @@ -699,13 +735,15 @@ async def test_enable_service_async_from_dict(): def test_enable_service_field_headers(): - client = ServiceUsageClient(credentials=ga_credentials.AnonymousCredentials(),) + client = ServiceUsageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) # Any value that is part of the HTTP/1.1 URI should be sent as # a field header. Set these to a non-empty value. request = serviceusage.EnableServiceRequest() - request.name = "name/value" + request.name = "name_value" # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object(type(client.transport.enable_service), "__call__") as call: @@ -719,18 +757,23 @@ def test_enable_service_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=name/value",) in kw["metadata"] + assert ( + "x-goog-request-params", + "name=name_value", + ) in kw["metadata"] @pytest.mark.asyncio async def test_enable_service_field_headers_async(): - client = ServiceUsageAsyncClient(credentials=ga_credentials.AnonymousCredentials(),) + client = ServiceUsageAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) # Any value that is part of the HTTP/1.1 URI should be sent as # a field header. Set these to a non-empty value. request = serviceusage.EnableServiceRequest() - request.name = "name/value" + request.name = "name_value" # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object(type(client.transport.enable_service), "__call__") as call: @@ -746,13 +789,23 @@ async def test_enable_service_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=name/value",) in kw["metadata"] + assert ( + "x-goog-request-params", + "name=name_value", + ) in kw["metadata"] -@pytest.mark.parametrize("request_type", [serviceusage.DisableServiceRequest, dict,]) +@pytest.mark.parametrize( + "request_type", + [ + serviceusage.DisableServiceRequest, + dict, + ], +) def test_disable_service(request_type, transport: str = "grpc"): client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # Everything is optional in proto3 as far as the runtime is concerned, @@ -778,7 +831,8 @@ def test_disable_service_empty_call(): # This test is a coverage failsafe to make sure that totally empty calls, # i.e. request == None and no flattened fields passed, work. client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport="grpc", + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", ) # Mock the actual call within the gRPC stub, and fake the request. @@ -794,7 +848,8 @@ async def test_disable_service_async( transport: str = "grpc_asyncio", request_type=serviceusage.DisableServiceRequest ): client = ServiceUsageAsyncClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # Everything is optional in proto3 as far as the runtime is concerned, @@ -824,13 +879,15 @@ async def test_disable_service_async_from_dict(): def test_disable_service_field_headers(): - client = ServiceUsageClient(credentials=ga_credentials.AnonymousCredentials(),) + client = ServiceUsageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) # Any value that is part of the HTTP/1.1 URI should be sent as # a field header. Set these to a non-empty value. request = serviceusage.DisableServiceRequest() - request.name = "name/value" + request.name = "name_value" # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object(type(client.transport.disable_service), "__call__") as call: @@ -844,18 +901,23 @@ def test_disable_service_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=name/value",) in kw["metadata"] + assert ( + "x-goog-request-params", + "name=name_value", + ) in kw["metadata"] @pytest.mark.asyncio async def test_disable_service_field_headers_async(): - client = ServiceUsageAsyncClient(credentials=ga_credentials.AnonymousCredentials(),) + client = ServiceUsageAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) # Any value that is part of the HTTP/1.1 URI should be sent as # a field header. Set these to a non-empty value. request = serviceusage.DisableServiceRequest() - request.name = "name/value" + request.name = "name_value" # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object(type(client.transport.disable_service), "__call__") as call: @@ -871,13 +933,23 @@ async def test_disable_service_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=name/value",) in kw["metadata"] + assert ( + "x-goog-request-params", + "name=name_value", + ) in kw["metadata"] -@pytest.mark.parametrize("request_type", [serviceusage.GetServiceRequest, dict,]) +@pytest.mark.parametrize( + "request_type", + [ + serviceusage.GetServiceRequest, + dict, + ], +) def test_get_service(request_type, transport: str = "grpc"): client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # Everything is optional in proto3 as far as the runtime is concerned, @@ -888,7 +960,9 @@ def test_get_service(request_type, transport: str = "grpc"): with mock.patch.object(type(client.transport.get_service), "__call__") as call: # Designate an appropriate return value for the call. call.return_value = resources.Service( - name="name_value", parent="parent_value", state=resources.State.DISABLED, + name="name_value", + parent="parent_value", + state=resources.State.DISABLED, ) response = client.get_service(request) @@ -908,7 +982,8 @@ def test_get_service_empty_call(): # This test is a coverage failsafe to make sure that totally empty calls, # i.e. request == None and no flattened fields passed, work. client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport="grpc", + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", ) # Mock the actual call within the gRPC stub, and fake the request. @@ -924,7 +999,8 @@ async def test_get_service_async( transport: str = "grpc_asyncio", request_type=serviceusage.GetServiceRequest ): client = ServiceUsageAsyncClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # Everything is optional in proto3 as far as the runtime is concerned, @@ -961,13 +1037,15 @@ async def test_get_service_async_from_dict(): def test_get_service_field_headers(): - client = ServiceUsageClient(credentials=ga_credentials.AnonymousCredentials(),) + client = ServiceUsageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) # Any value that is part of the HTTP/1.1 URI should be sent as # a field header. Set these to a non-empty value. request = serviceusage.GetServiceRequest() - request.name = "name/value" + request.name = "name_value" # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object(type(client.transport.get_service), "__call__") as call: @@ -981,18 +1059,23 @@ def test_get_service_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=name/value",) in kw["metadata"] + assert ( + "x-goog-request-params", + "name=name_value", + ) in kw["metadata"] @pytest.mark.asyncio async def test_get_service_field_headers_async(): - client = ServiceUsageAsyncClient(credentials=ga_credentials.AnonymousCredentials(),) + client = ServiceUsageAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) # Any value that is part of the HTTP/1.1 URI should be sent as # a field header. Set these to a non-empty value. request = serviceusage.GetServiceRequest() - request.name = "name/value" + request.name = "name_value" # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object(type(client.transport.get_service), "__call__") as call: @@ -1006,13 +1089,23 @@ async def test_get_service_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "name=name/value",) in kw["metadata"] + assert ( + "x-goog-request-params", + "name=name_value", + ) in kw["metadata"] -@pytest.mark.parametrize("request_type", [serviceusage.ListServicesRequest, dict,]) +@pytest.mark.parametrize( + "request_type", + [ + serviceusage.ListServicesRequest, + dict, + ], +) def test_list_services(request_type, transport: str = "grpc"): client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # Everything is optional in proto3 as far as the runtime is concerned, @@ -1041,7 +1134,8 @@ def test_list_services_empty_call(): # This test is a coverage failsafe to make sure that totally empty calls, # i.e. request == None and no flattened fields passed, work. client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport="grpc", + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", ) # Mock the actual call within the gRPC stub, and fake the request. @@ -1057,7 +1151,8 @@ async def test_list_services_async( transport: str = "grpc_asyncio", request_type=serviceusage.ListServicesRequest ): client = ServiceUsageAsyncClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # Everything is optional in proto3 as far as the runtime is concerned, @@ -1068,7 +1163,9 @@ async def test_list_services_async( with mock.patch.object(type(client.transport.list_services), "__call__") as call: # Designate an appropriate return value for the call. call.return_value = grpc_helpers_async.FakeUnaryUnaryCall( - serviceusage.ListServicesResponse(next_page_token="next_page_token_value",) + serviceusage.ListServicesResponse( + next_page_token="next_page_token_value", + ) ) response = await client.list_services(request) @@ -1088,13 +1185,15 @@ async def test_list_services_async_from_dict(): def test_list_services_field_headers(): - client = ServiceUsageClient(credentials=ga_credentials.AnonymousCredentials(),) + client = ServiceUsageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) # Any value that is part of the HTTP/1.1 URI should be sent as # a field header. Set these to a non-empty value. request = serviceusage.ListServicesRequest() - request.parent = "parent/value" + request.parent = "parent_value" # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object(type(client.transport.list_services), "__call__") as call: @@ -1108,18 +1207,23 @@ def test_list_services_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "parent=parent/value",) in kw["metadata"] + assert ( + "x-goog-request-params", + "parent=parent_value", + ) in kw["metadata"] @pytest.mark.asyncio async def test_list_services_field_headers_async(): - client = ServiceUsageAsyncClient(credentials=ga_credentials.AnonymousCredentials(),) + client = ServiceUsageAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) # Any value that is part of the HTTP/1.1 URI should be sent as # a field header. Set these to a non-empty value. request = serviceusage.ListServicesRequest() - request.parent = "parent/value" + request.parent = "parent_value" # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object(type(client.transport.list_services), "__call__") as call: @@ -1135,12 +1239,16 @@ async def test_list_services_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "parent=parent/value",) in kw["metadata"] + assert ( + "x-goog-request-params", + "parent=parent_value", + ) in kw["metadata"] def test_list_services_pager(transport_name: str = "grpc"): client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials, transport=transport_name, + credentials=ga_credentials.AnonymousCredentials, + transport=transport_name, ) # Mock the actual call within the gRPC stub, and fake the request. @@ -1155,12 +1263,21 @@ def test_list_services_pager(transport_name: str = "grpc"): ], next_page_token="abc", ), - serviceusage.ListServicesResponse(services=[], next_page_token="def",), serviceusage.ListServicesResponse( - services=[resources.Service(),], next_page_token="ghi", + services=[], + next_page_token="def", ), serviceusage.ListServicesResponse( - services=[resources.Service(), resources.Service(),], + services=[ + resources.Service(), + ], + next_page_token="ghi", + ), + serviceusage.ListServicesResponse( + services=[ + resources.Service(), + resources.Service(), + ], ), RuntimeError, ) @@ -1173,14 +1290,15 @@ def test_list_services_pager(transport_name: str = "grpc"): assert pager._metadata == metadata - results = [i for i in pager] + results = list(pager) assert len(results) == 6 assert all(isinstance(i, resources.Service) for i in results) def test_list_services_pages(transport_name: str = "grpc"): client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials, transport=transport_name, + credentials=ga_credentials.AnonymousCredentials, + transport=transport_name, ) # Mock the actual call within the gRPC stub, and fake the request. @@ -1195,12 +1313,21 @@ def test_list_services_pages(transport_name: str = "grpc"): ], next_page_token="abc", ), - serviceusage.ListServicesResponse(services=[], next_page_token="def",), serviceusage.ListServicesResponse( - services=[resources.Service(),], next_page_token="ghi", + services=[], + next_page_token="def", ), serviceusage.ListServicesResponse( - services=[resources.Service(), resources.Service(),], + services=[ + resources.Service(), + ], + next_page_token="ghi", + ), + serviceusage.ListServicesResponse( + services=[ + resources.Service(), + resources.Service(), + ], ), RuntimeError, ) @@ -1211,7 +1338,9 @@ def test_list_services_pages(transport_name: str = "grpc"): @pytest.mark.asyncio async def test_list_services_async_pager(): - client = ServiceUsageAsyncClient(credentials=ga_credentials.AnonymousCredentials,) + client = ServiceUsageAsyncClient( + credentials=ga_credentials.AnonymousCredentials, + ) # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object( @@ -1227,19 +1356,30 @@ async def test_list_services_async_pager(): ], next_page_token="abc", ), - serviceusage.ListServicesResponse(services=[], next_page_token="def",), serviceusage.ListServicesResponse( - services=[resources.Service(),], next_page_token="ghi", + services=[], + next_page_token="def", ), serviceusage.ListServicesResponse( - services=[resources.Service(), resources.Service(),], + services=[ + resources.Service(), + ], + next_page_token="ghi", + ), + serviceusage.ListServicesResponse( + services=[ + resources.Service(), + resources.Service(), + ], ), RuntimeError, ) - async_pager = await client.list_services(request={},) + async_pager = await client.list_services( + request={}, + ) assert async_pager.next_page_token == "abc" responses = [] - async for response in async_pager: + async for response in async_pager: # pragma: no branch responses.append(response) assert len(responses) == 6 @@ -1248,7 +1388,9 @@ async def test_list_services_async_pager(): @pytest.mark.asyncio async def test_list_services_async_pages(): - client = ServiceUsageAsyncClient(credentials=ga_credentials.AnonymousCredentials,) + client = ServiceUsageAsyncClient( + credentials=ga_credentials.AnonymousCredentials, + ) # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object( @@ -1264,28 +1406,44 @@ async def test_list_services_async_pages(): ], next_page_token="abc", ), - serviceusage.ListServicesResponse(services=[], next_page_token="def",), serviceusage.ListServicesResponse( - services=[resources.Service(),], next_page_token="ghi", + services=[], + next_page_token="def", ), serviceusage.ListServicesResponse( - services=[resources.Service(), resources.Service(),], + services=[ + resources.Service(), + ], + next_page_token="ghi", + ), + serviceusage.ListServicesResponse( + services=[ + resources.Service(), + resources.Service(), + ], ), RuntimeError, ) pages = [] - async for page_ in (await client.list_services(request={})).pages: + async for page_ in ( + await client.list_services(request={}) + ).pages: # pragma: no branch pages.append(page_) for page_, token in zip(pages, ["abc", "def", "ghi", ""]): assert page_.raw_page.next_page_token == token @pytest.mark.parametrize( - "request_type", [serviceusage.BatchEnableServicesRequest, dict,] + "request_type", + [ + serviceusage.BatchEnableServicesRequest, + dict, + ], ) def test_batch_enable_services(request_type, transport: str = "grpc"): client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # Everything is optional in proto3 as far as the runtime is concerned, @@ -1313,7 +1471,8 @@ def test_batch_enable_services_empty_call(): # This test is a coverage failsafe to make sure that totally empty calls, # i.e. request == None and no flattened fields passed, work. client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport="grpc", + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", ) # Mock the actual call within the gRPC stub, and fake the request. @@ -1332,7 +1491,8 @@ async def test_batch_enable_services_async( request_type=serviceusage.BatchEnableServicesRequest, ): client = ServiceUsageAsyncClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # Everything is optional in proto3 as far as the runtime is concerned, @@ -1364,13 +1524,15 @@ async def test_batch_enable_services_async_from_dict(): def test_batch_enable_services_field_headers(): - client = ServiceUsageClient(credentials=ga_credentials.AnonymousCredentials(),) + client = ServiceUsageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) # Any value that is part of the HTTP/1.1 URI should be sent as # a field header. Set these to a non-empty value. request = serviceusage.BatchEnableServicesRequest() - request.parent = "parent/value" + request.parent = "parent_value" # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object( @@ -1386,18 +1548,23 @@ def test_batch_enable_services_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "parent=parent/value",) in kw["metadata"] + assert ( + "x-goog-request-params", + "parent=parent_value", + ) in kw["metadata"] @pytest.mark.asyncio async def test_batch_enable_services_field_headers_async(): - client = ServiceUsageAsyncClient(credentials=ga_credentials.AnonymousCredentials(),) + client = ServiceUsageAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) # Any value that is part of the HTTP/1.1 URI should be sent as # a field header. Set these to a non-empty value. request = serviceusage.BatchEnableServicesRequest() - request.parent = "parent/value" + request.parent = "parent_value" # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object( @@ -1415,13 +1582,23 @@ async def test_batch_enable_services_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "parent=parent/value",) in kw["metadata"] + assert ( + "x-goog-request-params", + "parent=parent_value", + ) in kw["metadata"] -@pytest.mark.parametrize("request_type", [serviceusage.BatchGetServicesRequest, dict,]) +@pytest.mark.parametrize( + "request_type", + [ + serviceusage.BatchGetServicesRequest, + dict, + ], +) def test_batch_get_services(request_type, transport: str = "grpc"): client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # Everything is optional in proto3 as far as the runtime is concerned, @@ -1449,7 +1626,8 @@ def test_batch_get_services_empty_call(): # This test is a coverage failsafe to make sure that totally empty calls, # i.e. request == None and no flattened fields passed, work. client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport="grpc", + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", ) # Mock the actual call within the gRPC stub, and fake the request. @@ -1467,7 +1645,8 @@ async def test_batch_get_services_async( transport: str = "grpc_asyncio", request_type=serviceusage.BatchGetServicesRequest ): client = ServiceUsageAsyncClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # Everything is optional in proto3 as far as the runtime is concerned, @@ -1499,13 +1678,15 @@ async def test_batch_get_services_async_from_dict(): def test_batch_get_services_field_headers(): - client = ServiceUsageClient(credentials=ga_credentials.AnonymousCredentials(),) + client = ServiceUsageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) # Any value that is part of the HTTP/1.1 URI should be sent as # a field header. Set these to a non-empty value. request = serviceusage.BatchGetServicesRequest() - request.parent = "parent/value" + request.parent = "parent_value" # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object( @@ -1521,18 +1702,23 @@ def test_batch_get_services_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "parent=parent/value",) in kw["metadata"] + assert ( + "x-goog-request-params", + "parent=parent_value", + ) in kw["metadata"] @pytest.mark.asyncio async def test_batch_get_services_field_headers_async(): - client = ServiceUsageAsyncClient(credentials=ga_credentials.AnonymousCredentials(),) + client = ServiceUsageAsyncClient( + credentials=ga_credentials.AnonymousCredentials(), + ) # Any value that is part of the HTTP/1.1 URI should be sent as # a field header. Set these to a non-empty value. request = serviceusage.BatchGetServicesRequest() - request.parent = "parent/value" + request.parent = "parent_value" # Mock the actual call within the gRPC stub, and fake the request. with mock.patch.object( @@ -1550,7 +1736,10 @@ async def test_batch_get_services_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] - assert ("x-goog-request-params", "parent=parent/value",) in kw["metadata"] + assert ( + "x-goog-request-params", + "parent=parent_value", + ) in kw["metadata"] def test_credentials_transport_error(): @@ -1560,7 +1749,8 @@ def test_credentials_transport_error(): ) with pytest.raises(ValueError): client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport=transport, + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, ) # It is an error to provide a credentials file and a transport instance. @@ -1580,7 +1770,10 @@ def test_credentials_transport_error(): options = client_options.ClientOptions() options.api_key = "api_key" with pytest.raises(ValueError): - client = ServiceUsageClient(client_options=options, transport=transport,) + client = ServiceUsageClient( + client_options=options, + transport=transport, + ) # It is an error to provide an api_key and a credential. options = mock.Mock() @@ -1596,7 +1789,8 @@ def test_credentials_transport_error(): ) with pytest.raises(ValueError): client = ServiceUsageClient( - client_options={"scopes": ["1", "2"]}, transport=transport, + client_options={"scopes": ["1", "2"]}, + transport=transport, ) @@ -1639,10 +1833,28 @@ def test_transport_adc(transport_class): adc.assert_called_once() +@pytest.mark.parametrize( + "transport_name", + [ + "grpc", + ], +) +def test_transport_kind(transport_name): + transport = ServiceUsageClient.get_transport_class(transport_name)( + credentials=ga_credentials.AnonymousCredentials(), + ) + assert transport.kind == transport_name + + def test_transport_grpc_default(): # A client should use the gRPC transport by default. - client = ServiceUsageClient(credentials=ga_credentials.AnonymousCredentials(),) - assert isinstance(client.transport, transports.ServiceUsageGrpcTransport,) + client = ServiceUsageClient( + credentials=ga_credentials.AnonymousCredentials(), + ) + assert isinstance( + client.transport, + transports.ServiceUsageGrpcTransport, + ) def test_service_usage_base_transport_error(): @@ -1686,6 +1898,14 @@ def test_service_usage_base_transport(): with pytest.raises(NotImplementedError): transport.operations_client + # Catch all for all remaining methods and properties + remainder = [ + "kind", + ] + for r in remainder: + with pytest.raises(NotImplementedError): + getattr(transport, r)() + def test_service_usage_base_transport_with_credentials_file(): # Instantiate the base transport with a credentials file @@ -1697,7 +1917,8 @@ def test_service_usage_base_transport_with_credentials_file(): Transport.return_value = None load_creds.return_value = (ga_credentials.AnonymousCredentials(), None) transport = transports.ServiceUsageTransport( - credentials_file="credentials.json", quota_project_id="octopus", + credentials_file="credentials.json", + quota_project_id="octopus", ) load_creds.assert_called_once_with( "credentials.json", @@ -1843,24 +2064,40 @@ def test_service_usage_grpc_transport_client_cert_source_for_mtls(transport_clas ) -def test_service_usage_host_no_port(): +@pytest.mark.parametrize( + "transport_name", + [ + "grpc", + "grpc_asyncio", + ], +) +def test_service_usage_host_no_port(transport_name): client = ServiceUsageClient( credentials=ga_credentials.AnonymousCredentials(), client_options=client_options.ClientOptions( api_endpoint="serviceusage.googleapis.com" ), + transport=transport_name, ) - assert client.transport._host == "serviceusage.googleapis.com:443" + assert client.transport._host == ("serviceusage.googleapis.com:443") -def test_service_usage_host_with_port(): +@pytest.mark.parametrize( + "transport_name", + [ + "grpc", + "grpc_asyncio", + ], +) +def test_service_usage_host_with_port(transport_name): client = ServiceUsageClient( credentials=ga_credentials.AnonymousCredentials(), client_options=client_options.ClientOptions( api_endpoint="serviceusage.googleapis.com:8000" ), + transport=transport_name, ) - assert client.transport._host == "serviceusage.googleapis.com:8000" + assert client.transport._host == ("serviceusage.googleapis.com:8000") def test_service_usage_grpc_transport_channel(): @@ -1868,7 +2105,8 @@ def test_service_usage_grpc_transport_channel(): # Check that channel is used if provided. transport = transports.ServiceUsageGrpcTransport( - host="squid.clam.whelk", channel=channel, + host="squid.clam.whelk", + channel=channel, ) assert transport.grpc_channel == channel assert transport._host == "squid.clam.whelk:443" @@ -1880,7 +2118,8 @@ def test_service_usage_grpc_asyncio_transport_channel(): # Check that channel is used if provided. transport = transports.ServiceUsageGrpcAsyncIOTransport( - host="squid.clam.whelk", channel=channel, + host="squid.clam.whelk", + channel=channel, ) assert transport.grpc_channel == channel assert transport._host == "squid.clam.whelk:443" @@ -1981,12 +2220,16 @@ def test_service_usage_transport_channel_mtls_with_adc(transport_class): def test_service_usage_grpc_lro_client(): client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), transport="grpc", + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc", ) transport = client.transport # Ensure that we have a api-core operations client. - assert isinstance(transport.operations_client, operations_v1.OperationsClient,) + assert isinstance( + transport.operations_client, + operations_v1.OperationsClient, + ) # Ensure that subsequent calls to the property send the exact same object. assert transport.operations_client is transport.operations_client @@ -1994,12 +2237,16 @@ def test_service_usage_grpc_lro_client(): def test_service_usage_grpc_lro_async_client(): client = ServiceUsageAsyncClient( - credentials=ga_credentials.AnonymousCredentials(), transport="grpc_asyncio", + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc_asyncio", ) transport = client.transport # Ensure that we have a api-core operations client. - assert isinstance(transport.operations_client, operations_v1.OperationsAsyncClient,) + assert isinstance( + transport.operations_client, + operations_v1.OperationsAsyncClient, + ) # Ensure that subsequent calls to the property send the exact same object. assert transport.operations_client is transport.operations_client @@ -2027,7 +2274,9 @@ def test_parse_common_billing_account_path(): def test_common_folder_path(): folder = "whelk" - expected = "folders/{folder}".format(folder=folder,) + expected = "folders/{folder}".format( + folder=folder, + ) actual = ServiceUsageClient.common_folder_path(folder) assert expected == actual @@ -2045,7 +2294,9 @@ def test_parse_common_folder_path(): def test_common_organization_path(): organization = "oyster" - expected = "organizations/{organization}".format(organization=organization,) + expected = "organizations/{organization}".format( + organization=organization, + ) actual = ServiceUsageClient.common_organization_path(organization) assert expected == actual @@ -2063,7 +2314,9 @@ def test_parse_common_organization_path(): def test_common_project_path(): project = "cuttlefish" - expected = "projects/{project}".format(project=project,) + expected = "projects/{project}".format( + project=project, + ) actual = ServiceUsageClient.common_project_path(project) assert expected == actual @@ -2083,7 +2336,8 @@ def test_common_location_path(): project = "winkle" location = "nautilus" expected = "projects/{project}/locations/{location}".format( - project=project, location=location, + project=project, + location=location, ) actual = ServiceUsageClient.common_location_path(project, location) assert expected == actual @@ -2108,7 +2362,8 @@ def test_client_with_default_client_info(): transports.ServiceUsageTransport, "_prep_wrapped_messages" ) as prep: client = ServiceUsageClient( - credentials=ga_credentials.AnonymousCredentials(), client_info=client_info, + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, ) prep.assert_called_once_with(client_info) @@ -2117,7 +2372,8 @@ def test_client_with_default_client_info(): ) as prep: transport_class = ServiceUsageClient.get_transport_class() transport = transport_class( - credentials=ga_credentials.AnonymousCredentials(), client_info=client_info, + credentials=ga_credentials.AnonymousCredentials(), + client_info=client_info, ) prep.assert_called_once_with(client_info) @@ -2125,7 +2381,8 @@ def test_client_with_default_client_info(): @pytest.mark.asyncio async def test_transport_close_async(): client = ServiceUsageAsyncClient( - credentials=ga_credentials.AnonymousCredentials(), transport="grpc_asyncio", + credentials=ga_credentials.AnonymousCredentials(), + transport="grpc_asyncio", ) with mock.patch.object( type(getattr(client.transport, "grpc_channel")), "close"