# HG changeset patch # User Sandro Knauß # Date 1332347086 -3600 # Node ID 08fcc2b6df992d70ff88846f036f0c8c34d17307 # Parent 34435357dc8a359953328c435e173eeb3f25f425 refactoring task._run diff -r 34435357dc8a -r 08fcc2b6df99 iro/controller/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 diff -r 34435357dc8a -r 08fcc2b6df99 iro/tests/task.py --- 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)