potiuk commented on code in PR #32767:
URL: https://github.com/apache/airflow/pull/32767#discussion_r1273972931
##########
airflow/utils/deprecation_tools.py:
##########
@@ -23,25 +23,70 @@
from types import ModuleType
-def getattr_with_deprecation(imports: dict[str, str], module: str, name: str):
+def getattr_with_deprecation(
+ imports: dict[str, str],
+ module: str,
+ override_deprecated_classes: dict[str, str],
+ extra_message: str,
+ name: str,
+):
+ """
+ Retrieve the imported attribute from the redirected module ad raises a
deprecation warning.
+
+ :param imports: dict of imports and their redirection for the module
+ :param module: module name
+ :param override_deprecated_classes: override target classes with
deprecated ones. If target class is
+ found in the dictionary, it will be displayed in the warning message.
+ :param name: attribute name
+ :return:
+ """
target_class_full_name = imports.get(name)
if not target_class_full_name:
raise AttributeError(f"The module `{module!r}` has no attribute
`{name!r}`")
+ warning_class_name = target_class_full_name
+ if override_deprecated_classes and name in override_deprecated_classes:
+ warning_class_name = override_deprecated_classes[name]
warnings.warn(
- f"The `{module}.{name}` class is deprecated. Please use
`{target_class_full_name!r}`.",
+ f"The `{module}.{name}` class is deprecated. Please use
`{warning_class_name!r}`.{extra_message}.",
DeprecationWarning,
stacklevel=2,
)
new_module, new_class_name = target_class_full_name.rsplit(".", 1)
- return getattr(importlib.import_module(new_module), new_class_name)
+ try:
+ return getattr(importlib.import_module(new_module), new_class_name)
+ except ImportError as e:
+ raise ImportError(
+ f"Could not import `{new_module}.{new_class_name}`"
+ f" while trying to import `{module}.{name}.`{extra_message}."
+ ) from e
+
+def add_deprecated_classes(
+ module_imports: dict[str, dict[str, str]],
+ package: str,
+ override_deprecated_classes: dict[str, dict[str, str]] | None = None,
+ extra_message: str | None = None,
+):
+ """
+ Add deprecated class PEP-563 imports and warnings modules to the package.
-def add_deprecated_classes(module_imports: dict[str, dict[str, str]], package:
str):
+ :param module_imports: imports to use
+ :param package: package name
+ :param override_deprecated_classes: override target classes with
deprecated ones. If module +
+ target class is found in the dictionary, it will be displayed in the
warning message.
+ :param extra_message: extra message to display in the warning or import
error message
+ """
for module_name, imports in module_imports.items():
full_module_name = f"{package}.{module_name}"
module_type = ModuleType(full_module_name)
# Mypy is not able to derive the right function signature
https://github.com/python/mypy/issues/2427
module_type.__getattr__ = functools.partial( # type:
ignore[assignment]
- getattr_with_deprecation, imports, full_module_name
+ getattr_with_deprecation,
+ imports,
+ full_module_name,
+ override_deprecated_classes[module_name]
+ if override_deprecated_classes and module_name in
override_deprecated_classes
+ else dict(),
Review Comment:
Right
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]