Explorar el Código

fixes shadow_name issue when using old Task (#4572)

* fixes shadow_name issue when using deprecated Task

* unit test for old-type shadow_name

* ... one last attempt at saving shadow_name for old-style tasks

* not really meant to be used this way, so I'm okay with just not supporting shadow_name for deprecated Tasks.

* rename deprecated -> old
pachewise hace 7 años
padre
commit
85eed30811
Se han modificado 2 ficheros con 42 adiciones y 1 borrados
  1. 5 1
      celery/app/task.py
  2. 37 0
      t/unit/tasks/test_tasks.py

+ 5 - 1
celery/app/task.py

@@ -529,7 +529,11 @@ class Task(object):
         if self.__self__ is not None:
             args = args if isinstance(args, tuple) else tuple(args or ())
             args = (self.__self__,) + args
-        shadow = shadow or self.shadow_name(args, kwargs, options)
+
+        if self.__v2_compat__:
+            shadow = shadow or self.shadow_name(self(), args, kwargs, options)
+        else:
+            shadow = shadow or self.shadow_name(args, kwargs, options)
 
         preopts = self._get_exec_options()
         options = dict(preopts, **options) if options else preopts

+ 37 - 0
t/unit/tasks/test_tasks.py

@@ -13,6 +13,7 @@ from celery.app.task import _reprtask
 from celery.exceptions import Ignore, ImproperlyConfigured, Retry
 from celery.five import items, range, string_t
 from celery.result import EagerResult
+from celery.task.base import Task as OldTask
 from celery.utils.time import parse_iso8601
 
 try:
@@ -394,6 +395,42 @@ class test_tasks(TasksCase):
 
         self.app.send_task = old_send_task
 
+    def test_shadow_name_old_task_class(self):
+        def shadow_name(task, args, kwargs, options):
+            return 'fooxyz'
+
+        @self.app.task(base=OldTask, shadow_name=shadow_name)
+        def shadowed():
+            pass
+
+        old_send_task = self.app.send_task
+        self.app.send_task = Mock()
+
+        shadowed.delay()
+
+        self.app.send_task.assert_called_once_with(ANY, ANY, ANY,
+                                                   compression=ANY,
+                                                   delivery_mode=ANY,
+                                                   exchange=ANY,
+                                                   expires=ANY,
+                                                   immediate=ANY,
+                                                   link=ANY,
+                                                   link_error=ANY,
+                                                   mandatory=ANY,
+                                                   priority=ANY,
+                                                   producer=ANY,
+                                                   queue=ANY,
+                                                   result_cls=ANY,
+                                                   routing_key=ANY,
+                                                   serializer=ANY,
+                                                   soft_time_limit=ANY,
+                                                   task_id=ANY,
+                                                   task_type=ANY,
+                                                   time_limit=ANY,
+                                                   shadow='fooxyz')
+
+        self.app.send_task = old_send_task
+
     def test_typing__disabled(self):
         @self.app.task(typing=False)
         def add(x, y, kw=1):