소스 검색

Deleted unnecesarry decorator & updated docs and tests

Dmitry Malinovsky 11 년 전
부모
커밋
ea0124cb52
5개의 변경된 파일21개의 추가작업 그리고 114개의 파일을 삭제
  1. 13 5
      celery/app/base.py
  2. 0 52
      celery/contrib/autoretry.py
  3. 0 39
      celery/tests/contrib/test_autoretry.py
  4. 4 4
      celery/tests/tasks/test_tasks.py
  5. 4 14
      docs/userguide/tasks.rst

+ 13 - 5
celery/app/base.py

@@ -15,6 +15,7 @@ import warnings
 from collections import defaultdict, deque
 from copy import deepcopy
 from operator import attrgetter
+from functools import wraps
 
 from amqp import promise
 from billiard.util import register_after_fork
@@ -38,7 +39,6 @@ from celery.utils.dispatch import Signal
 from celery.utils.functional import first, maybe_list
 from celery.utils.imports import instantiate, symbol_by_name
 from celery.utils.objects import FallbackContext, mro_lookup
-from celery.contrib.autoretry import autoretry
 
 from .annotations import prepare as prepare_annotations
 from .defaults import DEFAULTS, find_deprecated_settings
@@ -284,11 +284,19 @@ class Celery(object):
             self._tasks[task.name] = task
             task.bind(self)  # connects task to this app
 
-            autoretry_on = options.get('autoretry_on')
-            retry_kwargs = options.get('retry_kwargs')
+            autoretry_for = tuple(options.get('autoretry_for', ()))
+            retry_kwargs = options.get('retry_kwargs', {})
 
-            if autoretry_on:
-                task = autoretry(autoretry_on, retry_kwargs)(task)
+            if autoretry_for and not hasattr(task, '_orig_run'):
+
+                @wraps(task.run)
+                def run(*args, **kwargs):
+                    try:
+                        return task._orig_run(*args, **kwargs)
+                    except autoretry_for as exc:
+                        raise task.retry(exc=exc, **retry_kwargs)
+
+                task._orig_run, task.run = task.run, run
         else:
             task = self._tasks[name]
         return task

+ 0 - 52
celery/contrib/autoretry.py

@@ -1,52 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-celery.contrib.autoretry
-========================
-
-.. versionadded:: 3.2
-
-Decorator that enables autoretrying when one of specified exceptions
-are raised in a task body.
-
-
-Examples
---------
-
-.. code-block:: python
-
-    from celery.contrib.autoretry import autoretry
-
-    @autoretry(on=(ZeroDivisionError,))
-    @app.task
-    def div
-
-.. note::
-
-    `autoretry` decorator must be applied **before** `app.task` decorator.
-"""
-
-from __future__ import absolute_import
-
-from functools import wraps
-
-
-def autoretry(on=None, retry_kwargs=None):
-
-    def decorator(task):
-        if not on or hasattr(task, '_orig_run'):
-            return task.run
-
-        autoretry_exceptions = tuple(on)  # except only works with tuples
-        _retry_kwargs = retry_kwargs or {}
-
-        @wraps(task.run)
-        def inner(*args, **kwargs):
-            try:
-                return task._orig_run(*args, **kwargs)
-            except autoretry_exceptions as exc:
-                raise task.retry(exc=exc, **_retry_kwargs)
-
-        task._orig_run = task.run
-        task.run = inner
-        return inner
-    return decorator

+ 0 - 39
celery/tests/contrib/test_autoretry.py

@@ -1,39 +0,0 @@
-from __future__ import absolute_import
-
-from celery.contrib.autoretry import autoretry
-
-from celery.tests.case import AppCase
-
-
-class TasksCase(AppCase):
-
-    def setup(self):
-
-        @autoretry(on=(ZeroDivisionError,))
-        @self.app.task(shared=False)
-        def autoretry_task_no_kwargs(a, b):
-            self.iterations += 1
-            return a/b
-        self.autoretry_task_no_kwargs = autoretry_task_no_kwargs
-
-        @autoretry(on=(ZeroDivisionError,), retry_kwargs={'max_retries': 5})
-        @self.app.task(shared=False)
-        def autoretry_task(a, b):
-            self.iterations += 1
-            return a/b
-        self.autoretry_task = autoretry_task
-
-
-class test_autoretry(TasksCase):
-
-    def test_autoretry_no_kwargs(self):
-        self.autoretry_task_no_kwargs.max_retries = 3
-        self.autoretry_task_no_kwargs.iterations = 0
-        self.autoretry_task_no_kwargs.apply((1, 0))
-        self.assertEqual(self.autoretry_task_no_kwargs.iterations, 4)
-
-    def test_autoretry(self):
-        self.autoretry_tasks.max_retries = 3
-        self.autoretry_task.iterations = 0
-        self.autoretry_task.apply((1, 0))
-        self.assertEqual(self.autoretry_task.iterations, 6)

+ 4 - 4
celery/tests/tasks/test_tasks.py

@@ -100,18 +100,18 @@ class TasksCase(AppCase):
                     raise self.retry(countdown=0, exc=exc)
         self.retry_task_customexc = retry_task_customexc
 
-        @self.app.task(on=(ZeroDivisionError,), shared=False)
+        @self.app.task(autoretry_for=(ZeroDivisionError,), shared=False)
         def autoretry_task_no_kwargs(a, b):
             self.iterations += 1
             return a/b
-        self.autoretry_task_no_kwargs
+        self.autoretry_task_no_kwargs = autoretry_task_no_kwargs
 
-        @self.app.task(on=(ZeroDivisionError,),
+        @self.app.task(autoretry_for=(ZeroDivisionError,),
                        retry_kwargs={'max_retries': 5}, shared=False)
         def autoretry_task(a, b):
             self.iterations += 1
             return a/b
-        self.autoretry_task
+        self.autoretry_task = autoretry_task
 
 
 class MyCustomException(Exception):

+ 4 - 14
docs/userguide/tasks.rst

@@ -491,30 +491,20 @@ This may not be acceptable all the time, since you may have a lot of such
 tasks.
 
 Fortunately, you can tell Celery to automatically retry a task using
-:func:`autoretry <~celery.contrib.autoretry.autoretry>` decorator:
+`autoretry_for` argument in `~@Celery.task` decorator:
 
 .. code-block:: python
 
-    @autoretry(on=(ZeroDivisionError,))
-    @app.task
-    def div(a, b):
-        return a / b
-
-Also you can specify autoretry directly in `~@Celery.task` decorator:
-
-.. code-block:: python
-
-    @app.task(autoretry_on=(ZeroDivisionError,))
+    @app.task(autoretry_for(ZeroDivisionError,))
     def div(a, b):
         return a / b
 
 If you want to specify custom arguments for internal `~@Task.retry`
-call, pass `retry_kwargs` argument to :func:`autoretry
-<~celery.contrib.autoretry.autoretry>` or `~@Celery.task` decorators:
+call, pass `retry_kwargs` argument to `~@Celery.task` decorator:
 
 .. code-block:: python
 
-    @app.task(autoretry_on=(ZeroDivisionError,),
+    @app.task(autoretry_for=(ZeroDivisionError,),
               retry_kwargs={'max_retries': 5})
     def div(a, b):
         return a / b