NOTE: This code has been incorporated into peak.events and has evolved significantly since then. This page should go away.
1 from __future__ import generators
2 from peak.api import *
3 from twisted.internet import defer
4 from twisted.python import failure
5
6 import traceback
7
8 class DeferredAsEventSource(protocols.Adapter):
9
10 protocols.advise(
11 instancesProvide=[events.ITaskSwitch],
12 asAdapterForTypes=[defer.Deferred],
13 )
14
15 def nextAction(self, thread=None, state=None):
16
17 if state is not None:
18
19 def handler():
20 v = events.resume()
21 if isinstance(v,failure.Failure):
22 raise v
23 else:
24 yield v
25
26 state.CALL(handler())
27
28 if self.subject.called:
29 state.YIELD(self.subject.result)
30 else:
31 cb = lambda v: (thread.step(self,v),v)[1]
32 self.subject.addCallbacks(cb,cb)
33
34 return self.subject.called
35
36
37 def testDeferred(d):
38 try:
39 yield d; print events.resume()
40 except:
41 traceback.print_exc()
42
43 d = defer.Deferred()
44 t = events.Thread(testDeferred(d))
45 d.callback(42)
46 t = events.Thread(testDeferred(d))
47
48 d = defer.Deferred()
49 t = events.Thread(testDeferred(d))
50 d.errback(ValueError)
51 t = events.Thread(testDeferred(d))