diff --git a/.github/release-please.yml b/.github/release-please.yml index 29601ad..fe749ff 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -1,5 +1,6 @@ releaseType: python handleGHRelease: true +manifest: true # NOTE: this section is generated by synthtool.languages.python # See https://github.com/googleapis/synthtool/blob/master/synthtool/languages/python.py branches: diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..3542679 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "2.9.3" +} diff --git a/docs/conf.py b/docs/conf.py index c6405fc..fdba699 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 diff --git a/docs/containeranalysis_v1/types.rst b/docs/containeranalysis_v1/types.rst index 1fa561b..c0d2aa5 100644 --- a/docs/containeranalysis_v1/types.rst +++ b/docs/containeranalysis_v1/types.rst @@ -3,5 +3,4 @@ Types for Google Cloud Devtools Containeranalysis v1 API .. automodule:: google.cloud.devtools.containeranalysis_v1.types :members: - :undoc-members: :show-inheritance: diff --git a/docs/index.rst b/docs/index.rst index cbf09a5..c84fd2e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -2,7 +2,8 @@ .. include:: multiprocessing.rst -Api Reference + +API Reference ------------- .. toctree:: :maxdepth: 2 @@ -11,22 +12,23 @@ Api Reference containeranalysis_v1/types -Changelog ----------- +Migration Guide +--------------- -For all previous ``google-cloud-containeranalysis`` releases: +See the guide below for instructions on migrating to the latest version. .. toctree:: :maxdepth: 2 - changelog +  UPGRADING -Migration Guide ---------------- -See the guide below for instructions on migrating to the 2.x release of this library. +Changelog +--------- + +For a list of all ``google-cloud-containeranalysis`` releases: .. toctree:: :maxdepth: 2 - UPGRADING + changelog diff --git a/google/cloud/devtools/containeranalysis/__init__.py b/google/cloud/devtools/containeranalysis/__init__.py index c0a5734..10f8cec 100644 --- a/google/cloud/devtools/containeranalysis/__init__.py +++ b/google/cloud/devtools/containeranalysis/__init__.py @@ -13,18 +13,19 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from google.cloud.devtools.containeranalysis import gapic_version as package_version + +__version__ = package_version.__version__ + -from google.cloud.devtools.containeranalysis_v1.services.container_analysis.client import ( - ContainerAnalysisClient, -) from google.cloud.devtools.containeranalysis_v1.services.container_analysis.async_client import ( ContainerAnalysisAsyncClient, ) - -from google.cloud.devtools.containeranalysis_v1.types.containeranalysis import ( - GetVulnerabilityOccurrencesSummaryRequest, +from google.cloud.devtools.containeranalysis_v1.services.container_analysis.client import ( + ContainerAnalysisClient, ) from google.cloud.devtools.containeranalysis_v1.types.containeranalysis import ( + GetVulnerabilityOccurrencesSummaryRequest, VulnerabilityOccurrencesSummary, ) diff --git a/google/cloud/devtools/containeranalysis/gapic_version.py b/google/cloud/devtools/containeranalysis/gapic_version.py new file mode 100644 index 0000000..085af7e --- /dev/null +++ b/google/cloud/devtools/containeranalysis/gapic_version.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# 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. +# +__version__ = "2.9.3" # {x-release-please-version} diff --git a/google/cloud/devtools/containeranalysis/py.typed b/google/cloud/devtools/containeranalysis/py.typed index 73accaf..4fb2a9f 100644 --- a/google/cloud/devtools/containeranalysis/py.typed +++ b/google/cloud/devtools/containeranalysis/py.typed @@ -1,2 +1,2 @@ # Marker file for PEP 561. -# The google-cloud-devtools-containeranalysis package uses inline types. +# The google-cloud-containeranalysis package uses inline types. diff --git a/google/cloud/devtools/containeranalysis_v1/__init__.py b/google/cloud/devtools/containeranalysis_v1/__init__.py index 709ca57..de0b63e 100644 --- a/google/cloud/devtools/containeranalysis_v1/__init__.py +++ b/google/cloud/devtools/containeranalysis_v1/__init__.py @@ -13,12 +13,19 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from google.cloud.devtools.containeranalysis import gapic_version as package_version -from .services.container_analysis import ContainerAnalysisClient -from .services.container_analysis import ContainerAnalysisAsyncClient +__version__ = package_version.__version__ -from .types.containeranalysis import GetVulnerabilityOccurrencesSummaryRequest -from .types.containeranalysis import VulnerabilityOccurrencesSummary + +from .services.container_analysis import ( + ContainerAnalysisAsyncClient, + ContainerAnalysisClient, +) +from .types.containeranalysis import ( + GetVulnerabilityOccurrencesSummaryRequest, + VulnerabilityOccurrencesSummary, +) __all__ = ( "ContainerAnalysisAsyncClient", diff --git a/google/cloud/devtools/containeranalysis_v1/py.typed b/google/cloud/devtools/containeranalysis_v1/py.typed index 73accaf..4fb2a9f 100644 --- a/google/cloud/devtools/containeranalysis_v1/py.typed +++ b/google/cloud/devtools/containeranalysis_v1/py.typed @@ -1,2 +1,2 @@ # Marker file for PEP 561. -# The google-cloud-devtools-containeranalysis package uses inline types. +# The google-cloud-containeranalysis package uses inline types. diff --git a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/__init__.py b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/__init__.py index da51d0c..5525a6b 100644 --- a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/__init__.py +++ b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/__init__.py @@ -13,8 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from .client import ContainerAnalysisClient from .async_client import ContainerAnalysisAsyncClient +from .client import ContainerAnalysisClient __all__ = ( "ContainerAnalysisClient", diff --git a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/async_client.py b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/async_client.py index f51d310..69e62d5 100644 --- a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/async_client.py +++ b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/async_client.py @@ -16,32 +16,42 @@ from collections import OrderedDict import functools import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + 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] except AttributeError: # pragma: NO COVER OptionalRetry = Union[retries.Retry, object] # type: ignore -from google.cloud.devtools.containeranalysis_v1.types import containeranalysis from google.iam.v1 import iam_policy_pb2 # type: ignore from google.iam.v1 import policy_pb2 # type: ignore -from .transports.base import ContainerAnalysisTransport, DEFAULT_CLIENT_INFO -from .transports.grpc_asyncio import ContainerAnalysisGrpcAsyncIOTransport -from .client import ContainerAnalysisClient - - from grafeas import grafeas_v1 from grafeas.grafeas_v1.services.grafeas import transports +from google.cloud.devtools.containeranalysis_v1.types import containeranalysis + +from .client import ContainerAnalysisClient +from .transports.base import DEFAULT_CLIENT_INFO, ContainerAnalysisTransport +from .transports.grpc_asyncio import ContainerAnalysisGrpcAsyncIOTransport + class ContainerAnalysisAsyncClient: """Retrieves analysis results of Cloud components such as Docker @@ -176,9 +186,9 @@ def transport(self) -> ContainerAnalysisTransport: def __init__( self, *, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, transport: Union[str, ContainerAnalysisTransport] = "grpc_asyncio", - client_options: ClientOptions = None, + client_options: Optional[ClientOptions] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the container analysis client. @@ -236,11 +246,11 @@ def get_grafeas_client(self) -> grafeas_v1.GrafeasClient: async def set_iam_policy( self, - request: Union[iam_policy_pb2.SetIamPolicyRequest, dict] = None, + request: Optional[Union[iam_policy_pb2.SetIamPolicyRequest, dict]] = None, *, - resource: str = None, + resource: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> policy_pb2.Policy: r"""Sets the access control policy on the specified note or @@ -281,7 +291,7 @@ async def sample_set_iam_policy(): print(response) Args: - request (Union[google.iam.v1.iam_policy_pb2.SetIamPolicyRequest, dict]): + request (Optional[Union[google.iam.v1.iam_policy_pb2.SetIamPolicyRequest, dict]]): The request object. Request message for `SetIamPolicy` method. resource (:class:`str`): @@ -410,11 +420,11 @@ async def sample_set_iam_policy(): async def get_iam_policy( self, - request: Union[iam_policy_pb2.GetIamPolicyRequest, dict] = None, + request: Optional[Union[iam_policy_pb2.GetIamPolicyRequest, dict]] = None, *, - resource: str = None, + resource: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> policy_pb2.Policy: r"""Gets the access control policy for a note or an occurrence @@ -455,7 +465,7 @@ async def sample_get_iam_policy(): print(response) Args: - request (Union[google.iam.v1.iam_policy_pb2.GetIamPolicyRequest, dict]): + request (Optional[Union[google.iam.v1.iam_policy_pb2.GetIamPolicyRequest, dict]]): The request object. Request message for `GetIamPolicy` method. resource (:class:`str`): @@ -584,12 +594,12 @@ async def sample_get_iam_policy(): async def test_iam_permissions( self, - request: Union[iam_policy_pb2.TestIamPermissionsRequest, dict] = None, + request: Optional[Union[iam_policy_pb2.TestIamPermissionsRequest, dict]] = None, *, - resource: str = None, - permissions: Sequence[str] = None, + resource: Optional[str] = None, + permissions: Optional[MutableSequence[str]] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> iam_policy_pb2.TestIamPermissionsResponse: r"""Returns the permissions that a caller has on the specified note @@ -630,7 +640,7 @@ async def sample_test_iam_permissions(): print(response) Args: - request (Union[google.iam.v1.iam_policy_pb2.TestIamPermissionsRequest, dict]): + request (Optional[Union[google.iam.v1.iam_policy_pb2.TestIamPermissionsRequest, dict]]): The request object. Request message for `TestIamPermissions` method. resource (:class:`str`): @@ -642,7 +652,7 @@ async def sample_test_iam_permissions(): This corresponds to the ``resource`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - permissions (:class:`Sequence[str]`): + permissions (:class:`MutableSequence[str]`): The set of permissions to check for the ``resource``. Permissions with wildcards (such as '*' or 'storage.*') are not allowed. For more information see `IAM @@ -708,14 +718,14 @@ async def sample_test_iam_permissions(): async def get_vulnerability_occurrences_summary( self, - request: Union[ - containeranalysis.GetVulnerabilityOccurrencesSummaryRequest, dict + request: Optional[ + Union[containeranalysis.GetVulnerabilityOccurrencesSummaryRequest, dict] ] = None, *, - parent: str = None, - filter: str = None, + parent: Optional[str] = None, + filter: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> containeranalysis.VulnerabilityOccurrencesSummary: r"""Gets a summary of the number and severity of @@ -748,7 +758,7 @@ async def sample_get_vulnerability_occurrences_summary(): print(response) Args: - request (Union[google.cloud.devtools.containeranalysis_v1.types.GetVulnerabilityOccurrencesSummaryRequest, dict]): + request (Optional[Union[google.cloud.devtools.containeranalysis_v1.types.GetVulnerabilityOccurrencesSummaryRequest, dict]]): The request object. Request to get a vulnerability summary for some set of occurrences. parent (:class:`str`): diff --git a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/client.py b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/client.py index 2be47b2..2a1073a 100644 --- a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/client.py +++ b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/client.py @@ -16,35 +16,46 @@ from collections import OrderedDict import os import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union -import pkg_resources +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, + cast, +) 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] except AttributeError: # pragma: NO COVER OptionalRetry = Union[retries.Retry, object] # type: ignore -from google.cloud.devtools.containeranalysis_v1.types import containeranalysis from google.iam.v1 import iam_policy_pb2 # type: ignore from google.iam.v1 import policy_pb2 # type: ignore -from .transports.base import ContainerAnalysisTransport, DEFAULT_CLIENT_INFO -from .transports.grpc import ContainerAnalysisGrpcTransport -from .transports.grpc_asyncio import ContainerAnalysisGrpcAsyncIOTransport - - from grafeas import grafeas_v1 from grafeas.grafeas_v1.services.grafeas import transports +from google.cloud.devtools.containeranalysis_v1.types import containeranalysis + +from .transports.base import DEFAULT_CLIENT_INFO, ContainerAnalysisTransport +from .transports.grpc import ContainerAnalysisGrpcTransport +from .transports.grpc_asyncio import ContainerAnalysisGrpcAsyncIOTransport + class ContainerAnalysisClientMeta(type): """Metaclass for the ContainerAnalysis client. @@ -62,7 +73,7 @@ class ContainerAnalysisClientMeta(type): def get_transport_class( cls, - label: str = None, + label: Optional[str] = None, ) -> Type[ContainerAnalysisTransport]: """Returns an appropriate transport class. @@ -330,8 +341,8 @@ def __init__( self, *, credentials: Optional[ga_credentials.Credentials] = None, - transport: Union[str, ContainerAnalysisTransport, None] = None, - client_options: Optional[client_options_lib.ClientOptions] = None, + transport: Optional[Union[str, ContainerAnalysisTransport]] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the container analysis client. @@ -345,7 +356,7 @@ def __init__( transport (Union[str, ContainerAnalysisTransport]): The transport to use. If set to None, a transport is chosen automatically. - client_options (google.api_core.client_options.ClientOptions): Custom options for the + client_options (Optional[Union[google.api_core.client_options.ClientOptions, dict]]): Custom options for the client. It won't take effect if a ``transport`` instance is provided. (1) The ``api_endpoint`` property can be used to override the default endpoint provided by the client. GOOGLE_API_USE_MTLS_ENDPOINT @@ -375,6 +386,7 @@ def __init__( client_options = client_options_lib.from_dict(client_options) if client_options is None: client_options = client_options_lib.ClientOptions() + client_options = cast(client_options_lib.ClientOptions, client_options) api_endpoint, client_cert_source_func = self.get_mtls_endpoint_and_cert_source( client_options @@ -441,11 +453,11 @@ def get_grafeas_client(self) -> grafeas_v1.GrafeasClient: def set_iam_policy( self, - request: Union[iam_policy_pb2.SetIamPolicyRequest, dict] = None, + request: Optional[Union[iam_policy_pb2.SetIamPolicyRequest, dict]] = None, *, - resource: str = None, + resource: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> policy_pb2.Policy: r"""Sets the access control policy on the specified note or @@ -612,11 +624,11 @@ def sample_set_iam_policy(): def get_iam_policy( self, - request: Union[iam_policy_pb2.GetIamPolicyRequest, dict] = None, + request: Optional[Union[iam_policy_pb2.GetIamPolicyRequest, dict]] = None, *, - resource: str = None, + resource: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> policy_pb2.Policy: r"""Gets the access control policy for a note or an occurrence @@ -783,12 +795,12 @@ def sample_get_iam_policy(): def test_iam_permissions( self, - request: Union[iam_policy_pb2.TestIamPermissionsRequest, dict] = None, + request: Optional[Union[iam_policy_pb2.TestIamPermissionsRequest, dict]] = None, *, - resource: str = None, - permissions: Sequence[str] = None, + resource: Optional[str] = None, + permissions: Optional[MutableSequence[str]] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> iam_policy_pb2.TestIamPermissionsResponse: r"""Returns the permissions that a caller has on the specified note @@ -841,7 +853,7 @@ def sample_test_iam_permissions(): This corresponds to the ``resource`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - permissions (Sequence[str]): + permissions (MutableSequence[str]): The set of permissions to check for the ``resource``. Permissions with wildcards (such as '*' or 'storage.*') are not allowed. For more information see `IAM @@ -905,14 +917,14 @@ def sample_test_iam_permissions(): def get_vulnerability_occurrences_summary( self, - request: Union[ - containeranalysis.GetVulnerabilityOccurrencesSummaryRequest, dict + request: Optional[ + Union[containeranalysis.GetVulnerabilityOccurrencesSummaryRequest, dict] ] = None, *, - parent: str = None, - filter: str = None, + parent: Optional[str] = None, + filter: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> containeranalysis.VulnerabilityOccurrencesSummary: r"""Gets a summary of the number and severity of diff --git a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/__init__.py b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/__init__.py index 4f6c5a2..ae59bc4 100644 --- a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/__init__.py +++ b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/__init__.py @@ -20,7 +20,6 @@ from .grpc import ContainerAnalysisGrpcTransport from .grpc_asyncio import ContainerAnalysisGrpcAsyncIOTransport - # Compile a registry of transports. _transport_registry = OrderedDict() # type: Dict[str, Type[ContainerAnalysisTransport]] _transport_registry["grpc"] = ContainerAnalysisGrpcTransport diff --git a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/base.py b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/base.py index 4349442..37d7e1c 100644 --- a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/base.py +++ b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/base.py @@ -15,24 +15,24 @@ # 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 retry as retries +import google.auth # type: ignore from google.auth import credentials as ga_credentials # type: ignore +from google.iam.v1 import iam_policy_pb2 # type: ignore +from google.iam.v1 import policy_pb2 # type: ignore from google.oauth2 import service_account # type: ignore +import pkg_resources from google.cloud.devtools.containeranalysis_v1.types import containeranalysis -from google.iam.v1 import iam_policy_pb2 # type: ignore -from google.iam.v1 import policy_pb2 # type: ignore try: DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( gapic_version=pkg_resources.get_distribution( - "google-cloud-devtools-containeranalysis", + "google-cloud-containeranalysis", ).version, ) except pkg_resources.DistributionNotFound: @@ -50,7 +50,7 @@ def __init__( self, *, host: str = DEFAULT_HOST, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, diff --git a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/grpc.py b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/grpc.py index 969a87b..73d3255 100644 --- a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/grpc.py +++ b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/grpc.py @@ -13,21 +13,20 @@ # 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 gapic_v1 +from google.api_core import gapic_v1, grpc_helpers 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.iam.v1 import iam_policy_pb2 # type: ignore +from google.iam.v1 import policy_pb2 # type: ignore import grpc # type: ignore from google.cloud.devtools.containeranalysis_v1.types import containeranalysis -from google.iam.v1 import iam_policy_pb2 # type: ignore -from google.iam.v1 import policy_pb2 # type: ignore -from .base import ContainerAnalysisTransport, DEFAULT_CLIENT_INFO + +from .base import DEFAULT_CLIENT_INFO, ContainerAnalysisTransport class ContainerAnalysisGrpcTransport(ContainerAnalysisTransport): @@ -63,14 +62,14 @@ def __init__( self, *, host: str = "containeranalysis.googleapis.com", - credentials: ga_credentials.Credentials = None, - credentials_file: str = None, - scopes: Sequence[str] = None, - channel: grpc.Channel = None, - api_mtls_endpoint: str = None, - client_cert_source: Callable[[], Tuple[bytes, bytes]] = None, - ssl_channel_credentials: grpc.ChannelCredentials = None, - client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, + scopes: Optional[Sequence[str]] = None, + channel: Optional[grpc.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, @@ -197,8 +196,8 @@ def __init__( def create_channel( cls, host: str = "containeranalysis.googleapis.com", - credentials: ga_credentials.Credentials = None, - credentials_file: str = None, + credentials: Optional[ga_credentials.Credentials] = None, + credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, **kwargs, diff --git a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/grpc_asyncio.py b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/grpc_asyncio.py index 6a408d4..a0c2731 100644 --- a/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/grpc_asyncio.py +++ b/google/cloud/devtools/containeranalysis_v1/services/container_analysis/transports/grpc_asyncio.py @@ -13,21 +13,20 @@ # 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 gapic_v1, grpc_helpers_async from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore - +from google.iam.v1 import iam_policy_pb2 # type: ignore +from google.iam.v1 import policy_pb2 # type: ignore import grpc # type: ignore from grpc.experimental import aio # type: ignore from google.cloud.devtools.containeranalysis_v1.types import containeranalysis -from google.iam.v1 import iam_policy_pb2 # type: ignore -from google.iam.v1 import policy_pb2 # type: ignore -from .base import ContainerAnalysisTransport, DEFAULT_CLIENT_INFO + +from .base import DEFAULT_CLIENT_INFO, ContainerAnalysisTransport from .grpc import ContainerAnalysisGrpcTransport @@ -65,7 +64,7 @@ class ContainerAnalysisGrpcAsyncIOTransport(ContainerAnalysisTransport): def create_channel( cls, host: str = "containeranalysis.googleapis.com", - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, quota_project_id: Optional[str] = None, @@ -108,15 +107,15 @@ def __init__( self, *, host: str = "containeranalysis.googleapis.com", - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, credentials_file: Optional[str] = None, scopes: Optional[Sequence[str]] = None, - channel: aio.Channel = None, - api_mtls_endpoint: str = None, - client_cert_source: Callable[[], Tuple[bytes, bytes]] = None, - ssl_channel_credentials: grpc.ChannelCredentials = None, - client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None, - quota_project_id=None, + channel: Optional[aio.Channel] = None, + api_mtls_endpoint: Optional[str] = None, + client_cert_source: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + ssl_channel_credentials: Optional[grpc.ChannelCredentials] = None, + client_cert_source_for_mtls: Optional[Callable[[], Tuple[bytes, bytes]]] = None, + quota_project_id: Optional[str] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, api_audience: Optional[str] = None, diff --git a/google/cloud/devtools/containeranalysis_v1/types/containeranalysis.py b/google/cloud/devtools/containeranalysis_v1/types/containeranalysis.py index 4480a7a..08b4aee 100644 --- a/google/cloud/devtools/containeranalysis_v1/types/containeranalysis.py +++ b/google/cloud/devtools/containeranalysis_v1/types/containeranalysis.py @@ -13,10 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import proto # type: ignore - -from grafeas.grafeas_v1.types import severity # type: ignore +from typing import MutableMapping, MutableSequence +import grafeas.grafeas_v1 # type: ignore +import proto # type: ignore __protobuf__ = proto.module( package="google.devtools.containeranalysis.v1", @@ -39,11 +39,11 @@ class GetVulnerabilityOccurrencesSummaryRequest(proto.Message): The filter expression. """ - parent = proto.Field( + parent: str = proto.Field( proto.STRING, number=1, ) - filter = proto.Field( + filter: str = proto.Field( proto.STRING, number=2, ) @@ -54,7 +54,7 @@ class VulnerabilityOccurrencesSummary(proto.Message): resource and severity type. Attributes: - counts (Sequence[google.cloud.devtools.containeranalysis_v1.types.VulnerabilityOccurrencesSummary.FixableTotalByDigest]): + counts (MutableSequence[google.cloud.devtools.containeranalysis_v1.types.VulnerabilityOccurrencesSummary.FixableTotalByDigest]): A listing by resource of the number of fixable and total vulnerabilities. """ @@ -66,7 +66,7 @@ class FixableTotalByDigest(proto.Message): Attributes: resource_uri (str): The affected resource. - severity (grafeas.v1.severity.Severity): + severity (grafeas.v1.grafeas.grafeas_v1.Severity): The severity for this count. SEVERITY_UNSPECIFIED indicates total across all severities. fixable_count (int): @@ -77,25 +77,25 @@ class FixableTotalByDigest(proto.Message): associated with this resource. """ - resource_uri = proto.Field( + resource_uri: str = proto.Field( proto.STRING, number=1, ) - severity = proto.Field( + severity: grafeas.grafeas_v1.Severity = proto.Field( proto.ENUM, number=2, - enum=severity.Severity, + enum=grafeas.grafeas_v1.Severity, ) - fixable_count = proto.Field( + fixable_count: int = proto.Field( proto.INT64, number=3, ) - total_count = proto.Field( + total_count: int = proto.Field( proto.INT64, number=4, ) - counts = proto.RepeatedField( + counts: MutableSequence[FixableTotalByDigest] = proto.RepeatedField( proto.MESSAGE, number=1, message=FixableTotalByDigest, diff --git a/noxfile.py b/noxfile.py index 624fe86..d8440c0 100644 --- a/noxfile.py +++ b/noxfile.py @@ -17,6 +17,7 @@ # Generated by synthtool. DO NOT EDIT! from __future__ import absolute_import + import os import pathlib import re @@ -267,7 +268,7 @@ def cover(session): test runs (not system test runs), and then erases coverage data. """ session.install("coverage", "pytest-cov") - session.run("coverage", "report", "--show-missing", "--fail-under=98") + session.run("coverage", "report", "--show-missing", "--fail-under=100") session.run("coverage", "erase") diff --git a/owlbot.py b/owlbot.py index 6b2c822..f970ec7 100644 --- a/owlbot.py +++ b/owlbot.py @@ -1,4 +1,4 @@ -# Copyright 2018 Google LLC +# 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. @@ -12,38 +12,38 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""This script is used to synthesize generated parts of this library.""" +import json +from pathlib import Path +import shutil import synthtool as s import synthtool.gcp as gcp -import logging from synthtool.languages import python -logging.basicConfig(level=logging.DEBUG) +# ---------------------------------------------------------------------------- +# Copy the generated client from the owl-bot staging directory +# ---------------------------------------------------------------------------- -common = gcp.CommonTemplates() +clean_up_generated_samples = True -default_version = "v1" +# Load the default version defined in .repo-metadata.json. +default_version = json.load(open(".repo-metadata.json", "rt")).get("default_version") for library in s.get_staging_dirs(default_version): - s.replace( - library / "google/**/*client.py", - r"""google-cloud-devtools-containeranalysis""", - r"""google-cloud-containeranalysis""", - ) + if clean_up_generated_samples: + shutil.rmtree("samples/generated_samples", ignore_errors=True) + clean_up_generated_samples = False # Fix imported type from grafeas s.replace( library / "google/**/types/containeranalysis.py", "from grafeas\.v1 import severity_pb2", - "from grafeas.grafeas_v1.types import severity" + "import grafeas.grafeas_v1", ) # Fix imported type from grafeas s.replace( - library / "google/**/types/containeranalysis.py", - "severity_pb2", - "severity" + library / "google/**/types/containeranalysis.py", "severity_pb2", "grafeas.grafeas_v1" ) # Insert helper method to get grafeas client @@ -66,7 +66,7 @@ s.replace( library / "google/**/client.py", r"""(\s+)def set_iam_policy\(""", - r'''\n\g<1>def get_grafeas_client( + r"""\n\g<1>def get_grafeas_client( self ) -> grafeas_v1.GrafeasClient: grafeas_transport = grafeas_v1.services.grafeas.transports.GrafeasGrpcTransport( @@ -81,13 +81,13 @@ return grafeas_v1.GrafeasClient(transport=grafeas_transport) \g<1># Service calls - \g<1>def set_iam_policy(''', + \g<1>def set_iam_policy(""", ) s.replace( library / "google/**/async_client.py", r"""(\s+)async def set_iam_policy\(""", - r'''\n\g<1>def get_grafeas_client( + r"""\n\g<1>def get_grafeas_client( self ) -> grafeas_v1.GrafeasClient: grafeas_transport = grafeas_v1.services.grafeas.transports.GrafeasGrpcTransport( @@ -102,11 +102,12 @@ return grafeas_v1.GrafeasClient(transport=grafeas_transport) \g<1># Service calls - \g<1>async def set_iam_policy(''', + \g<1>async def set_iam_policy(""", ) # Add test to ensure that credentials propagate to client.get_grafeas_client() - num_replacements = s.replace(library / "tests/**/test_container_analysis.py", + num_replacements = s.replace( + library / "tests/**/test_container_analysis.py", """create_channel.assert_called_with\( "containeranalysis.googleapis.com:443", credentials=file_creds, @@ -142,31 +143,33 @@ # Also check client.get_grafeas_client() to make sure that the file credentials are used assert file_creds == client.get_grafeas_client().transport._credentials - """ + """, ) assert num_replacements == 1 - s.move(library, excludes=["setup.py", "README.rst", "docs/index.rst"]) - + s.move([library], excludes=["**/gapic_version.py", "setup.py", "testing/constraints-3.7.txt"]) s.remove_staging_dirs() # ---------------------------------------------------------------------------- # Add templated files # ---------------------------------------------------------------------------- -templated_files = common.py_library( - samples=False, # set to True only if there are samples + +templated_files = gcp.CommonTemplates().py_library( + cov_level=100, microgenerator=True, - cov_level=98, + versions=gcp.common.detect_versions(path="./google", default_first=True), ) -s.move(templated_files, +s.move( + templated_files, excludes=[ - ".coveragerc", # microgenerator has a good coveragerc - ".github/workflows", # exclude templated gh actions as tests require credentials - ] - ) - -python.configure_previous_major_version_branches() + ".coveragerc", + ".github/release-please.yml", + ".github/workflows", + ], +) # exclude templated gh actions as tests require credentials python.py_samples(skip_readmes=True) -s.shell.run(["nox", "-s", "blacken"], hide_output=False) \ No newline at end of file +# run format session for all directories which have a noxfile +for noxfile in Path(".").glob("**/noxfile.py"): + s.shell.run(["nox", "-s", "format"], cwd=noxfile.parent, hide_output=False) diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..595994a --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "packages": { + ".": { + "release-type": "python", + "extra-files": [ + "google/cloud/devtools/containeranalysis/gapic_version.py", + { + "type": "json", + "path": "samples/generated_samples/snippet_metadata_google.devtools.containeranalysis.v1.json", + "jsonpath": "$.clientLibrary.version" + } + ] + } + }, + "release-type": "python", + "plugins": [ + { + "type": "sentence-case" + } + ], + "initial-version": "0.1.0" +} diff --git a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_iam_policy_async.py b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_iam_policy_async.py index a23a384..c075f96 100644 --- a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_iam_policy_async.py +++ b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_iam_policy_async.py @@ -20,7 +20,7 @@ # It may require modifications to work in your environment. # To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-devtools-containeranalysis +# python3 -m pip install google-cloud-containeranalysis # [START containeranalysis_v1_generated_ContainerAnalysis_GetIamPolicy_async] diff --git a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_iam_policy_sync.py b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_iam_policy_sync.py index 94c5c99..c5c5d1d 100644 --- a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_iam_policy_sync.py +++ b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_iam_policy_sync.py @@ -20,7 +20,7 @@ # It may require modifications to work in your environment. # To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-devtools-containeranalysis +# python3 -m pip install google-cloud-containeranalysis # [START containeranalysis_v1_generated_ContainerAnalysis_GetIamPolicy_sync] diff --git a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_vulnerability_occurrences_summary_async.py b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_vulnerability_occurrences_summary_async.py index fe88fb5..690acda 100644 --- a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_vulnerability_occurrences_summary_async.py +++ b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_vulnerability_occurrences_summary_async.py @@ -20,7 +20,7 @@ # It may require modifications to work in your environment. # To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-devtools-containeranalysis +# python3 -m pip install google-cloud-containeranalysis # [START containeranalysis_v1_generated_ContainerAnalysis_GetVulnerabilityOccurrencesSummary_async] diff --git a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_vulnerability_occurrences_summary_sync.py b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_vulnerability_occurrences_summary_sync.py index 97371c3..ee847bb 100644 --- a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_vulnerability_occurrences_summary_sync.py +++ b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_get_vulnerability_occurrences_summary_sync.py @@ -20,7 +20,7 @@ # It may require modifications to work in your environment. # To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-devtools-containeranalysis +# python3 -m pip install google-cloud-containeranalysis # [START containeranalysis_v1_generated_ContainerAnalysis_GetVulnerabilityOccurrencesSummary_sync] diff --git a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_set_iam_policy_async.py b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_set_iam_policy_async.py index aeebc69..ceaf936 100644 --- a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_set_iam_policy_async.py +++ b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_set_iam_policy_async.py @@ -20,7 +20,7 @@ # It may require modifications to work in your environment. # To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-devtools-containeranalysis +# python3 -m pip install google-cloud-containeranalysis # [START containeranalysis_v1_generated_ContainerAnalysis_SetIamPolicy_async] diff --git a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_set_iam_policy_sync.py b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_set_iam_policy_sync.py index d034834..35319f3 100644 --- a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_set_iam_policy_sync.py +++ b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_set_iam_policy_sync.py @@ -20,7 +20,7 @@ # It may require modifications to work in your environment. # To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-devtools-containeranalysis +# python3 -m pip install google-cloud-containeranalysis # [START containeranalysis_v1_generated_ContainerAnalysis_SetIamPolicy_sync] diff --git a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_test_iam_permissions_async.py b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_test_iam_permissions_async.py index b5447d7..0fd4a88 100644 --- a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_test_iam_permissions_async.py +++ b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_test_iam_permissions_async.py @@ -20,7 +20,7 @@ # It may require modifications to work in your environment. # To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-devtools-containeranalysis +# python3 -m pip install google-cloud-containeranalysis # [START containeranalysis_v1_generated_ContainerAnalysis_TestIamPermissions_async] diff --git a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_test_iam_permissions_sync.py b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_test_iam_permissions_sync.py index b1b9297..97938d0 100644 --- a/samples/generated_samples/containeranalysis_v1_generated_container_analysis_test_iam_permissions_sync.py +++ b/samples/generated_samples/containeranalysis_v1_generated_container_analysis_test_iam_permissions_sync.py @@ -20,7 +20,7 @@ # It may require modifications to work in your environment. # To install the latest published package dependency, execute the following: -# python3 -m pip install google-cloud-devtools-containeranalysis +# python3 -m pip install google-cloud-containeranalysis # [START containeranalysis_v1_generated_ContainerAnalysis_TestIamPermissions_sync] diff --git a/samples/generated_samples/snippet_metadata_containeranalysis_v1.json b/samples/generated_samples/snippet_metadata_google.devtools.containeranalysis.v1.json similarity index 99% rename from samples/generated_samples/snippet_metadata_containeranalysis_v1.json rename to samples/generated_samples/snippet_metadata_google.devtools.containeranalysis.v1.json index e7675a2..dab3e1e 100644 --- a/samples/generated_samples/snippet_metadata_containeranalysis_v1.json +++ b/samples/generated_samples/snippet_metadata_google.devtools.containeranalysis.v1.json @@ -7,7 +7,8 @@ } ], "language": "PYTHON", - "name": "google-cloud-devtools-containeranalysis" + "name": "google-cloud-containeranalysis", + "version": "0.1.0" }, "snippets": [ { @@ -529,7 +530,7 @@ }, { "name": "permissions", - "type": "Sequence[str]" + "type": "MutableSequence[str]" }, { "name": "retry", @@ -613,7 +614,7 @@ }, { "name": "permissions", - "type": "Sequence[str]" + "type": "MutableSequence[str]" }, { "name": "retry", diff --git a/samples/snippets/noxfile.py b/samples/snippets/noxfile.py index 0398d72..c171513 100644 --- a/samples/snippets/noxfile.py +++ b/samples/snippets/noxfile.py @@ -22,7 +22,6 @@ import nox - # WARNING - WARNING - WARNING - WARNING - WARNING # WARNING - WARNING - WARNING - WARNING - WARNING # DO NOT EDIT THIS FILE EVER! @@ -180,6 +179,7 @@ def blacken(session: nox.sessions.Session) -> None: # format = isort + black # + @nox.session def format(session: nox.sessions.Session) -> None: """ @@ -207,7 +207,9 @@ def _session_tests( session: nox.sessions.Session, post_install: Callable = None ) -> None: # check for presence of tests - test_list = glob.glob("**/*_test.py", recursive=True) + glob.glob("**/test_*.py", recursive=True) + test_list = glob.glob("**/*_test.py", recursive=True) + glob.glob( + "**/test_*.py", recursive=True + ) test_list.extend(glob.glob("**/tests", recursive=True)) if len(test_list) == 0: @@ -229,9 +231,7 @@ def _session_tests( if os.path.exists("requirements-test.txt"): if os.path.exists("constraints-test.txt"): - session.install( - "-r", "requirements-test.txt", "-c", "constraints-test.txt" - ) + session.install("-r", "requirements-test.txt", "-c", "constraints-test.txt") else: session.install("-r", "requirements-test.txt") with open("requirements-test.txt") as rtfile: @@ -244,9 +244,9 @@ def _session_tests( post_install(session) if "pytest-parallel" in packages: - concurrent_args.extend(['--workers', 'auto', '--tests-per-worker', 'auto']) + concurrent_args.extend(["--workers", "auto", "--tests-per-worker", "auto"]) elif "pytest-xdist" in packages: - concurrent_args.extend(['-n', 'auto']) + concurrent_args.extend(["-n", "auto"]) session.run( "pytest", @@ -276,7 +276,7 @@ def py(session: nox.sessions.Session) -> None: def _get_repo_root() -> Optional[str]: - """ Returns the root folder of the project. """ + """Returns the root folder of the project.""" # Get root of this repository. Assume we don't have directories nested deeper than 10 items. p = Path(os.getcwd()) for i in range(10): diff --git a/samples/snippets/samples.py b/samples/snippets/samples.py index ecf28c4..3f22117 100644 --- a/samples/snippets/samples.py +++ b/samples/snippets/samples.py @@ -20,30 +20,30 @@ def create_note(note_id, project_id): # note_id = 'my-note' # project_id = 'my-gcp-project' - from grafeas.grafeas_v1 import Version from google.cloud.devtools import containeranalysis_v1 + from grafeas.grafeas_v1 import Version client = containeranalysis_v1.ContainerAnalysisClient() grafeas_client = client.get_grafeas_client() project_name = f"projects/{project_id}" note = { - 'vulnerability': { - 'details': [ + "vulnerability": { + "details": [ { - 'affected_cpe_uri': 'your-uri-here', - 'affected_package': 'your-package-here', - 'affected_version_start': { - 'kind': Version.VersionKind.MINIMUM - }, - 'fixed_version': { - 'kind': Version.VersionKind.MAXIMUM - } + "affected_cpe_uri": "your-uri-here", + "affected_package": "your-package-here", + "affected_version_start": {"kind": Version.VersionKind.MINIMUM}, + "fixed_version": {"kind": Version.VersionKind.MAXIMUM}, } ] } } - response = grafeas_client.create_note(parent=project_name, note_id=note_id, note=note) + response = grafeas_client.create_note( + parent=project_name, note_id=note_id, note=note + ) return response + + # [END containeranalysis_create_note] @@ -60,20 +60,22 @@ def delete_note(note_id, project_id): note_name = f"projects/{project_id}/notes/{note_id}" grafeas_client.delete_note(name=note_name) + + # [END containeranalysis_delete_note] # [START containeranalysis_create_occurrence] def create_occurrence(resource_url, note_id, occurrence_project, note_project): - """ Creates and returns a new occurrence of a previously + """Creates and returns a new occurrence of a previously created vulnerability note.""" # resource_url = 'https://gcr.io/my-project/my-image@sha256:123' # note_id = 'my-note' # occurrence_project = 'my-gcp-project' # note_project = 'my-gcp-project' - from grafeas.grafeas_v1 import Version from google.cloud.devtools import containeranalysis_v1 + from grafeas.grafeas_v1 import Version client = containeranalysis_v1.ContainerAnalysisClient() grafeas_client = client.get_grafeas_client() @@ -81,25 +83,25 @@ def create_occurrence(resource_url, note_id, occurrence_project, note_project): formatted_project = f"projects/{occurrence_project}" occurrence = { - 'note_name': formatted_note, - 'resource_uri': resource_url, - 'vulnerability': { - 'package_issue': [ + "note_name": formatted_note, + "resource_uri": resource_url, + "vulnerability": { + "package_issue": [ { - 'affected_cpe_uri': 'your-uri-here', - 'affected_package': 'your-package-here', - 'affected_version': { - 'kind': Version.VersionKind.MINIMUM - }, - 'fixed_version': { - 'kind': Version.VersionKind.MAXIMUM - } + "affected_cpe_uri": "your-uri-here", + "affected_package": "your-package-here", + "affected_version": {"kind": Version.VersionKind.MINIMUM}, + "fixed_version": {"kind": Version.VersionKind.MAXIMUM}, } ] - } + }, } - return grafeas_client.create_occurrence(parent=formatted_project, occurrence=occurrence) + return grafeas_client.create_occurrence( + parent=formatted_project, occurrence=occurrence + ) + + # [END containeranalysis_create_occurrence] @@ -115,6 +117,8 @@ def delete_occurrence(occurrence_id, project_id): grafeas_client = client.get_grafeas_client() parent = f"projects/{project_id}/occurrences/{occurrence_id}" grafeas_client.delete_occurrence(name=parent) + + # [END containeranalysis_delete_occurrence] @@ -131,6 +135,8 @@ def get_note(note_id, project_id): note_name = f"projects/{project_id}/notes/{note_id}" response = grafeas_client.get_note(name=note_name) return response + + # [END containeranalysis_get_note] @@ -146,6 +152,8 @@ def get_occurrence(occurrence_id, project_id): grafeas_client = client.get_grafeas_client() parent = f"projects/{project_id}/occurrences/{occurrence_id}" return grafeas_client.get_occurrence(name=parent) + + # [END containeranalysis_get_occurrence] @@ -163,10 +171,11 @@ def get_discovery_info(resource_url, project_id): client = containeranalysis_v1.ContainerAnalysisClient() grafeas_client = client.get_grafeas_client() project_name = f"projects/{project_id}" - response = grafeas_client.list_occurrences(parent=project_name, - filter_=filter_str) + response = grafeas_client.list_occurrences(parent=project_name, filter_=filter_str) for occ in response: print(occ) + + # [END containeranalysis_discovery_info] @@ -190,6 +199,8 @@ def get_occurrences_for_note(note_id, project_id): # in this sample, we will simply count each one count += 1 return count + + # [END containeranalysis_occurrences_for_note] @@ -207,14 +218,15 @@ def get_occurrences_for_image(resource_url, project_id): grafeas_client = client.get_grafeas_client() project_name = f"projects/{project_id}" - response = grafeas_client.list_occurrences(parent=project_name, - filter=filter_str) + response = grafeas_client.list_occurrences(parent=project_name, filter=filter_str) count = 0 for o in response: # do something with the retrieved occurrence # in this sample, we will simply count each one count += 1 return count + + # [END containeranalysis_occurrences_for_image] @@ -226,6 +238,7 @@ def pubsub(subscription_id, timeout_seconds, project_id): # project_id = 'my-gcp-project' import time + from google.cloud.pubsub import SubscriberClient client = SubscriberClient() @@ -243,6 +256,7 @@ def pubsub(subscription_id, timeout_seconds, project_id): class MessageReceiver: """Custom class to handle incoming Pub/Sub messages.""" + def __init__(self): # initialize counter to 0 on initialization self.msg_count = 0 @@ -250,7 +264,7 @@ def __init__(self): def pubsub_callback(self, message): # every time a pubsub message comes in, print it and count it self.msg_count += 1 - print('Message {}: {}'.format(self.msg_count, message.data)) + print("Message {}: {}".format(self.msg_count, message.data)) message.ack() @@ -263,7 +277,7 @@ def create_occurrence_subscription(subscription_id, project_id): from google.api_core.exceptions import AlreadyExists from google.cloud.pubsub import SubscriberClient - topic_id = 'container-analysis-occurrences-v1' + topic_id = "container-analysis-occurrences-v1" client = SubscriberClient() topic_name = f"projects/{project_id}/topics/{topic_id}" subscription_name = client.subscription_path(project_id, subscription_id) @@ -276,6 +290,8 @@ def create_occurrence_subscription(subscription_id, project_id): else: success = False return success + + # [END containeranalysis_pubsub] @@ -288,8 +304,9 @@ def poll_discovery_finished(resource_url, timeout_seconds, project_id): # project_id = 'my-gcp-project' import time - from grafeas.grafeas_v1 import DiscoveryOccurrence + from google.cloud.devtools import containeranalysis_v1 + from grafeas.grafeas_v1 import DiscoveryOccurrence deadline = time.time() + timeout_seconds @@ -302,12 +319,13 @@ def poll_discovery_finished(resource_url, timeout_seconds, project_id): time.sleep(1) filter_str = 'resourceUrl="{}" \ AND noteProjectId="goog-analysis" \ - AND noteId="PACKAGE_VULNERABILITY"'.format(resource_url) + AND noteId="PACKAGE_VULNERABILITY"'.format( + resource_url + ) # [END containeranalysis_poll_discovery_occurrence_finished] # The above filter isn't testable, since it looks for occurrences in a # locked down project fall back to a more permissive filter for testing - filter_str = 'kind="DISCOVERY" AND resourceUrl="{}"'\ - .format(resource_url) + filter_str = 'kind="DISCOVERY" AND resourceUrl="{}"'.format(resource_url) # [START containeranalysis_poll_discovery_occurrence_finished] result = grafeas_client.list_occurrences(parent=project_name, filter=filter_str) # only one occurrence should ever be returned by ListOccurrences @@ -315,24 +333,28 @@ def poll_discovery_finished(resource_url, timeout_seconds, project_id): for item in result: discovery_occurrence = item if time.time() > deadline: - raise RuntimeError('timeout while retrieving discovery occurrence') + raise RuntimeError("timeout while retrieving discovery occurrence") status = DiscoveryOccurrence.AnalysisStatus.PENDING - while status != DiscoveryOccurrence.AnalysisStatus.FINISHED_UNSUPPORTED \ - and status != DiscoveryOccurrence.AnalysisStatus.FINISHED_FAILED \ - and status != DiscoveryOccurrence.AnalysisStatus.FINISHED_SUCCESS: + while ( + status != DiscoveryOccurrence.AnalysisStatus.FINISHED_UNSUPPORTED + and status != DiscoveryOccurrence.AnalysisStatus.FINISHED_FAILED + and status != DiscoveryOccurrence.AnalysisStatus.FINISHED_SUCCESS + ): time.sleep(1) updated = grafeas_client.get_occurrence(name=discovery_occurrence.name) status = updated.discovery.analysis_status if time.time() > deadline: - raise RuntimeError('timeout while waiting for terminal state') + raise RuntimeError("timeout while waiting for terminal state") return discovery_occurrence + + # [END containeranalysis_poll_discovery_occurrence_finished] # [START containeranalysis_vulnerability_occurrences_for_image] def find_vulnerabilities_for_image(resource_url, project_id): - """"Retrieves all vulnerability occurrences associated with a resource.""" + """ "Retrieves all vulnerability occurrences associated with a resource.""" # resource_url = 'https://gcr.io/my-project/my-image@sha256:123' # project_id = 'my-gcp-project' @@ -342,9 +364,10 @@ def find_vulnerabilities_for_image(resource_url, project_id): grafeas_client = client.get_grafeas_client() project_name = f"projects/{project_id}" - filter_str = 'kind="VULNERABILITY" AND resourceUrl="{}"'\ - .format(resource_url) + filter_str = 'kind="VULNERABILITY" AND resourceUrl="{}"'.format(resource_url) return list(grafeas_client.list_occurrences(parent=project_name, filter=filter_str)) + + # [END containeranalysis_vulnerability_occurrences_for_image] @@ -355,19 +378,25 @@ def find_high_severity_vulnerabilities_for_image(resource_url, project_id): # resource_url = 'https://gcr.io/my-project/my-image@sha256:123' # project_id = 'my-gcp-project' - from grafeas.grafeas_v1 import Severity from google.cloud.devtools import containeranalysis_v1 + from grafeas.grafeas_v1 import Severity client = containeranalysis_v1.ContainerAnalysisClient() grafeas_client = client.get_grafeas_client() project_name = f"projects/{project_id}" - filter_str = 'kind="VULNERABILITY" AND resourceUrl="{}"'\ - .format(resource_url) - vulnerabilities = grafeas_client.list_occurrences(parent=project_name, filter=filter_str) + filter_str = 'kind="VULNERABILITY" AND resourceUrl="{}"'.format(resource_url) + vulnerabilities = grafeas_client.list_occurrences( + parent=project_name, filter=filter_str + ) filtered_list = [] for v in vulnerabilities: - if v.vulnerability.effective_severity == Severity.HIGH or v.vulnerability.effective_severity == Severity.CRITICAL: + if ( + v.vulnerability.effective_severity == Severity.HIGH + or v.vulnerability.effective_severity == Severity.CRITICAL + ): filtered_list.append(v) return filtered_list + + # [END containeranalysis_filter_vulnerability_occurrences] diff --git a/samples/snippets/samples_test.py b/samples/snippets/samples_test.py index dd9bce6..8ed97fa 100644 --- a/samples/snippets/samples_test.py +++ b/samples/snippets/samples_test.py @@ -19,27 +19,22 @@ import time import uuid -from google.api_core.exceptions import AlreadyExists -from google.api_core.exceptions import InvalidArgument -from google.api_core.exceptions import NotFound +from google.api_core.exceptions import AlreadyExists, InvalidArgument, NotFound from google.cloud.devtools import containeranalysis_v1 from google.cloud.pubsub import PublisherClient, SubscriberClient - -from grafeas.grafeas_v1 import DiscoveryOccurrence -from grafeas.grafeas_v1 import NoteKind -from grafeas.grafeas_v1 import Severity -from grafeas.grafeas_v1 import Version +from grafeas.grafeas_v1 import DiscoveryOccurrence, NoteKind, Severity, Version import pytest import samples -PROJECT_ID = environ['GOOGLE_CLOUD_PROJECT'] +PROJECT_ID = environ["GOOGLE_CLOUD_PROJECT"] SLEEP_TIME = 1 TRY_LIMIT = 20 class MessageReceiver: """Custom class to handle incoming Pub/Sub messages.""" + def __init__(self, expected_msg_nums, done_event): # initialize counter to 0 on initialization self.msg_count = 0 @@ -49,22 +44,21 @@ def __init__(self, expected_msg_nums, done_event): def pubsub_callback(self, message): # every time a pubsub message comes in, print it and count it self.msg_count += 1 - print('Message {}: {}'.format(self.msg_count, message.data)) + print("Message {}: {}".format(self.msg_count, message.data)) message.ack() - if (self.msg_count == self.expected_msg_nums): + if self.msg_count == self.expected_msg_nums: self.done_event.set() class TestContainerAnalysisSamples: - def setup_method(self, test_method): - print('SETUP {}'.format(test_method.__name__)) - self.note_id = 'note-{}'.format(uuid.uuid4()) - self.image_url = '{}.{}'.format(uuid.uuid4(), test_method.__name__) + print("SETUP {}".format(test_method.__name__)) + self.note_id = "note-{}".format(uuid.uuid4()) + self.image_url = "{}.{}".format(uuid.uuid4(), test_method.__name__) self.note_obj = samples.create_note(self.note_id, PROJECT_ID) def teardown_method(self, test_method): - print('TEAR DOWN {}'.format(test_method.__name__)) + print("TEAR DOWN {}".format(test_method.__name__)) try: samples.delete_note(self.note_id, PROJECT_ID) except NotFound: @@ -82,23 +76,21 @@ def test_delete_note(self): pass else: # didn't raise exception we expected - assert (False) + assert False def test_create_occurrence(self): - created = samples.create_occurrence(self.image_url, - self.note_id, - PROJECT_ID, - PROJECT_ID) + created = samples.create_occurrence( + self.image_url, self.note_id, PROJECT_ID, PROJECT_ID + ) retrieved = samples.get_occurrence(basename(created.name), PROJECT_ID) assert created.name == retrieved.name # clean up samples.delete_occurrence(basename(created.name), PROJECT_ID) def test_delete_occurrence(self): - created = samples.create_occurrence(self.image_url, - self.note_id, - PROJECT_ID, - PROJECT_ID) + created = samples.create_occurrence( + self.image_url, self.note_id, PROJECT_ID, PROJECT_ID + ) samples.delete_occurrence(basename(created.name), PROJECT_ID) try: samples.get_occurrence(basename(created.name), PROJECT_ID) @@ -109,18 +101,15 @@ def test_delete_occurrence(self): assert False def test_occurrences_for_image(self): - orig_count = samples.get_occurrences_for_image(self.image_url, - PROJECT_ID) - occ = samples.create_occurrence(self.image_url, - self.note_id, - PROJECT_ID, - PROJECT_ID) + orig_count = samples.get_occurrences_for_image(self.image_url, PROJECT_ID) + occ = samples.create_occurrence( + self.image_url, self.note_id, PROJECT_ID, PROJECT_ID + ) new_count = 0 tries = 0 while new_count != 1 and tries < TRY_LIMIT: tries += 1 - new_count = samples.get_occurrences_for_image(self.image_url, - PROJECT_ID) + new_count = samples.get_occurrences_for_image(self.image_url, PROJECT_ID) time.sleep(SLEEP_TIME) assert new_count == 1 assert orig_count == 0 @@ -128,18 +117,15 @@ def test_occurrences_for_image(self): samples.delete_occurrence(basename(occ.name), PROJECT_ID) def test_occurrences_for_note(self): - orig_count = samples.get_occurrences_for_note(self.note_id, - PROJECT_ID) - occ = samples.create_occurrence(self.image_url, - self.note_id, - PROJECT_ID, - PROJECT_ID) + orig_count = samples.get_occurrences_for_note(self.note_id, PROJECT_ID) + occ = samples.create_occurrence( + self.image_url, self.note_id, PROJECT_ID, PROJECT_ID + ) new_count = 0 tries = 0 while new_count != 1 and tries < TRY_LIMIT: tries += 1 - new_count = samples.get_occurrences_for_note(self.note_id, - PROJECT_ID) + new_count = samples.get_occurrences_for_note(self.note_id, PROJECT_ID) time.sleep(SLEEP_TIME) assert new_count == 1 assert orig_count == 0 @@ -151,16 +137,15 @@ def test_pubsub(self): # create topic if needed client = SubscriberClient() try: - topic_id = 'container-analysis-occurrences-v1' + topic_id = "container-analysis-occurrences-v1" topic_name = {"name": f"projects/{PROJECT_ID}/topics/{topic_id}"} publisher = PublisherClient() publisher.create_topic(topic_name) except AlreadyExists: pass - subscription_id = 'container-analysis-test-{}'.format(uuid.uuid4()) - subscription_name = client.subscription_path(PROJECT_ID, - subscription_id) + subscription_id = "container-analysis-test-{}".format(uuid.uuid4()) + subscription_name = client.subscription_path(PROJECT_ID, subscription_id) samples.create_occurrence_subscription(subscription_id, PROJECT_ID) # I can not make it pass with multiple messages. My guess is @@ -173,7 +158,8 @@ def test_pubsub(self): for i in range(message_count): occ = samples.create_occurrence( - self.image_url, self.note_id, PROJECT_ID, PROJECT_ID) + self.image_url, self.note_id, PROJECT_ID, PROJECT_ID + ) time.sleep(SLEEP_TIME) samples.delete_occurrence(basename(occ.name), PROJECT_ID) time.sleep(SLEEP_TIME) @@ -181,7 +167,7 @@ def test_pubsub(self): # to 180 seconds. # See also: python-docs-samples/issues/2894 job_done.wait(timeout=180) - print('done. msg_count = {}'.format(receiver.msg_count)) + print("done. msg_count = {}".format(receiver.msg_count)) assert message_count <= receiver.msg_count finally: # clean up @@ -200,27 +186,23 @@ def test_poll_discovery_occurrence_fails(self): @pytest.mark.flaky(max_runs=3, min_passes=1) def test_poll_discovery_occurrence(self): # create discovery occurrence - note_id = 'discovery-note-{}'.format(uuid.uuid4()) + note_id = "discovery-note-{}".format(uuid.uuid4()) client = containeranalysis_v1.ContainerAnalysisClient() grafeas_client = client.get_grafeas_client() - note = { - 'discovery': { - 'analysis_kind': NoteKind.DISCOVERY - } - } - grafeas_client.\ - create_note(parent=f"projects/{PROJECT_ID}", note_id=note_id, note=note) + note = {"discovery": {"analysis_kind": NoteKind.DISCOVERY}} + grafeas_client.create_note( + parent=f"projects/{PROJECT_ID}", note_id=note_id, note=note + ) occurrence = { - 'note_name': f"projects/{PROJECT_ID}/notes/{note_id}", - 'resource_uri': self.image_url, - 'discovery': { - 'analysis_status': DiscoveryOccurrence.AnalysisStatus - .FINISHED_SUCCESS - } + "note_name": f"projects/{PROJECT_ID}/notes/{note_id}", + "resource_uri": self.image_url, + "discovery": { + "analysis_status": DiscoveryOccurrence.AnalysisStatus.FINISHED_SUCCESS + }, } - created = grafeas_client.\ - create_occurrence(parent=f"projects/{PROJECT_ID}", - occurrence=occurrence) + created = grafeas_client.create_occurrence( + parent=f"projects/{PROJECT_ID}", occurrence=occurrence + ) disc = samples.poll_discovery_finished(self.image_url, 10, PROJECT_ID) status = disc.discovery.analysis_status @@ -232,20 +214,19 @@ def test_poll_discovery_occurrence(self): samples.delete_note(note_id, PROJECT_ID) def test_find_vulnerabilities_for_image(self): - occ_list = samples.find_vulnerabilities_for_image(self.image_url, - PROJECT_ID) + occ_list = samples.find_vulnerabilities_for_image(self.image_url, PROJECT_ID) assert len(occ_list) == 0 - created = samples.create_occurrence(self.image_url, - self.note_id, - PROJECT_ID, - PROJECT_ID) + created = samples.create_occurrence( + self.image_url, self.note_id, PROJECT_ID, PROJECT_ID + ) tries = 0 count = 0 while count != 1 and tries < TRY_LIMIT: tries += 1 - occ_list = samples.find_vulnerabilities_for_image(self.image_url, - PROJECT_ID) + occ_list = samples.find_vulnerabilities_for_image( + self.image_url, PROJECT_ID + ) count = len(occ_list) time.sleep(SLEEP_TIME) assert len(occ_list) == 1 @@ -253,62 +234,56 @@ def test_find_vulnerabilities_for_image(self): def test_find_high_severity_vulnerabilities(self): occ_list = samples.find_high_severity_vulnerabilities_for_image( - self.image_url, - PROJECT_ID) + self.image_url, PROJECT_ID + ) assert len(occ_list) == 0 # create new high severity vulnerability - note_id = 'discovery-note-{}'.format(uuid.uuid4()) + note_id = "discovery-note-{}".format(uuid.uuid4()) client = containeranalysis_v1.ContainerAnalysisClient() grafeas_client = client.get_grafeas_client() note = { - 'vulnerability': { - 'severity': Severity.CRITICAL, - 'details': [ + "vulnerability": { + "severity": Severity.CRITICAL, + "details": [ { - 'affected_cpe_uri': 'your-uri-here', - 'affected_package': 'your-package-here', - 'affected_version_start': { - 'kind': Version.VersionKind.MINIMUM - }, - 'fixed_version': { - 'kind': Version.VersionKind.MAXIMUM - } + "affected_cpe_uri": "your-uri-here", + "affected_package": "your-package-here", + "affected_version_start": {"kind": Version.VersionKind.MINIMUM}, + "fixed_version": {"kind": Version.VersionKind.MAXIMUM}, } - ] + ], } } - grafeas_client.\ - create_note(parent=f"projects/{PROJECT_ID}", note_id=note_id, note=note) + grafeas_client.create_note( + parent=f"projects/{PROJECT_ID}", note_id=note_id, note=note + ) occurrence = { - 'note_name': f"projects/{PROJECT_ID}/notes/{note_id}", - 'resource_uri': self.image_url, - 'vulnerability': { - 'effective_severity': Severity.CRITICAL, - 'package_issue': [ + "note_name": f"projects/{PROJECT_ID}/notes/{note_id}", + "resource_uri": self.image_url, + "vulnerability": { + "effective_severity": Severity.CRITICAL, + "package_issue": [ { - 'affected_cpe_uri': 'your-uri-here', - 'affected_package': 'your-package-here', - 'affected_version': { - 'kind': Version.VersionKind.MINIMUM - }, - 'fixed_version': { - 'kind': Version.VersionKind.MAXIMUM - } + "affected_cpe_uri": "your-uri-here", + "affected_package": "your-package-here", + "affected_version": {"kind": Version.VersionKind.MINIMUM}, + "fixed_version": {"kind": Version.VersionKind.MAXIMUM}, } - ] - } + ], + }, } - created = grafeas_client.\ - create_occurrence(parent=f"projects/{PROJECT_ID}", - occurrence=occurrence) + created = grafeas_client.create_occurrence( + parent=f"projects/{PROJECT_ID}", occurrence=occurrence + ) # query again tries = 0 count = 0 while count != 1 and tries < TRY_LIMIT: tries += 1 - occ_list = samples.find_vulnerabilities_for_image(self.image_url, - PROJECT_ID) + occ_list = samples.find_vulnerabilities_for_image( + self.image_url, PROJECT_ID + ) count = len(occ_list) time.sleep(SLEEP_TIME) assert len(occ_list) == 1 diff --git a/setup.py b/setup.py index 69f0296..16a187f 100644 --- a/setup.py +++ b/setup.py @@ -1,38 +1,52 @@ # -*- coding: utf-8 -*- -# -# Copyright 2019 Google LLC +# 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 # -# https://www.apache.org/licenses/LICENSE-2.0 +# 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. - +# import io import os -import setuptools +import setuptools # type: ignore +package_root = os.path.abspath(os.path.dirname(__file__)) name = "google-cloud-containeranalysis" -description = "Container Analysis API API client library" -version = "2.9.3" -release_status = "Development Status :: 5 - Production/Stable" + + +description = "Google Cloud Devtools Containeranalysis API client library" + +version = {} +with open( + os.path.join( + package_root, "google/cloud/devtools/containeranalysis/gapic_version.py" + ) +) as fp: + exec(fp.read(), version) +version = version["__version__"] + +if version[0] == "0": + release_status = "Development Status :: 4 - Beta" +else: + release_status = "Development Status :: 5 - Production/Stable" + dependencies = [ - "google-api-core[grpc] >= 1.32.0, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*", - "grpc-google-iam-v1 >= 0.12.4, <1.0.0dev", + "google-api-core[grpc] >= 1.33.2, <3.0.0dev,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*", "proto-plus >= 1.22.0, <2.0.0dev", "protobuf>=3.19.5,<5.0.0dev,!=3.20.0,!=3.20.1,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5", + "grpc-google-iam-v1 >= 0.12.4, < 1.0.0dev", "grafeas >=1.4.1, <2.0dev", ] -extras = {"libcst": "libcst >= 0.2.5"} - +url = "https://github.com/googleapis/python-containeranalysis" package_root = os.path.abspath(os.path.dirname(__file__)) @@ -60,7 +74,7 @@ author="Google LLC", author_email="googleapis-packages@google.com", license="Apache 2.0", - url="https://github.com/googleapis/python-containeranalysis", + url=url, classifiers=[ release_status, "Intended Audience :: Developers", @@ -76,11 +90,9 @@ ], platforms="Posix; MacOS X; Windows", packages=packages, + python_requires=">=3.7", namespace_packages=namespaces, install_requires=dependencies, - extras_require=extras, - python_requires=">=3.7", - scripts=["scripts/fixup_containeranalysis_v1_keywords.py"], include_package_data=True, zip_safe=False, ) diff --git a/testing/constraints-3.10.txt b/testing/constraints-3.10.txt index e69de29..ad3f0fa 100644 --- a/testing/constraints-3.10.txt +++ b/testing/constraints-3.10.txt @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf +grpc-google-iam-v1 diff --git a/testing/constraints-3.11.txt b/testing/constraints-3.11.txt index e69de29..ad3f0fa 100644 --- a/testing/constraints-3.11.txt +++ b/testing/constraints-3.11.txt @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf +grpc-google-iam-v1 diff --git a/testing/constraints-3.7.txt b/testing/constraints-3.7.txt index f2ff391..8995c3a 100644 --- a/testing/constraints-3.7.txt +++ b/testing/constraints-3.7.txt @@ -1,14 +1,11 @@ # This constraints file is used to check that lower bounds # are correct in setup.py -# List *all* library dependencies and extras in this file. +# List all library dependencies and extras in this file. # Pin the version to the lower bound. -# -# e.g., if setup.py has "foo >= 1.14.0, < 2.0.0dev", -# Then this file should have foo==1.14.0 -google-api-core==1.32.0 -grpc-google-iam-v1==0.12.4 +# 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.33.2 proto-plus==1.22.0 -libcst==0.2.5 -grafeas==1.4.1 protobuf==3.19.5 - +grpc-google-iam-v1==0.12.4 +grafeas==1.4.1 diff --git a/testing/constraints-3.8.txt b/testing/constraints-3.8.txt index e69de29..ad3f0fa 100644 --- a/testing/constraints-3.8.txt +++ b/testing/constraints-3.8.txt @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf +grpc-google-iam-v1 diff --git a/testing/constraints-3.9.txt b/testing/constraints-3.9.txt index e69de29..ad3f0fa 100644 --- a/testing/constraints-3.9.txt +++ b/testing/constraints-3.9.txt @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# This constraints file is required for unit tests. +# List all library dependencies and extras in this file. +google-api-core +proto-plus +protobuf +grpc-google-iam-v1 diff --git a/tests/unit/gapic/containeranalysis_v1/test_container_analysis.py b/tests/unit/gapic/containeranalysis_v1/test_container_analysis.py index b977996..3a4bf81 100644 --- a/tests/unit/gapic/containeranalysis_v1/test_container_analysis.py +++ b/tests/unit/gapic/containeranalysis_v1/test_container_analysis.py @@ -22,38 +22,32 @@ except ImportError: # pragma: NO COVER import mock -import grpc -from grpc.experimental import aio import math -import pytest -from proto.marshal.rules.dates import DurationRule, TimestampRule -from proto.marshal.rules import wrappers +from google.api_core import gapic_v1, grpc_helpers, grpc_helpers_async, path_template from google.api_core import client_options from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 -from google.api_core import grpc_helpers -from google.api_core import grpc_helpers_async -from google.api_core import path_template +import google.auth from google.auth import credentials as ga_credentials from google.auth.exceptions import MutualTLSChannelError -from google.cloud.devtools.containeranalysis_v1.services.container_analysis import ( - ContainerAnalysisAsyncClient, -) -from google.cloud.devtools.containeranalysis_v1.services.container_analysis import ( - ContainerAnalysisClient, -) -from google.cloud.devtools.containeranalysis_v1.services.container_analysis import ( - transports, -) -from google.cloud.devtools.containeranalysis_v1.types import containeranalysis from google.iam.v1 import iam_policy_pb2 # type: ignore from google.iam.v1 import options_pb2 # type: ignore from google.iam.v1 import policy_pb2 # type: ignore from google.oauth2 import service_account from google.protobuf import field_mask_pb2 # type: ignore from google.type import expr_pb2 # type: ignore -import google.auth +import grpc +from grpc.experimental import aio +from proto.marshal.rules import wrappers +from proto.marshal.rules.dates import DurationRule, TimestampRule +import pytest + +from google.cloud.devtools.containeranalysis_v1.services.container_analysis import ( + ContainerAnalysisAsyncClient, + ContainerAnalysisClient, + transports, +) +from google.cloud.devtools.containeranalysis_v1.types import containeranalysis def client_cert_source_callback(): diff --git a/tests/unit/test_get_grafeas_client.py b/tests/unit/test_get_grafeas_client.py index 66a1652..2a96216 100644 --- a/tests/unit/test_get_grafeas_client.py +++ b/tests/unit/test_get_grafeas_client.py @@ -1,7 +1,5 @@ from google.cloud.devtools.containeranalysis_v1.services.container_analysis import ( ContainerAnalysisAsyncClient, -) -from google.cloud.devtools.containeranalysis_v1.services.container_analysis import ( ContainerAnalysisClient, )