--- 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)