Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package
python-google-cloud-appengine-logging for openSUSE:Factory checked in at
2026-10-08 11:59:33
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-google-cloud-appengine-logging (Old)
and
/work/SRC/openSUSE:Factory/.python-google-cloud-appengine-logging.new.3698736
(New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-google-cloud-appengine-logging"
Thu Oct 8 11:59:33 2026 rev:8 rq:1383209 version:1.11.0
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-google-cloud-appengine-logging/python-google-cloud-appengine-logging.changes
2026-07-15 17:02:07.700181688 +0200
+++
/work/SRC/openSUSE:Factory/.python-google-cloud-appengine-logging.new.3698736/python-google-cloud-appengine-logging.changes
2026-10-08 12:00:26.225598859 +0200
@@ -1,0 +2,7 @@
+Tue Oct 6 10:37:34 UTC 2026 - John Paul Adrian Glaubitz
<[email protected]>
+
+- Update to 1.11.0
+ * declare Python3.15 support
+- Update BuildRequires and Requires from setup.py
+
+-------------------------------------------------------------------
Old:
----
google_cloud_appengine_logging-1.10.0.tar.gz
New:
----
google_cloud_appengine_logging-1.11.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-google-cloud-appengine-logging.spec ++++++
--- /var/tmp/diff_new_pack.IrxNZS/_old 2026-10-08 12:00:27.339645290 +0200
+++ /var/tmp/diff_new_pack.IrxNZS/_new 2026-10-08 12:00:27.342645415 +0200
@@ -18,31 +18,28 @@
%{?sle15_python_module_pythons}
Name: python-google-cloud-appengine-logging
-Version: 1.10.0
+Version: 1.11.0
Release: 0
Summary: Google Cloud Appengine Logging API client library
License: Apache-2.0
URL:
https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-appengine-logging
Source:
https://files.pythonhosted.org/packages/source/g/google_cloud_appengine_logging/google_cloud_appengine_logging-%{version}.tar.gz
-BuildRequires: %{python_module grpcio}
+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 pip}
BuildRequires: %{python_module pytest}
BuildRequires: %{python_module wheel}
BuildRequires: python-rpm-macros
# SECTION test requirements
-BuildRequires: %{python_module google-api-core >= 2.11.0}
-%if %python_version_nodots < 313
-BuildRequires: %{python_module proto-plus >= 1.22.3}
-%else
-BuildRequires: %{python_module proto-plus >= 1.25.0}
-%endif
-BuildRequires: %{python_module protobuf >= 4.25.8}
+BuildRequires: %{python_module google-api-core >= 2.28.0}
+BuildRequires: %{python_module proto-plus >= 1.26.1}
+BuildRequires: %{python_module protobuf >= 6.33.5}
# /SECTION
BuildRequires: fdupes
-Requires: python-google-api-core >= 2.11.0
+Requires: python-google-api-core >= 2.28.0
Requires: python-google-auth >= 2.14.1
%if %python_version_nodots < 314
-Requires: python-grpcio >= 1.33.2
+Requires: python-grpcio >= 1.59.0
%else
Requires: python-grpcio >= 1.75.1
%endif
++++++ google_cloud_appengine_logging-1.10.0.tar.gz ->
google_cloud_appengine_logging-1.11.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/google_cloud_appengine_logging-1.10.0/PKG-INFO
new/google_cloud_appengine_logging-1.11.0/PKG-INFO
--- old/google_cloud_appengine_logging-1.10.0/PKG-INFO 2026-06-02
16:17:55.891806600 +0200
+++ new/google_cloud_appengine_logging-1.11.0/PKG-INFO 2026-10-01
18:18:32.175500000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: google-cloud-appengine-logging
-Version: 1.10.0
+Version: 1.11.0
Summary: Google Cloud Appengine Logging API client library
Home-page:
https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-appengine-logging
Author: Google LLC
@@ -17,17 +17,17 @@
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
+Classifier: Programming Language :: Python :: 3.15
Classifier: Operating System :: OS Independent
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.28.0
Requires-Dist: google-auth!=2.24.0,!=2.25.0,<3.0.0,>=2.14.1
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: proto-plus<2.0.0,>=1.26.1
+Requires-Dist: protobuf<8.0.0,>=6.33.5
Dynamic: author
Dynamic: author-email
Dynamic: classifier
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/google_cloud_appengine_logging-1.10.0/google/cloud/appengine_logging/gapic_version.py
new/google_cloud_appengine_logging-1.11.0/google/cloud/appengine_logging/gapic_version.py
---
old/google_cloud_appengine_logging-1.10.0/google/cloud/appengine_logging/gapic_version.py
2026-06-02 16:13:29.000000000 +0200
+++
new/google_cloud_appengine_logging-1.11.0/google/cloud/appengine_logging/gapic_version.py
2026-10-01 18:14:35.750750800 +0200
@@ -13,4 +13,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-__version__ = "1.10.0" # {x-release-please-version}
+__version__ = "1.11.0" # {x-release-please-version}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/google_cloud_appengine_logging-1.10.0/google/cloud/appengine_logging_v1/__init__.py
new/google_cloud_appengine_logging-1.11.0/google/cloud/appengine_logging_v1/__init__.py
---
old/google_cloud_appengine_logging-1.10.0/google/cloud/appengine_logging_v1/__init__.py
2026-06-02 16:13:28.000000000 +0200
+++
new/google_cloud_appengine_logging-1.11.0/google/cloud/appengine_logging_v1/__init__.py
2026-10-01 18:14:36.556749600 +0200
@@ -13,100 +13,24 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-import sys
-
import google.api_core as api_core
from google.cloud.appengine_logging_v1 import gapic_version as package_version
__version__ = package_version.__version__
-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.cloud.appengine_logging_v1.types.request_log",
+}
-from .types.request_log import LogLine, RequestLog, SourceLocation,
SourceReference
-if hasattr(api_core, "check_python_version") and hasattr(
- api_core, "check_dependency_versions"
-): # pragma: NO COVER
- api_core.check_python_version("google.cloud.appengine_logging_v1") #
type: ignore
- api_core.check_dependency_versions("google.cloud.appengine_logging_v1") #
type: ignore
-else: # pragma: NO COVER
- # An older version of api_core is installed which does not define the
- # functions above. We do equivalent checks manually.
- try:
- import warnings
-
- _py_version_str = sys.version.split()[0]
- _package_label = "google.cloud.appengine_logging_v1"
- if sys.version_info < (3, 10):
- warnings.warn(
- "You are using a non-supported Python version "
- + f"({_py_version_str}). Google will not post any further "
- + f"updates to {_package_label} supporting this Python
version. "
- + "Please upgrade to the latest Python version, or at "
- + f"least to Python 3.10, and then update {_package_label}.",
- FutureWarning,
- )
-
- 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)
- 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>"
- Returns:
- Tuple of integers for the parsed version string.
- """
- parts = []
- for part in version_string.split("."):
- try:
- parts.append(int(part))
- except ValueError:
- # If it's a non-numeric part (e.g., '1.0.0b1' -> 'b1'),
stop here.
- # This is a simplification compared to
'packaging.parse_version', but sufficient
- # for comparing strictly numeric semantic versions.
- break
- return tuple(parts)
-
- def _get_version(dependency_name):
- try:
- version_string: str = metadata.version(dependency_name)
- parsed_version = parse_version_to_tuple(version_string)
- return (parsed_version, version_string)
- except Exception:
- # Catch exceptions from metadata.version() (e.g.,
PackageNotFoundError)
- # or errors during parse_version_to_tuple
- return (None, "--")
-
- _dependency_package = "google.protobuf"
- _next_supported_version = "4.25.8"
- _next_supported_version_tuple = (4, 25, 8)
- _recommendation = " (we recommend 6.x)"
- (_version_used, _version_used_string) =
_get_version(_dependency_package)
- if _version_used and _version_used < _next_supported_version_tuple:
- warnings.warn(
- f"Package {_package_label} depends on "
- + f"{_dependency_package}, currently installed at version "
- + f"{_version_used_string}. Future updates to "
- + f"{_package_label} will require {_dependency_package} at "
- + f"version {_next_supported_version} or
higher{_recommendation}."
- + " Please ensure "
- + "that either (a) your Python environment doesn't pin the "
- + f"version of {_dependency_package}, so that updates to "
- + f"{_package_label} can require the higher version, or "
- + "(b) you manually update your Python environment to use at "
- + f"least version {_next_supported_version} of "
- + f"{_dependency_package}.",
- FutureWarning,
- )
- except Exception:
- warnings.warn(
- "Could not determine the version of Python "
- + "currently being used. To continue receiving "
- + "updates for {_package_label}, ensure you are "
- + "using a supported version of Python; see "
- + "https://devguide.python.org/versions/"
- )
+from .types.request_log import LogLine, RequestLog, SourceLocation,
SourceReference
__all__ = (
"LogLine",
@@ -114,3 +38,6 @@
"SourceLocation",
"SourceReference",
)
+
+api_core.check_python_version("google.cloud.appengine_logging_v1")
+api_core.check_dependency_versions("google.cloud.appengine_logging_v1")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/google_cloud_appengine_logging-1.10.0/google/cloud/appengine_logging_v1/_compat.py
new/google_cloud_appengine_logging-1.11.0/google/cloud/appengine_logging_v1/_compat.py
---
old/google_cloud_appengine_logging-1.10.0/google/cloud/appengine_logging_v1/_compat.py
1970-01-01 01:00:00.000000000 +0100
+++
new/google_cloud_appengine_logging-1.11.0/google/cloud/appengine_logging_v1/_compat.py
2026-10-01 18:14:37.245748500 +0200
@@ -0,0 +1,262 @@
+# -*- coding: utf-8 -*-
+# Copyright 2026 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+"""A compatibility module for older versions of google-api-core."""
+
+import json
+import os
+from typing import Any, Dict, List, Optional, Tuple
+from urllib.parse import urlparse, urlunparse
+
+from google.api_core import path_template
+from google.api_core.universe import EmptyUniverseError
+from google.auth.exceptions import MutualTLSChannelError
+from google.protobuf import json_format
+
+try:
+ # note: `#type: ignore` is added because the return type for
`should_use_client_cert`
+ # is different than that of the fallback implementation below. This will
be removed once
+ # we bump the minimum supported version of google-auth.
+ from google.auth.transport.mtls import should_use_client_cert # type:
ignore
+except ImportError: # pragma: NO COVER
+
+ def should_use_client_cert():
+ """Returns whether client certificate should be used for mTLS."""
+ use_client_cert = os.getenv(
+ "GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
+ ).lower()
+ if use_client_cert not in ("true", "false"):
+ raise ValueError(
+ "Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must
be"
+ " either `true` or `false`"
+ )
+ return use_client_cert == "true"
+
+
+def read_environment_variables():
+ """Returns the environment variables used by the client.
+
+ Returns:
+ Tuple[bool, str, str]: returns the GOOGLE_API_USE_CLIENT_CERTIFICATE,
+ GOOGLE_API_USE_MTLS_ENDPOINT, and GOOGLE_CLOUD_UNIVERSE_DOMAIN
environment variables.
+
+ Raises:
+ ValueError: If GOOGLE_API_USE_CLIENT_CERTIFICATE is not
+ any of ["true", "false"].
+ google.auth.exceptions.MutualTLSChannelError: If
GOOGLE_API_USE_MTLS_ENDPOINT
+ is not any of ["auto", "never", "always"].
+ """
+ use_client_cert = should_use_client_cert()
+ use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT",
"auto").lower()
+ universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN")
+ if use_mtls_endpoint not in ("auto", "never", "always"):
+ raise MutualTLSChannelError(
+ "Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be
`never`,"
+ " `auto` or `always`"
+ )
+ return use_client_cert, use_mtls_endpoint, universe_domain_env
+
+
+DEFAULT_UNIVERSE = "googleapis.com"
+
+try:
+ from google.api_core.universe import get_default_mtls_endpoint
+except ImportError: # pragma: NO COVER
+
+ def get_default_mtls_endpoint(api_endpoint: Optional[str]) ->
Optional[str]:
+ """Converts api endpoint to mTLS endpoint.
+
+ Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to
+ "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com"
respectively.
+ Other URLs (including those that do not match these domain suffixes or
+ already contain '.mtls.') are passed through as-is.
+
+ Args:
+ api_endpoint (Optional[str]): the api endpoint to convert.
+
+ Returns:
+ Optional[str]: converted mTLS api endpoint.
+ """
+ if not api_endpoint or ".mtls." in api_endpoint.lower():
+ return api_endpoint
+
+ has_scheme = "://" in api_endpoint
+ if not has_scheme:
+ parsed = urlparse("//" + api_endpoint)
+ else:
+ parsed = urlparse(api_endpoint)
+
+ host = parsed.hostname
+ if not host:
+ return api_endpoint
+
+ port = f":{parsed.port}" if parsed.port else ""
+
+ lowered_host = host.lower()
+ suffix_sandbox = ".sandbox.googleapis.com"
+ suffix_google = ".googleapis.com"
+ if lowered_host.endswith(suffix_sandbox):
+ new_host = host[: -len(suffix_sandbox)] +
".mtls.sandbox.googleapis.com"
+ elif lowered_host.endswith(suffix_google):
+ new_host = host[: -len(suffix_google)] + ".mtls.googleapis.com"
+ else:
+ return api_endpoint
+
+ netloc = new_host + port
+ new_parsed = parsed._replace(netloc=netloc)
+
+ if not has_scheme:
+ return urlunparse(new_parsed)[2:]
+ else:
+ return urlunparse(new_parsed)
+
+
+try:
+ from google.api_core.universe import get_api_endpoint
+except ImportError: # pragma: NO COVER
+
+ def get_api_endpoint(
+ api_override: Optional[str],
+ universe_domain: str,
+ default_universe: str,
+ default_mtls_endpoint: Optional[str],
+ default_endpoint_template: str,
+ use_mtls: bool,
+ ) -> str:
+ """Return the API endpoint used by the client.
+
+ Args:
+ api_override (Optional[str]): The API endpoint override. If
specified,
+ this is always returned.
+ universe_domain (str): The universe domain used by the client.
+ default_universe (str): The default universe domain.
+ default_mtls_endpoint (Optional[str]): The default mTLS endpoint.
+ default_endpoint_template (str): The default endpoint template
containing
+ a placeholder `{UNIVERSE_DOMAIN}`.
+ use_mtls (bool): Whether to use the mTLS endpoint.
+
+ Returns:
+ str: The API endpoint to be used by the client.
+
+ Raises:
+ google.auth.exceptions.MutualTLSChannelError: If mTLS is requested
but
+ not supported in the configured universe domain.
+ ValueError: If mTLS is requested but no mTLS endpoint is available.
+ """
+ if api_override is not None:
+ return api_override
+
+ if use_mtls:
+ if universe_domain.lower() != default_universe.lower():
+ raise MutualTLSChannelError(
+ f"mTLS is not supported in any universe other than
{default_universe}."
+ )
+ if not default_mtls_endpoint:
+ raise ValueError("mTLS endpoint is not available.")
+ return default_mtls_endpoint
+ else:
+ return
default_endpoint_template.format(UNIVERSE_DOMAIN=universe_domain)
+
+
+try:
+ from google.api_core.universe import get_universe_domain
+except ImportError: # pragma: NO COVER
+
+ def get_universe_domain(
+ *potential_universes: Optional[str],
+ default_universe: str,
+ ) -> str:
+ """Return the universe domain used by the client.
+
+ Args:
+ *potential_universes (Optional[str]): Potential universe domains
in order of preference.
+ default_universe (str): The default universe domain.
+
+ Returns:
+ str: The universe domain to be used by the client.
+
+ Raises:
+ EmptyUniverseError: If the resolved universe domain is an empty
string.
+ """
+ resolved = next(
+ (x.strip() for x in potential_universes if x is not None),
+ default_universe,
+ )
+
+ if not resolved:
+ raise EmptyUniverseError()
+ return resolved
+
+
+try:
+ from google.api_core.rest_helpers import transcode_request # type: ignore
+except ImportError: # pragma: NO COVER
+
+ def transcode_request(
+ http_options: List[Dict[str, str]],
+ request: Any,
+ required_fields_default_values: Optional[Dict[str, Any]] = None,
+ rest_numeric_enums: bool = False,
+ ) -> Tuple[Dict[str, Any], Optional[str], Dict[str, Any]]:
+ """Transcodes a request into HTTP method, URI, body, and query
parameters.
+
+ Args:
+ http_options (List[Dict[str, str]]): List of HTTP transcoding
rules.
+ request (Any): The protobuf or proto-plus request message.
+ required_fields_default_values (Optional[Dict[str, Any]]):
Dictionary
+ of required fields default values to merge into query
parameters if missing.
+ rest_numeric_enums (bool): Whether to encode enums as integers.
+
+ Returns:
+ Tuple[Dict[str, Any], Optional[str], Dict[str, Any]]: A tuple
containing:
+ - The raw transcoded request dictionary (containing keys like
'uri', 'method').
+ - The serialized request body JSON string, or None if no body.
+ - The query parameters dictionary.
+ """
+ if request is None:
+ raise TypeError("request cannot be None")
+
+ # Convert proto-plus message to its underlying protobuf message if
needed
+ pb_request = getattr(request, "_pb", request)
+
+ transcoded_request = path_template.transcode(http_options, pb_request)
+
+ body_json = None
+ if transcoded_request.get("body") is not None:
+ body_json = json_format.MessageToJson(
+ transcoded_request["body"],
+ use_integers_for_enums=rest_numeric_enums,
+ )
+
+ query_params_json = {}
+ if transcoded_request.get("query_params") is not None:
+ query_params_json = json.loads(
+ json_format.MessageToJson(
+ transcoded_request["query_params"],
+ use_integers_for_enums=rest_numeric_enums,
+ )
+ )
+
+ # If required_fields_default_values is provided, we merge default
values for missing
+ # required fields into the query parameters.
+ if required_fields_default_values:
+ for k, v in required_fields_default_values.items():
+ if k not in query_params_json:
+ query_params_json[k] = v
+
+ if rest_numeric_enums:
+ query_params_json["$alt"] = "json;enum-encoding=int"
+
+ return transcoded_request, body_json, query_params_json
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/google_cloud_appengine_logging-1.10.0/google/cloud/appengine_logging_v1/gapic_version.py
new/google_cloud_appengine_logging-1.11.0/google/cloud/appengine_logging_v1/gapic_version.py
---
old/google_cloud_appengine_logging-1.10.0/google/cloud/appengine_logging_v1/gapic_version.py
2026-06-02 16:13:29.000000000 +0200
+++
new/google_cloud_appengine_logging-1.11.0/google/cloud/appengine_logging_v1/gapic_version.py
2026-10-01 18:14:35.750750800 +0200
@@ -13,4 +13,4 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-__version__ = "1.10.0" # {x-release-please-version}
+__version__ = "1.11.0" # {x-release-please-version}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/google_cloud_appengine_logging-1.10.0/google_cloud_appengine_logging.egg-info/PKG-INFO
new/google_cloud_appengine_logging-1.11.0/google_cloud_appengine_logging.egg-info/PKG-INFO
---
old/google_cloud_appengine_logging-1.10.0/google_cloud_appengine_logging.egg-info/PKG-INFO
2026-06-02 16:17:55.000000000 +0200
+++
new/google_cloud_appengine_logging-1.11.0/google_cloud_appengine_logging.egg-info/PKG-INFO
2026-10-01 18:18:32.153334000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: google-cloud-appengine-logging
-Version: 1.10.0
+Version: 1.11.0
Summary: Google Cloud Appengine Logging API client library
Home-page:
https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-appengine-logging
Author: Google LLC
@@ -17,17 +17,17 @@
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
+Classifier: Programming Language :: Python :: 3.15
Classifier: Operating System :: OS Independent
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.28.0
Requires-Dist: google-auth!=2.24.0,!=2.25.0,<3.0.0,>=2.14.1
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: proto-plus<2.0.0,>=1.26.1
+Requires-Dist: protobuf<8.0.0,>=6.33.5
Dynamic: author
Dynamic: author-email
Dynamic: classifier
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/google_cloud_appengine_logging-1.10.0/google_cloud_appengine_logging.egg-info/SOURCES.txt
new/google_cloud_appengine_logging-1.11.0/google_cloud_appengine_logging.egg-info/SOURCES.txt
---
old/google_cloud_appengine_logging-1.10.0/google_cloud_appengine_logging.egg-info/SOURCES.txt
2026-06-02 16:17:55.000000000 +0200
+++
new/google_cloud_appengine_logging-1.11.0/google_cloud_appengine_logging.egg-info/SOURCES.txt
2026-10-01 18:18:32.165553000 +0200
@@ -6,6 +6,7 @@
google/cloud/appengine_logging/gapic_version.py
google/cloud/appengine_logging/py.typed
google/cloud/appengine_logging_v1/__init__.py
+google/cloud/appengine_logging_v1/_compat.py
google/cloud/appengine_logging_v1/gapic_metadata.json
google/cloud/appengine_logging_v1/gapic_version.py
google/cloud/appengine_logging_v1/py.typed
@@ -22,4 +23,5 @@
tests/unit/__init__.py
tests/unit/gapic/__init__.py
tests/unit/gapic/appengine_logging_v1/__init__.py
-tests/unit/gapic/appengine_logging_v1/test_appengine_logging_v1.py
\ No newline at end of file
+tests/unit/gapic/appengine_logging_v1/test_appengine_logging_v1.py
+tests/unit/gapic/appengine_logging_v1/test_compat.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/google_cloud_appengine_logging-1.10.0/google_cloud_appengine_logging.egg-info/requires.txt
new/google_cloud_appengine_logging-1.11.0/google_cloud_appengine_logging.egg-info/requires.txt
---
old/google_cloud_appengine_logging-1.10.0/google_cloud_appengine_logging.egg-info/requires.txt
2026-06-02 16:17:55.000000000 +0200
+++
new/google_cloud_appengine_logging-1.11.0/google_cloud_appengine_logging.egg-info/requires.txt
2026-10-01 18:18:32.154017200 +0200
@@ -1,11 +1,8 @@
-google-api-core[grpc]<3.0.0,>=2.17.1
+google-api-core[grpc]<3.0.0,>=2.28.0
google-auth!=2.24.0,!=2.25.0,<3.0.0,>=2.14.1
grpcio<2.0.0,>=1.59.0
-proto-plus<2.0.0,>=1.22.3
-protobuf<8.0.0,>=4.25.8
-
-[:python_version >= "3.13"]
-proto-plus<2.0.0,>=1.25.0
+proto-plus<2.0.0,>=1.26.1
+protobuf<8.0.0,>=6.33.5
[:python_version >= "3.14"]
grpcio<2.0.0,>=1.75.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/google_cloud_appengine_logging-1.10.0/setup.py
new/google_cloud_appengine_logging-1.11.0/setup.py
--- old/google_cloud_appengine_logging-1.10.0/setup.py 2026-06-02
16:13:27.000000000 +0200
+++ new/google_cloud_appengine_logging-1.11.0/setup.py 2026-10-01
18:14:35.911750600 +0200
@@ -31,7 +31,10 @@
with open(
os.path.join(package_root,
"google/cloud/appengine_logging/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]
@@ -41,15 +44,14 @@
release_status = "Development Status :: 5 - Production/Stable"
dependencies = [
- "google-api-core[grpc] >= 2.17.1, <3.0.0",
+ "google-api-core[grpc] >= 2.28.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.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",
+ "proto-plus >= 1.26.1, <2.0.0",
+ "protobuf >= 6.33.5, < 8.0.0",
]
extras = {}
url =
"https://github.com/googleapis/google-cloud-python/tree/main/packages/google-cloud-appengine-logging"
@@ -86,6 +88,7 @@
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
+ "Programming Language :: Python :: 3.15",
"Operating System :: OS Independent",
"Topic :: Internet",
],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/google_cloud_appengine_logging-1.10.0/tests/unit/gapic/appengine_logging_v1/test_compat.py
new/google_cloud_appengine_logging-1.11.0/tests/unit/gapic/appengine_logging_v1/test_compat.py
---
old/google_cloud_appengine_logging-1.10.0/tests/unit/gapic/appengine_logging_v1/test_compat.py
1970-01-01 01:00:00.000000000 +0100
+++
new/google_cloud_appengine_logging-1.11.0/tests/unit/gapic/appengine_logging_v1/test_compat.py
2026-10-01 18:14:38.649746400 +0200
@@ -0,0 +1,429 @@
+# -*- coding: utf-8 -*-
+# Copyright 2026 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+"""Tests for the compatibility module for older versions of google-api-core."""
+
+import json
+import os
+from unittest import mock
+
+import google.auth.transport.mtls
+import pytest
+from google.api_core.universe import EmptyUniverseError
+from google.auth.exceptions import MutualTLSChannelError
+from google.protobuf import descriptor_pb2
+
+from google.cloud.appengine_logging_v1._compat import (
+ get_api_endpoint,
+ get_default_mtls_endpoint,
+ get_universe_domain,
+ read_environment_variables,
+ should_use_client_cert,
+ transcode_request,
+)
+
+
+def test_get_universe_domain():
+ # When universe_domain is provided
+ assert get_universe_domain("foo.com", default_universe="default.com") ==
"foo.com"
+ assert (
+ get_universe_domain(" foo.com ", default_universe="default.com") ==
"foo.com"
+ )
+
+ # When universe_domain is None, falls back to default_universe
+ assert get_universe_domain(None, default_universe="default.com") ==
"default.com"
+
+ # When multiple potential universes are provided, resolves in order of
preference
+ assert (
+ get_universe_domain("foo.com", "bar.com",
default_universe="default.com")
+ == "foo.com"
+ )
+ assert (
+ get_universe_domain(None, "bar.com", default_universe="default.com")
+ == "bar.com"
+ )
+ assert (
+ get_universe_domain(None, None, default_universe="default.com") ==
"default.com"
+ )
+
+ # EmptyUniverseError raised when resolved value is empty string
+ with pytest.raises(EmptyUniverseError) as excinfo:
+ get_universe_domain("", default_universe="default.com")
+ assert str(excinfo.value) == "Universe Domain cannot be an empty string."
+
+ with pytest.raises(EmptyUniverseError) as excinfo:
+ get_universe_domain(" ", default_universe="default.com")
+ assert str(excinfo.value) == "Universe Domain cannot be an empty string."
+
+ with pytest.raises(EmptyUniverseError) as excinfo:
+ get_universe_domain(None, "", default_universe="default.com")
+ assert str(excinfo.value) == "Universe Domain cannot be an empty string."
+
+
+def test_get_default_mtls_endpoint():
+ # Test valid API endpoints
+ assert get_default_mtls_endpoint("foo.googleapis.com") ==
"foo.mtls.googleapis.com"
+ assert (
+ get_default_mtls_endpoint("foo.sandbox.googleapis.com")
+ == "foo.mtls.sandbox.googleapis.com"
+ )
+ # Test case-insensitivity
+ assert get_default_mtls_endpoint("foo.GoogleAPIs.com") ==
"foo.mtls.googleapis.com"
+ assert (
+ get_default_mtls_endpoint("foo.Sandbox.GoogleAPIs.com")
+ == "foo.mtls.sandbox.googleapis.com"
+ )
+
+ # Test valid API endpoints with schemes
+ assert (
+ get_default_mtls_endpoint("https://foo.googleapis.com")
+ == "https://foo.mtls.googleapis.com"
+ )
+ assert (
+ get_default_mtls_endpoint("http://foo.googleapis.com:8080/v1")
+ == "http://foo.mtls.googleapis.com:8080/v1"
+ )
+
+ # Test valid API endpoints with ports
+ assert (
+ get_default_mtls_endpoint("foo.googleapis.com:443")
+ == "foo.mtls.googleapis.com:443"
+ )
+ assert (
+ get_default_mtls_endpoint("foo.sandbox.googleapis.com:443")
+ == "foo.mtls.sandbox.googleapis.com:443"
+ )
+ # Test case-insensitivity with ports
+ assert (
+ get_default_mtls_endpoint("foo.GoogleAPIs.com:443")
+ == "foo.mtls.googleapis.com:443"
+ )
+ assert (
+ get_default_mtls_endpoint("foo.Sandbox.GoogleAPIs.com:443")
+ == "foo.mtls.sandbox.googleapis.com:443"
+ )
+
+ # Test endpoints that shouldn't be converted
+ assert (
+ get_default_mtls_endpoint("foo.mtls.googleapis.com")
+ == "foo.mtls.googleapis.com"
+ )
+ assert get_default_mtls_endpoint("foo.com") == "foo.com"
+ assert get_default_mtls_endpoint("foo.com:8080") == "foo.com:8080"
+
+ # Test empty/None endpoints
+ assert get_default_mtls_endpoint("") == ""
+ assert get_default_mtls_endpoint(None) is None
+
+ # Test endpoints without host
+ assert get_default_mtls_endpoint("http://") == "http://"
+ assert get_default_mtls_endpoint("https://") == "https://"
+
+
[email protected](
+
"api_override,universe_domain,default_universe,default_mtls_endpoint,default_endpoint_template,use_mtls,expected",
+ [
+ (
+ "foo.com",
+ "googleapis.com",
+ "googleapis.com",
+ "foo.mtls.googleapis.com",
+ "foo.{UNIVERSE_DOMAIN}",
+ True,
+ "foo.com",
+ ),
+ (
+ None,
+ "googleapis.com",
+ "googleapis.com",
+ "foo.mtls.googleapis.com",
+ "foo.{UNIVERSE_DOMAIN}",
+ True,
+ "foo.mtls.googleapis.com",
+ ),
+ (
+ None,
+ "googleapis.com",
+ "googleapis.com",
+ "foo.mtls.googleapis.com",
+ "foo.{UNIVERSE_DOMAIN}",
+ False,
+ "foo.googleapis.com",
+ ),
+ (
+ None,
+ "bar.com",
+ "googleapis.com",
+ "foo.mtls.googleapis.com",
+ "foo.{UNIVERSE_DOMAIN}",
+ True,
+ MutualTLSChannelError,
+ ),
+ (
+ None,
+ "googleapis.com",
+ "googleapis.com",
+ None,
+ "foo.{UNIVERSE_DOMAIN}",
+ True,
+ ValueError,
+ ),
+ ],
+)
+def test_get_api_endpoint(
+ api_override,
+ universe_domain,
+ default_universe,
+ default_mtls_endpoint,
+ default_endpoint_template,
+ use_mtls,
+ expected,
+):
+ if isinstance(expected, type) and issubclass(expected, Exception):
+ with pytest.raises(expected):
+ get_api_endpoint(
+ api_override,
+ universe_domain,
+ default_universe,
+ default_mtls_endpoint,
+ default_endpoint_template,
+ use_mtls,
+ )
+ else:
+ assert (
+ get_api_endpoint(
+ api_override,
+ universe_domain,
+ default_universe,
+ default_mtls_endpoint,
+ default_endpoint_template,
+ use_mtls,
+ )
+ == expected
+ )
+
+
+def test_should_use_client_cert_fallback_env():
+ with mock.patch.dict(
+ os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "true"}, clear=True
+ ):
+ assert should_use_client_cert() is True
+
+ with mock.patch.dict(
+ os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "false"}, clear=True
+ ):
+ assert should_use_client_cert() is False
+
+ with mock.patch.dict(
+ os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "invalid"},
clear=True
+ ):
+ if not hasattr(google.auth.transport.mtls, "should_use_client_cert"):
+ with pytest.raises(
+ ValueError,
+ match="Environment variable
`GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`",
+ ):
+ should_use_client_cert()
+
+
+def test_transcode_basic():
+ # We use FieldDescriptorProto as it has standard primitive fields and
nested messages.
+ http_options = [
+ {
+ "method": "get",
+ "uri": "/v1/test/{name}",
+ }
+ ]
+
+ request = descriptor_pb2.FieldDescriptorProto()
+ request.name = "my-field"
+ request.number = 123
+
+ transcoded, body, query_params = transcode_request(http_options, request)
+
+ assert transcoded["method"] == "get"
+ assert transcoded["uri"] == "/v1/test/my-field"
+ assert body is None
+ # 'number' should be in query parameters
+ assert "number" in query_params
+ assert query_params["number"] == 123
+
+
+def test_transcode_with_nested_field():
+ http_options = [
+ {
+ "method": "get",
+ "uri": "/v1/test/{options.deprecated}/{name}",
+ }
+ ]
+
+ request = descriptor_pb2.FieldDescriptorProto()
+ request.name = "my-field"
+ request.options.deprecated = True
+ request.number = 123
+
+ transcoded, body, query_params = transcode_request(http_options, request)
+
+ assert transcoded["method"] == "get"
+ assert transcoded["uri"] == "/v1/test/True/my-field"
+ assert body is None
+ assert "number" in query_params
+ assert query_params["number"] == 123
+
+
+def test_transcode_with_body():
+ http_options = [
+ {
+ "method": "post",
+ "uri": "/v1/test/{name}",
+ "body": "options",
+ }
+ ]
+
+ request = descriptor_pb2.FieldDescriptorProto()
+ request.name = "my-field"
+ request.options.deprecated = True
+ request.number = 123
+
+ transcoded, body, query_params = transcode_request(http_options, request)
+
+ assert transcoded["method"] == "post"
+ assert transcoded["uri"] == "/v1/test/my-field"
+ assert body is not None
+ body_data = json.loads(body)
+ assert body_data["deprecated"] is True
+ # Query parameters should not contain 'options' (the body)
+ assert "number" in query_params
+ assert query_params["number"] == 123
+ assert "options" not in query_params
+
+
+def test_transcode_with_required_fields_default_values():
+ http_options = [
+ {
+ "method": "get",
+ "uri": "/v1/test/{name}",
+ }
+ ]
+
+ request = descriptor_pb2.FieldDescriptorProto()
+ request.name = "my-field"
+
+ required_defaults = {"requiredQueryParam": "default-val"}
+
+ transcoded, body, query_params = transcode_request(
+ http_options,
+ request,
+ required_fields_default_values=required_defaults,
+ )
+
+ assert query_params["requiredQueryParam"] == "default-val"
+
+
+def test_transcode_with_numeric_enums():
+ http_options = [
+ {
+ "method": "get",
+ "uri": "/v1/test/{name}",
+ }
+ ]
+
+ request = descriptor_pb2.FieldDescriptorProto()
+ request.name = "my-field"
+ request.type = descriptor_pb2.FieldDescriptorProto.TYPE_STRING
+
+ # Without numeric enums
+ _, _, query_params = transcode_request(
+ http_options, request, rest_numeric_enums=False
+ )
+ assert query_params["type"] == "TYPE_STRING"
+
+ # With numeric enums
+ _, _, query_params = transcode_request(
+ http_options, request, rest_numeric_enums=True
+ )
+ # Type number for TYPE_STRING is 9
+ assert query_params["type"] == 9
+ assert query_params["$alt"] == "json;enum-encoding=int"
+
+
+def test_transcode_no_query_params():
+ http_options = [{"method": "get", "uri": "/v1/test"}]
+ request = descriptor_pb2.FieldDescriptorProto()
+
+ with mock.patch(
+ "google.api_core.path_template.transcode",
+ return_value={"method": "get", "uri": "/v1/test"},
+ ):
+ transcoded, body, query_params = transcode_request(http_options,
request)
+ assert query_params == {}
+
+
+def test_transcode_with_required_fields_existing_key():
+ http_options = [
+ {
+ "method": "get",
+ "uri": "/v1/test",
+ }
+ ]
+
+ request = descriptor_pb2.FieldDescriptorProto()
+ request.name = "custom-name"
+
+ required_defaults = {"name": "default-name"}
+
+ transcoded, body, query_params = transcode_request(
+ http_options,
+ request,
+ required_fields_default_values=required_defaults,
+ )
+
+ assert query_params["name"] == "custom-name"
+
+
+def test_transcode_request_invalid_request():
+ http_options = [{"method": "get", "uri": "/v1/test"}]
+ with pytest.raises(TypeError, match="request cannot be None"):
+ transcode_request(http_options, None)
+
+
+def test_transcode_request_proto_plus_wrapper():
+ http_options = [{"method": "get", "uri": "/v1/test/{name}"}]
+ mock_pb = descriptor_pb2.FieldDescriptorProto()
+ mock_pb.name = "proto-plus-field"
+
+ mock_proto_plus = mock.Mock()
+ mock_proto_plus._pb = mock_pb
+
+ transcoded, _, _ = transcode_request(http_options, mock_proto_plus)
+ assert transcoded["uri"] == "/v1/test/proto-plus-field"
+
+
+def test_read_environment_variables():
+ with mock.patch.dict(
+ os.environ,
+ {
+ "GOOGLE_API_USE_CLIENT_CERTIFICATE": "true",
+ "GOOGLE_API_USE_MTLS_ENDPOINT": "always",
+ "GOOGLE_CLOUD_UNIVERSE_DOMAIN": "foo.com",
+ },
+ ):
+ use_cert, mtls_endpoint, universe_domain = read_environment_variables()
+ assert use_cert is True
+ assert mtls_endpoint == "always"
+ assert universe_domain == "foo.com"
+
+ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT":
"invalid"}):
+ with pytest.raises(MutualTLSChannelError):
+ read_environment_variables()