Explorar o código

Fix exception raised when iterating on the result of TaskSet.apply().

Branko Čibej %!s(int64=14) %!d(string=hai) anos
pai
achega
f60d0edad9
Modificáronse 2 ficheiros con 11 adicións e 0 borrados
  1. 3 0
      celery/result.py
  2. 8 0
      celery/tests/test_task/test_result.py

+ 3 - 0
celery/result.py

@@ -446,6 +446,9 @@ class EagerResult(BaseAsyncResult):
         return (self.__class__, (self.task_id, self._result,
                                  self._state, self._traceback))
 
+    def __copy__(self):
+        return apply(*self.__reduce__())
+
     def successful(self):
         """Returns :const:`True` if the task executed without failure."""
         return self.state == states.SUCCESS

+ 8 - 0
celery/tests/test_task/test_result.py

@@ -244,6 +244,14 @@ class TestTaskSetResult(unittest.TestCase):
         self.assertEqual(it.next(), 42)
         self.assertEqual(it.next(), 42)
 
+    def test_iterate_eager(self):
+        ar1 = EagerResult(gen_unique_id(), 42, states.SUCCESS)
+        ar2 = EagerResult(gen_unique_id(), 42, states.SUCCESS)
+        ts = TaskSetResult(gen_unique_id(), [ar1, ar2])
+        it = iter(ts)
+        self.assertEqual(it.next(), 42)
+        self.assertEqual(it.next(), 42)
+
     def test_join_timeout(self):
         ar = MockAsyncResultSuccess(gen_unique_id())
         ar2 = MockAsyncResultSuccess(gen_unique_id())