Przeglądaj źródła

Move deprecation utils to .utils.deprecated

Ask Solem 8 lat temu
rodzic
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
-    from celery.utils import warn_deprecated
+    from celery.utils import deprecated
     for name, opt in flatten(NAMESPACES):
         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,
                             removal=opt.remove_by,
                             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 celery.utils import warn_deprecated
+from celery.utils import deprecated
 
 __all__ = ['AMQPBackend']
 
@@ -28,7 +28,7 @@ class AMQPBackend(BaseRPCBackend):
     """Publishes results by sending messages."""
 
     def __init__(self, *args, **kwargs):
-        warn_deprecated(
+        deprecated.warn(
             'The AMQP backend', deprecation='4.0', removal='5.0',
             alternative='Please use RPC backend or a persistent backend.')
         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.exceptions import ChordError, ImproperlyConfigured
 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.log import get_logger
 from celery.utils.timeutils import humanize_seconds
@@ -321,18 +321,18 @@ class RedisBackend(base.BaseKeyValueStoreBackend, async.AsyncBackendMixin):
             (self.url,), {'expires': self.expires},
         )
 
-    @deprecated_property(4.0, 5.0)
+    @deprecated.Property(4.0, 5.0)
     def host(self):
         return self.connparams['host']
 
-    @deprecated_property(4.0, 5.0)
+    @deprecated.Property(4.0, 5.0)
     def port(self):
         return self.connparams['port']
 
-    @deprecated_property(4.0, 5.0)
+    @deprecated.Property(4.0, 5.0)
     def db(self):
         return self.connparams['db']
 
-    @deprecated_property(4.0, 5.0)
+    @deprecated.Property(4.0, 5.0)
     def password(self):
         return self.connparams['password']

+ 1 - 1
celery/result.py

@@ -587,7 +587,7 @@ class ResultSet(ResultBase):
         """`res[i] -> res.results[i]`"""
         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):
         """Deprecated method, use :meth:`get` with a callback argument."""
         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 (
     chunks,
-    deprecated_property,
     isatty,
     is_iterable,
     cached_property,
-    warn_deprecated,
     worker_direct,
     gen_task_name,
     jsonify,
@@ -36,61 +34,6 @@ class test_worker_direct(Case):
         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):
 
     def test_no_module(self):
@@ -171,8 +114,3 @@ class test_utils(Case):
         self.assertIs(x.__get__(None), x)
         self.assertIs(x.__set__(None, 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 sys
 import traceback
-import warnings
 import datetime
 
 from functools import partial
 from pprint import pprint
 
 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 .functional import memoize
 from .text import simple_format
 
-__all__ = ['worker_direct', 'warn_deprecated', 'deprecated', 'lpmerge',
+__all__ = ['worker_direct', 'lpmerge',
            'is_iterable', 'isatty', 'cry', 'maybe_reraise', 'strtobool',
            'jsonify', 'gen_task_name', 'nodename', 'nodesplit',
            'cached_property']
 
 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.
 #: We use it to find out the name of the original ``__main__``
 #: 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):
     """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.abstract
     celery.utils.collections
+    celery.utils.deprecated
     celery.utils.functional
     celery.utils.graph
     celery.utils.objects