Browse Source

Move deprecation utils to .utils.deprecated

Ask Solem 8 years ago
parent
commit
7a3f56c32e

+ 2 - 2
celery/app/defaults.py

@@ -324,10 +324,10 @@ _OLD_SETTING_KEYS = set(keys(_TO_NEW_KEY))
 
 
 
 
 def find_deprecated_settings(source):  # pragma: no cover
 def find_deprecated_settings(source):  # pragma: no cover
-    from celery.utils import warn_deprecated
+    from celery.utils import deprecated
     for name, opt in flatten(NAMESPACES):
     for name, opt in flatten(NAMESPACES):
         if (opt.deprecate_by or opt.remove_by) and getattr(source, name, None):
         if (opt.deprecate_by or opt.remove_by) and getattr(source, name, None):
-            warn_deprecated(description='The {0!r} setting'.format(name),
+            deprecated.warn(description='The {0!r} setting'.format(name),
                             deprecation=opt.deprecate_by,
                             deprecation=opt.deprecate_by,
                             removal=opt.remove_by,
                             removal=opt.remove_by,
                             alternative='Use the {0.alt} instead'.format(opt))
                             alternative='Use the {0.alt} instead'.format(opt))

+ 2 - 2
celery/backends/amqp.py

@@ -12,7 +12,7 @@ from __future__ import absolute_import, unicode_literals
 
 
 from .rpc import BaseRPCBackend
 from .rpc import BaseRPCBackend
 
 
-from celery.utils import warn_deprecated
+from celery.utils import deprecated
 
 
 __all__ = ['AMQPBackend']
 __all__ = ['AMQPBackend']
 
 
@@ -28,7 +28,7 @@ class AMQPBackend(BaseRPCBackend):
     """Publishes results by sending messages."""
     """Publishes results by sending messages."""
 
 
     def __init__(self, *args, **kwargs):
     def __init__(self, *args, **kwargs):
-        warn_deprecated(
+        deprecated.warn(
             'The AMQP backend', deprecation='4.0', removal='5.0',
             'The AMQP backend', deprecation='4.0', removal='5.0',
             alternative='Please use RPC backend or a persistent backend.')
             alternative='Please use RPC backend or a persistent backend.')
         super(AMQPBackend, self).__init__(*args, **kwargs)
         super(AMQPBackend, self).__init__(*args, **kwargs)

+ 5 - 5
celery/backends/redis.py

@@ -18,7 +18,7 @@ from celery._state import task_join_will_block
 from celery.canvas import maybe_signature
 from celery.canvas import maybe_signature
 from celery.exceptions import ChordError, ImproperlyConfigured
 from celery.exceptions import ChordError, ImproperlyConfigured
 from celery.five import string_t
 from celery.five import string_t
-from celery.utils import deprecated_property
+from celery.utils import deprecated
 from celery.utils.functional import dictfilter
 from celery.utils.functional import dictfilter
 from celery.utils.log import get_logger
 from celery.utils.log import get_logger
 from celery.utils.timeutils import humanize_seconds
 from celery.utils.timeutils import humanize_seconds
@@ -321,18 +321,18 @@ class RedisBackend(base.BaseKeyValueStoreBackend, async.AsyncBackendMixin):
             (self.url,), {'expires': self.expires},
             (self.url,), {'expires': self.expires},
         )
         )
 
 
-    @deprecated_property(4.0, 5.0)
+    @deprecated.Property(4.0, 5.0)
     def host(self):
     def host(self):
         return self.connparams['host']
         return self.connparams['host']
 
 
-    @deprecated_property(4.0, 5.0)
+    @deprecated.Property(4.0, 5.0)
     def port(self):
     def port(self):
         return self.connparams['port']
         return self.connparams['port']
 
 
-    @deprecated_property(4.0, 5.0)
+    @deprecated.Property(4.0, 5.0)
     def db(self):
     def db(self):
         return self.connparams['db']
         return self.connparams['db']
 
 
-    @deprecated_property(4.0, 5.0)
+    @deprecated.Property(4.0, 5.0)
     def password(self):
     def password(self):
         return self.connparams['password']
         return self.connparams['password']

+ 1 - 1
celery/result.py

@@ -587,7 +587,7 @@ class ResultSet(ResultBase):
         """`res[i] -> res.results[i]`"""
         """`res[i] -> res.results[i]`"""
         return self.results[index]
         return self.results[index]
 
 
-    @deprecated('4.0', '5.0')
+    @deprecated.Callable('4.0', '5.0')
     def iterate(self, timeout=None, propagate=True, interval=0.5):
     def iterate(self, timeout=None, propagate=True, interval=0.5):
         """Deprecated method, use :meth:`get` with a callback argument."""
         """Deprecated method, use :meth:`get` with a callback argument."""
         elapsed = 0.0
         elapsed = 0.0

+ 69 - 0
celery/tests/utils/test_deprecated.py

@@ -0,0 +1,69 @@
+from __future__ import absolute_import, unicode_literals
+
+from celery.tests.case import Case, Mock, patch
+
+from celery.utils import deprecated
+
+
+class test_deprecated_property(Case):
+
+    @patch('celery.utils.deprecated.warn')
+    def test_deprecated(self, warn):
+
+        class X(object):
+            _foo = None
+
+            @deprecated.Property(deprecation='1.2')
+            def foo(self):
+                return self._foo
+
+            @foo.setter
+            def foo(self, value):
+                self._foo = value
+
+            @foo.deleter
+            def foo(self):
+                self._foo = None
+        self.assertTrue(X.foo)
+        self.assertTrue(X.foo.__set__(None, 1))
+        self.assertTrue(X.foo.__delete__(None))
+        x = X()
+        x.foo = 10
+        warn.assert_called_with(
+            stacklevel=3, deprecation='1.2', alternative=None,
+            description='foo', removal=None,
+        )
+        warn.reset_mock()
+        self.assertEqual(x.foo, 10)
+        warn.assert_called_with(
+            stacklevel=3, deprecation='1.2', alternative=None,
+            description='foo', removal=None,
+        )
+        warn.reset_mock()
+        del(x.foo)
+        warn.assert_called_with(
+            stacklevel=3, deprecation='1.2', alternative=None,
+            description='foo', removal=None,
+        )
+        self.assertIsNone(x._foo)
+
+    def test_deprecated_no_setter_or_deleter(self):
+        class X(object):
+            @deprecated.Property(deprecation='1.2')
+            def foo(self):
+                pass
+        self.assertTrue(X.foo)
+        x = X()
+        with self.assertRaises(AttributeError):
+            x.foo = 10
+        with self.assertRaises(AttributeError):
+            del(x.foo)
+
+
+
+class test_warn(Case):
+
+    @patch('warnings.warn')
+    def test_warn_deprecated(self, warn):
+        deprecated.warn('Foo')
+        warn.assert_called()

+ 0 - 62
celery/tests/utils/test_utils.py

@@ -8,11 +8,9 @@ from kombu import Queue
 
 
 from celery.utils import (
 from celery.utils import (
     chunks,
     chunks,
-    deprecated_property,
     isatty,
     isatty,
     is_iterable,
     is_iterable,
     cached_property,
     cached_property,
-    warn_deprecated,
     worker_direct,
     worker_direct,
     gen_task_name,
     gen_task_name,
     jsonify,
     jsonify,
@@ -36,61 +34,6 @@ class test_worker_direct(Case):
         self.assertIs(worker_direct(q), q)
         self.assertIs(worker_direct(q), q)
 
 
 
 
-class test_deprecated_property(Case):
-
-    @patch('celery.utils.warn_deprecated')
-    def test_deprecated(self, warn_deprecated):
-
-        class X(object):
-            _foo = None
-
-            @deprecated_property(deprecation='1.2')
-            def foo(self):
-                return self._foo
-
-            @foo.setter
-            def foo(self, value):
-                self._foo = value
-
-            @foo.deleter
-            def foo(self):
-                self._foo = None
-        self.assertTrue(X.foo)
-        self.assertTrue(X.foo.__set__(None, 1))
-        self.assertTrue(X.foo.__delete__(None))
-        x = X()
-        x.foo = 10
-        warn_deprecated.assert_called_with(
-            stacklevel=3, deprecation='1.2', alternative=None,
-            description='foo', removal=None,
-        )
-        warn_deprecated.reset_mock()
-        self.assertEqual(x.foo, 10)
-        warn_deprecated.assert_called_with(
-            stacklevel=3, deprecation='1.2', alternative=None,
-            description='foo', removal=None,
-        )
-        warn_deprecated.reset_mock()
-        del(x.foo)
-        warn_deprecated.assert_called_with(
-            stacklevel=3, deprecation='1.2', alternative=None,
-            description='foo', removal=None,
-        )
-        self.assertIsNone(x._foo)
-
-    def test_deprecated_no_setter_or_deleter(self):
-        class X(object):
-            @deprecated_property(deprecation='1.2')
-            def foo(self):
-                pass
-        self.assertTrue(X.foo)
-        x = X()
-        with self.assertRaises(AttributeError):
-            x.foo = 10
-        with self.assertRaises(AttributeError):
-            del(x.foo)
-
-
 class test_gen_task_name(Case):
 class test_gen_task_name(Case):
 
 
     def test_no_module(self):
     def test_no_module(self):
@@ -171,8 +114,3 @@ class test_utils(Case):
         self.assertIs(x.__get__(None), x)
         self.assertIs(x.__get__(None), x)
         self.assertIs(x.__set__(None, None), x)
         self.assertIs(x.__set__(None, None), x)
         self.assertIs(x.__delete__(None), x)
         self.assertIs(x.__delete__(None), x)
-
-    @patch('warnings.warn')
-    def test_warn_deprecated(self, warn):
-        warn_deprecated('Foo')
-        warn.assert_called()

+ 1 - 106
celery/utils/__init__.py

@@ -13,39 +13,25 @@ import os
 import socket
 import socket
 import sys
 import sys
 import traceback
 import traceback
-import warnings
 import datetime
 import datetime
 
 
 from functools import partial
 from functools import partial
 from pprint import pprint
 from pprint import pprint
 
 
 from kombu.entity import Exchange, Queue
 from kombu.entity import Exchange, Queue
-from vine.utils import wraps
 
 
-from celery.exceptions import CPendingDeprecationWarning, CDeprecationWarning
 from celery.five import WhateverIO, items, reraise, string_t
 from celery.five import WhateverIO, items, reraise, string_t
 
 
 from .functional import memoize
 from .functional import memoize
 from .text import simple_format
 from .text import simple_format
 
 
-__all__ = ['worker_direct', 'warn_deprecated', 'deprecated', 'lpmerge',
+__all__ = ['worker_direct', 'lpmerge',
            'is_iterable', 'isatty', 'cry', 'maybe_reraise', 'strtobool',
            'is_iterable', 'isatty', 'cry', 'maybe_reraise', 'strtobool',
            'jsonify', 'gen_task_name', 'nodename', 'nodesplit',
            'jsonify', 'gen_task_name', 'nodename', 'nodesplit',
            'cached_property']
            'cached_property']
 
 
 PY3 = sys.version_info[0] == 3
 PY3 = sys.version_info[0] == 3
 
 
-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}
-"""
-
 #: Billiard sets this when execv is enabled.
 #: Billiard sets this when execv is enabled.
 #: We use it to find out the name of the original ``__main__``
 #: We use it to find out the name of the original ``__main__``
 #: module, so that we can properly rewrite the name of the
 #: module, so that we can properly rewrite the name of the
@@ -84,97 +70,6 @@ def worker_direct(hostname):
     )
     )
 
 
 
 
-def warn_deprecated(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 deprecated(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_deprecated(description=description or qualname(fun),
-                            deprecation=deprecation,
-                            removal=removal,
-                            alternative=alternative,
-                            stacklevel=3)
-            return fun(*args, **kwargs)
-        return __inner
-    return _inner
-
-
-def deprecated_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_deprecated(**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_deprecated(**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_deprecated(**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)
-
-
 def lpmerge(L, R):
 def lpmerge(L, R):
     """In place left precedent dictionary merge.
     """In place left precedent dictionary merge.
 
 

+ 120 - 0
celery/utils/deprecated.py

@@ -0,0 +1,120 @@
+# -*- 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)

+ 11 - 0
docs/internals/reference/celery.utils.deprecated.rst

@@ -0,0 +1,11 @@
+==========================================
+ ``celery.utils.deprecated``
+==========================================
+
+.. contents::
+    :local:
+.. currentmodule:: celery.utils.deprecated
+
+.. automodule:: celery.utils.deprecated
+    :members:
+    :undoc-members:

+ 1 - 0
docs/internals/reference/index.rst

@@ -51,6 +51,7 @@
     celery.utils
     celery.utils
     celery.utils.abstract
     celery.utils.abstract
     celery.utils.collections
     celery.utils.collections
+    celery.utils.deprecated
     celery.utils.functional
     celery.utils.functional
     celery.utils.graph
     celery.utils.graph
     celery.utils.objects
     celery.utils.objects