Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-google-api-core for openSUSE:Factory checked in at 2023-12-17 21:32:24 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-google-api-core (Old) and /work/SRC/openSUSE:Factory/.python-google-api-core.new.25432 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-google-api-core" Sun Dec 17 21:32:24 2023 rev:29 rq:1133662 version:2.15.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-google-api-core/python-google-api-core.changes 2023-12-07 19:13:19.685727905 +0100 +++ /work/SRC/openSUSE:Factory/.python-google-api-core.new.25432/python-google-api-core.changes 2023-12-17 21:34:47.778972276 +0100 @@ -1,0 +2,13 @@ +Sat Dec 16 19:25:47 UTC 2023 - Dirk Müller <dmuel...@suse.com> + +- update to 2.15.0: + * Add support for Python 3.12 + * Add type annotations to wrapped grpc calls + * Add universe_domain argument to ClientOptions + * Introduce compatibility with native namespace packages + * Fix regression in `bidi` causing `Thread- + ConsumeBidirectionalStream caught unexpected exception and + will exit` (#562) + * Replace deprecated `datetime.datetime.utcnow()` + +------------------------------------------------------------------- Old: ---- google-api-core-2.14.0.tar.gz New: ---- google-api-core-2.15.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-google-api-core.spec ++++++ --- /var/tmp/diff_new_pack.yW2T3j/_old 2023-12-17 21:34:48.250989426 +0100 +++ /var/tmp/diff_new_pack.yW2T3j/_new 2023-12-17 21:34:48.250989426 +0100 @@ -24,10 +24,9 @@ %define psuffix %{nil} %bcond_with test %endif -%define skip_python2 1 %{?sle15_python_module_pythons} Name: python-google-api-core -Version: 2.14.0 +Version: 2.15.0 Release: 0 Summary: Google API client core library License: Apache-2.0 @@ -38,7 +37,6 @@ BuildRequires: %{python_module google-auth >= 2.14.1} BuildRequires: %{python_module googleapis-common-protos >= 1.53.0} BuildRequires: %{python_module grpcio >= 1.33.2} -BuildRequires: %{python_module grpcio-gcp >= 0.2.2} BuildRequires: %{python_module grpcio-status >= 1.33.2} BuildRequires: %{python_module pip} BuildRequires: %{python_module protobuf >= 3.19.5 with %python-protobuf < 5.0.0.dev0} @@ -64,7 +62,6 @@ Requires: python-requests >= 2.18.0 Requires: python-setuptools >= 40.3.0 Requires: (python-protobuf >= 3.19.5 with python-protobuf < 5.0.0.dev0) -Suggests: python-grpcio-gcp >= 0.2.2 BuildArch: noarch %python_subpackages @@ -95,7 +92,6 @@ %license LICENSE %doc README.rst %{python_sitelib}/google/api_core -%{python_sitelib}/google_api_core-%{version}*-nspkg.pth %{python_sitelib}/google_api_core-%{version}*-info %endif ++++++ google-api-core-2.14.0.tar.gz -> google-api-core-2.15.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/PKG-INFO new/google-api-core-2.15.0/PKG-INFO --- old/google-api-core-2.14.0/PKG-INFO 2023-11-10 00:16:17.662312300 +0100 +++ new/google-api-core-2.15.0/PKG-INFO 2023-12-07 17:38:24.526273500 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: google-api-core -Version: 2.14.0 +Version: 2.15.0 Summary: Google API client core library Home-page: https://github.com/googleapis/python-api-core Author: Google LLC @@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 Classifier: Operating System :: OS Independent Classifier: Topic :: Internet Requires-Python: >=3.7 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/google/__init__.py new/google-api-core-2.15.0/google/__init__.py --- old/google-api-core-2.14.0/google/__init__.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/google/__init__.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,25 +0,0 @@ -# Copyright 2016 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. - -"""Google namespace package.""" - -try: - import pkg_resources - - pkg_resources.declare_namespace(__name__) -except ImportError: - import pkgutil - - # See: https://github.com/python/mypy/issues/1422 - __path__ = pkgutil.extend_path(__path__, __name__) # type: ignore diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/google/api_core/bidi.py new/google-api-core-2.15.0/google/api_core/bidi.py --- old/google-api-core-2.14.0/google/api_core/bidi.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/google/api_core/bidi.py 2023-12-07 17:36:01.000000000 +0100 @@ -91,8 +91,9 @@ def _is_active(self): # Note: there is a possibility that this starts *before* the call # property is set. So we have to check if self.call is set before - # seeing if it's active. - return self.call is not None and self.call.is_active() + # seeing if it's active. We need to return True if self.call is None. + # See https://github.com/googleapis/python-api-core/issues/560. + return self.call is None or self.call.is_active() def __iter__(self): if self._initial_request is not None: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/google/api_core/client_options.py new/google-api-core-2.15.0/google/api_core/client_options.py --- old/google-api-core-2.14.0/google/api_core/client_options.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/google/api_core/client_options.py 2023-12-07 17:36:01.000000000 +0100 @@ -75,6 +75,11 @@ authentication flows. Audience is typically a resource identifier. If not set, the service endpoint value will be used as a default. An example of a valid ``api_audience`` is: "https://language.googleapis.com". + universe_domain (Optional[str]): The desired universe domain. This must match + the one in credentials. If not set, the default universe domain is + `googleapis.com`. If both `api_endpoint` and `universe_domain` are set, + then `api_endpoint` is used as the service endpoint. If `api_endpoint` is + not specified, the format will be `{service}.{universe_domain}`. Raises: ValueError: If both ``client_cert_source`` and ``client_encrypted_cert_source`` @@ -91,6 +96,7 @@ scopes=None, api_key=None, api_audience=None, + universe_domain=None, ): if client_cert_source and client_encrypted_cert_source: raise ValueError( @@ -106,6 +112,7 @@ self.scopes = scopes self.api_key = api_key self.api_audience = api_audience + self.universe_domain = universe_domain def __repr__(self): return "ClientOptions: " + repr(self.__dict__) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/google/api_core/datetime_helpers.py new/google-api-core-2.15.0/google/api_core/datetime_helpers.py --- old/google-api-core-2.14.0/google/api_core/datetime_helpers.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/google/api_core/datetime_helpers.py 2023-12-07 17:36:01.000000000 +0100 @@ -42,7 +42,7 @@ def utcnow(): """A :meth:`datetime.datetime.utcnow()` alias to allow mocking in tests.""" - return datetime.datetime.utcnow() + return datetime.datetime.now(tz=datetime.timezone.utc).replace(tzinfo=None) def to_milliseconds(value): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/google/api_core/grpc_helpers.py new/google-api-core-2.15.0/google/api_core/grpc_helpers.py --- old/google-api-core-2.14.0/google/api_core/grpc_helpers.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/google/api_core/grpc_helpers.py 2023-12-07 17:36:01.000000000 +0100 @@ -13,6 +13,7 @@ # limitations under the License. """Helpers for :mod:`grpc`.""" +from typing import Generic, TypeVar, Iterator import collections import functools @@ -54,6 +55,9 @@ _LOGGER = logging.getLogger(__name__) +# denotes the proto response type for grpc calls +P = TypeVar("P") + def _patch_callable_name(callable_): """Fix-up gRPC callable attributes. @@ -79,7 +83,7 @@ return error_remapped_callable -class _StreamingResponseIterator(grpc.Call): +class _StreamingResponseIterator(Generic[P], grpc.Call): def __init__(self, wrapped, prefetch_first_result=True): self._wrapped = wrapped @@ -97,11 +101,11 @@ # ignore stop iteration at this time. This should be handled outside of retry. pass - def __iter__(self): + def __iter__(self) -> Iterator[P]: """This iterator is also an iterable that returns itself.""" return self - def __next__(self): + def __next__(self) -> P: """Get the next response from the stream. Returns: @@ -144,6 +148,10 @@ return self._wrapped.trailing_metadata() +# public type alias denoting the return type of streaming gapic calls +GrpcStream = _StreamingResponseIterator[P] + + def _wrap_stream_errors(callable_): """Wrap errors for Unary-Stream and Stream-Stream gRPC callables. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/google/api_core/grpc_helpers_async.py new/google-api-core-2.15.0/google/api_core/grpc_helpers_async.py --- old/google-api-core-2.14.0/google/api_core/grpc_helpers_async.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/google/api_core/grpc_helpers_async.py 2023-12-07 17:36:01.000000000 +0100 @@ -21,11 +21,15 @@ import asyncio import functools +from typing import Generic, Iterator, AsyncGenerator, TypeVar + import grpc from grpc import aio from google.api_core import exceptions, grpc_helpers +# denotes the proto response type for grpc calls +P = TypeVar("P") # NOTE(lidiz) Alternatively, we can hack "__getattribute__" to perform # automatic patching for us. But that means the overhead of creating an @@ -75,8 +79,8 @@ raise exceptions.from_grpc_error(rpc_error) from rpc_error -class _WrappedUnaryResponseMixin(_WrappedCall): - def __await__(self): +class _WrappedUnaryResponseMixin(Generic[P], _WrappedCall): + def __await__(self) -> Iterator[P]: try: response = yield from self._call.__await__() return response @@ -84,17 +88,17 @@ raise exceptions.from_grpc_error(rpc_error) from rpc_error -class _WrappedStreamResponseMixin(_WrappedCall): +class _WrappedStreamResponseMixin(Generic[P], _WrappedCall): def __init__(self): self._wrapped_async_generator = None - async def read(self): + async def read(self) -> P: try: return await self._call.read() except grpc.RpcError as rpc_error: raise exceptions.from_grpc_error(rpc_error) from rpc_error - async def _wrapped_aiter(self): + async def _wrapped_aiter(self) -> AsyncGenerator[P, None]: try: # NOTE(lidiz) coverage doesn't understand the exception raised from # __anext__ method. It is covered by test case: @@ -104,7 +108,7 @@ except grpc.RpcError as rpc_error: raise exceptions.from_grpc_error(rpc_error) from rpc_error - def __aiter__(self): + def __aiter__(self) -> AsyncGenerator[P, None]: if not self._wrapped_async_generator: self._wrapped_async_generator = self._wrapped_aiter() return self._wrapped_async_generator @@ -127,26 +131,32 @@ # NOTE(lidiz) Implementing each individual class separately, so we don't # expose any API that should not be seen. E.g., __aiter__ in unary-unary # RPC, or __await__ in stream-stream RPC. -class _WrappedUnaryUnaryCall(_WrappedUnaryResponseMixin, aio.UnaryUnaryCall): +class _WrappedUnaryUnaryCall(_WrappedUnaryResponseMixin[P], aio.UnaryUnaryCall): """Wrapped UnaryUnaryCall to map exceptions.""" -class _WrappedUnaryStreamCall(_WrappedStreamResponseMixin, aio.UnaryStreamCall): +class _WrappedUnaryStreamCall(_WrappedStreamResponseMixin[P], aio.UnaryStreamCall): """Wrapped UnaryStreamCall to map exceptions.""" class _WrappedStreamUnaryCall( - _WrappedUnaryResponseMixin, _WrappedStreamRequestMixin, aio.StreamUnaryCall + _WrappedUnaryResponseMixin[P], _WrappedStreamRequestMixin, aio.StreamUnaryCall ): """Wrapped StreamUnaryCall to map exceptions.""" class _WrappedStreamStreamCall( - _WrappedStreamRequestMixin, _WrappedStreamResponseMixin, aio.StreamStreamCall + _WrappedStreamRequestMixin, _WrappedStreamResponseMixin[P], aio.StreamStreamCall ): """Wrapped StreamStreamCall to map exceptions.""" +# public type alias denoting the return type of async streaming gapic calls +GrpcAsyncStream = _WrappedStreamResponseMixin[P] +# public type alias denoting the return type of unary gapic calls +AwaitableGrpcCall = _WrappedUnaryResponseMixin[P] + + def _wrap_unary_errors(callable_): """Map errors for Unary-Unary async callables.""" grpc_helpers._patch_callable_name(callable_) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/google/api_core/version.py new/google-api-core-2.15.0/google/api_core/version.py --- old/google-api-core-2.14.0/google/api_core/version.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/google/api_core/version.py 2023-12-07 17:36:01.000000000 +0100 @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.14.0" +__version__ = "2.15.0" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/google_api_core.egg-info/PKG-INFO new/google-api-core-2.15.0/google_api_core.egg-info/PKG-INFO --- old/google-api-core-2.14.0/google_api_core.egg-info/PKG-INFO 2023-11-10 00:16:17.000000000 +0100 +++ new/google-api-core-2.15.0/google_api_core.egg-info/PKG-INFO 2023-12-07 17:38:24.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: google-api-core -Version: 2.14.0 +Version: 2.15.0 Summary: Google API client core library Home-page: https://github.com/googleapis/python-api-core Author: Google LLC @@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 Classifier: Operating System :: OS Independent Classifier: Topic :: Internet Requires-Python: >=3.7 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/google_api_core.egg-info/SOURCES.txt new/google-api-core-2.15.0/google_api_core.egg-info/SOURCES.txt --- old/google-api-core-2.14.0/google_api_core.egg-info/SOURCES.txt 2023-11-10 00:16:17.000000000 +0100 +++ new/google-api-core-2.15.0/google_api_core.egg-info/SOURCES.txt 2023-12-07 17:38:24.000000000 +0100 @@ -3,7 +3,6 @@ README.rst setup.cfg setup.py -google/__init__.py google/api_core/__init__.py google/api_core/bidi.py google/api_core/client_info.py @@ -52,7 +51,6 @@ google_api_core.egg-info/PKG-INFO google_api_core.egg-info/SOURCES.txt google_api_core.egg-info/dependency_links.txt -google_api_core.egg-info/namespace_packages.txt google_api_core.egg-info/not-zip-safe google_api_core.egg-info/requires.txt google_api_core.egg-info/top_level.txt @@ -79,6 +77,7 @@ tests/unit/test_grpc_helpers.py tests/unit/test_iam.py tests/unit/test_operation.py +tests/unit/test_packaging.py tests/unit/test_page_iterator.py tests/unit/test_path_template.py tests/unit/test_protobuf_helpers.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/google_api_core.egg-info/namespace_packages.txt new/google-api-core-2.15.0/google_api_core.egg-info/namespace_packages.txt --- old/google-api-core-2.14.0/google_api_core.egg-info/namespace_packages.txt 2023-11-10 00:16:17.000000000 +0100 +++ new/google-api-core-2.15.0/google_api_core.egg-info/namespace_packages.txt 1970-01-01 01:00:00.000000000 +0100 @@ -1 +0,0 @@ -google diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/setup.py new/google-api-core-2.15.0/setup.py --- old/google-api-core-2.14.0/setup.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/setup.py 2023-12-07 17:36:01.000000000 +0100 @@ -63,15 +63,11 @@ # Only include packages under the 'google' namespace. Do not include tests, # benchmarks, etc. packages = [ - package for package in setuptools.find_packages() if package.startswith("google") + package + for package in setuptools.find_namespace_packages() + if package.startswith("google") ] -# Determine which namespaces are needed. -namespaces = ["google"] -if "google.cloud" in packages: - namespaces.append("google.cloud") - - setuptools.setup( name=name, version=version, @@ -92,12 +88,12 @@ "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Operating System :: OS Independent", "Topic :: Internet", ], platforms="Posix; MacOS X; Windows", packages=packages, - namespace_packages=namespaces, install_requires=dependencies, extras_require=extras, python_requires=">=3.7", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/tests/asyncio/test_grpc_helpers_async.py new/google-api-core-2.15.0/tests/asyncio/test_grpc_helpers_async.py --- old/google-api-core-2.14.0/tests/asyncio/test_grpc_helpers_async.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/tests/asyncio/test_grpc_helpers_async.py 2023-12-07 17:36:01.000000000 +0100 @@ -266,6 +266,28 @@ wrap_unary_errors.assert_called_once_with(callable_) +def test_grpc_async_stream(): + """ + GrpcAsyncStream type should be both an AsyncIterator and a grpc.aio.Call. + """ + instance = grpc_helpers_async.GrpcAsyncStream[int]() + assert isinstance(instance, grpc.aio.Call) + # should implement __aiter__ and __anext__ + assert hasattr(instance, "__aiter__") + it = instance.__aiter__() + assert hasattr(it, "__anext__") + + +def test_awaitable_grpc_call(): + """ + AwaitableGrpcCall type should be an Awaitable and a grpc.aio.Call. + """ + instance = grpc_helpers_async.AwaitableGrpcCall[int]() + assert isinstance(instance, grpc.aio.Call) + # should implement __await__ + assert hasattr(instance, "__await__") + + @mock.patch("google.api_core.grpc_helpers_async._wrap_stream_errors") def test_wrap_errors_streaming(wrap_stream_errors): callable_ = mock.create_autospec(aio.UnaryStreamMultiCallable) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/tests/asyncio/test_retry_async.py new/google-api-core-2.15.0/tests/asyncio/test_retry_async.py --- old/google-api-core-2.14.0/tests/asyncio/test_retry_async.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/tests/asyncio/test_retry_async.py 2023-12-07 17:36:01.000000000 +0100 @@ -280,7 +280,6 @@ @mock.patch("asyncio.sleep", autospec=True) @pytest.mark.asyncio async def test___call___and_execute_retry(self, sleep, uniform): - on_error = mock.Mock(spec=["__call__"], side_effect=[None]) retry_ = retry_async.AsyncRetry( predicate=retry_async.if_exception_type(ValueError) @@ -305,7 +304,6 @@ @mock.patch("asyncio.sleep", autospec=True) @pytest.mark.asyncio async def test___call___and_execute_retry_hitting_deadline(self, sleep, uniform): - on_error = mock.Mock(spec=["__call__"], side_effect=[None] * 10) retry_ = retry_async.AsyncRetry( predicate=retry_async.if_exception_type(ValueError), @@ -315,7 +313,7 @@ deadline=9.9, ) - utcnow = datetime.datetime.utcnow() + utcnow = datetime.datetime.now(tz=datetime.timezone.utc) utcnow_patcher = mock.patch( "google.api_core.datetime_helpers.utcnow", return_value=utcnow ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/tests/unit/test_client_options.py new/google-api-core-2.15.0/tests/unit/test_client_options.py --- old/google-api-core-2.14.0/tests/unit/test_client_options.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/tests/unit/test_client_options.py 2023-12-07 17:36:01.000000000 +0100 @@ -38,6 +38,7 @@ "https://www.googleapis.com/auth/cloud-platform.read-only", ], api_audience="foo2.googleapis.com", + universe_domain="googleapis.com", ) assert options.api_endpoint == "foo.googleapis.com" @@ -49,6 +50,7 @@ "https://www.googleapis.com/auth/cloud-platform.read-only", ] assert options.api_audience == "foo2.googleapis.com" + assert options.universe_domain == "googleapis.com" def test_constructor_with_encrypted_cert_source(): @@ -110,6 +112,7 @@ options = client_options.from_dict( { "api_endpoint": "foo.googleapis.com", + "universe_domain": "googleapis.com", "client_cert_source": get_client_cert, "quota_project_id": "quote-proj", "credentials_file": "path/to/credentials.json", @@ -122,6 +125,7 @@ ) assert options.api_endpoint == "foo.googleapis.com" + assert options.universe_domain == "googleapis.com" assert options.client_cert_source() == (b"cert", b"key") assert options.quota_project_id == "quote-proj" assert options.credentials_file == "path/to/credentials.json" @@ -148,6 +152,7 @@ expected_keys = set( [ "api_endpoint", + "universe_domain", "client_cert_source", "client_encrypted_cert_source", "quota_project_id", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/tests/unit/test_grpc_helpers.py new/google-api-core-2.15.0/tests/unit/test_grpc_helpers.py --- old/google-api-core-2.14.0/tests/unit/test_grpc_helpers.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/tests/unit/test_grpc_helpers.py 2023-12-07 17:36:01.000000000 +0100 @@ -195,6 +195,23 @@ wrapped.trailing_metadata.assert_called_once_with() +class TestGrpcStream(Test_StreamingResponseIterator): + @staticmethod + def _make_one(wrapped, **kw): + return grpc_helpers.GrpcStream(wrapped, **kw) + + def test_grpc_stream_attributes(self): + """ + Should be both a grpc.Call and an iterable + """ + call = self._make_one(None) + assert isinstance(call, grpc.Call) + # should implement __iter__ + assert hasattr(call, "__iter__") + it = call.__iter__() + assert hasattr(it, "__next__") + + def test_wrap_stream_okay(): expected_responses = [1, 2, 3] callable_ = mock.Mock(spec=["__call__"], return_value=iter(expected_responses)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/tests/unit/test_iam.py new/google-api-core-2.15.0/tests/unit/test_iam.py --- old/google-api-core-2.14.0/tests/unit/test_iam.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/tests/unit/test_iam.py 2023-12-07 17:36:01.000000000 +0100 @@ -167,14 +167,15 @@ assert policy.owners == expected def test_owners_setter(self): - import warnings from google.api_core.iam import OWNER_ROLE MEMBER = "user:ph...@example.com" expected = set([MEMBER]) policy = self._make_one() - with warnings.catch_warnings(record=True) as warned: + with pytest.warns( + DeprecationWarning, match="Assigning to 'owners' is deprecated." + ) as warned: policy.owners = [MEMBER] (warning,) = warned @@ -191,14 +192,15 @@ assert policy.editors == expected def test_editors_setter(self): - import warnings from google.api_core.iam import EDITOR_ROLE MEMBER = "user:ph...@example.com" expected = set([MEMBER]) policy = self._make_one() - with warnings.catch_warnings(record=True) as warned: + with pytest.warns( + DeprecationWarning, match="Assigning to 'editors' is deprecated." + ) as warned: policy.editors = [MEMBER] (warning,) = warned @@ -215,14 +217,15 @@ assert policy.viewers == expected def test_viewers_setter(self): - import warnings from google.api_core.iam import VIEWER_ROLE MEMBER = "user:ph...@example.com" expected = set([MEMBER]) policy = self._make_one() - with warnings.catch_warnings(record=True) as warned: + with pytest.warns( + DeprecationWarning, match="Assigning to 'viewers' is deprecated." + ) as warned: policy.viewers = [MEMBER] (warning,) = warned @@ -337,12 +340,13 @@ assert policy.to_api_repr() == {} def test_to_api_repr_binding_w_duplicates(self): - import warnings from google.api_core.iam import OWNER_ROLE OWNER = "group:cloud-l...@google.com" policy = self._make_one() - with warnings.catch_warnings(record=True): + with pytest.warns( + DeprecationWarning, match="Assigning to 'owners' is deprecated." + ): policy.owners = [OWNER, OWNER] assert policy.to_api_repr() == { "bindings": [{"role": OWNER_ROLE, "members": [OWNER]}] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/tests/unit/test_packaging.py new/google-api-core-2.15.0/tests/unit/test_packaging.py --- old/google-api-core-2.14.0/tests/unit/test_packaging.py 1970-01-01 01:00:00.000000000 +0100 +++ new/google-api-core-2.15.0/tests/unit/test_packaging.py 2023-12-07 17:36:01.000000000 +0100 @@ -0,0 +1,28 @@ +# Copyright 2023 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 os +import subprocess +import sys + + +def test_namespace_package_compat(tmp_path): + # The ``google`` namespace package should not be masked + # by the presence of ``google-api-core``. + google = tmp_path / "google" + google.mkdir() + google.joinpath("othermod.py").write_text("") + env = dict(os.environ, PYTHONPATH=str(tmp_path)) + cmd = [sys.executable, "-m", "google.othermod"] + subprocess.check_call(cmd, env=env) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/tests/unit/test_retry.py new/google-api-core-2.15.0/tests/unit/test_retry.py --- old/google-api-core-2.14.0/tests/unit/test_retry.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/tests/unit/test_retry.py 2023-12-07 17:36:01.000000000 +0100 @@ -361,7 +361,6 @@ @mock.patch("random.uniform", autospec=True, side_effect=lambda m, n: n) @mock.patch("time.sleep", autospec=True) def test___call___and_execute_retry(self, sleep, uniform): - on_error = mock.Mock(spec=["__call__"], side_effect=[None]) retry_ = retry.Retry(predicate=retry.if_exception_type(ValueError)) @@ -383,7 +382,6 @@ @mock.patch("random.uniform", autospec=True, side_effect=lambda m, n: n) @mock.patch("time.sleep", autospec=True) def test___call___and_execute_retry_hitting_deadline(self, sleep, uniform): - on_error = mock.Mock(spec=["__call__"], side_effect=[None] * 10) retry_ = retry.Retry( predicate=retry.if_exception_type(ValueError), @@ -393,7 +391,7 @@ deadline=30.9, ) - utcnow = datetime.datetime.utcnow() + utcnow = datetime.datetime.now(tz=datetime.timezone.utc) utcnow_patcher = mock.patch( "google.api_core.datetime_helpers.utcnow", return_value=utcnow ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/google-api-core-2.14.0/tests/unit/test_timeout.py new/google-api-core-2.15.0/tests/unit/test_timeout.py --- old/google-api-core-2.14.0/tests/unit/test_timeout.py 2023-11-10 00:14:15.000000000 +0100 +++ new/google-api-core-2.15.0/tests/unit/test_timeout.py 2023-12-07 17:36:01.000000000 +0100 @@ -58,10 +58,10 @@ def test_apply(self): target = mock.Mock(spec=["__call__", "__name__"], __name__="target") - datetime.datetime.utcnow() + datetime.datetime.now(tz=datetime.timezone.utc) datetime.timedelta(seconds=1) - now = datetime.datetime.utcnow() + now = datetime.datetime.now(tz=datetime.timezone.utc) times = [ now, @@ -92,10 +92,10 @@ def test_apply_no_timeout(self): target = mock.Mock(spec=["__call__", "__name__"], __name__="target") - datetime.datetime.utcnow() + datetime.datetime.now(tz=datetime.timezone.utc) datetime.timedelta(seconds=1) - now = datetime.datetime.utcnow() + now = datetime.datetime.now(tz=datetime.timezone.utc) times = [ now,