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

Reply via email to