~divmod-dev/divmod.org/trunk

« back to all changes in this revision

Viewing changes to Epsilon/epsilon/hotfixes/deferredgenerator_tfailure.py

  • Committer: Jean-Paul Calderone
  • Date: 2014-06-29 20:33:04 UTC
  • mfrom: (2749.1.1 remove-epsilon-1325289)
  • Revision ID: exarkun@twistedmatrix.com-20140629203304-gdkmbwl1suei4m97
mergeĀ lp:~exarkun/divmod.org/remove-epsilon-1325289

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 
2
 
from twisted.python import failure
3
 
from twisted.internet import  defer
4
 
 
5
 
def getResult(self):
6
 
    if isinstance(self.result, failure.Failure):
7
 
        self.result.raiseException()
8
 
    return self.result
9
 
 
10
 
 
11
 
def _deferGenerator(g, deferred=None):
12
 
    """
13
 
    See L{waitForDeferred}.
14
 
    """
15
 
    result = None
16
 
    while 1:
17
 
        if deferred is None:
18
 
            deferred = defer.Deferred()
19
 
        try:
20
 
            result = g.next()
21
 
        except StopIteration:
22
 
            deferred.callback(result)
23
 
            return deferred
24
 
        except:
25
 
            deferred.errback()
26
 
            return deferred
27
 
 
28
 
        # Deferred.callback(Deferred) raises an error; we catch this case
29
 
        # early here and give a nicer error message to the user in case
30
 
        # they yield a Deferred. Perhaps eventually these semantics may
31
 
        # change.
32
 
        if isinstance(result, defer.Deferred):
33
 
            return defer.fail(TypeError("Yield waitForDeferred(d), not d!"))
34
 
 
35
 
        if isinstance(result, defer.waitForDeferred):
36
 
            waiting = [True, None]
37
 
            # Pass vars in so they don't get changed going around the loop
38
 
            def gotResult(r, waiting=waiting, result=result):
39
 
                result.result = r
40
 
                if waiting[0]:
41
 
                    waiting[0] = False
42
 
                    waiting[1] = r
43
 
                else:
44
 
                    _deferGenerator(g, deferred)
45
 
            result.d.addBoth(gotResult)
46
 
            if waiting[0]:
47
 
                # Haven't called back yet, set flag so that we get reinvoked
48
 
                # and return from the loop
49
 
                waiting[0] = False
50
 
                return deferred
51
 
            result = None # waiting[1]
52
 
 
53
 
 
54
 
def install():
55
 
    getResult.__module__ = 'twisted.internet.defer'
56
 
    defer.waitForDeferred.getResult = getResult
57
 
 
58
 
    _deferGenerator.__module__ = 'twisted.internet.defer'
59
 
    defer._deferGenerator = _deferGenerator