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,

Reply via email to