feat: add v1 api for google-cloud-maintenance-api (#14998) · googleapis/google-cloud-python@1028946
1+# -*- coding: utf-8 -*-
2+# Copyright 2025 Google LLC
3+#
4+# Licensed under the Apache License, Version 2.0 (the "License");
5+# you may not use this file except in compliance with the License.
6+# You may obtain a copy of the License at
7+#
8+# http://www.apache.org/licenses/LICENSE-2.0
9+#
10+# Unless required by applicable law or agreed to in writing, software
11+# distributed under the License is distributed on an "AS IS" BASIS,
12+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+# See the License for the specific language governing permissions and
14+# limitations under the License.
15+#
16+import sys
17+18+import google.api_core as api_core
19+20+from google.cloud.maintenance_api_v1 import gapic_version as package_version
21+22+__version__ = package_version.__version__
23+24+if sys.version_info >= (3, 8): # pragma: NO COVER
25+from importlib import metadata
26+else: # pragma: NO COVER
27+# TODO(https://github.com/googleapis/python-api-core/issues/835): Remove
28+# this code path once we drop support for Python 3.7
29+import importlib_metadata as metadata
30+31+from .services.maintenance import MaintenanceAsyncClient, MaintenanceClient
32+from .types.maintenance_service import (
33+GetResourceMaintenanceRequest,
34+ListResourceMaintenancesRequest,
35+ListResourceMaintenancesResponse,
36+MaintenanceCategory,
37+MaintenanceControl,
38+MaintenanceSummary,
39+ResourceMaintenance,
40+SummarizeMaintenancesRequest,
41+SummarizeMaintenancesResponse,
42+)
43+44+if hasattr(api_core, "check_python_version") and hasattr(
45+api_core, "check_dependency_versions"
46+): # pragma: NO COVER
47+api_core.check_python_version("google.cloud.maintenance_api_v1") # type: ignore
48+api_core.check_dependency_versions("google.cloud.maintenance_api_v1") # type: ignore
49+else: # pragma: NO COVER
50+# An older version of api_core is installed which does not define the
51+# functions above. We do equivalent checks manually.
52+try:
53+import sys
54+import warnings
55+56+_py_version_str = sys.version.split()[0]
57+_package_label = "google.cloud.maintenance_api_v1"
58+if sys.version_info < (3, 9):
59+warnings.warn(
60+"You are using a non-supported Python version "
61++ f"({_py_version_str}). Google will not post any further "
62++ f"updates to {_package_label} supporting this Python version. "
63++ "Please upgrade to the latest Python version, or at "
64++ f"least to Python 3.9, and then update {_package_label}.",
65+FutureWarning,
66+ )
67+if sys.version_info[:2] == (3, 9):
68+warnings.warn(
69+f"You are using a Python version ({_py_version_str}) "
70++ f"which Google will stop supporting in {_package_label} in "
71++ "January 2026. Please "
72++ "upgrade to the latest Python version, or at "
73++ "least to Python 3.10, before then, and "
74++ f"then update {_package_label}.",
75+FutureWarning,
76+ )
77+78+def parse_version_to_tuple(version_string: str):
79+"""Safely converts a semantic version string to a comparable tuple of integers.
80+ Example: "4.25.8" -> (4, 25, 8)
81+ Ignores non-numeric parts and handles common version formats.
82+ Args:
83+ version_string: Version string in the format "x.y.z" or "x.y.z<suffix>"
84+ Returns:
85+ Tuple of integers for the parsed version string.
86+ """
87+parts = []
88+for part in version_string.split("."):
89+try:
90+parts.append(int(part))
91+except ValueError:
92+# If it's a non-numeric part (e.g., '1.0.0b1' -> 'b1'), stop here.
93+# This is a simplification compared to 'packaging.parse_version', but sufficient
94+# for comparing strictly numeric semantic versions.
95+break
96+return tuple(parts)
97+98+def _get_version(dependency_name):
99+try:
100+version_string: str = metadata.version(dependency_name)
101+parsed_version = parse_version_to_tuple(version_string)
102+return (parsed_version, version_string)
103+except Exception:
104+# Catch exceptions from metadata.version() (e.g., PackageNotFoundError)
105+# or errors during parse_version_to_tuple
106+return (None, "--")
107+108+_dependency_package = "google.protobuf"
109+_next_supported_version = "4.25.8"
110+_next_supported_version_tuple = (4, 25, 8)
111+_recommendation = " (we recommend 6.x)"
112+ (_version_used, _version_used_string) = _get_version(_dependency_package)
113+if _version_used and _version_used < _next_supported_version_tuple:
114+warnings.warn(
115+f"Package {_package_label} depends on "
116++ f"{_dependency_package}, currently installed at version "
117++ f"{_version_used_string}. Future updates to "
118++ f"{_package_label} will require {_dependency_package} at "
119++ f"version {_next_supported_version} or higher{_recommendation}."
120++ " Please ensure "
121++ "that either (a) your Python environment doesn't pin the "
122++ f"version of {_dependency_package}, so that updates to "
123++ f"{_package_label} can require the higher version, or "
124++ "(b) you manually update your Python environment to use at "
125++ f"least version {_next_supported_version} of "
126++ f"{_dependency_package}.",
127+FutureWarning,
128+ )
129+except Exception:
130+warnings.warn(
131+"Could not determine the version of Python "
132++ "currently being used. To continue receiving "
133++ "updates for {_package_label}, ensure you are "
134++ "using a supported version of Python; see "
135++ "https://devguide.python.org/versions/"
136+ )
137+138+__all__ = (
139+"MaintenanceAsyncClient",
140+"GetResourceMaintenanceRequest",
141+"ListResourceMaintenancesRequest",
142+"ListResourceMaintenancesResponse",
143+"MaintenanceCategory",
144+"MaintenanceClient",
145+"MaintenanceControl",
146+"MaintenanceSummary",
147+"ResourceMaintenance",
148+"SummarizeMaintenancesRequest",
149+"SummarizeMaintenancesResponse",
150+)