Browse Source

Result: from_serializable needs to forward app. Closes #1249

Ask Solem 12 years ago
parent
commit
ce2c9b2bf3
4 changed files with 14 additions and 12 deletions
  1. 2 2
      celery/app/builtins.py
  2. 1 1
      celery/backends/base.py
  3. 7 5
      celery/result.py
  4. 4 4
      celery/tests/tasks/test_result.py

+ 2 - 2
celery/app/builtins.py

@@ -89,7 +89,7 @@ def add_unlock_chord_task(app):
         # check if the task group is ready, and if so apply the callback.
         deps = GroupResult(
             group_id,
-            [from_serializable(r, Result=Result) for r in result],
+            [from_serializable(r, app=app) for r in result],
         )
         j = deps.join_native if deps.supports_native_join else deps.join
 
@@ -165,7 +165,7 @@ def add_group_task(app):
 
         def run(self, tasks, result, group_id, partial_args):
             app = self.app
-            result = from_serializable(result)
+            result = from_serializable(result, app)
             # any partial args are added to all tasks in the group
             taskit = (subtask(task).clone(partial_args)
                       for i, task in enumerate(tasks))

+ 1 - 1
celery/backends/base.py

@@ -472,7 +472,7 @@ class KeyValueStoreBackend(BaseDictBackend):
             meta = self.decode(meta)
             result = meta['result']
             if isinstance(result, (list, tuple)):
-                return {'result': from_serializable(result)}
+                return {'result': from_serializable(result, self.app)}
             return meta
 
     def on_chord_apply(self, group_id, body, result=None, **kwargs):

+ 7 - 5
celery/result.py

@@ -225,7 +225,7 @@ class AsyncResult(ResultBase):
     def children(self):
         children = self.backend.get_children(self.id)
         if children:
-            return map(from_serializable, children)
+            return [from_serializable(r, self.app) for r in children]
 
     @property
     def result(self):
@@ -718,15 +718,17 @@ class EagerResult(AsyncResult):
         return False
 
 
-def from_serializable(r, Result=AsyncResult):
+def from_serializable(r, app=None):
     # earlier backends may just pickle, so check if
     # result is already prepared.
+    app = app_or_default(app)
+    Result = app.AsyncResult
     if not isinstance(r, ResultBase):
         if isinstance(r, (list, tuple)):
             id, nodes = r
             if nodes:
-                return GroupResult(id, [Result(id) for id, _ in nodes])
-            return AsyncResult(id)
+                return app.GroupResult(id, [Result(id) for id, _ in nodes])
+            return Result(id)
         else:
-            return AsyncResult(r)
+            return Result(r)
     return r

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

@@ -579,10 +579,10 @@ class test_serializable(AppCase):
 
     def test_AsyncResult(self):
         x = AsyncResult(uuid())
-        self.assertEqual(x, from_serializable(x.serializable()))
-        self.assertEqual(x, from_serializable(x))
+        self.assertEqual(x, from_serializable(x.serializable(), self.app))
+        self.assertEqual(x, from_serializable(x, self.app))
 
     def test_GroupResult(self):
         x = GroupResult(uuid(), [AsyncResult(uuid()) for _ in range(10)])
-        self.assertEqual(x, from_serializable(x.serializable()))
-        self.assertEqual(x, from_serializable(x))
+        self.assertEqual(x, from_serializable(x.serializable(), self.app))
+        self.assertEqual(x, from_serializable(x, self.app))