Browse Source

apply_async of empty chain must return None. Closes #1650

Ask Solem 11 years ago
parent
commit
af50b74fd3
2 changed files with 9 additions and 1 deletions
  1. 5 1
      celery/canvas.py
  2. 4 0
      celery/tests/tasks/test_canvas.py

+ 5 - 1
celery/canvas.py

@@ -209,12 +209,16 @@ class Signature(dict):
         self.immutable = immutable
 
     def apply_async(self, args=(), kwargs={}, **options):
+        try:
+            _apply = self._apply_async
+        except IndexError:  # no tasks for chain, etc to find type
+            return
         # For callbacks: extra args are prepended to the stored args.
         if args or kwargs or options:
             args, kwargs, options = self._merge(args, kwargs, options)
         else:
             args, kwargs, options = self.args, self.kwargs, self.options
-        return self._apply_async(args, kwargs, **options)
+        return _apply(args, kwargs, **options)
 
     def append_to_list_option(self, key, value):
         items = self.options.setdefault(key, [])

+ 4 - 0
celery/tests/tasks/test_canvas.py

@@ -220,6 +220,10 @@ class test_chain(CanvasCase):
         self.assertEqual(res.parent.parent.get(), 8)
         self.assertIsNone(res.parent.parent.parent)
 
+    def test_empty_chain_returns_none(self):
+        self.assertIsNone(chain(app=self.app)())
+        self.assertIsNone(chain(app=self.app).apply_async())
+
     def test_call_no_tasks(self):
         x = chain()
         self.assertFalse(x())