123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- # -*- coding: utf-8 -*-
- """
- celery.utils.deprecated
- ~~~~~~~~~~~~~~~~~~~~~~~
- Deprecation utilities.
- """
- from __future__ import absolute_import, print_function, unicode_literals
- import warnings
- from vine.utils import wraps
- from celery.exceptions import CPendingDeprecationWarning, CDeprecationWarning
- __all__ = ['Callbable', 'Property', 'warn']
- PENDING_DEPRECATION_FMT = """
- {description} is scheduled for deprecation in \
- version {deprecation} and removal in version v{removal}. \
- {alternative}
- """
- DEPRECATION_FMT = """
- {description} is deprecated and scheduled for removal in
- version {removal}. {alternative}
- """
- def warn(description=None, deprecation=None,
- removal=None, alternative=None, stacklevel=2):
- ctx = {'description': description,
- 'deprecation': deprecation, 'removal': removal,
- 'alternative': alternative}
- if deprecation is not None:
- w = CPendingDeprecationWarning(PENDING_DEPRECATION_FMT.format(**ctx))
- else:
- w = CDeprecationWarning(DEPRECATION_FMT.format(**ctx))
- warnings.warn(w, stacklevel=stacklevel)
- def Callable(deprecation=None, removal=None,
- alternative=None, description=None):
- """Decorator for deprecated functions.
- A deprecation warning will be emitted when the function is called.
- :keyword deprecation: Version that marks first deprecation, if this
- argument is not set a ``PendingDeprecationWarning`` will be emitted
- instead.
- :keyword removal: Future version when this feature will be removed.
- :keyword alternative: Instructions for an alternative solution (if any).
- :keyword description: Description of what is being deprecated.
- """
- def _inner(fun):
- @wraps(fun)
- def __inner(*args, **kwargs):
- from .imports import qualname
- warn(description=description or qualname(fun),
- deprecation=deprecation,
- removal=removal,
- alternative=alternative,
- stacklevel=3)
- return fun(*args, **kwargs)
- return __inner
- return _inner
- def Property(deprecation=None, removal=None,
- alternative=None, description=None):
- def _inner(fun):
- return _deprecated_property(
- fun, deprecation=deprecation, removal=removal,
- alternative=alternative, description=description or fun.__name__)
- return _inner
- class _deprecated_property(object):
- def __init__(self, fget=None, fset=None, fdel=None, doc=None, **depreinfo):
- self.__get = fget
- self.__set = fset
- self.__del = fdel
- self.__name__, self.__module__, self.__doc__ = (
- fget.__name__, fget.__module__, fget.__doc__,
- )
- self.depreinfo = depreinfo
- self.depreinfo.setdefault('stacklevel', 3)
- def __get__(self, obj, type=None):
- if obj is None:
- return self
- warn(**self.depreinfo)
- return self.__get(obj)
- def __set__(self, obj, value):
- if obj is None:
- return self
- if self.__set is None:
- raise AttributeError('cannot set attribute')
- warn(**self.depreinfo)
- self.__set(obj, value)
- def __delete__(self, obj):
- if obj is None:
- return self
- if self.__del is None:
- raise AttributeError('cannot delete attribute')
- warn(**self.depreinfo)
- self.__del(obj)
- def setter(self, fset):
- return self.__class__(self.__get, fset, self.__del, **self.depreinfo)
- def deleter(self, fdel):
- return self.__class__(self.__get, self.__set, fdel, **self.depreinfo)
|