diff --git a/lib/matplotlib/cbook/deprecation.py b/lib/matplotlib/cbook/deprecation.py index b93a5ca94f8f..32245d538444 100644 --- a/lib/matplotlib/cbook/deprecation.py +++ b/lib/matplotlib/cbook/deprecation.py @@ -1,5 +1,5 @@ import functools -import textwrap +import inspect import warnings @@ -117,6 +117,11 @@ def deprecated(since, message='', name='', alternative='', pending=False, """ Decorator to mark a function or a class as deprecated. + When deprecating a classmethod, a staticmethod, or a property, the + ``@deprecated`` decorator should go *under* the ``@classmethod``, etc. + decorator (i.e., `deprecated` should directly decorate the underlying + callable). + Parameters ---------- since : str @@ -183,8 +188,8 @@ def deprecate(obj, message=message, name=name, alternative=alternative, if isinstance(obj, type): obj_type = "class" - old_doc = obj.__doc__ func = obj.__init__ + old_doc = obj.__doc__ def finalize(wrapper, new_doc): obj.__doc__ = new_doc @@ -192,22 +197,13 @@ def finalize(wrapper, new_doc): return obj else: obj_type = "function" - if isinstance(obj, classmethod): - func = obj.__func__ - old_doc = func.__doc__ - - def finalize(wrapper, new_doc): - wrapper = functools.wraps(func)(wrapper) - wrapper.__doc__ = new_doc - return classmethod(wrapper) - else: - func = obj - old_doc = func.__doc__ - - def finalize(wrapper, new_doc): - wrapper = functools.wraps(func)(wrapper) - wrapper.__doc__ = new_doc - return wrapper + func = obj + old_doc = func.__doc__ + + def finalize(wrapper, new_doc): + wrapper = functools.wraps(func)(wrapper) + wrapper.__doc__ = new_doc + return wrapper message = _generate_deprecation_message( since, message, name, alternative, pending, obj_type, addendum, @@ -219,11 +215,13 @@ def wrapper(*args, **kwargs): warnings.warn(message, category, stacklevel=2) return func(*args, **kwargs) - old_doc = textwrap.dedent(old_doc or '').strip('\n') + old_doc = inspect.cleandoc(old_doc or '').strip('\n') message = message.strip() - new_doc = (('\n.. deprecated:: %(since)s' - '\n %(message)s\n\n' % - {'since': since, 'message': message}) + old_doc) + new_doc = ('.. deprecated:: {since}\n' + ' {message}\n' + '\n' + '{old_doc}' + .format(since=since, message=message, old_doc=old_doc)) if not old_doc: # This is to prevent a spurious 'unexected unindent' warning from # docutils when the original docstring was blank.