diff --git a/.github/release-please.yml b/.github/release-please.yml index 6def37a..e9a4f00 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..866e93f --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "1.4.3" +} diff --git a/docs/transcoder_v1/types.rst b/docs/transcoder_v1/types.rst index 7dc3c71..6fe8d2e 100644 --- a/docs/transcoder_v1/types.rst +++ b/docs/transcoder_v1/types.rst @@ -3,5 +3,4 @@ Types for Google Cloud Video Transcoder v1 API .. automodule:: google.cloud.video.transcoder_v1.types :members: - :undoc-members: :show-inheritance: diff --git a/google/cloud/video/transcoder/__init__.py b/google/cloud/video/transcoder/__init__.py index 39af9a1..7ec74e4 100644 --- a/google/cloud/video/transcoder/__init__.py +++ b/google/cloud/video/transcoder/__init__.py @@ -13,6 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from google.cloud.video.transcoder import gapic_version as package_version + +__version__ = package_version.__version__ + from google.cloud.video.transcoder_v1.services.transcoder_service.async_client import ( TranscoderServiceAsyncClient, diff --git a/google/cloud/video/transcoder/gapic_version.py b/google/cloud/video/transcoder/gapic_version.py new file mode 100644 index 0000000..178df4b --- /dev/null +++ b/google/cloud/video/transcoder/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__ = "1.4.3" # {x-release-please-version} diff --git a/google/cloud/video/transcoder_v1/__init__.py b/google/cloud/video/transcoder_v1/__init__.py index 34fdac3..6a5c73b 100644 --- a/google/cloud/video/transcoder_v1/__init__.py +++ b/google/cloud/video/transcoder_v1/__init__.py @@ -13,6 +13,10 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from google.cloud.video.transcoder import gapic_version as package_version + +__version__ = package_version.__version__ + from .services.transcoder_service import ( TranscoderServiceAsyncClient, diff --git a/google/cloud/video/transcoder_v1/services/transcoder_service/async_client.py b/google/cloud/video/transcoder_v1/services/transcoder_service/async_client.py index a79d04d..e789f5e 100644 --- a/google/cloud/video/transcoder_v1/services/transcoder_service/async_client.py +++ b/google/cloud/video/transcoder_v1/services/transcoder_service/async_client.py @@ -16,7 +16,17 @@ from collections import OrderedDict import functools import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union +from typing import ( + Dict, + Mapping, + MutableMapping, + MutableSequence, + Optional, + Sequence, + Tuple, + Type, + Union, +) from google.api_core import exceptions as core_exceptions from google.api_core import gapic_v1 @@ -173,9 +183,9 @@ def transport(self) -> TranscoderServiceTransport: def __init__( self, *, - credentials: ga_credentials.Credentials = None, + credentials: Optional[ga_credentials.Credentials] = None, transport: Union[str, TranscoderServiceTransport] = "grpc_asyncio", - client_options: ClientOptions = None, + client_options: Optional[ClientOptions] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the transcoder service client. @@ -219,12 +229,12 @@ def __init__( async def create_job( self, - request: Union[services.CreateJobRequest, dict] = None, + request: Optional[Union[services.CreateJobRequest, dict]] = None, *, - parent: str = None, - job: resources.Job = None, + parent: Optional[str] = None, + job: Optional[resources.Job] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> resources.Job: r"""Creates a job in the specified region. @@ -260,7 +270,7 @@ async def sample_create_job(): print(response) Args: - request (Union[google.cloud.video.transcoder_v1.types.CreateJobRequest, dict]): + request (Optional[Union[google.cloud.video.transcoder_v1.types.CreateJobRequest, dict]]): The request object. Request message for `TranscoderService.CreateJob`. parent (:class:`str`): @@ -333,11 +343,11 @@ async def sample_create_job(): async def list_jobs( self, - request: Union[services.ListJobsRequest, dict] = None, + request: Optional[Union[services.ListJobsRequest, dict]] = None, *, - parent: str = None, + parent: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListJobsAsyncPager: r"""Lists jobs in the specified region. @@ -370,7 +380,7 @@ async def sample_list_jobs(): print(response) Args: - request (Union[google.cloud.video.transcoder_v1.types.ListJobsRequest, dict]): + request (Optional[Union[google.cloud.video.transcoder_v1.types.ListJobsRequest, dict]]): The request object. Request message for `TranscoderService.ListJobs`. The parent location from which to retrieve the collection of jobs. @@ -448,11 +458,11 @@ async def sample_list_jobs(): async def get_job( self, - request: Union[services.GetJobRequest, dict] = None, + request: Optional[Union[services.GetJobRequest, dict]] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> resources.Job: r"""Returns the job data. @@ -484,7 +494,7 @@ async def sample_get_job(): print(response) Args: - request (Union[google.cloud.video.transcoder_v1.types.GetJobRequest, dict]): + request (Optional[Union[google.cloud.video.transcoder_v1.types.GetJobRequest, dict]]): The request object. Request message for `TranscoderService.GetJob`. name (:class:`str`): @@ -548,11 +558,11 @@ async def sample_get_job(): async def delete_job( self, - request: Union[services.DeleteJobRequest, dict] = None, + request: Optional[Union[services.DeleteJobRequest, dict]] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes a job. @@ -581,7 +591,7 @@ async def sample_delete_job(): await client.delete_job(request=request) Args: - request (Union[google.cloud.video.transcoder_v1.types.DeleteJobRequest, dict]): + request (Optional[Union[google.cloud.video.transcoder_v1.types.DeleteJobRequest, dict]]): The request object. Request message for `TranscoderService.DeleteJob`. name (:class:`str`): @@ -638,13 +648,13 @@ async def sample_delete_job(): async def create_job_template( self, - request: Union[services.CreateJobTemplateRequest, dict] = None, + request: Optional[Union[services.CreateJobTemplateRequest, dict]] = None, *, - parent: str = None, - job_template: resources.JobTemplate = None, - job_template_id: str = None, + parent: Optional[str] = None, + job_template: Optional[resources.JobTemplate] = None, + job_template_id: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> resources.JobTemplate: r"""Creates a job template in the specified region. @@ -677,7 +687,7 @@ async def sample_create_job_template(): print(response) Args: - request (Union[google.cloud.video.transcoder_v1.types.CreateJobTemplateRequest, dict]): + request (Optional[Union[google.cloud.video.transcoder_v1.types.CreateJobTemplateRequest, dict]]): The request object. Request message for `TranscoderService.CreateJobTemplate`. parent (:class:`str`): @@ -765,11 +775,11 @@ async def sample_create_job_template(): async def list_job_templates( self, - request: Union[services.ListJobTemplatesRequest, dict] = None, + request: Optional[Union[services.ListJobTemplatesRequest, dict]] = None, *, - parent: str = None, + parent: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListJobTemplatesAsyncPager: r"""Lists job templates in the specified region. @@ -802,7 +812,7 @@ async def sample_list_job_templates(): print(response) Args: - request (Union[google.cloud.video.transcoder_v1.types.ListJobTemplatesRequest, dict]): + request (Optional[Union[google.cloud.video.transcoder_v1.types.ListJobTemplatesRequest, dict]]): The request object. Request message for `TranscoderService.ListJobTemplates`. parent (:class:`str`): @@ -880,11 +890,11 @@ async def sample_list_job_templates(): async def get_job_template( self, - request: Union[services.GetJobTemplateRequest, dict] = None, + request: Optional[Union[services.GetJobTemplateRequest, dict]] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> resources.JobTemplate: r"""Returns the job template data. @@ -916,7 +926,7 @@ async def sample_get_job_template(): print(response) Args: - request (Union[google.cloud.video.transcoder_v1.types.GetJobTemplateRequest, dict]): + request (Optional[Union[google.cloud.video.transcoder_v1.types.GetJobTemplateRequest, dict]]): The request object. Request message for `TranscoderService.GetJobTemplate`. name (:class:`str`): @@ -981,11 +991,11 @@ async def sample_get_job_template(): async def delete_job_template( self, - request: Union[services.DeleteJobTemplateRequest, dict] = None, + request: Optional[Union[services.DeleteJobTemplateRequest, dict]] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes a job template. @@ -1014,7 +1024,7 @@ async def sample_delete_job_template(): await client.delete_job_template(request=request) Args: - request (Union[google.cloud.video.transcoder_v1.types.DeleteJobTemplateRequest, dict]): + request (Optional[Union[google.cloud.video.transcoder_v1.types.DeleteJobTemplateRequest, dict]]): The request object. Request message for `TranscoderService.DeleteJobTemplate`. name (:class:`str`): diff --git a/google/cloud/video/transcoder_v1/services/transcoder_service/client.py b/google/cloud/video/transcoder_v1/services/transcoder_service/client.py index 6fe477b..ce3540a 100644 --- a/google/cloud/video/transcoder_v1/services/transcoder_service/client.py +++ b/google/cloud/video/transcoder_v1/services/transcoder_service/client.py @@ -16,7 +16,18 @@ from collections import OrderedDict import os import re -from typing import Dict, Mapping, Optional, Sequence, Tuple, Type, Union +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 @@ -61,7 +72,7 @@ class TranscoderServiceClientMeta(type): def get_transport_class( cls, - label: str = None, + label: Optional[str] = None, ) -> Type[TranscoderServiceTransport]: """Returns an appropriate transport class. @@ -365,8 +376,8 @@ def __init__( self, *, credentials: Optional[ga_credentials.Credentials] = None, - transport: Union[str, TranscoderServiceTransport, None] = None, - client_options: Optional[client_options_lib.ClientOptions] = None, + transport: Optional[Union[str, TranscoderServiceTransport]] = None, + client_options: Optional[Union[client_options_lib.ClientOptions, dict]] = None, client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, ) -> None: """Instantiates the transcoder service client. @@ -380,7 +391,7 @@ def __init__( transport (Union[str, TranscoderServiceTransport]): 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 @@ -410,6 +421,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 @@ -462,12 +474,12 @@ def __init__( def create_job( self, - request: Union[services.CreateJobRequest, dict] = None, + request: Optional[Union[services.CreateJobRequest, dict]] = None, *, - parent: str = None, - job: resources.Job = None, + parent: Optional[str] = None, + job: Optional[resources.Job] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> resources.Job: r"""Creates a job in the specified region. @@ -576,11 +588,11 @@ def sample_create_job(): def list_jobs( self, - request: Union[services.ListJobsRequest, dict] = None, + request: Optional[Union[services.ListJobsRequest, dict]] = None, *, - parent: str = None, + parent: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListJobsPager: r"""Lists jobs in the specified region. @@ -691,11 +703,11 @@ def sample_list_jobs(): def get_job( self, - request: Union[services.GetJobRequest, dict] = None, + request: Optional[Union[services.GetJobRequest, dict]] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> resources.Job: r"""Returns the job data. @@ -791,11 +803,11 @@ def sample_get_job(): def delete_job( self, - request: Union[services.DeleteJobRequest, dict] = None, + request: Optional[Union[services.DeleteJobRequest, dict]] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes a job. @@ -881,13 +893,13 @@ def sample_delete_job(): def create_job_template( self, - request: Union[services.CreateJobTemplateRequest, dict] = None, + request: Optional[Union[services.CreateJobTemplateRequest, dict]] = None, *, - parent: str = None, - job_template: resources.JobTemplate = None, - job_template_id: str = None, + parent: Optional[str] = None, + job_template: Optional[resources.JobTemplate] = None, + job_template_id: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> resources.JobTemplate: r"""Creates a job template in the specified region. @@ -1008,11 +1020,11 @@ def sample_create_job_template(): def list_job_templates( self, - request: Union[services.ListJobTemplatesRequest, dict] = None, + request: Optional[Union[services.ListJobTemplatesRequest, dict]] = None, *, - parent: str = None, + parent: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> pagers.ListJobTemplatesPager: r"""Lists job templates in the specified region. @@ -1123,11 +1135,11 @@ def sample_list_job_templates(): def get_job_template( self, - request: Union[services.GetJobTemplateRequest, dict] = None, + request: Optional[Union[services.GetJobTemplateRequest, dict]] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> resources.JobTemplate: r"""Returns the job template data. @@ -1224,11 +1236,11 @@ def sample_get_job_template(): def delete_job_template( self, - request: Union[services.DeleteJobTemplateRequest, dict] = None, + request: Optional[Union[services.DeleteJobTemplateRequest, dict]] = None, *, - name: str = None, + name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, - timeout: float = None, + timeout: Optional[float] = None, metadata: Sequence[Tuple[str, str]] = (), ) -> None: r"""Deletes a job template. diff --git a/google/cloud/video/transcoder_v1/services/transcoder_service/transports/base.py b/google/cloud/video/transcoder_v1/services/transcoder_service/transports/base.py index 6596605..691e037 100644 --- a/google/cloud/video/transcoder_v1/services/transcoder_service/transports/base.py +++ b/google/cloud/video/transcoder_v1/services/transcoder_service/transports/base.py @@ -49,7 +49,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/video/transcoder_v1/services/transcoder_service/transports/grpc.py b/google/cloud/video/transcoder_v1/services/transcoder_service/transports/grpc.py index 8212f09..0a57b5d 100644 --- a/google/cloud/video/transcoder_v1/services/transcoder_service/transports/grpc.py +++ b/google/cloud/video/transcoder_v1/services/transcoder_service/transports/grpc.py @@ -53,14 +53,14 @@ def __init__( self, *, host: str = "transcoder.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, @@ -187,8 +187,8 @@ def __init__( def create_channel( cls, host: str = "transcoder.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/video/transcoder_v1/services/transcoder_service/transports/grpc_asyncio.py b/google/cloud/video/transcoder_v1/services/transcoder_service/transports/grpc_asyncio.py index a5e2ae4..3a73984 100644 --- a/google/cloud/video/transcoder_v1/services/transcoder_service/transports/grpc_asyncio.py +++ b/google/cloud/video/transcoder_v1/services/transcoder_service/transports/grpc_asyncio.py @@ -55,7 +55,7 @@ class TranscoderServiceGrpcAsyncIOTransport(TranscoderServiceTransport): def create_channel( cls, host: str = "transcoder.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, @@ -98,15 +98,15 @@ def __init__( self, *, host: str = "transcoder.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/video/transcoder_v1/types/resources.py b/google/cloud/video/transcoder_v1/types/resources.py index d7cfb7f..ab657b6 100644 --- a/google/cloud/video/transcoder_v1/types/resources.py +++ b/google/cloud/video/transcoder_v1/types/resources.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from typing import MutableMapping, MutableSequence + from google.protobuf import duration_pb2 # type: ignore from google.protobuf import timestamp_pb2 # type: ignore from google.rpc import status_pb2 # type: ignore @@ -103,7 +105,7 @@ class Job(proto.Message): effective after job completion. Job should be deleted automatically after the given TTL. Enter a value between 1 and 90. The default is 30. - labels (Mapping[str, str]): + labels (MutableMapping[str, str]): The labels associated with this job. You can use these to organize and group your jobs. error (google.rpc.status_pb2.Status): @@ -120,59 +122,59 @@ class ProcessingState(proto.Enum): SUCCEEDED = 3 FAILED = 4 - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) - input_uri = proto.Field( + input_uri: str = proto.Field( proto.STRING, number=2, ) - output_uri = proto.Field( + output_uri: str = proto.Field( proto.STRING, number=3, ) - template_id = proto.Field( + template_id: str = proto.Field( proto.STRING, number=4, oneof="job_config", ) - config = proto.Field( + config: "JobConfig" = proto.Field( proto.MESSAGE, number=5, oneof="job_config", message="JobConfig", ) - state = proto.Field( + state: ProcessingState = proto.Field( proto.ENUM, number=8, enum=ProcessingState, ) - create_time = proto.Field( + create_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=12, message=timestamp_pb2.Timestamp, ) - start_time = proto.Field( + start_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=13, message=timestamp_pb2.Timestamp, ) - end_time = proto.Field( + end_time: timestamp_pb2.Timestamp = proto.Field( proto.MESSAGE, number=14, message=timestamp_pb2.Timestamp, ) - ttl_after_completion_days = proto.Field( + ttl_after_completion_days: int = proto.Field( proto.INT32, number=15, ) - labels = proto.MapField( + labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=16, ) - error = proto.Field( + error: status_pb2.Status = proto.Field( proto.MESSAGE, number=17, message=status_pb2.Status, @@ -188,22 +190,22 @@ class JobTemplate(proto.Message): ``projects/{project_number}/locations/{location}/jobTemplates/{job_template}`` config (google.cloud.video.transcoder_v1.types.JobConfig): The configuration for this template. - labels (Mapping[str, str]): + labels (MutableMapping[str, str]): The labels associated with this job template. You can use these to organize and group your job templates. """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) - config = proto.Field( + config: "JobConfig" = proto.Field( proto.MESSAGE, number=2, message="JobConfig", ) - labels = proto.MapField( + labels: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, number=3, @@ -214,80 +216,80 @@ class JobConfig(proto.Message): r"""Job configuration Attributes: - inputs (Sequence[google.cloud.video.transcoder_v1.types.Input]): + inputs (MutableSequence[google.cloud.video.transcoder_v1.types.Input]): List of input assets stored in Cloud Storage. - edit_list (Sequence[google.cloud.video.transcoder_v1.types.EditAtom]): + edit_list (MutableSequence[google.cloud.video.transcoder_v1.types.EditAtom]): List of ``Edit atom``\ s. Defines the ultimate timeline of the resulting file or manifest. - elementary_streams (Sequence[google.cloud.video.transcoder_v1.types.ElementaryStream]): + elementary_streams (MutableSequence[google.cloud.video.transcoder_v1.types.ElementaryStream]): List of elementary streams. - mux_streams (Sequence[google.cloud.video.transcoder_v1.types.MuxStream]): + mux_streams (MutableSequence[google.cloud.video.transcoder_v1.types.MuxStream]): List of multiplexing settings for output streams. - manifests (Sequence[google.cloud.video.transcoder_v1.types.Manifest]): + manifests (MutableSequence[google.cloud.video.transcoder_v1.types.Manifest]): List of output manifests. output (google.cloud.video.transcoder_v1.types.Output): Output configuration. - ad_breaks (Sequence[google.cloud.video.transcoder_v1.types.AdBreak]): + ad_breaks (MutableSequence[google.cloud.video.transcoder_v1.types.AdBreak]): List of ad breaks. Specifies where to insert ad break tags in the output manifests. pubsub_destination (google.cloud.video.transcoder_v1.types.PubsubDestination): Destination on Pub/Sub. - sprite_sheets (Sequence[google.cloud.video.transcoder_v1.types.SpriteSheet]): + sprite_sheets (MutableSequence[google.cloud.video.transcoder_v1.types.SpriteSheet]): List of output sprite sheets. Spritesheets require at least one VideoStream in the Jobconfig. - overlays (Sequence[google.cloud.video.transcoder_v1.types.Overlay]): + overlays (MutableSequence[google.cloud.video.transcoder_v1.types.Overlay]): List of overlays on the output video, in descending Z-order. """ - inputs = proto.RepeatedField( + inputs: MutableSequence["Input"] = proto.RepeatedField( proto.MESSAGE, number=1, message="Input", ) - edit_list = proto.RepeatedField( + edit_list: MutableSequence["EditAtom"] = proto.RepeatedField( proto.MESSAGE, number=2, message="EditAtom", ) - elementary_streams = proto.RepeatedField( + elementary_streams: MutableSequence["ElementaryStream"] = proto.RepeatedField( proto.MESSAGE, number=3, message="ElementaryStream", ) - mux_streams = proto.RepeatedField( + mux_streams: MutableSequence["MuxStream"] = proto.RepeatedField( proto.MESSAGE, number=4, message="MuxStream", ) - manifests = proto.RepeatedField( + manifests: MutableSequence["Manifest"] = proto.RepeatedField( proto.MESSAGE, number=5, message="Manifest", ) - output = proto.Field( + output: "Output" = proto.Field( proto.MESSAGE, number=6, message="Output", ) - ad_breaks = proto.RepeatedField( + ad_breaks: MutableSequence["AdBreak"] = proto.RepeatedField( proto.MESSAGE, number=7, message="AdBreak", ) - pubsub_destination = proto.Field( + pubsub_destination: "PubsubDestination" = proto.Field( proto.MESSAGE, number=8, message="PubsubDestination", ) - sprite_sheets = proto.RepeatedField( + sprite_sheets: MutableSequence["SpriteSheet"] = proto.RepeatedField( proto.MESSAGE, number=9, message="SpriteSheet", ) - overlays = proto.RepeatedField( + overlays: MutableSequence["Overlay"] = proto.RepeatedField( proto.MESSAGE, number=10, message="Overlay", @@ -313,15 +315,15 @@ class Input(proto.Message): Preprocessing configurations. """ - key = proto.Field( + key: str = proto.Field( proto.STRING, number=1, ) - uri = proto.Field( + uri: str = proto.Field( proto.STRING, number=2, ) - preprocessing_config = proto.Field( + preprocessing_config: "PreprocessingConfig" = proto.Field( proto.MESSAGE, number=3, message="PreprocessingConfig", @@ -340,7 +342,7 @@ class Output(proto.Message): formats `__. """ - uri = proto.Field( + uri: str = proto.Field( proto.STRING, number=1, ) @@ -353,7 +355,7 @@ class EditAtom(proto.Message): key (str): A unique key for this atom. Must be specified when using advanced mapping. - inputs (Sequence[str]): + inputs (MutableSequence[str]): List of ``Input.key``\ s identifying files that should be used in this atom. The listed ``inputs`` must have the same timeline. @@ -366,20 +368,20 @@ class EditAtom(proto.Message): file timeline. The default is ``0s``. """ - key = proto.Field( + key: str = proto.Field( proto.STRING, number=1, ) - inputs = proto.RepeatedField( + inputs: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=2, ) - end_time_offset = proto.Field( + end_time_offset: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=3, message=duration_pb2.Duration, ) - start_time_offset = proto.Field( + start_time_offset: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=4, message=duration_pb2.Duration, @@ -395,7 +397,7 @@ class AdBreak(proto.Message): output file timeline. The default is ``0s``. """ - start_time_offset = proto.Field( + start_time_offset: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=1, message=duration_pb2.Duration, @@ -432,23 +434,23 @@ class ElementaryStream(proto.Message): This field is a member of `oneof`_ ``elementary_stream``. """ - key = proto.Field( + key: str = proto.Field( proto.STRING, number=4, ) - video_stream = proto.Field( + video_stream: "VideoStream" = proto.Field( proto.MESSAGE, number=1, oneof="elementary_stream", message="VideoStream", ) - audio_stream = proto.Field( + audio_stream: "AudioStream" = proto.Field( proto.MESSAGE, number=2, oneof="elementary_stream", message="AudioStream", ) - text_stream = proto.Field( + text_stream: "TextStream" = proto.Field( proto.MESSAGE, number=3, oneof="elementary_stream", @@ -484,30 +486,30 @@ class MuxStream(proto.Message): See also: `Supported input and output formats `__ - elementary_streams (Sequence[str]): + elementary_streams (MutableSequence[str]): List of ``ElementaryStream.key``\ s multiplexed in this stream. segment_settings (google.cloud.video.transcoder_v1.types.SegmentSettings): Segment settings for ``ts``, ``fmp4`` and ``vtt``. """ - key = proto.Field( + key: str = proto.Field( proto.STRING, number=1, ) - file_name = proto.Field( + file_name: str = proto.Field( proto.STRING, number=2, ) - container = proto.Field( + container: str = proto.Field( proto.STRING, number=3, ) - elementary_streams = proto.RepeatedField( + elementary_streams: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=4, ) - segment_settings = proto.Field( + segment_settings: "SegmentSettings" = proto.Field( proto.MESSAGE, number=5, message="SegmentSettings", @@ -524,7 +526,7 @@ class Manifest(proto.Message): ``Manifest.type``. type_ (google.cloud.video.transcoder_v1.types.Manifest.ManifestType): Required. Type of the manifest, can be ``HLS`` or ``DASH``. - mux_streams (Sequence[str]): + mux_streams (MutableSequence[str]): Required. List of user given ``MuxStream.key``\ s that should appear in this manifest. @@ -539,16 +541,16 @@ class ManifestType(proto.Enum): HLS = 1 DASH = 2 - file_name = proto.Field( + file_name: str = proto.Field( proto.STRING, number=1, ) - type_ = proto.Field( + type_: ManifestType = proto.Field( proto.ENUM, number=2, enum=ManifestType, ) - mux_streams = proto.RepeatedField( + mux_streams: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) @@ -564,7 +566,7 @@ class PubsubDestination(proto.Message): ``projects/{project}/topics/{topic}``. """ - topic = proto.Field( + topic: str = proto.Field( proto.STRING, number=1, ) @@ -601,6 +603,12 @@ class SpriteSheet(proto.Message): [SpriteSheet.sprite_height_pixels][google.cloud.video.transcoder.v1.SpriteSheet.sprite_height_pixels] field, but not both (the API will automatically calculate the missing field). + + For portrait videos that contain horizontal ASR and rotation + metadata, provide the width, in pixels, per the horizontal + ASR. The API calculates the height per the horizontal ASR. + The API detects any rotation metadata and swaps the + requested height and width for the output. sprite_height_pixels (int): Required. The height of sprite in pixels. Must be an even integer. To preserve the source aspect ratio, set the @@ -609,6 +617,12 @@ class SpriteSheet(proto.Message): [SpriteSheet.sprite_width_pixels][google.cloud.video.transcoder.v1.SpriteSheet.sprite_width_pixels] field, but not both (the API will automatically calculate the missing field). + + For portrait videos that contain horizontal ASR and rotation + metadata, provide the height, in pixels, per the horizontal + ASR. The API calculates the width per the horizontal ASR. + The API detects any rotation metadata and swaps the + requested height and width for the output. column_count (int): The maximum number of sprites per row in a sprite sheet. The default is 0, which indicates @@ -646,52 +660,52 @@ class SpriteSheet(proto.Message): ratio. """ - format_ = proto.Field( + format_: str = proto.Field( proto.STRING, number=1, ) - file_prefix = proto.Field( + file_prefix: str = proto.Field( proto.STRING, number=2, ) - sprite_width_pixels = proto.Field( + sprite_width_pixels: int = proto.Field( proto.INT32, number=3, ) - sprite_height_pixels = proto.Field( + sprite_height_pixels: int = proto.Field( proto.INT32, number=4, ) - column_count = proto.Field( + column_count: int = proto.Field( proto.INT32, number=5, ) - row_count = proto.Field( + row_count: int = proto.Field( proto.INT32, number=6, ) - start_time_offset = proto.Field( + start_time_offset: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=7, message=duration_pb2.Duration, ) - end_time_offset = proto.Field( + end_time_offset: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=8, message=duration_pb2.Duration, ) - total_count = proto.Field( + total_count: int = proto.Field( proto.INT32, number=9, oneof="extraction_strategy", ) - interval = proto.Field( + interval: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=10, oneof="extraction_strategy", message=duration_pb2.Duration, ) - quality = proto.Field( + quality: int = proto.Field( proto.INT32, number=11, ) @@ -703,7 +717,7 @@ class Overlay(proto.Message): Attributes: image (google.cloud.video.transcoder_v1.types.Overlay.Image): Image overlay. - animations (Sequence[google.cloud.video.transcoder_v1.types.Overlay.Animation]): + animations (MutableSequence[google.cloud.video.transcoder_v1.types.Overlay.Animation]): List of Animations. The list should be chronological, without any time overlap. """ @@ -724,11 +738,11 @@ class NormalizedCoordinate(proto.Message): Normalized y coordinate. """ - x = proto.Field( + x: float = proto.Field( proto.DOUBLE, number=1, ) - y = proto.Field( + y: float = proto.Field( proto.DOUBLE, number=2, ) @@ -753,16 +767,16 @@ class Image(proto.Message): value greater than ``0.0``. """ - uri = proto.Field( + uri: str = proto.Field( proto.STRING, number=1, ) - resolution = proto.Field( + resolution: "Overlay.NormalizedCoordinate" = proto.Field( proto.MESSAGE, number=2, message="Overlay.NormalizedCoordinate", ) - alpha = proto.Field( + alpha: float = proto.Field( proto.DOUBLE, number=3, ) @@ -783,12 +797,12 @@ class AnimationStatic(proto.Message): object, in seconds. Default: 0 """ - xy = proto.Field( + xy: "Overlay.NormalizedCoordinate" = proto.Field( proto.MESSAGE, number=1, message="Overlay.NormalizedCoordinate", ) - start_time_offset = proto.Field( + start_time_offset: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=2, message=duration_pb2.Duration, @@ -816,22 +830,22 @@ class AnimationFade(proto.Message): ``start_time_offset`` + 1s """ - fade_type = proto.Field( + fade_type: "Overlay.FadeType" = proto.Field( proto.ENUM, number=1, enum="Overlay.FadeType", ) - xy = proto.Field( + xy: "Overlay.NormalizedCoordinate" = proto.Field( proto.MESSAGE, number=2, message="Overlay.NormalizedCoordinate", ) - start_time_offset = proto.Field( + start_time_offset: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=3, message=duration_pb2.Duration, ) - end_time_offset = proto.Field( + end_time_offset: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=4, message=duration_pb2.Duration, @@ -848,7 +862,7 @@ class AnimationEnd(proto.Message): Default: 0 """ - start_time_offset = proto.Field( + start_time_offset: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=1, message=duration_pb2.Duration, @@ -879,31 +893,31 @@ class Animation(proto.Message): This field is a member of `oneof`_ ``animation_type``. """ - animation_static = proto.Field( + animation_static: "Overlay.AnimationStatic" = proto.Field( proto.MESSAGE, number=1, oneof="animation_type", message="Overlay.AnimationStatic", ) - animation_fade = proto.Field( + animation_fade: "Overlay.AnimationFade" = proto.Field( proto.MESSAGE, number=2, oneof="animation_type", message="Overlay.AnimationFade", ) - animation_end = proto.Field( + animation_end: "Overlay.AnimationEnd" = proto.Field( proto.MESSAGE, number=3, oneof="animation_type", message="Overlay.AnimationEnd", ) - image = proto.Field( + image: Image = proto.Field( proto.MESSAGE, number=1, message=Image, ) - animations = proto.RepeatedField( + animations: MutableSequence[Animation] = proto.RepeatedField( proto.MESSAGE, number=2, message=Animation, @@ -926,6 +940,8 @@ class PreprocessingConfig(proto.Message): Specify the video cropping configuration. pad (google.cloud.video.transcoder_v1.types.PreprocessingConfig.Pad): Specify the video pad filter configuration. + deinterlace (google.cloud.video.transcoder_v1.types.PreprocessingConfig.Deinterlace): + Specify the video deinterlace configuration. """ class Color(proto.Message): @@ -951,15 +967,15 @@ class Color(proto.Message): change. The default is 0. """ - saturation = proto.Field( + saturation: float = proto.Field( proto.DOUBLE, number=1, ) - contrast = proto.Field( + contrast: float = proto.Field( proto.DOUBLE, number=2, ) - brightness = proto.Field( + brightness: float = proto.Field( proto.DOUBLE, number=3, ) @@ -984,11 +1000,11 @@ class Denoise(proto.Message): - ``grain`` """ - strength = proto.Field( + strength: float = proto.Field( proto.DOUBLE, number=1, ) - tune = proto.Field( + tune: str = proto.Field( proto.STRING, number=2, ) @@ -1008,11 +1024,11 @@ class Deblock(proto.Message): Enable deblocker. The default is ``false``. """ - strength = proto.Field( + strength: float = proto.Field( proto.DOUBLE, number=1, ) - enabled = proto.Field( + enabled: bool = proto.Field( proto.BOOL, number=2, ) @@ -1047,15 +1063,15 @@ class Audio(proto.Message): **Note:** This field is not supported. """ - lufs = proto.Field( + lufs: float = proto.Field( proto.DOUBLE, number=1, ) - high_boost = proto.Field( + high_boost: bool = proto.Field( proto.BOOL, number=2, ) - low_boost = proto.Field( + low_boost: bool = proto.Field( proto.BOOL, number=3, ) @@ -1079,19 +1095,19 @@ class Crop(proto.Message): The default is 0. """ - top_pixels = proto.Field( + top_pixels: int = proto.Field( proto.INT32, number=1, ) - bottom_pixels = proto.Field( + bottom_pixels: int = proto.Field( proto.INT32, number=2, ) - left_pixels = proto.Field( + left_pixels: int = proto.Field( proto.INT32, number=3, ) - right_pixels = proto.Field( + right_pixels: int = proto.Field( proto.INT32, number=4, ) @@ -1116,53 +1132,170 @@ class Pad(proto.Message): default is 0. """ - top_pixels = proto.Field( + top_pixels: int = proto.Field( proto.INT32, number=1, ) - bottom_pixels = proto.Field( + bottom_pixels: int = proto.Field( proto.INT32, number=2, ) - left_pixels = proto.Field( + left_pixels: int = proto.Field( proto.INT32, number=3, ) - right_pixels = proto.Field( + right_pixels: int = proto.Field( proto.INT32, number=4, ) - color = proto.Field( + class Deinterlace(proto.Message): + r"""Deinterlace configuration for input video. + + This message has `oneof`_ fields (mutually exclusive fields). + For each oneof, at most one member field can be set at the same time. + Setting any member of the oneof automatically clears all other + members. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + yadif (google.cloud.video.transcoder_v1.types.PreprocessingConfig.Deinterlace.YadifConfig): + Specifies the Yet Another Deinterlacing + Filter Configuration. + + This field is a member of `oneof`_ ``deinterlacing_filter``. + bwdif (google.cloud.video.transcoder_v1.types.PreprocessingConfig.Deinterlace.BwdifConfig): + Specifies the Bob Weaver Deinterlacing Filter + Configuration. + + This field is a member of `oneof`_ ``deinterlacing_filter``. + """ + + class YadifConfig(proto.Message): + r"""Yet Another Deinterlacing Filter Configuration. + + Attributes: + mode (str): + Specifies the deinterlacing mode to adopt. The default is + ``send_frame``. Supported values: + + - ``send_frame``: Output one frame for each frame + - ``send_field``: Output one frame for each field + disable_spatial_interlacing (bool): + Disable spacial interlacing. The default is ``false``. + parity (str): + The picture field parity assumed for the input interlaced + video. The default is ``auto``. Supported values: + + - ``tff``: Assume the top field is first + - ``bff``: Assume the bottom field is first + - ``auto``: Enable automatic detection of field parity + deinterlace_all_frames (bool): + Deinterlace all frames rather than just the frames + identified as interlaced. The default is ``false``. + """ + + mode: str = proto.Field( + proto.STRING, + number=1, + ) + disable_spatial_interlacing: bool = proto.Field( + proto.BOOL, + number=2, + ) + parity: str = proto.Field( + proto.STRING, + number=3, + ) + deinterlace_all_frames: bool = proto.Field( + proto.BOOL, + number=4, + ) + + class BwdifConfig(proto.Message): + r"""Bob Weaver Deinterlacing Filter Configuration. + + Attributes: + mode (str): + Specifies the deinterlacing mode to adopt. The default is + ``send_frame``. Supported values: + + - ``send_frame``: Output one frame for each frame + - ``send_field``: Output one frame for each field + parity (str): + The picture field parity assumed for the input interlaced + video. The default is ``auto``. Supported values: + + - ``tff``: Assume the top field is first + - ``bff``: Assume the bottom field is first + - ``auto``: Enable automatic detection of field parity + deinterlace_all_frames (bool): + Deinterlace all frames rather than just the frames + identified as interlaced. The default is ``false``. + """ + + mode: str = proto.Field( + proto.STRING, + number=1, + ) + parity: str = proto.Field( + proto.STRING, + number=2, + ) + deinterlace_all_frames: bool = proto.Field( + proto.BOOL, + number=3, + ) + + yadif: "PreprocessingConfig.Deinterlace.YadifConfig" = proto.Field( + proto.MESSAGE, + number=1, + oneof="deinterlacing_filter", + message="PreprocessingConfig.Deinterlace.YadifConfig", + ) + bwdif: "PreprocessingConfig.Deinterlace.BwdifConfig" = proto.Field( + proto.MESSAGE, + number=2, + oneof="deinterlacing_filter", + message="PreprocessingConfig.Deinterlace.BwdifConfig", + ) + + color: Color = proto.Field( proto.MESSAGE, number=1, message=Color, ) - denoise = proto.Field( + denoise: Denoise = proto.Field( proto.MESSAGE, number=2, message=Denoise, ) - deblock = proto.Field( + deblock: Deblock = proto.Field( proto.MESSAGE, number=3, message=Deblock, ) - audio = proto.Field( + audio: Audio = proto.Field( proto.MESSAGE, number=4, message=Audio, ) - crop = proto.Field( + crop: Crop = proto.Field( proto.MESSAGE, number=5, message=Crop, ) - pad = proto.Field( + pad: Pad = proto.Field( proto.MESSAGE, number=6, message=Pad, ) + deinterlace: Deinterlace = proto.Field( + proto.MESSAGE, + number=7, + message=Deinterlace, + ) class VideoStream(proto.Message): @@ -1207,12 +1340,24 @@ class H264CodecSettings(proto.Message): adjusted to match the specified height and input aspect ratio. If both are omitted, the input width is used. + For portrait videos that contain horizontal ASR + and rotation metadata, provide the width, in + pixels, per the horizontal ASR. The API + calculates the height per the horizontal ASR. + The API detects any rotation metadata and swaps + the requested height and width for the output. height_pixels (int): The height of the video in pixels. Must be an even integer. When not specified, the height is adjusted to match the specified width and input aspect ratio. If both are omitted, the input height is used. + For portrait videos that contain horizontal ASR + and rotation metadata, provide the height, in + pixels, per the horizontal ASR. The API + calculates the width per the horizontal ASR. The + API detects any rotation metadata and swaps the + requested height and width for the output. frame_rate (float): Required. The target video frame rate in frames per second (FPS). Must be less than or equal to 120. Will default to @@ -1327,86 +1472,86 @@ class H264CodecSettings(proto.Message): ``H264CodecSettings`` message. """ - width_pixels = proto.Field( + width_pixels: int = proto.Field( proto.INT32, number=1, ) - height_pixels = proto.Field( + height_pixels: int = proto.Field( proto.INT32, number=2, ) - frame_rate = proto.Field( + frame_rate: float = proto.Field( proto.DOUBLE, number=3, ) - bitrate_bps = proto.Field( + bitrate_bps: int = proto.Field( proto.INT32, number=4, ) - pixel_format = proto.Field( + pixel_format: str = proto.Field( proto.STRING, number=5, ) - rate_control_mode = proto.Field( + rate_control_mode: str = proto.Field( proto.STRING, number=6, ) - crf_level = proto.Field( + crf_level: int = proto.Field( proto.INT32, number=7, ) - allow_open_gop = proto.Field( + allow_open_gop: bool = proto.Field( proto.BOOL, number=8, ) - gop_frame_count = proto.Field( + gop_frame_count: int = proto.Field( proto.INT32, number=9, oneof="gop_mode", ) - gop_duration = proto.Field( + gop_duration: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=10, oneof="gop_mode", message=duration_pb2.Duration, ) - enable_two_pass = proto.Field( + enable_two_pass: bool = proto.Field( proto.BOOL, number=11, ) - vbv_size_bits = proto.Field( + vbv_size_bits: int = proto.Field( proto.INT32, number=12, ) - vbv_fullness_bits = proto.Field( + vbv_fullness_bits: int = proto.Field( proto.INT32, number=13, ) - entropy_coder = proto.Field( + entropy_coder: str = proto.Field( proto.STRING, number=14, ) - b_pyramid = proto.Field( + b_pyramid: bool = proto.Field( proto.BOOL, number=15, ) - b_frame_count = proto.Field( + b_frame_count: int = proto.Field( proto.INT32, number=16, ) - aq_strength = proto.Field( + aq_strength: float = proto.Field( proto.DOUBLE, number=17, ) - profile = proto.Field( + profile: str = proto.Field( proto.STRING, number=18, ) - tune = proto.Field( + tune: str = proto.Field( proto.STRING, number=19, ) - preset = proto.Field( + preset: str = proto.Field( proto.STRING, number=20, ) @@ -1428,12 +1573,24 @@ class H265CodecSettings(proto.Message): adjusted to match the specified height and input aspect ratio. If both are omitted, the input width is used. + For portrait videos that contain horizontal ASR + and rotation metadata, provide the width, in + pixels, per the horizontal ASR. The API + calculates the height per the horizontal ASR. + The API detects any rotation metadata and swaps + the requested height and width for the output. height_pixels (int): The height of the video in pixels. Must be an even integer. When not specified, the height is adjusted to match the specified width and input aspect ratio. If both are omitted, the input height is used. + For portrait videos that contain horizontal ASR + and rotation metadata, provide the height, in + pixels, per the horizontal ASR. The API + calculates the width per the horizontal ASR. The + API detects any rotation metadata and swaps the + requested height and width for the output. frame_rate (float): Required. The target video frame rate in frames per second (FPS). Must be less than or equal to 120. Will default to @@ -1561,82 +1718,82 @@ class H265CodecSettings(proto.Message): ``H265CodecSettings`` message. """ - width_pixels = proto.Field( + width_pixels: int = proto.Field( proto.INT32, number=1, ) - height_pixels = proto.Field( + height_pixels: int = proto.Field( proto.INT32, number=2, ) - frame_rate = proto.Field( + frame_rate: float = proto.Field( proto.DOUBLE, number=3, ) - bitrate_bps = proto.Field( + bitrate_bps: int = proto.Field( proto.INT32, number=4, ) - pixel_format = proto.Field( + pixel_format: str = proto.Field( proto.STRING, number=5, ) - rate_control_mode = proto.Field( + rate_control_mode: str = proto.Field( proto.STRING, number=6, ) - crf_level = proto.Field( + crf_level: int = proto.Field( proto.INT32, number=7, ) - allow_open_gop = proto.Field( + allow_open_gop: bool = proto.Field( proto.BOOL, number=8, ) - gop_frame_count = proto.Field( + gop_frame_count: int = proto.Field( proto.INT32, number=9, oneof="gop_mode", ) - gop_duration = proto.Field( + gop_duration: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=10, oneof="gop_mode", message=duration_pb2.Duration, ) - enable_two_pass = proto.Field( + enable_two_pass: bool = proto.Field( proto.BOOL, number=11, ) - vbv_size_bits = proto.Field( + vbv_size_bits: int = proto.Field( proto.INT32, number=12, ) - vbv_fullness_bits = proto.Field( + vbv_fullness_bits: int = proto.Field( proto.INT32, number=13, ) - b_pyramid = proto.Field( + b_pyramid: bool = proto.Field( proto.BOOL, number=14, ) - b_frame_count = proto.Field( + b_frame_count: int = proto.Field( proto.INT32, number=15, ) - aq_strength = proto.Field( + aq_strength: float = proto.Field( proto.DOUBLE, number=16, ) - profile = proto.Field( + profile: str = proto.Field( proto.STRING, number=17, ) - tune = proto.Field( + tune: str = proto.Field( proto.STRING, number=18, ) - preset = proto.Field( + preset: str = proto.Field( proto.STRING, number=19, ) @@ -1658,12 +1815,24 @@ class Vp9CodecSettings(proto.Message): adjusted to match the specified height and input aspect ratio. If both are omitted, the input width is used. + For portrait videos that contain horizontal ASR + and rotation metadata, provide the width, in + pixels, per the horizontal ASR. The API + calculates the height per the horizontal ASR. + The API detects any rotation metadata and swaps + the requested height and width for the output. height_pixels (int): The height of the video in pixels. Must be an even integer. When not specified, the height is adjusted to match the specified width and input aspect ratio. If both are omitted, the input height is used. + For portrait videos that contain horizontal ASR + and rotation metadata, provide the height, in + pixels, per the horizontal ASR. The API + calculates the width per the horizontal ASR. The + API detects any rotation metadata and swaps the + requested height and width for the output. frame_rate (float): Required. The target video frame rate in frames per second (FPS). Must be less than or equal to 120. Will default to @@ -1732,63 +1901,63 @@ class Vp9CodecSettings(proto.Message): ``Vp9CodecSettings`` message. """ - width_pixels = proto.Field( + width_pixels: int = proto.Field( proto.INT32, number=1, ) - height_pixels = proto.Field( + height_pixels: int = proto.Field( proto.INT32, number=2, ) - frame_rate = proto.Field( + frame_rate: float = proto.Field( proto.DOUBLE, number=3, ) - bitrate_bps = proto.Field( + bitrate_bps: int = proto.Field( proto.INT32, number=4, ) - pixel_format = proto.Field( + pixel_format: str = proto.Field( proto.STRING, number=5, ) - rate_control_mode = proto.Field( + rate_control_mode: str = proto.Field( proto.STRING, number=6, ) - crf_level = proto.Field( + crf_level: int = proto.Field( proto.INT32, number=7, ) - gop_frame_count = proto.Field( + gop_frame_count: int = proto.Field( proto.INT32, number=8, oneof="gop_mode", ) - gop_duration = proto.Field( + gop_duration: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=9, oneof="gop_mode", message=duration_pb2.Duration, ) - profile = proto.Field( + profile: str = proto.Field( proto.STRING, number=10, ) - h264 = proto.Field( + h264: H264CodecSettings = proto.Field( proto.MESSAGE, number=1, oneof="codec_settings", message=H264CodecSettings, ) - h265 = proto.Field( + h265: H265CodecSettings = proto.Field( proto.MESSAGE, number=2, oneof="codec_settings", message=H265CodecSettings, ) - vp9 = proto.Field( + vp9: Vp9CodecSettings = proto.Field( proto.MESSAGE, number=3, oneof="codec_settings", @@ -1817,7 +1986,7 @@ class AudioStream(proto.Message): channel_count (int): Number of audio channels. Must be between 1 and 6. The default is 2. - channel_layout (Sequence[str]): + channel_layout (MutableSequence[str]): A list of channel names specifying layout of the audio channels. This only affects the metadata embedded in the container headers, if supported by the specified format. The @@ -1831,7 +2000,7 @@ class AudioStream(proto.Message): - ``sr`` - Side right channel - ``fc`` - Front center channel - ``lfe`` - Low frequency - mapping_ (Sequence[google.cloud.video.transcoder_v1.types.AudioStream.AudioMapping]): + mapping_ (MutableSequence[google.cloud.video.transcoder_v1.types.AudioStream.AudioMapping]): The mapping for the ``Job.edit_list`` atoms with audio ``EditAtom.inputs``. sample_rate_hertz (int): @@ -1864,53 +2033,53 @@ class AudioMapping(proto.Message): default is 0. """ - atom_key = proto.Field( + atom_key: str = proto.Field( proto.STRING, number=1, ) - input_key = proto.Field( + input_key: str = proto.Field( proto.STRING, number=2, ) - input_track = proto.Field( + input_track: int = proto.Field( proto.INT32, number=3, ) - input_channel = proto.Field( + input_channel: int = proto.Field( proto.INT32, number=4, ) - output_channel = proto.Field( + output_channel: int = proto.Field( proto.INT32, number=5, ) - gain_db = proto.Field( + gain_db: float = proto.Field( proto.DOUBLE, number=6, ) - codec = proto.Field( + codec: str = proto.Field( proto.STRING, number=1, ) - bitrate_bps = proto.Field( + bitrate_bps: int = proto.Field( proto.INT32, number=2, ) - channel_count = proto.Field( + channel_count: int = proto.Field( proto.INT32, number=3, ) - channel_layout = proto.RepeatedField( + channel_layout: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=4, ) - mapping_ = proto.RepeatedField( + mapping_: MutableSequence[AudioMapping] = proto.RepeatedField( proto.MESSAGE, number=5, message=AudioMapping, ) - sample_rate_hertz = proto.Field( + sample_rate_hertz: int = proto.Field( proto.INT32, number=6, ) @@ -1931,7 +2100,7 @@ class TextStream(proto.Message): - ``cea608`` - ``cea708`` - ``webvtt`` - mapping_ (Sequence[google.cloud.video.transcoder_v1.types.TextStream.TextMapping]): + mapping_ (MutableSequence[google.cloud.video.transcoder_v1.types.TextStream.TextMapping]): The mapping for the ``Job.edit_list`` atoms with text ``EditAtom.inputs``. """ @@ -1951,24 +2120,24 @@ class TextMapping(proto.Message): in the input file. """ - atom_key = proto.Field( + atom_key: str = proto.Field( proto.STRING, number=1, ) - input_key = proto.Field( + input_key: str = proto.Field( proto.STRING, number=2, ) - input_track = proto.Field( + input_track: int = proto.Field( proto.INT32, number=3, ) - codec = proto.Field( + codec: str = proto.Field( proto.STRING, number=1, ) - mapping_ = proto.RepeatedField( + mapping_: MutableSequence[TextMapping] = proto.RepeatedField( proto.MESSAGE, number=3, message=TextMapping, @@ -1990,12 +2159,12 @@ class SegmentSettings(proto.Message): ``false``. """ - segment_duration = proto.Field( + segment_duration: duration_pb2.Duration = proto.Field( proto.MESSAGE, number=1, message=duration_pb2.Duration, ) - individual_segments = proto.Field( + individual_segments: bool = proto.Field( proto.BOOL, number=3, ) diff --git a/google/cloud/video/transcoder_v1/types/services.py b/google/cloud/video/transcoder_v1/types/services.py index 3ddd5e0..c7b864f 100644 --- a/google/cloud/video/transcoder_v1/types/services.py +++ b/google/cloud/video/transcoder_v1/types/services.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from typing import MutableMapping, MutableSequence + import proto # type: ignore from google.cloud.video.transcoder_v1.types import resources @@ -46,11 +48,11 @@ class CreateJobRequest(proto.Message): job. """ - parent = proto.Field( + parent: str = proto.Field( proto.STRING, number=1, ) - job = proto.Field( + job: resources.Job = proto.Field( proto.MESSAGE, number=2, message=resources.Job, @@ -79,23 +81,23 @@ class ListJobsRequest(proto.Message): https://google.aip.dev/132#ordering. """ - parent = proto.Field( + parent: str = proto.Field( proto.STRING, number=1, ) - page_size = proto.Field( + page_size: int = proto.Field( proto.INT32, number=2, ) - page_token = proto.Field( + page_token: str = proto.Field( proto.STRING, number=3, ) - filter = proto.Field( + filter: str = proto.Field( proto.STRING, number=4, ) - order_by = proto.Field( + order_by: str = proto.Field( proto.STRING, number=5, ) @@ -110,7 +112,7 @@ class GetJobRequest(proto.Message): ``projects/{project}/locations/{location}/jobs/{job}`` """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) @@ -129,11 +131,11 @@ class DeleteJobRequest(proto.Message): on the server. """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) - allow_missing = proto.Field( + allow_missing: bool = proto.Field( proto.BOOL, number=2, ) @@ -143,11 +145,11 @@ class ListJobsResponse(proto.Message): r"""Response message for ``TranscoderService.ListJobs``. Attributes: - jobs (Sequence[google.cloud.video.transcoder_v1.types.Job]): + jobs (MutableSequence[google.cloud.video.transcoder_v1.types.Job]): List of jobs in the specified region. next_page_token (str): The pagination token. - unreachable (Sequence[str]): + unreachable (MutableSequence[str]): List of regions that could not be reached. """ @@ -155,16 +157,16 @@ class ListJobsResponse(proto.Message): def raw_page(self): return self - jobs = proto.RepeatedField( + jobs: MutableSequence[resources.Job] = proto.RepeatedField( proto.MESSAGE, number=1, message=resources.Job, ) - next_page_token = proto.Field( + next_page_token: str = proto.Field( proto.STRING, number=2, ) - unreachable = proto.RepeatedField( + unreachable: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) @@ -190,16 +192,16 @@ class CreateJobTemplateRequest(proto.Message): ``[a-zA-Z][a-zA-Z0-9_-]*``. """ - parent = proto.Field( + parent: str = proto.Field( proto.STRING, number=1, ) - job_template = proto.Field( + job_template: resources.JobTemplate = proto.Field( proto.MESSAGE, number=2, message=resources.JobTemplate, ) - job_template_id = proto.Field( + job_template_id: str = proto.Field( proto.STRING, number=3, ) @@ -227,23 +229,23 @@ class ListJobTemplatesRequest(proto.Message): https://google.aip.dev/132#ordering. """ - parent = proto.Field( + parent: str = proto.Field( proto.STRING, number=1, ) - page_size = proto.Field( + page_size: int = proto.Field( proto.INT32, number=2, ) - page_token = proto.Field( + page_token: str = proto.Field( proto.STRING, number=3, ) - filter = proto.Field( + filter: str = proto.Field( proto.STRING, number=4, ) - order_by = proto.Field( + order_by: str = proto.Field( proto.STRING, number=5, ) @@ -258,7 +260,7 @@ class GetJobTemplateRequest(proto.Message): ``projects/{project}/locations/{location}/jobTemplates/{job_template}`` """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) @@ -277,11 +279,11 @@ class DeleteJobTemplateRequest(proto.Message): will be taken on the server. """ - name = proto.Field( + name: str = proto.Field( proto.STRING, number=1, ) - allow_missing = proto.Field( + allow_missing: bool = proto.Field( proto.BOOL, number=2, ) @@ -291,12 +293,12 @@ class ListJobTemplatesResponse(proto.Message): r"""Response message for ``TranscoderService.ListJobTemplates``. Attributes: - job_templates (Sequence[google.cloud.video.transcoder_v1.types.JobTemplate]): + job_templates (MutableSequence[google.cloud.video.transcoder_v1.types.JobTemplate]): List of job templates in the specified region. next_page_token (str): The pagination token. - unreachable (Sequence[str]): + unreachable (MutableSequence[str]): List of regions that could not be reached. """ @@ -304,16 +306,16 @@ class ListJobTemplatesResponse(proto.Message): def raw_page(self): return self - job_templates = proto.RepeatedField( + job_templates: MutableSequence[resources.JobTemplate] = proto.RepeatedField( proto.MESSAGE, number=1, message=resources.JobTemplate, ) - next_page_token = proto.Field( + next_page_token: str = proto.Field( proto.STRING, number=2, ) - unreachable = proto.RepeatedField( + unreachable: MutableSequence[str] = proto.RepeatedField( proto.STRING, number=3, ) diff --git a/owlbot.py b/owlbot.py new file mode 100644 index 0000000..ce738f0 --- /dev/null +++ b/owlbot.py @@ -0,0 +1,56 @@ +# 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. + +import json +from pathlib import Path +import shutil + +import synthtool as s +import synthtool.gcp as gcp +from synthtool.languages import python + +# ---------------------------------------------------------------------------- +# Copy the generated client from the owl-bot staging directory +# ---------------------------------------------------------------------------- + +clean_up_generated_samples = True + +# 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): + if clean_up_generated_samples: + shutil.rmtree("samples/generated_samples", ignore_errors=True) + clean_up_generated_samples = False + s.move([library], excludes=["**/gapic_version.py"]) +s.remove_staging_dirs() + +# ---------------------------------------------------------------------------- +# Add templated files +# ---------------------------------------------------------------------------- + +templated_files = gcp.CommonTemplates().py_library( + cov_level=100, + microgenerator=True, + versions=gcp.common.detect_versions(path="./google", default_first=True), +) +s.move(templated_files, excludes=[".coveragerc", ".github/release-please.yml"]) + +python.py_samples(skip_readmes=True) + +# 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..0e767cf --- /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/video/transcoder/gapic_version.py", + { + "type": "json", + "path": "samples/generated_samples/snippet_metadata_google.cloud.video.transcoder.v1.json", + "jsonpath": "$.clientLibrary.version" + } + ] + } + }, + "release-type": "python", + "plugins": [ + { + "type": "sentence-case" + } + ], + "initial-version": "0.1.0" +} diff --git a/samples/generated_samples/snippet_metadata_transcoder_v1.json b/samples/generated_samples/snippet_metadata_google.cloud.video.transcoder.v1.json similarity index 99% rename from samples/generated_samples/snippet_metadata_transcoder_v1.json rename to samples/generated_samples/snippet_metadata_google.cloud.video.transcoder.v1.json index 128c112..2c7572e 100644 --- a/samples/generated_samples/snippet_metadata_transcoder_v1.json +++ b/samples/generated_samples/snippet_metadata_google.cloud.video.transcoder.v1.json @@ -7,7 +7,8 @@ } ], "language": "PYTHON", - "name": "google-cloud-video-transcoder" + "name": "google-cloud-video-transcoder", + "version": "0.1.0" }, "snippets": [ { diff --git a/setup.py b/setup.py index ee196b9..967ae10 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- - -# Copyright (C) 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. @@ -14,13 +13,36 @@ # See the License for the specific language governing permissions and # limitations under the License. # - import io import os import setuptools # type: ignore -version = "1.4.3" +package_root = os.path.abspath(os.path.dirname(__file__)) + +name = "google-cloud-video-transcoder" + + +description = "Google Cloud Video Transcoder API client library" + +version = {} +with open( + os.path.join(package_root, "google/cloud/video/transcoder/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.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", +] +url = "https://github.com/googleapis/python-video-transcoder" package_root = os.path.abspath(os.path.dirname(__file__)) @@ -28,35 +50,43 @@ with io.open(readme_filename, encoding="utf-8") as readme_file: readme = readme_file.read() +packages = [ + package + for package in setuptools.PEP420PackageFinder.find() + if package.startswith("google") +] + +namespaces = ["google"] +if "google.cloud" in packages: + namespaces.append("google.cloud") setuptools.setup( - name="google-cloud-video-transcoder", + name=name, version=version, + description=description, long_description=readme, author="Google LLC", author_email="googleapis-packages@google.com", license="Apache 2.0", - url="https://github.com/googleapis/python-video-transcoder", - packages=setuptools.PEP420PackageFinder.find(), - namespace_packages=("google", "google.cloud"), - platforms="Posix; MacOS X; Windows", - include_package_data=True, - install_requires=( - "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.*", - "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", - ), - python_requires=">=3.7", + url=url, classifiers=[ - "Development Status :: 5 - Production/Stable", + release_status, "Intended Audience :: Developers", - "Operating System :: OS Independent", + "License :: OSI Approved :: Apache Software License", + "Programming Language :: Python", + "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", + "Operating System :: OS Independent", "Topic :: Internet", - "Topic :: Software Development :: Libraries :: Python Modules", ], + platforms="Posix; MacOS X; Windows", + packages=packages, + python_requires=">=3.7", + namespace_packages=namespaces, + install_requires=dependencies, + include_package_data=True, zip_safe=False, ) diff --git a/testing/constraints-3.10.txt b/testing/constraints-3.10.txt index e69de29..ed7f9ae 100644 --- a/testing/constraints-3.10.txt +++ b/testing/constraints-3.10.txt @@ -0,0 +1,6 @@ +# -*- 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 diff --git a/testing/constraints-3.11.txt b/testing/constraints-3.11.txt index e69de29..ed7f9ae 100644 --- a/testing/constraints-3.11.txt +++ b/testing/constraints-3.11.txt @@ -0,0 +1,6 @@ +# -*- 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 diff --git a/testing/constraints-3.7.txt b/testing/constraints-3.7.txt index 5dcaa6f..6f3158c 100644 --- a/testing/constraints-3.7.txt +++ b/testing/constraints-3.7.txt @@ -1,10 +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. +# 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 +# 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 protobuf==3.19.5 diff --git a/testing/constraints-3.8.txt b/testing/constraints-3.8.txt index e69de29..ed7f9ae 100644 --- a/testing/constraints-3.8.txt +++ b/testing/constraints-3.8.txt @@ -0,0 +1,6 @@ +# -*- 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 diff --git a/testing/constraints-3.9.txt b/testing/constraints-3.9.txt index e69de29..ed7f9ae 100644 --- a/testing/constraints-3.9.txt +++ b/testing/constraints-3.9.txt @@ -0,0 +1,6 @@ +# -*- 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