Work in progress with John Landahl to create a Deferred wrapper for peak.events...
1
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)
32 self.subject.addCallbacks(cb,cb)
33
34 return self.subject.called
35
36
37 def testDeferred(d):
38 yield d; print events.resume()
39
40 d = defer.Deferred()
41 t = events.Thread(testDeferred(d))
42 d.callback(42)
43 t = events.Thread(testDeferred(d))
44
45 d = defer.Deferred()
46 t = events.Thread(testDeferred(d))
47 try:
48 d.errback(ValueError)
49 except:
50 traceback.print_exc()
51 try:
52 t = events.Thread(testDeferred(d))
53 except:
54 traceback.print_exc()