From e049c82dafddb0a3b2ae4aaebb12974424feb6de Mon Sep 17 00:00:00 2001 From: Laurent Peuch Date: Wed, 22 Apr 2020 22:43:05 +0200 Subject: [deprecation/refactoring] simplify deprecated --- logilab/common/deprecation.py | 74 ++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 29 deletions(-) (limited to 'logilab') diff --git a/logilab/common/deprecation.py b/logilab/common/deprecation.py index 4a14aac..cdf538c 100644 --- a/logilab/common/deprecation.py +++ b/logilab/common/deprecation.py @@ -226,8 +226,51 @@ def send_warning(reason, version=None, stacklevel=2): warn(reason, DeprecationWarning, stacklevel=stacklevel) -def deprecated(reason=None, stacklevel=2, name=None, doc=None): - return _defaultdeprecator.deprecated(None, reason, stacklevel, name, doc) +def argument_removed(old_argument_name): + """ + callable decorator to allow getting backward compatibility for renamed keyword arguments. + + >>> @argument_removed("old") + ... def some_function(new): + ... return new + >>> some_function(old=42) + sample.py:15: DeprecationWarning: argument old of callable some_function has been renamed and is deprecated, use keyword argument new instead + some_function(old=42) + 42 + """ + def _wrap(func): + @wraps(func) + def check_kwargs(*args, **kwargs): + if old_argument_name in kwargs: + warn(f"argument {old_argument_name} of callable {func.__name__} has been removed and is " + f"deprecated", stacklevel=2) + del kwargs[old_argument_name] + + return func(*args, **kwargs) + + return check_kwargs + + return _wrap + + +@argument_removed("name") +@argument_removed("doc") +def deprecated(reason=None, version=None, stacklevel=2): + """Display a deprecation message only if the version is older than the + compatible version. + """ + def decorator(func): + message = reason or 'The function "%s" is deprecated' + if '%s' in message: + message %= func.__name__ + + @wraps(func) + def wrapped(*args, **kwargs): + send_warning(message, version, stacklevel + 1) + return func(*args, **kwargs) + return wrapped + + return decorator class class_deprecated(type): @@ -325,33 +368,6 @@ def argument_renamed(old_name, new_name): return _wrap -def argument_removed(old_argument_name): - """ - callable decorator to allow getting backward compatibility for renamed keyword arguments. - - >>> @argument_removed("old") - ... def some_function(new): - ... return new - >>> some_function(old=42) - sample.py:15: DeprecationWarning: argument old of callable some_function has been renamed and is deprecated, use keyword argument new instead - some_function(old=42) - 42 - """ - def _wrap(func): - @wraps(func) - def check_kwargs(*args, **kwargs): - if old_argument_name in kwargs: - warn(f"argument {old_argument_name} of callable {func.__name__} has been removed and is " - f"deprecated", stacklevel=2) - del kwargs[old_argument_name] - - return func(*args, **kwargs) - - return check_kwargs - - return _wrap - - def renamed(old_name, new_function): """use to tell that a callable has been renamed. -- cgit v1.2.1