From 58581cb71b2711a0656639e5b75281dd6a1f54c3 Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Fri, 22 May 2020 16:51:56 +0200 Subject: [deprecation/fix] rollback to old class_deprecation being a class behavior It breaks CW because CW was using class_deprecated in a isinstance to select the good views to uses. --- logilab/common/deprecation.py | 50 ++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/logilab/common/deprecation.py b/logilab/common/deprecation.py index 6edc71c..3da3021 100644 --- a/logilab/common/deprecation.py +++ b/logilab/common/deprecation.py @@ -163,33 +163,21 @@ def callable_deprecated(reason=None, version=None, stacklevel=2): deprecated = callable_renamed(old_name="deprecated", new_function=callable_deprecated) -def class_deprecated(old_name, parents, class_dict): - try: - return _class_deprecated(old_name, parents, clsdict) - except (NameError, TypeError): - # in case of conflicting metaclass situation - class DeprecatedClass(*parents): - def __init__(self, *args, **kwargs): - msg = class_dict.get("__deprecation_warning__", f"{old_name} is deprecated") - send_warning( - msg, - stacklevel=class_dict.get("__deprecation_warning_stacklevel__", 3), - version=class_dict.get("__deprecation_warning_version__", None), - ) - super(DeprecatedClass, self).__init__(*args, **kwargs) +def _generate_class_deprecated(): + class _class_deprecated(type): + """metaclass to print a warning on instantiation of a deprecated class""" - return DeprecatedClass + def __call__(cls, *args, **kwargs): + message = getattr(cls, "__deprecation_warning__", + "%(cls)s is deprecated") % {'cls': cls.__name__} + send_warning(message, stacklevel=getattr(cls, "__deprecation_warning_stacklevel__", 4), + version=getattr(cls, "__deprecation_warning_version__", None)) + return type.__call__(cls, *args, **kwargs) + return _class_deprecated -class _class_deprecated(type): - """metaclass to print a warning on instantiation of a deprecated class""" - def __call__(cls, *args, **kwargs): - msg = getattr(cls, "__deprecation_warning__", - "%(cls)s is deprecated") % {'cls': cls.__name__} - send_warning(msg, stacklevel=getattr(cls, "__deprecation_warning_stacklevel__", 4), - version=getattr(cls, "__deprecation_warning_version__", None)) - return type.__call__(cls, *args, **kwargs) +class_deprecated = _generate_class_deprecated() def attribute_renamed(old_name, new_name, version=None): @@ -318,7 +306,21 @@ def class_renamed(old_name, new_class, message=None, version=None): class_dict['__deprecation_warning_version__'] = version class_dict['__deprecation_warning_stacklevel__'] = 5 - return class_deprecated(old_name, (new_class,), class_dict) + try: + return class_deprecated(old_name, (new_class,), class_dict) + except (NameError, TypeError): + # in case of conflicting metaclass situation + class DeprecatedClass(new_class): + def __init__(self, *args, **kwargs): + msg = class_dict.get("__deprecation_warning__", f"{old_name} is deprecated") + send_warning( + msg, + stacklevel=class_dict.get("__deprecation_warning_stacklevel__", 3), + version=class_dict.get("__deprecation_warning_version__", None), + ) + super(DeprecatedClass, self).__init__(*args, **kwargs) + + return DeprecatedClass def class_moved(new_class, old_name=None, message=None, version=None): -- cgit v1.2.1