refactoring task._run devel
authorSandro Knauß <knauss@netzguerilla.net>
Wed, 21 Mar 2012 17:24:46 +0100
branchdevel
changeset 234 08fcc2b6df99
parent 233 34435357dc8a
child 235 c5d8384caf68
refactoring task._run
iro/controller/task.py
iro/tests/task.py
--- a/iro/controller/task.py	Sun Mar 18 14:08:06 2012 +0100
+++ b/iro/controller/task.py	Wed Mar 21 17:24:46 2012 +0100
@@ -1,6 +1,6 @@
 from functools import partial
 
-from twisted.internet.defer import inlineCallbacks, returnValue 
+from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred, Deferred
 
 from ..error import NoRouteForTask, RejectRecipient
 
@@ -23,29 +23,38 @@
         self.status = status
         return status
 
-    def setError(self,error):
+    def setError(self, error):
         self.status = error
         self.error = True
         return error
 
     def start(self):
-        self.d = taskPool.run(self._run)
+        self.d = Deferred()
         self.d.addCallback(self.setStatus)
         self.d.addCallback(partial(self.job.setStatus,self))
         self.d.addErrback(self.setError)
         self.d.addErrback(partial(self.job.setError,self))
+        taskPool.run(self._run)
         return self.d
 
-    @inlineCallbacks
     def _run(self):
-        for offer in self.job.offers:
+        os= (i for i in self.job.offers)
+        def n():
             try:
-                ret = yield offers[offer](self.recipient,self.job.message)
-                returnValue(ret)
-            except RejectRecipient:
-                continue
-        else:
-            raise NoRouteForTask()
+                offer = os.next()
+                d = maybeDeferred(offers[offer],self.recipient,self.job.message)
+                d.addCallback(self.d.callback)
+                d.addErrback(addErr)
+                d.addErrback(self.d.errback)
+                return d
+            except StopIteration:
+                self.d.errback(NoRouteForTask())
+
+        def addErr(failure):
+            failure.trap(RejectRecipient)
+            return n()
+        
+        n()
 
 
 @inlineCallbacks
--- a/iro/tests/task.py	Sun Mar 18 14:08:06 2012 +0100
+++ b/iro/tests/task.py	Wed Mar 21 17:24:46 2012 +0100
@@ -1,5 +1,5 @@
 from twisted.internet import reactor
-from twisted.internet.defer import inlineCallbacks
+from twisted.internet.defer import inlineCallbacks, Deferred
 
 from Queue import deque
 
@@ -63,22 +63,29 @@
         exjob = yield exJobs.create(u, [Telnumber('123456789')], SMS('test'), ['test'])
         
         task=Task(Telnumber('123456789'), exjob)
-        ret = yield task._run()
+        task.d=Deferred()
+        task._run()
+        ret = yield task.d
         self.assertIsInstance(ret, Status)
         self.assertEqual(ret.provider, p)
         self.assertEqual(ret.route, "test")
 
-    @inlineCallbacks
     def testNoRoute(self):
         with self.session() as session:
             u = User(name='test',apikey='abcdef123456789')
             session.add(u)
-
-        exjob = yield exJobs.create(u, [Telnumber('123456789')], SMS('test'), [])
         
-        task=Task(Telnumber('123456789'), exjob)
-        d = task._run()
-        self.assertFailure(d, NoRouteForTask)
+        def c(exjob):
+            task = Task(Telnumber('123456789'), exjob)
+            task.d = Deferred()
+            task._run()
+            self.assertFailure(task.d, NoRouteForTask)
+            return task.d
+
+        d = exJobs.create(u, [Telnumber('123456789')], SMS('test'), [])
+        d.addCallback(c)
+        return d
+        
 
     def testSetStatus(self):
         task=Task(Telnumber('123456789'), None)