71 lines
1.7 KiB
Python
71 lines
1.7 KiB
Python
|
import warnings
|
||
|
import functools
|
||
|
|
||
|
|
||
|
class AltairDeprecationWarning(UserWarning):
|
||
|
pass
|
||
|
|
||
|
|
||
|
def deprecated(message=None):
|
||
|
"""Decorator to deprecate a function or class.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
message : string (optional)
|
||
|
The deprecation message
|
||
|
"""
|
||
|
|
||
|
def wrapper(obj):
|
||
|
return _deprecate(obj, message=message)
|
||
|
|
||
|
return wrapper
|
||
|
|
||
|
|
||
|
def _deprecate(obj, name=None, message=None):
|
||
|
"""Return a version of a class or function that raises a deprecation warning.
|
||
|
|
||
|
Parameters
|
||
|
----------
|
||
|
obj : class or function
|
||
|
The object to create a deprecated version of.
|
||
|
name : string (optional)
|
||
|
The name of the deprecated object
|
||
|
message : string (optional)
|
||
|
The deprecation message
|
||
|
|
||
|
Returns
|
||
|
-------
|
||
|
deprecated_obj :
|
||
|
The deprecated version of obj
|
||
|
|
||
|
Examples
|
||
|
--------
|
||
|
>>> class Foo(object): pass
|
||
|
>>> OldFoo = _deprecate(Foo, "OldFoo")
|
||
|
>>> f = OldFoo() # doctest: +SKIP
|
||
|
AltairDeprecationWarning: alt.OldFoo is deprecated. Use alt.Foo instead.
|
||
|
"""
|
||
|
if message is None:
|
||
|
message = "alt.{} is deprecated. Use alt.{} instead." "".format(
|
||
|
name, obj.__name__
|
||
|
)
|
||
|
if isinstance(obj, type):
|
||
|
return type(
|
||
|
name,
|
||
|
(obj,),
|
||
|
{
|
||
|
"__doc__": obj.__doc__,
|
||
|
"__init__": _deprecate(obj.__init__, "__init__", message),
|
||
|
},
|
||
|
)
|
||
|
elif callable(obj):
|
||
|
|
||
|
@functools.wraps(obj)
|
||
|
def new_obj(*args, **kwargs):
|
||
|
warnings.warn(message, AltairDeprecationWarning)
|
||
|
return obj(*args, **kwargs)
|
||
|
|
||
|
return new_obj
|
||
|
else:
|
||
|
raise ValueError("Cannot deprecate object of type {}".format(type(obj)))
|