-
Notifications
You must be signed in to change notification settings - Fork 45
feat(gapic): support mTLS certificates when available #658
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -15,8 +15,18 @@ | |
| # | ||
| from google.cloud.datastore_admin_v1 import gapic_version as package_version | ||
|
|
||
| import google.api_core as api_core | ||
| import sys | ||
|
|
||
| __version__ = package_version.__version__ | ||
|
|
||
| if sys.version_info >= (3, 8): # pragma: NO COVER | ||
| from importlib import metadata | ||
| else: # pragma: NO COVER | ||
| # TODO(https://github.com/googleapis/python-api-core/issues/835): Remove | ||
| # this code path once we drop support for Python 3.7 | ||
| import importlib_metadata as metadata | ||
|
|
||
|
|
||
| from .services.datastore_admin import DatastoreAdminClient | ||
| from .services.datastore_admin import DatastoreAdminAsyncClient | ||
|
|
@@ -43,6 +53,100 @@ | |
| from .types.migration import MigrationState | ||
| from .types.migration import MigrationStep | ||
|
|
||
| if hasattr(api_core, "check_python_version") and hasattr( | ||
| api_core, "check_dependency_versions" | ||
| ): # pragma: NO COVER | ||
| api_core.check_python_version("google.cloud.datastore_admin_v1") # type: ignore | ||
| api_core.check_dependency_versions("google.cloud.datastore_admin_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 | ||
| import sys | ||
|
|
||
| _py_version_str = sys.version.split()[0] | ||
| _package_label = "google.cloud.datastore_admin_v1" | ||
| if sys.version_info < (3, 9): | ||
| 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.9, and then update {_package_label}.", | ||
| FutureWarning, | ||
| ) | ||
| if sys.version_info[:2] == (3, 9): | ||
| warnings.warn( | ||
| f"You are using a Python version ({_py_version_str}) " | ||
| + f"which Google will stop supporting in {_package_label} in " | ||
| + "January 2026. Please " | ||
| + "upgrade to the latest Python version, or at " | ||
| + "least to Python 3.10, before then, and " | ||
| + f"then update {_package_label}.", | ||
|
Comment on lines
+81
to
+86
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The warning message is constructed using a mix of string concatenation with (f"You are using a Python version ({_py_version_str}) "
f"which Google will stop supporting in {_package_label} in "
"January 2026. Please "
"upgrade to the latest Python version, or at "
"least to Python 3.10, before then, and "
f"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}.", | ||
|
Comment on lines
+127
to
+138
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The warning message is constructed using a mix of string concatenation with (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/" | ||
| ) | ||
|
|
||
| __all__ = ( | ||
| "DatastoreAdminAsyncClient", | ||
| "CommonMetadata", | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -15,8 +15,18 @@ | |
| # | ||
| from google.cloud.datastore_v1 import gapic_version as package_version | ||
|
|
||
| import google.api_core as api_core | ||
| import sys | ||
|
|
||
| __version__ = package_version.__version__ | ||
|
|
||
| if sys.version_info >= (3, 8): # pragma: NO COVER | ||
| from importlib import metadata | ||
| else: # pragma: NO COVER | ||
| # TODO(https://github.com/googleapis/python-api-core/issues/835): Remove | ||
| # this code path once we drop support for Python 3.7 | ||
| import importlib_metadata as metadata | ||
|
|
||
|
|
||
| from .services.datastore import DatastoreClient | ||
| from .services.datastore import DatastoreAsyncClient | ||
|
|
@@ -69,6 +79,100 @@ | |
| from .types.query_profile import ExplainOptions | ||
| from .types.query_profile import PlanSummary | ||
|
|
||
| if hasattr(api_core, "check_python_version") and hasattr( | ||
| api_core, "check_dependency_versions" | ||
| ): # pragma: NO COVER | ||
| api_core.check_python_version("google.cloud.datastore_v1") # type: ignore | ||
| api_core.check_dependency_versions("google.cloud.datastore_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 | ||
| import sys | ||
|
|
||
| _py_version_str = sys.version.split()[0] | ||
| _package_label = "google.cloud.datastore_v1" | ||
| if sys.version_info < (3, 9): | ||
| 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.9, and then update {_package_label}.", | ||
|
Comment on lines
+98
to
+102
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The warning message is constructed using a mix of string concatenation with ("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.9, and then update {_package_label}.") |
||
| FutureWarning, | ||
| ) | ||
| if sys.version_info[:2] == (3, 9): | ||
| warnings.warn( | ||
| f"You are using a Python version ({_py_version_str}) " | ||
| + f"which Google will stop supporting in {_package_label} in " | ||
| + "January 2026. Please " | ||
| + "upgrade to the latest Python version, or at " | ||
| + "least to Python 3.10, before then, and " | ||
| + f"then update {_package_label}.", | ||
|
Comment on lines
+107
to
+112
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The warning message is constructed using a mix of string concatenation with (f"You are using a Python version ({_py_version_str}) "
f"which Google will stop supporting in {_package_label} in "
"January 2026. Please "
"upgrade to the latest Python version, or at "
"least to Python 3.10, before then, and "
f"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}.", | ||
|
Comment on lines
+153
to
+164
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The warning message is constructed using a mix of string concatenation with (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/" | ||
| ) | ||
|
|
||
| __all__ = ( | ||
| "DatastoreAsyncClient", | ||
| "AggregationQuery", | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The warning message is constructed using a mix of string concatenation with
+and an f-string. This can be simplified into a single multi-line string using implicit concatenation for better readability.