Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-google-cloud-pubsub for 
openSUSE:Factory checked in at 2026-08-19 17:57:51
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-google-cloud-pubsub (Old)
 and      /work/SRC/openSUSE:Factory/.python-google-cloud-pubsub.new.1258 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-google-cloud-pubsub"

Wed Aug 19 17:57:51 2026 rev:8 rq:1371811 version:2.39.1

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-google-cloud-pubsub/python-google-cloud-pubsub.changes
    2026-07-15 17:01:15.490408486 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-google-cloud-pubsub.new.1258/python-google-cloud-pubsub.changes
  2026-08-19 17:58:06.156529105 +0200
@@ -1,0 +2,7 @@
+Tue Aug 18 09:31:44 UTC 2026 - John Paul Adrian Glaubitz 
<[email protected]>
+
+- Update to 2.39.1
+  * bump grpcio to 1.59.0; require Python 3.10+ (#17351)
+- Update BuildRequires and Requires from setup.py
+
+-------------------------------------------------------------------

Old:
----
  google_cloud_pubsub-2.39.0.tar.gz

New:
----
  google_cloud_pubsub-2.39.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-google-cloud-pubsub.spec ++++++
--- /var/tmp/diff_new_pack.IG7kmY/_old  2026-08-19 17:58:06.785551795 +0200
+++ /var/tmp/diff_new_pack.IG7kmY/_new  2026-08-19 17:58:06.787551867 +0200
@@ -18,7 +18,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-google-cloud-pubsub
-Version:        2.39.0
+Version:        2.39.1
 Release:        0
 Summary:        Google Cloud Pub/Sub API client library
 License:        Apache-2.0
@@ -30,28 +30,39 @@
 BuildRequires:  python-rpm-macros
 # SECTION test requirements
 BuildRequires:  %{python_module flaky}
-BuildRequires:  %{python_module google-api-core >= 2.11.0}
+BuildRequires:  %{python_module google-api-core >= 2.25.0}
 BuildRequires:  %{python_module google-auth >= 2.14.1}
-BuildRequires:  %{python_module grpc-google-iam-v1 >= 0.14.0}
-BuildRequires:  %{python_module grpcio >= 1.75.1}
-BuildRequires:  %{python_module grpcio-status >= 1.33.2}
+BuildRequires:  %{python_module grpc-google-iam-v1 >= 0.14.2}
+BuildRequires:  %{python_module grpcio >= 1.59.0 if %python-base < 3.14}
+BuildRequires:  %{python_module grpcio >= 1.75.1 if %python-base >= 3.14}
+BuildRequires:  %{python_module grpcio-status >= 1.59.0 if %python-base < 3.14}
+BuildRequires:  %{python_module grpcio-status >= 1.75.1 if %python-base >= 
3.14}
 BuildRequires:  %{python_module opentelemetry-api >= 1.27.0}
 BuildRequires:  %{python_module opentelemetry-sdk >= 1.27.0}
-BuildRequires:  %{python_module proto-plus >= 1.25.0}
-BuildRequires:  %{python_module protobuf >= 4.25.8}
+BuildRequires:  %{python_module proto-plus >= 1.26.1}
+BuildRequires:  %{python_module protobuf >= 6.33.5}
 BuildRequires:  %{python_module pytest-asyncio}
 BuildRequires:  %{python_module pytest}
 # /SECTION
 BuildRequires:  fdupes
-Requires:       python-google-api-core >= 2.11.0
+Requires:       python-google-api-core >= 2.25.0
 Requires:       python-google-auth >= 2.14.1
-Requires:       python-grpc-google-iam-v1 >= 0.14.0
-Requires:       python-grpcio >= 1.51.3
-Requires:       python-grpcio-status >= 1.33.2
+Requires:       python-grpc-google-iam-v1 >= 0.14.2
+%if %python_version_nodots < 314
+Requires:       python-grpcio >= 1.59.0
+%else
+Requires:       python-grpcio >= 1.75.1
+%endif
+%if %python_version_nodots < 314
+Requires:       python-grpcio-status >= 1.59.0
+%else
+Requires:       python-grpcio-status >= 1.75.1
+%endif
+Requires:       python-grpcio-status >= 1.59.0
 Requires:       python-opentelemetry-api >= 1.27.0
 Requires:       python-opentelemetry-sdk >= 1.27.0
-Requires:       python-proto-plus >= 1.22.3
-Requires:       python-protobuf >= 4.25.8
+Requires:       python-proto-plus >= 1.26.1
+Requires:       python-protobuf >= 6.33.5
 Suggests:       python-libcst >= 0.3.10
 BuildArch:      noarch
 %python_subpackages

++++++ google_cloud_pubsub-2.39.0.tar.gz -> google_cloud_pubsub-2.39.1.tar.gz 
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/google_cloud_pubsub-2.39.0/PKG-INFO 
new/google_cloud_pubsub-2.39.1/PKG-INFO
--- old/google_cloud_pubsub-2.39.0/PKG-INFO     2026-06-02 16:28:02.871827600 
+0200
+++ new/google_cloud_pubsub-2.39.1/PKG-INFO     2026-08-06 07:58:29.022971000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: google-cloud-pubsub
-Version: 2.39.0
+Version: 2.39.1
 Summary: Google Cloud Pub/Sub API client library
 Home-page: 
https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-pubsub
 Author: Google LLC
@@ -21,15 +21,15 @@
 Classifier: Topic :: Internet
 Requires-Python: >=3.10
 License-File: LICENSE
-Requires-Dist: google-api-core[grpc]<3.0.0,>=2.17.1
+Requires-Dist: google-api-core[grpc]<3.0.0,>=2.25.0
 Requires-Dist: google-auth!=2.24.0,!=2.25.0,<3.0.0,>=2.14.1
-Requires-Dist: grpcio<2.0.0,>=1.51.3; python_version < "3.14"
+Requires-Dist: grpcio<2.0.0,>=1.59.0
 Requires-Dist: grpcio<2.0.0,>=1.75.1; python_version >= "3.14"
-Requires-Dist: proto-plus<2.0.0,>=1.22.3
-Requires-Dist: proto-plus<2.0.0,>=1.25.0; python_version >= "3.13"
-Requires-Dist: protobuf<8.0.0,>=4.25.8
-Requires-Dist: grpc-google-iam-v1<1.0.0,>=0.14.0
-Requires-Dist: grpcio-status>=1.51.3
+Requires-Dist: proto-plus<2.0.0,>=1.26.1
+Requires-Dist: protobuf<8.0.0,>=6.33.5
+Requires-Dist: grpc-google-iam-v1<1.0.0,>=0.14.2
+Requires-Dist: grpcio-status<2.0.0,>=1.59.0
+Requires-Dist: grpcio-status<2.0.0,>=1.75.1; python_version >= "3.14"
 Requires-Dist: opentelemetry-api>=1.27.0
 Requires-Dist: opentelemetry-sdk>=1.27.0
 Provides-Extra: libcst
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/cloud/pubsub_v1/publisher/client.py 
new/google_cloud_pubsub-2.39.1/google/cloud/pubsub_v1/publisher/client.py
--- old/google_cloud_pubsub-2.39.0/google/cloud/pubsub_v1/publisher/client.py   
2026-06-02 16:13:27.000000000 +0200
+++ new/google_cloud_pubsub-2.39.1/google/cloud/pubsub_v1/publisher/client.py   
2026-08-06 07:54:32.000000000 +0200
@@ -17,7 +17,6 @@
 import copy
 import logging
 import os
-import sys
 import threading
 import time
 import typing
@@ -165,18 +164,6 @@
         self._open_telemetry_enabled = (
             self.publisher_options.enable_open_telemetry_tracing
         )
-        # OpenTelemetry features used by the library are not supported in 
Python versions <= 3.7.
-        # Refer 
https://github.com/open-telemetry/opentelemetry-python/issues/3993#issuecomment-2211976389
-        if (
-            self.publisher_options.enable_open_telemetry_tracing
-            and sys.version_info.major == 3
-            and sys.version_info.minor < 8
-        ):
-            warnings.warn(
-                message="Open Telemetry for Python version 3.7 or lower is not 
supported. Disabling Open Telemetry tracing.",
-                category=RuntimeWarning,
-            )
-            self._open_telemetry_enabled = False
 
     @classmethod
     def from_service_account_file(  # type: ignore[override]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/cloud/pubsub_v1/subscriber/_protocol/leaser.py
 
new/google_cloud_pubsub-2.39.1/google/cloud/pubsub_v1/subscriber/_protocol/leaser.py
--- 
old/google_cloud_pubsub-2.39.0/google/cloud/pubsub_v1/subscriber/_protocol/leaser.py
        2026-06-02 16:13:26.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/cloud/pubsub_v1/subscriber/_protocol/leaser.py
        2026-08-06 07:54:33.000000000 +0200
@@ -20,22 +20,14 @@
 import threading
 import time
 import typing
+from collections.abc import KeysView
 from typing import Dict, Iterable, Optional, Union
 
 from google.cloud.pubsub_v1.open_telemetry.subscribe_opentelemetry import (
     SubscribeOpenTelemetry,
 )
-from google.cloud.pubsub_v1.subscriber._protocol.dispatcher import 
_MAX_BATCH_LATENCY
-
-try:
-    from collections.abc import KeysView
-
-    KeysView[None]  # KeysView is only subscriptable in Python 3.9+
-except TypeError:
-    # Deprecated since Python 3.9, thus only use as a fallback in older Python 
versions
-    from typing import KeysView
-
 from google.cloud.pubsub_v1.subscriber._protocol import requests
+from google.cloud.pubsub_v1.subscriber._protocol.dispatcher import 
_MAX_BATCH_LATENCY
 
 if typing.TYPE_CHECKING:  # pragma: NO COVER
     from google.cloud.pubsub_v1.subscriber._protocol.streaming_pull_manager 
import (
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/cloud/pubsub_v1/subscriber/client.py 
new/google_cloud_pubsub-2.39.1/google/cloud/pubsub_v1/subscriber/client.py
--- old/google_cloud_pubsub-2.39.0/google/cloud/pubsub_v1/subscriber/client.py  
2026-06-02 16:13:27.000000000 +0200
+++ new/google_cloud_pubsub-2.39.1/google/cloud/pubsub_v1/subscriber/client.py  
2026-08-06 07:54:33.000000000 +0200
@@ -15,7 +15,6 @@
 from __future__ import absolute_import
 
 import os
-import sys
 import typing
 import warnings
 from typing import Any, Callable, Optional, Sequence, Union, cast
@@ -102,18 +101,6 @@
         self._open_telemetry_enabled = (
             self.subscriber_options.enable_open_telemetry_tracing
         )
-        # OpenTelemetry features used by the library are not supported in 
Python versions <= 3.7.
-        # Refer 
https://github.com/open-telemetry/opentelemetry-python/issues/3993#issuecomment-2211976389
-        if (
-            self.subscriber_options.enable_open_telemetry_tracing
-            and sys.version_info.major == 3
-            and sys.version_info.minor < 8
-        ):
-            warnings.warn(
-                message="Open Telemetry for Python version 3.7 or lower is not 
supported. Disabling Open Telemetry tracing.",
-                category=RuntimeWarning,
-            )
-            self._open_telemetry_enabled = False
 
     @property
     def open_telemetry_enabled(self) -> bool:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/cloud/pubsub_v1/subscriber/scheduler.py 
new/google_cloud_pubsub-2.39.1/google/cloud/pubsub_v1/subscriber/scheduler.py
--- 
old/google_cloud_pubsub-2.39.0/google/cloud/pubsub_v1/subscriber/scheduler.py   
    2026-06-02 16:13:30.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/cloud/pubsub_v1/subscriber/scheduler.py   
    2026-08-06 07:54:30.000000000 +0200
@@ -153,11 +153,6 @@
         """
         dropped_messages = []
 
-        # Drop all pending item from the executor. Without this, the executor 
will also
-        # try to process any pending work items before termination, which is 
undesirable.
-        #
-        # TODO: Replace the logic below by passing `cancel_futures=True` to 
shutdown()
-        # once we only need to support Python 3.9+.
         try:
             while True:
                 work_item = self._executor._work_queue.get(block=False)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub/gapic_version.py 
new/google_cloud_pubsub-2.39.1/google/pubsub/gapic_version.py
--- old/google_cloud_pubsub-2.39.0/google/pubsub/gapic_version.py       
2026-06-02 16:13:30.000000000 +0200
+++ new/google_cloud_pubsub-2.39.1/google/pubsub/gapic_version.py       
2026-08-06 07:54:29.000000000 +0200
@@ -13,4 +13,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-__version__ = "2.39.0"  # {x-release-please-version}
+__version__ = "2.39.1"  # {x-release-please-version}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/__init__.py 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/__init__.py
--- old/google_cloud_pubsub-2.39.0/google/pubsub_v1/__init__.py 2026-06-02 
16:13:30.000000000 +0200
+++ new/google_cloud_pubsub-2.39.1/google/pubsub_v1/__init__.py 2026-08-06 
07:54:31.000000000 +0200
@@ -23,6 +23,21 @@
 
 from importlib import metadata
 
+# PEP 0810: Explicit Lazy Imports
+# Python 3.15+ natively intercepts and defers these imports.
+# Developers can disable this behavior and force eager imports.
+# For more information, see:
+# https://docs.python.org/3.15/library/sys.html#sys.set_lazy_imports_filter
+# Older Python versions safely ignore this variable.
+__lazy_modules__ = {
+    "google.pubsub_v1.services.publisher",
+    "google.pubsub_v1.services.schema_service",
+    "google.pubsub_v1.services.subscriber",
+    "google.pubsub_v1.types.pubsub",
+    "google.pubsub_v1.types.schema",
+}
+
+
 from .services.publisher import PublisherAsyncClient, PublisherClient
 from .services.schema_service import SchemaServiceAsyncClient, 
SchemaServiceClient
 from .services.subscriber import SubscriberAsyncClient, SubscriberClient
@@ -126,7 +141,7 @@
 
         def parse_version_to_tuple(version_string: str):
             """Safely converts a semantic version string to a comparable tuple 
of integers.
-            Example: "4.25.8" -> (4, 25, 8)
+            Example: "6.33.5" -> (6, 33, 5)
             Ignores non-numeric parts and handles common version formats.
             Args:
                 version_string: Version string in the format "x.y.z" or 
"x.y.z<suffix>"
@@ -155,9 +170,9 @@
                 return (None, "--")
 
         _dependency_package = "google.protobuf"
-        _next_supported_version = "4.25.8"
-        _next_supported_version_tuple = (4, 25, 8)
-        _recommendation = " (we recommend 6.x)"
+        _next_supported_version = "6.33.5"
+        _next_supported_version_tuple = (6, 33, 5)
+        _recommendation = " (we recommend 7.x)"
         (_version_used, _version_used_string) = 
_get_version(_dependency_package)
         if _version_used and _version_used < _next_supported_version_tuple:
             warnings.warn(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/gapic_version.py 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/gapic_version.py
--- old/google_cloud_pubsub-2.39.0/google/pubsub_v1/gapic_version.py    
2026-06-02 16:13:30.000000000 +0200
+++ new/google_cloud_pubsub-2.39.1/google/pubsub_v1/gapic_version.py    
2026-08-06 07:54:29.000000000 +0200
@@ -13,4 +13,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
-__version__ = "2.39.0"  # {x-release-please-version}
+__version__ = "2.39.1"  # {x-release-please-version}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/publisher/async_client.py
 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/publisher/async_client.py
--- 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/publisher/async_client.py
  2026-06-02 16:13:28.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/publisher/async_client.py
  2026-08-06 07:54:32.000000000 +0200
@@ -1692,9 +1692,7 @@
 DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
     client_library_version=package_version.__version__
 )
-
-if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"):  # pragma: NO 
COVER
-    DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
+DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
 
 
 __all__ = ("PublisherAsyncClient",)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/publisher/client.py 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/publisher/client.py
--- 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/publisher/client.py    
    2026-06-02 16:13:28.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/publisher/client.py    
    2026-08-06 07:54:31.000000000 +0200
@@ -2201,8 +2201,6 @@
 DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
     client_library_version=package_version.__version__
 )
-
-if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"):  # pragma: NO 
COVER
-    DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
+DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
 
 __all__ = ("PublisherClient",)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/publisher/transports/base.py
 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/publisher/transports/base.py
--- 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/publisher/transports/base.py
       2026-06-02 16:13:29.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/publisher/transports/base.py
       2026-08-06 07:54:34.000000000 +0200
@@ -36,9 +36,7 @@
 DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
     client_library_version=package_version.__version__
 )
-
-if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"):  # pragma: NO 
COVER
-    DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
+DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
 
 
 class PublisherTransport(abc.ABC):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/publisher/transports/rest.py
 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/publisher/transports/rest.py
--- 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/publisher/transports/rest.py
       2026-06-02 16:13:29.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/publisher/transports/rest.py
       2026-08-06 07:54:30.000000000 +0200
@@ -58,8 +58,7 @@
     rest_version=f"requests@{requests_version}",
 )
 
-if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"):  # pragma: NO 
COVER
-    DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
+DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
 
 
 class PublisherRestInterceptor:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/schema_service/async_client.py
 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/schema_service/async_client.py
--- 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/schema_service/async_client.py
     2026-06-02 16:13:28.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/schema_service/async_client.py
     2026-08-06 07:54:33.000000000 +0200
@@ -1802,9 +1802,7 @@
 DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
     client_library_version=package_version.__version__
 )
-
-if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"):  # pragma: NO 
COVER
-    DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
+DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
 
 
 __all__ = ("SchemaServiceAsyncClient",)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/schema_service/client.py
 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/schema_service/client.py
--- 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/schema_service/client.py
   2026-06-02 16:13:27.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/schema_service/client.py
   2026-08-06 07:54:33.000000000 +0200
@@ -2234,8 +2234,6 @@
 DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
     client_library_version=package_version.__version__
 )
-
-if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"):  # pragma: NO 
COVER
-    DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
+DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
 
 __all__ = ("SchemaServiceClient",)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/schema_service/transports/base.py
 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/schema_service/transports/base.py
--- 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/schema_service/transports/base.py
  2026-06-02 16:13:30.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/schema_service/transports/base.py
  2026-08-06 07:54:31.000000000 +0200
@@ -37,9 +37,7 @@
 DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
     client_library_version=package_version.__version__
 )
-
-if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"):  # pragma: NO 
COVER
-    DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
+DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
 
 
 class SchemaServiceTransport(abc.ABC):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/schema_service/transports/rest.py
 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/schema_service/transports/rest.py
--- 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/schema_service/transports/rest.py
  2026-06-02 16:13:29.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/schema_service/transports/rest.py
  2026-08-06 07:54:34.000000000 +0200
@@ -59,8 +59,7 @@
     rest_version=f"requests@{requests_version}",
 )
 
-if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"):  # pragma: NO 
COVER
-    DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
+DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
 
 
 class SchemaServiceRestInterceptor:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/subscriber/async_client.py
 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/subscriber/async_client.py
--- 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/subscriber/async_client.py
 2026-06-02 16:13:29.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/subscriber/async_client.py
 2026-08-06 07:54:33.000000000 +0200
@@ -2664,9 +2664,7 @@
 DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
     client_library_version=package_version.__version__
 )
-
-if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"):  # pragma: NO 
COVER
-    DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
+DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
 
 
 __all__ = ("SubscriberAsyncClient",)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/subscriber/client.py 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/subscriber/client.py
--- 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/subscriber/client.py   
    2026-06-02 16:13:28.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/subscriber/client.py   
    2026-08-06 07:54:29.000000000 +0200
@@ -3143,8 +3143,6 @@
 DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
     client_library_version=package_version.__version__
 )
-
-if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"):  # pragma: NO 
COVER
-    DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
+DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
 
 __all__ = ("SubscriberClient",)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/subscriber/transports/base.py
 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/subscriber/transports/base.py
--- 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/subscriber/transports/base.py
      2026-06-02 16:13:30.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/subscriber/transports/base.py
      2026-08-06 07:54:34.000000000 +0200
@@ -36,9 +36,7 @@
 DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
     client_library_version=package_version.__version__
 )
-
-if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"):  # pragma: NO 
COVER
-    DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
+DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
 
 
 class SubscriberTransport(abc.ABC):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/subscriber/transports/rest.py
 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/subscriber/transports/rest.py
--- 
old/google_cloud_pubsub-2.39.0/google/pubsub_v1/services/subscriber/transports/rest.py
      2026-06-02 16:13:26.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/google/pubsub_v1/services/subscriber/transports/rest.py
      2026-08-06 07:54:31.000000000 +0200
@@ -58,8 +58,7 @@
     rest_version=f"requests@{requests_version}",
 )
 
-if hasattr(DEFAULT_CLIENT_INFO, "protobuf_runtime_version"):  # pragma: NO 
COVER
-    DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
+DEFAULT_CLIENT_INFO.protobuf_runtime_version = google.protobuf.__version__
 
 
 class SubscriberRestInterceptor:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google_cloud_pubsub.egg-info/PKG-INFO 
new/google_cloud_pubsub-2.39.1/google_cloud_pubsub.egg-info/PKG-INFO
--- old/google_cloud_pubsub-2.39.0/google_cloud_pubsub.egg-info/PKG-INFO        
2026-06-02 16:28:02.000000000 +0200
+++ new/google_cloud_pubsub-2.39.1/google_cloud_pubsub.egg-info/PKG-INFO        
2026-08-06 07:58:28.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: google-cloud-pubsub
-Version: 2.39.0
+Version: 2.39.1
 Summary: Google Cloud Pub/Sub API client library
 Home-page: 
https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-pubsub
 Author: Google LLC
@@ -21,15 +21,15 @@
 Classifier: Topic :: Internet
 Requires-Python: >=3.10
 License-File: LICENSE
-Requires-Dist: google-api-core[grpc]<3.0.0,>=2.17.1
+Requires-Dist: google-api-core[grpc]<3.0.0,>=2.25.0
 Requires-Dist: google-auth!=2.24.0,!=2.25.0,<3.0.0,>=2.14.1
-Requires-Dist: grpcio<2.0.0,>=1.51.3; python_version < "3.14"
+Requires-Dist: grpcio<2.0.0,>=1.59.0
 Requires-Dist: grpcio<2.0.0,>=1.75.1; python_version >= "3.14"
-Requires-Dist: proto-plus<2.0.0,>=1.22.3
-Requires-Dist: proto-plus<2.0.0,>=1.25.0; python_version >= "3.13"
-Requires-Dist: protobuf<8.0.0,>=4.25.8
-Requires-Dist: grpc-google-iam-v1<1.0.0,>=0.14.0
-Requires-Dist: grpcio-status>=1.51.3
+Requires-Dist: proto-plus<2.0.0,>=1.26.1
+Requires-Dist: protobuf<8.0.0,>=6.33.5
+Requires-Dist: grpc-google-iam-v1<1.0.0,>=0.14.2
+Requires-Dist: grpcio-status<2.0.0,>=1.59.0
+Requires-Dist: grpcio-status<2.0.0,>=1.75.1; python_version >= "3.14"
 Requires-Dist: opentelemetry-api>=1.27.0
 Requires-Dist: opentelemetry-sdk>=1.27.0
 Provides-Extra: libcst
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/google_cloud_pubsub.egg-info/requires.txt 
new/google_cloud_pubsub-2.39.1/google_cloud_pubsub.egg-info/requires.txt
--- old/google_cloud_pubsub-2.39.0/google_cloud_pubsub.egg-info/requires.txt    
2026-06-02 16:28:02.000000000 +0200
+++ new/google_cloud_pubsub-2.39.1/google_cloud_pubsub.egg-info/requires.txt    
2026-08-06 07:58:28.000000000 +0200
@@ -1,20 +1,16 @@
-google-api-core[grpc]<3.0.0,>=2.17.1
+google-api-core[grpc]<3.0.0,>=2.25.0
 google-auth!=2.24.0,!=2.25.0,<3.0.0,>=2.14.1
-proto-plus<2.0.0,>=1.22.3
-protobuf<8.0.0,>=4.25.8
-grpc-google-iam-v1<1.0.0,>=0.14.0
-grpcio-status>=1.51.3
+grpcio<2.0.0,>=1.59.0
+proto-plus<2.0.0,>=1.26.1
+protobuf<8.0.0,>=6.33.5
+grpc-google-iam-v1<1.0.0,>=0.14.2
+grpcio-status<2.0.0,>=1.59.0
 opentelemetry-api>=1.27.0
 opentelemetry-sdk>=1.27.0
 
-[:python_version < "3.14"]
-grpcio<2.0.0,>=1.51.3
-
-[:python_version >= "3.13"]
-proto-plus<2.0.0,>=1.25.0
-
 [:python_version >= "3.14"]
 grpcio<2.0.0,>=1.75.1
+grpcio-status<2.0.0,>=1.75.1
 
 [libcst]
 libcst>=0.3.10
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/google_cloud_pubsub-2.39.0/setup.py 
new/google_cloud_pubsub-2.39.1/setup.py
--- old/google_cloud_pubsub-2.39.0/setup.py     2026-06-02 16:13:28.000000000 
+0200
+++ new/google_cloud_pubsub-2.39.1/setup.py     2026-08-06 07:54:32.000000000 
+0200
@@ -29,7 +29,10 @@
 version = None
 
 with open(os.path.join(package_root, "google/pubsub/gapic_version.py")) as fp:
-    version_candidates = re.findall(r"(?<=\")\d+.\d+.\d+(?=\")", fp.read())
+    version_candidates = re.findall(
+        r"(?<=\")\d+\.\d+\.\d+[^\"\s]*(?=\")",
+        fp.read(),
+    )
     assert len(version_candidates) == 1
     version = version_candidates[0]
 
@@ -39,17 +42,17 @@
     release_status = "Development Status :: 5 - Production/Stable"
 
 dependencies = [
-    "google-api-core[grpc] >= 2.17.1, <3.0.0",
+    "google-api-core[grpc] >= 2.25.0, <3.0.0",
     # Exclude incompatible versions of `google-auth`
     # See https://github.com/googleapis/google-cloud-python/issues/12364
     "google-auth >= 2.14.1, <3.0.0,!=2.24.0,!=2.25.0",
-    "grpcio >= 1.51.3, < 2.0.0; python_version < '3.14'",
+    "grpcio >= 1.59.0, < 2.0.0",
     "grpcio >= 1.75.1, < 2.0.0; python_version >= '3.14'",
-    "proto-plus >= 1.22.3, <2.0.0",
-    "proto-plus >= 1.25.0, <2.0.0; python_version >= '3.13'",
-    "protobuf >= 4.25.8, < 8.0.0",
-    "grpc-google-iam-v1 >= 0.14.0, <1.0.0",
-    "grpcio-status >= 1.51.3",
+    "proto-plus >= 1.26.1, <2.0.0",
+    "protobuf >= 6.33.5, < 8.0.0",
+    "grpc-google-iam-v1 >= 0.14.2, <1.0.0",
+    "grpcio-status >= 1.59.0, < 2.0.0",
+    "grpcio-status >= 1.75.1, < 2.0.0; python_version >= '3.14'",
     "opentelemetry-api >= 1.27.0",
     "opentelemetry-sdk >= 1.27.0",
 ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/google_cloud_pubsub-2.39.0/tests/system.py 
new/google_cloud_pubsub-2.39.1/tests/system.py
--- old/google_cloud_pubsub-2.39.0/tests/system.py      2026-06-02 
16:13:30.000000000 +0200
+++ new/google_cloud_pubsub-2.39.1/tests/system.py      2026-08-06 
07:54:30.000000000 +0200
@@ -447,11 +447,19 @@
     subscriber = pubsub_v1.SubscriberClient(transport="grpc")
     subscriber_2 = pubsub_v1.SubscriberClient(transport="grpc")
 
+    # Construct a secondary publisher client to clean up the topic,
+    # so we can safely close the main publisher client inside the test.
+    if "Rest" in type(publisher._transport).__name__:
+        publisher_2 = pubsub_v1.PublisherClient(transport="rest")
+    else:
+        publisher_2 = pubsub_v1.PublisherClient(transport="grpc")
+
     cleanup.append(
         (subscriber_2.delete_subscription, (), {"subscription": 
subscription_path})
     )
     cleanup.append((subscriber_2.close, (), {}))
-    cleanup.append((publisher.delete_topic, (), {"topic": topic_path}))
+    cleanup.append((publisher_2.delete_topic, (), {"topic": topic_path}))
+    cleanup.append((publisher_2._transport.close, (), {}))
 
     # Create topic before starting to track connection count (any sockets 
opened
     # by the publisher client are not counted by this test).
@@ -477,7 +485,16 @@
         response = subscriber.pull(subscription=subscription_path, 
max_messages=3)
         assert len(response.received_messages) == 3
 
-    conn_count_end = len(current_process.net_connections())
+    # Close the publisher client's transport used in the test to ensure all 
its socket connections
+    # (including any opened asynchronously on the background publisher 
threads) are closed.
+    publisher._transport.close()
+
+    # Wait a bit for the asynchronous channel teardown to complete and the 
socket to be closed.
+    for _ in range(30):
+        conn_count_end = len(current_process.net_connections())
+        if conn_count_end <= conn_count_start:
+            break
+        time.sleep(0.1)
 
     # To avoid flakiness, use <= in the assertion, since on rare occasions 
additional
     # sockets are closed, causing the == assertion to fail.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/tests/unit/gapic/pubsub_v1/test_publisher.py 
new/google_cloud_pubsub-2.39.1/tests/unit/gapic/pubsub_v1/test_publisher.py
--- old/google_cloud_pubsub-2.39.0/tests/unit/gapic/pubsub_v1/test_publisher.py 
2026-06-02 16:13:28.000000000 +0200
+++ new/google_cloud_pubsub-2.39.1/tests/unit/gapic/pubsub_v1/test_publisher.py 
2026-08-06 07:54:29.000000000 +0200
@@ -933,7 +933,14 @@
                 config_filename = "mock_certificate_config.json"
                 config_file_content = json.dumps(config_data)
                 m = mock.mock_open(read_data=config_file_content)
-                with mock.patch("builtins.open", m):
+                with (
+                    mock.patch("builtins.open", m),
+                    mock.patch(
+                        "os.path.exists",
+                        side_effect=lambda path: os.path.basename(path)
+                        == config_filename,
+                    ),
+                ):
                     with mock.patch.dict(
                         os.environ, {"GOOGLE_API_CERTIFICATE_CONFIG": 
config_filename}
                     ):
@@ -980,7 +987,14 @@
                 config_filename = "mock_certificate_config.json"
                 config_file_content = json.dumps(config_data)
                 m = mock.mock_open(read_data=config_file_content)
-                with mock.patch("builtins.open", m):
+                with (
+                    mock.patch("builtins.open", m),
+                    mock.patch(
+                        "os.path.exists",
+                        side_effect=lambda path: os.path.basename(path)
+                        == config_filename,
+                    ),
+                ):
                     with mock.patch.dict(
                         os.environ, {"GOOGLE_API_CERTIFICATE_CONFIG": 
config_filename}
                     ):
@@ -3000,6 +3014,9 @@
         assert pager._retry == retry
         assert pager._timeout == timeout
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, pubsub.Topic) for i in results)
@@ -3088,6 +3105,8 @@
             request={},
         )
         assert async_pager.next_page_token == "abc"
+        assert 
str(async_pager).startswith(f"{async_pager.__class__.__name__}<")
+
         responses = []
         async for response in async_pager:  # pragma: no branch
             responses.append(response)
@@ -3545,6 +3564,9 @@
         assert pager._retry == retry
         assert pager._timeout == timeout
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, str) for i in results)
@@ -3637,6 +3659,8 @@
             request={},
         )
         assert async_pager.next_page_token == "abc"
+        assert 
str(async_pager).startswith(f"{async_pager.__class__.__name__}<")
+
         responses = []
         async for response in async_pager:  # pragma: no branch
             responses.append(response)
@@ -4093,6 +4117,9 @@
         assert pager._retry == retry
         assert pager._timeout == timeout
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, str) for i in results)
@@ -4185,6 +4212,8 @@
             request={},
         )
         assert async_pager.next_page_token == "abc"
+        assert 
str(async_pager).startswith(f"{async_pager.__class__.__name__}<")
+
         responses = []
         async for response in async_pager:  # pragma: no branch
             responses.append(response)
@@ -5758,6 +5787,9 @@
 
         pager = client.list_topics(request=sample_request)
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, pubsub.Topic) for i in results)
@@ -6018,6 +6050,9 @@
 
         pager = client.list_topic_subscriptions(request=sample_request)
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, str) for i in results)
@@ -6275,6 +6310,9 @@
 
         pager = client.list_topic_snapshots(request=sample_request)
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, str) for i in results)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/tests/unit/gapic/pubsub_v1/test_schema_service.py
 
new/google_cloud_pubsub-2.39.1/tests/unit/gapic/pubsub_v1/test_schema_service.py
--- 
old/google_cloud_pubsub-2.39.0/tests/unit/gapic/pubsub_v1/test_schema_service.py
    2026-06-02 16:13:28.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/tests/unit/gapic/pubsub_v1/test_schema_service.py
    2026-08-06 07:54:29.000000000 +0200
@@ -959,7 +959,14 @@
                 config_filename = "mock_certificate_config.json"
                 config_file_content = json.dumps(config_data)
                 m = mock.mock_open(read_data=config_file_content)
-                with mock.patch("builtins.open", m):
+                with (
+                    mock.patch("builtins.open", m),
+                    mock.patch(
+                        "os.path.exists",
+                        side_effect=lambda path: os.path.basename(path)
+                        == config_filename,
+                    ),
+                ):
                     with mock.patch.dict(
                         os.environ, {"GOOGLE_API_CERTIFICATE_CONFIG": 
config_filename}
                     ):
@@ -1006,7 +1013,14 @@
                 config_filename = "mock_certificate_config.json"
                 config_file_content = json.dumps(config_data)
                 m = mock.mock_open(read_data=config_file_content)
-                with mock.patch("builtins.open", m):
+                with (
+                    mock.patch("builtins.open", m),
+                    mock.patch(
+                        "os.path.exists",
+                        side_effect=lambda path: os.path.basename(path)
+                        == config_filename,
+                    ),
+                ):
                     with mock.patch.dict(
                         os.environ, {"GOOGLE_API_CERTIFICATE_CONFIG": 
config_filename}
                     ):
@@ -2390,6 +2404,9 @@
         assert pager._retry == retry
         assert pager._timeout == timeout
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, schema.Schema) for i in results)
@@ -2478,6 +2495,8 @@
             request={},
         )
         assert async_pager.next_page_token == "abc"
+        assert 
str(async_pager).startswith(f"{async_pager.__class__.__name__}<")
+
         responses = []
         async for response in async_pager:  # pragma: no branch
             responses.append(response)
@@ -2929,6 +2948,9 @@
         assert pager._retry == retry
         assert pager._timeout == timeout
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, schema.Schema) for i in results)
@@ -3021,6 +3043,8 @@
             request={},
         )
         assert async_pager.next_page_token == "abc"
+        assert 
str(async_pager).startswith(f"{async_pager.__class__.__name__}<")
+
         responses = []
         async for response in async_pager:  # pragma: no branch
             responses.append(response)
@@ -5615,6 +5639,9 @@
 
         pager = client.list_schemas(request=sample_request)
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, schema.Schema) for i in results)
@@ -5877,6 +5904,9 @@
 
         pager = client.list_schema_revisions(request=sample_request)
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, schema.Schema) for i in results)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/tests/unit/gapic/pubsub_v1/test_subscriber.py 
new/google_cloud_pubsub-2.39.1/tests/unit/gapic/pubsub_v1/test_subscriber.py
--- 
old/google_cloud_pubsub-2.39.0/tests/unit/gapic/pubsub_v1/test_subscriber.py    
    2026-06-02 16:13:27.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/tests/unit/gapic/pubsub_v1/test_subscriber.py    
    2026-08-06 07:54:30.000000000 +0200
@@ -937,7 +937,14 @@
                 config_filename = "mock_certificate_config.json"
                 config_file_content = json.dumps(config_data)
                 m = mock.mock_open(read_data=config_file_content)
-                with mock.patch("builtins.open", m):
+                with (
+                    mock.patch("builtins.open", m),
+                    mock.patch(
+                        "os.path.exists",
+                        side_effect=lambda path: os.path.basename(path)
+                        == config_filename,
+                    ),
+                ):
                     with mock.patch.dict(
                         os.environ, {"GOOGLE_API_CERTIFICATE_CONFIG": 
config_filename}
                     ):
@@ -984,7 +991,14 @@
                 config_filename = "mock_certificate_config.json"
                 config_file_content = json.dumps(config_data)
                 m = mock.mock_open(read_data=config_file_content)
-                with mock.patch("builtins.open", m):
+                with (
+                    mock.patch("builtins.open", m),
+                    mock.patch(
+                        "os.path.exists",
+                        side_effect=lambda path: os.path.basename(path)
+                        == config_filename,
+                    ),
+                ):
                     with mock.patch.dict(
                         os.environ, {"GOOGLE_API_CERTIFICATE_CONFIG": 
config_filename}
                     ):
@@ -2824,6 +2838,9 @@
         assert pager._retry == retry
         assert pager._timeout == timeout
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, pubsub.Subscription) for i in results)
@@ -2916,6 +2933,8 @@
             request={},
         )
         assert async_pager.next_page_token == "abc"
+        assert 
str(async_pager).startswith(f"{async_pager.__class__.__name__}<")
+
         responses = []
         async for response in async_pager:  # pragma: no branch
             responses.append(response)
@@ -5490,6 +5509,9 @@
         assert pager._retry == retry
         assert pager._timeout == timeout
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, pubsub.Snapshot) for i in results)
@@ -5578,6 +5600,8 @@
             request={},
         )
         assert async_pager.next_page_token == "abc"
+        assert 
str(async_pager).startswith(f"{async_pager.__class__.__name__}<")
+
         responses = []
         async for response in async_pager:  # pragma: no branch
             responses.append(response)
@@ -7653,6 +7677,9 @@
 
         pager = client.list_subscriptions(request=sample_request)
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, pubsub.Subscription) for i in results)
@@ -9030,6 +9057,9 @@
 
         pager = client.list_snapshots(request=sample_request)
 
+        assert pager.next_page_token == "abc"
+        assert str(pager).startswith(f"{pager.__class__.__name__}<")
+
         results = list(pager)
         assert len(results) == 6
         assert all(isinstance(i, pubsub.Snapshot) for i in results)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/conftest.py 
new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/conftest.py
--- old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/conftest.py     
2026-06-02 16:13:29.000000000 +0200
+++ new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/conftest.py     
2026-08-06 07:54:31.000000000 +0200
@@ -39,11 +39,27 @@
 
 @pytest.fixture(scope="function")
 def span_exporter():
+    """Provides an InMemorySpanExporter for testing OpenTelemetry traces.
+
+    Registers a SimpleSpanProcessor with the global TracerProvider at start,
+    and removes it during teardown to prevent trace/span processor accumulation
+    and test pollution across tests.
+    """
     exporter = InMemorySpanExporter()
     processor = SimpleSpanProcessor(exporter)
     provider = trace.get_tracer_provider()
     provider.add_span_processor(processor)
-    yield exporter
+    try:
+        yield exporter
+    finally:
+        if hasattr(provider, "_active_span_processor") and hasattr(
+            provider._active_span_processor, "_span_processors"
+        ):
+            processors = provider._active_span_processor._span_processors
+            if isinstance(processors, tuple):
+                provider._active_span_processor._span_processors = tuple(
+                    p for p in processors if p is not processor
+                )
 
 
 @pytest.fixture()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/publisher/batch/test_thread.py
 
new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/publisher/batch/test_thread.py
--- 
old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/publisher/batch/test_thread.py
  2026-06-02 16:13:29.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/publisher/batch/test_thread.py
  2026-08-06 07:54:31.000000000 +0200
@@ -13,7 +13,6 @@
 # limitations under the License.
 
 import datetime
-import sys
 import threading
 import time
 from unittest import mock
@@ -723,9 +722,6 @@
 
 
 # Refer https://opentelemetry.io/docs/languages/python/#version-support
[email protected](
-    sys.version_info < (3, 8), reason="Open Telemetry requires python3.8 or 
higher"
-)
 def test_open_telemetry_commit_publish_rpc_span_none(span_exporter):
     """
     Test scenario where OpenTelemetry is enabled, publish RPC
@@ -771,9 +767,6 @@
 
 
 # Refer https://opentelemetry.io/docs/languages/python/#version-support
[email protected](
-    sys.version_info < (3, 8), reason="Open Telemetry requires python3.8 or 
higher"
-)
 def test_open_telemetry_commit_publish_rpc_exception(span_exporter):
     TOPIC = "projects/projectID/topics/topicID"
     batch = create_batch(topic=TOPIC, enable_open_telemetry=True)
@@ -819,9 +812,6 @@
 
 
 # Refer https://opentelemetry.io/docs/languages/python/#version-support
[email protected](
-    sys.version_info < (3, 8), reason="Open Telemetry requires python3.8 or 
higher"
-)
 def test_opentelemetry_commit_sampling(span_exporter):
     TOPIC = "projects/projectID/topics/topic"
     batch = create_batch(
@@ -886,9 +876,6 @@
         assert span.events[1].name == "publish end"
 
 
[email protected](
-    sys.version_info < (3, 8), reason="Open Telemetry requires python3.8 or 
higher"
-)
 def test_opentelemetry_commit(span_exporter):
     TOPIC = "projects/projectID/topics/topic"
     batch = create_batch(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/publisher/test_publisher_client.py
 
new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/publisher/test_publisher_client.py
--- 
old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/publisher/test_publisher_client.py
      2026-06-02 16:13:30.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/publisher/test_publisher_client.py
      2026-08-06 07:54:29.000000000 +0200
@@ -16,7 +16,6 @@
 
 import inspect
 import math
-import sys
 import time
 from typing import Any, Callable, TypeVar, cast
 from unittest import mock
@@ -154,28 +153,13 @@
 )
 @typed_flaky
 def test_open_telemetry_publisher_options(creds, enable_open_telemetry):
-    if sys.version_info >= (3, 8) or enable_open_telemetry is False:
-        client = publisher.Client(
-            publisher_options=types.PublisherOptions(
-                enable_open_telemetry_tracing=enable_open_telemetry
-            ),
-            credentials=creds,
-        )
-        assert client._open_telemetry_enabled == enable_open_telemetry
-    else:
-        # Open Telemetry is not supported and hence disabled for Python
-        # versions 3.7 or below
-        with pytest.warns(
-            RuntimeWarning,
-            match="Open Telemetry for Python version 3.7 or lower is not 
supported. Disabling Open Telemetry tracing.",
-        ):
-            client = publisher.Client(
-                publisher_options=types.PublisherOptions(
-                    enable_open_telemetry_tracing=enable_open_telemetry
-                ),
-                credentials=creds,
-            )
-            assert client._open_telemetry_enabled is False
+    client = publisher.Client(
+        publisher_options=types.PublisherOptions(
+            enable_open_telemetry_tracing=enable_open_telemetry
+        ),
+        credentials=creds,
+    )
+    assert client._open_telemetry_enabled == enable_open_telemetry
 
 
 def test_opentelemetry_context_setter():
@@ -185,10 +169,6 @@
     assert "googclient_key" in msg.attributes.keys()
 
 
[email protected](
-    sys.version_info < (3, 8),
-    reason="Open Telemetry not supported below Python version 3.8",
-)
 def test_opentelemetry_context_propagation(creds, span_exporter):
     TOPIC = "projects/projectID/topics/topicID"
     client = publisher.Client(
@@ -208,10 +188,6 @@
     assert "googclient_traceparent" in args[0].attributes
 
 
[email protected](
-    sys.version_info < (3, 8),
-    reason="Open Telemetry not supported below Python version 3.8",
-)
 @pytest.mark.parametrize(
     "enable_open_telemetry",
     [
@@ -271,10 +247,6 @@
         assert len(spans) == 0
 
 
[email protected](
-    sys.version_info < (3, 8),
-    reason="Open Telemetry not supported below Python version 3.8",
-)
 def test_opentelemetry_flow_control_exception(creds, span_exporter):
     publisher_options = types.PublisherOptions(
         flow_control=types.PublishFlowControl(
@@ -299,16 +271,30 @@
 
     spans = span_exporter.get_finished_spans()
 
-    # Find the spans related to the second, failing publish call
-    failed_create_span = None
+    # Find the spans related to the second, failing publish call.
+    # We first find the failed flow control span.
     failed_fc_span = None
     for span in spans:
-        if span.name == "topicID create":
-            if span.status.status_code == trace.StatusCode.ERROR:
+        if (
+            span.name == "publisher flow control"
+            and span.status.status_code == trace.StatusCode.ERROR
+        ):
+            failed_fc_span = span
+            break
+
+    # Next, we find the corresponding 'create' span.
+    # Crucially, to prevent matching late-arriving or concurrent publish spans 
from other tests
+    # (e.g. background batch/sequencer threads from previous tests executing 
late),
+    # we filter for the 'topicID create' span that shares the EXACT same trace 
ID.
+    failed_create_span = None
+    if failed_fc_span:
+        for span in spans:
+            if (
+                span.name == "topicID create"
+                and span.context.trace_id == failed_fc_span.context.trace_id
+            ):
                 failed_create_span = span
-        elif span.name == "publisher flow control":
-            if span.status.status_code == trace.StatusCode.ERROR:
-                failed_fc_span = span
+                break
 
     assert failed_create_span is not None, "Failed 'topicID create' span not 
found"
     assert failed_fc_span is not None, "Failed 'publisher flow control' span 
not found"
@@ -332,10 +318,6 @@
     assert has_exception_event, "Exception event not found in failed create 
span"
 
 
[email protected](
-    sys.version_info < (3, 8),
-    reason="Open Telemetry not supported below Python version 3.8",
-)
 def test_opentelemetry_publish(creds, span_exporter):
     TOPIC = "projects/projectID/topics/topicID"
     client = publisher.Client(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/subscriber/test_dispatcher.py
 
new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/subscriber/test_dispatcher.py
--- 
old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/subscriber/test_dispatcher.py
   2026-06-02 16:13:28.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/subscriber/test_dispatcher.py
   2026-08-06 07:54:34.000000000 +0200
@@ -14,7 +14,6 @@
 
 import collections
 import queue
-import sys
 import threading
 from unittest import mock
 
@@ -403,10 +402,6 @@
     assert subscribe_span.events[1].name == "modack end"
 
 
[email protected](
-    sys.version_info < (3, 8),
-    reason="Open Telemetry not supported below Python version 3.8",
-)
 def test_opentelemetry_ack(span_exporter):
     manager = mock.create_autospec(
         streaming_pull_manager.StreamingPullManager, instance=True
@@ -602,10 +597,6 @@
             assert ctor_call.kwargs["daemon"]
 
 
[email protected](
-    sys.version_info < (3, 8),
-    reason="Open Telemetry not supported below Python version 3.8",
-)
 def test_opentelemetry_retry_acks(span_exporter):
     manager = mock.create_autospec(
         streaming_pull_manager.StreamingPullManager, instance=True
@@ -789,10 +780,6 @@
     assert subscribe_span.events[0].name == "modack end"
 
 
[email protected](
-    sys.version_info < (3, 8),
-    reason="Open Telemetry not supported below Python version 3.8",
-)
 def test_opentelemetry_retry_nacks(span_exporter):
     manager = mock.create_autospec(
         streaming_pull_manager.StreamingPullManager, instance=True
@@ -959,10 +946,6 @@
     manager.maybe_resume_consumer.assert_called_once()
 
 
[email protected](
-    sys.version_info < (3, 8),
-    reason="Open Telemetry not supported below Python version 3.8",
-)
 def test_opentelemetry_nack(span_exporter):
     manager = mock.create_autospec(
         streaming_pull_manager.StreamingPullManager, instance=True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/subscriber/test_streaming_pull_manager.py
 
new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/subscriber/test_streaming_pull_manager.py
--- 
old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/subscriber/test_streaming_pull_manager.py
       2026-06-02 16:13:26.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/subscriber/test_streaming_pull_manager.py
       2026-08-06 07:54:30.000000000 +0200
@@ -16,7 +16,6 @@
 import logging
 import math
 import queue
-import sys
 import threading
 import time
 import types as stdlib_types
@@ -629,10 +628,6 @@
     assert manager._on_hold_bytes == 0  # should be auto-corrected
 
 
[email protected](
-    sys.version_info < (3, 8),
-    reason="Open Telemetry not supported below Python version 3.8",
-)
 @pytest.mark.parametrize(
     "receipt_modack",
     [
@@ -2823,10 +2818,6 @@
     assert future3.result() == subscriber_exceptions.AcknowledgeStatus.SUCCESS
 
 
[email protected](
-    sys.version_info < (3, 8),
-    reason="Open Telemetry not supported below Python version 3.8",
-)
 def test_opentelemetry__on_response_subscribe_span_create(span_exporter):
     manager, _, _, leaser, _, _ = make_running_manager(
         enable_open_telemetry=True,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/subscriber/test_subscriber_client.py
 
new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/subscriber/test_subscriber_client.py
--- 
old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/subscriber/test_subscriber_client.py
    2026-06-02 16:13:27.000000000 +0200
+++ 
new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/subscriber/test_subscriber_client.py
    2026-08-06 07:54:34.000000000 +0200
@@ -11,8 +11,6 @@
 # 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 sys
 from unittest import mock
 
 import grpc
@@ -345,17 +343,9 @@
     options = types.SubscriberOptions(
         enable_open_telemetry_tracing=enable_open_telemetry,
     )
-    if sys.version_info >= (3, 8) or enable_open_telemetry is False:
-        client = subscriber.Client(credentials=creds, 
subscriber_options=options)
-        assert client.subscriber_options == options
-        assert client._open_telemetry_enabled == enable_open_telemetry
-    else:
-        with pytest.warns(
-            RuntimeWarning,
-            match="Open Telemetry for Python version 3.7 or lower is not 
supported. Disabling Open Telemetry tracing.",
-        ):
-            client = subscriber.Client(credentials=creds, 
subscriber_options=options)
-            assert client._open_telemetry_enabled is False
+    client = subscriber.Client(credentials=creds, subscriber_options=options)
+    assert client.subscriber_options == options
+    assert client._open_telemetry_enabled == enable_open_telemetry
 
 
 def test_opentelemetry_propagator_get():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/test_futures.py 
new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/test_futures.py
--- old/google_cloud_pubsub-2.39.0/tests/unit/pubsub_v1/test_futures.py 
2026-06-02 16:13:26.000000000 +0200
+++ new/google_cloud_pubsub-2.39.1/tests/unit/pubsub_v1/test_futures.py 
2026-08-06 07:54:32.000000000 +0200
@@ -13,7 +13,6 @@
 # limitations under the License.
 
 import concurrent.futures
-import sys
 import threading
 import time
 from unittest import mock
@@ -117,10 +116,6 @@
     assert "concurrent.futures" in error_msg
 
 
[email protected](
-    sys.version_info < (3, 8),
-    reason="InvalidStateError is only available in Python 3.8+",
-)
 def test_set_result_once_only():
     future = _future()
     future.set_result("12345")
@@ -128,10 +123,6 @@
         future.set_result("67890")
 
 
[email protected](
-    sys.version_info < (3, 8),
-    reason="InvalidStateError is only available in Python 3.8+",
-)
 def test_set_exception_once_only():
     future = _future()
     future.set_exception(ValueError("wah wah"))

Reply via email to