From e4e0dfe5630342b8983836fa2f038207ceeefd7c Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Thu, 30 Apr 2020 16:06:23 +0200 Subject: [deprecation] 'deprecated' function renamed 'callable_deprecated' --- logilab/common/deprecation.py | 55 +++++++++++++++++++++++-------------------- test/unittest_deprecation.py | 8 +++---- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/logilab/common/deprecation.py b/logilab/common/deprecation.py index ba34445..48f3202 100644 --- a/logilab/common/deprecation.py +++ b/logilab/common/deprecation.py @@ -88,6 +88,31 @@ def send_warning(reason, version=None, stacklevel=2): warn(reason, DeprecationWarning, stacklevel=stacklevel) +def callable_renamed(old_name, new_function, version=None): + """use to tell that a callable has been renamed. + + It returns a callable wrapper, so that when its called a warning is printed + telling what is the object new name. + + >>> old_function = renamed('old_function', new_function) + >>> old_function() + sample.py:57: DeprecationWarning: old_function has been renamed and is deprecated, uses new_function instead + old_function() + >>> + """ + @wraps(new_function) + def wrapped(*args, **kwargs): + send_warning(( + f"{old_name} has been renamed and is deprecated, uses {new_function.__name__} " + f"instead" + ), stacklevel=3, version=version) + return new_function(*args, **kwargs) + return wrapped + + +renamed = callable_renamed(old_name="renamed", new_function=callable_renamed) + + def argument_removed(old_argument_name, version=None): """ callable decorator to allow getting backward compatibility for renamed keyword arguments. @@ -117,7 +142,7 @@ def argument_removed(old_argument_name, version=None): @argument_removed("name") @argument_removed("doc") -def deprecated(reason=None, version=None, stacklevel=2): +def callable_deprecated(reason=None, version=None, stacklevel=2): """Display a deprecation message only if the version is older than the compatible version. """ @@ -135,6 +160,9 @@ def deprecated(reason=None, version=None, stacklevel=2): return decorator +deprecated = callable_renamed(old_name="deprecated", new_function=callable_deprecated) + + class class_deprecated(type): """metaclass to print a warning on instantiation of a deprecated class""" @@ -251,31 +279,6 @@ def moved(module_name, object_name, version=None, stacklevel=2): return callnew -def callable_renamed(old_name, new_function, version=None): - """use to tell that a callable has been renamed. - - It returns a callable wrapper, so that when its called a warning is printed - telling what is the object new name. - - >>> old_function = renamed('old_function', new_function) - >>> old_function() - sample.py:57: DeprecationWarning: old_function has been renamed and is deprecated, uses new_function instead - old_function() - >>> - """ - @wraps(new_function) - def wrapped(*args, **kwargs): - send_warning(( - f"{old_name} has been renamed and is deprecated, uses {new_function.__name__} " - f"instead" - ), stacklevel=3, version=version) - return new_function(*args, **kwargs) - return wrapped - - -renamed = callable_renamed(old_name="renamed", new_function=callable_renamed) - - def class_renamed(old_name, new_class, message=None, version=None): """automatically creates a class which fires a DeprecationWarning when instantiated. diff --git a/test/unittest_deprecation.py b/test/unittest_deprecation.py index 09ec45a..597b021 100644 --- a/test/unittest_deprecation.py +++ b/test/unittest_deprecation.py @@ -79,19 +79,19 @@ class RawInputTC(TestCase): ['[logilab.common] class AnyClass is now available as unittest_deprecation.AnyClass']) def test_deprecated_func(self): - any_func = deprecation.deprecated()(self.mk_func()) + any_func = deprecation.callable_deprecated()(self.mk_func()) any_func() - any_func = deprecation.deprecated('message')(self.mk_func()) + any_func = deprecation.callable_deprecated('message')(self.mk_func()) any_func() self.assertEqual(self.messages, ['[logilab.common] The function "any_func" is deprecated', '[logilab.common] message']) def test_deprecated_decorator(self): - @deprecation.deprecated() + @deprecation.callable_deprecated() def any_func(): pass any_func() - @deprecation.deprecated('message') + @deprecation.callable_deprecated('message') def any_func(): pass any_func() -- cgit v1.2.1