Selaa lähdekoodia

Fixes Signature.link* to work when link option is not a list. Closes #2019

Ask Solem 11 vuotta sitten
vanhempi
commit
e0389ec83d
2 muutettua tiedostoa jossa 11 lisäystä ja 1 poistoa
  1. 3 1
      celery/canvas.py
  2. 8 0
      celery/tests/tasks/test_canvas.py

+ 3 - 1
celery/canvas.py

@@ -12,7 +12,7 @@
 """
 from __future__ import absolute_import
 
-from collections import deque
+from collections import MutableSequence, deque
 from copy import deepcopy
 from functools import partial as _partial, reduce
 from operator import itemgetter
@@ -244,6 +244,8 @@ class Signature(dict):
 
     def append_to_list_option(self, key, value):
         items = self.options.setdefault(key, [])
+        if not isinstance(items, MutableSequence):
+            items = self.options[key] = [items]
         if value not in items:
             items.append(value)
         return value

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

@@ -59,6 +59,14 @@ class test_Signature(CanvasCase):
         self.assertEqual(SIG.options, {'task_id': 'TASK_ID'})
         self.assertEqual(SIG.subtask_type, '')
 
+    def test_link_on_scalar(self):
+        x = Signature('TASK', link=Signature('B'))
+        self.assertTrue(x.options['link'])
+        x.link(Signature('C'))
+        self.assertIsInstance(x.options['link'], list)
+        self.assertIn(Signature('B'), x.options['link'])
+        self.assertIn(Signature('C'), x.options['link'])
+
     def test_replace(self):
         x = Signature('TASK', ('A'), {})
         self.assertTupleEqual(x.replace(args=('B', )).args, ('B', ))