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"))