~divmod-dev/divmod.org/trunk

« back to all changes in this revision

Viewing changes to Epsilon/epsilon/hotfix.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
 
import inspect
3
 
 
4
 
class NoSuchHotfix(Exception):
5
 
    """
6
 
    Man you must be pretty stupid.
7
 
    """
8
 
 
9
 
_alreadyInstalled = set()
10
 
def require(packageName, fixName):
11
 
    if (packageName, fixName) in _alreadyInstalled:
12
 
        return
13
 
 
14
 
    if (packageName, fixName) == ('twisted', 'filepath_copyTo'):
15
 
        from twisted.python import filepath
16
 
        if filepath.FilePath('a') != filepath.FilePath('a'):
17
 
            from epsilon.hotfixes import filepath_copyTo
18
 
            filepath_copyTo.install()
19
 
    elif (packageName, fixName) == ('twisted', 'timeoutmixin_calllater'):
20
 
        from twisted.protocols import policies
21
 
        if not hasattr(policies.TimeoutMixin, 'callLater'):
22
 
            from epsilon.hotfixes import timeoutmixin_calllater
23
 
            timeoutmixin_calllater.install()
24
 
    elif (packageName, fixName) == ('twisted', 'delayedcall_seconds'):
25
 
        from twisted.internet import base
26
 
        args = inspect.getargs(base.DelayedCall.__init__.func_code)[0]
27
 
        if 'seconds' not in args:
28
 
            from epsilon.hotfixes import delayedcall_seconds
29
 
            delayedcall_seconds.install()
30
 
    elif (packageName, fixName) == ('twisted', 'deferredgenerator_tfailure'):
31
 
        from twisted.internet import defer
32
 
        result = []
33
 
        def test():
34
 
            d = defer.waitForDeferred(defer.succeed(1))
35
 
            yield d
36
 
            result.append(d.getResult())
37
 
        defer.deferredGenerator(test)()
38
 
        if result == [1]:
39
 
            from epsilon.hotfixes import deferredgenerator_tfailure
40
 
            deferredgenerator_tfailure.install()
41
 
        else:
42
 
            assert result == [None]
43
 
    elif (packageName, fixName) == ("twisted", "proto_helpers_stringtransport"):
44
 
        from twisted.test.proto_helpers import StringTransport
45
 
        st = StringTransport()
46
 
        try:
47
 
            st.write(u'foo')
48
 
        except TypeError, e:
49
 
            pass
50
 
        else:
51
 
            from epsilon.hotfixes import proto_helpers_stringtransport
52
 
            proto_helpers_stringtransport.install()
53
 
    elif (packageName, fixName) == ("twisted", "internet_task_Clock"):
54
 
        from twisted.internet.task import Clock
55
 
        from twisted.internet import base
56
 
        from twisted import version
57
 
        from epsilon.hotfixes import internet_task_clock
58
 
        if internet_task_clock.clockIsBroken():
59
 
            internet_task_clock.install()
60
 
    elif (packageName, fixName) == ("twisted", "trial_assertwarns"):
61
 
        from twisted.trial.unittest import TestCase
62
 
        if not hasattr(TestCase, "failUnlessWarns"):
63
 
            from epsilon.hotfixes import trial_assertwarns
64
 
            trial_assertwarns.install()
65
 
    elif (packageName, fixName) == ("twisted", "plugin_package_paths"):
66
 
        try:
67
 
            from twisted.plugin import pluginPackagePaths
68
 
        except ImportError:
69
 
            from epsilon.hotfixes import plugin_package_paths
70
 
            plugin_package_paths.install()
71
 
    elif (packageName, fixName) == ("twisted", "loopbackasync_reentrancy"):
72
 
        # This one is really hard to detect reasonably.  Invoking the code
73
 
        # involves triggering the reactor, which it would be good to avoid. 
74
 
        from twisted import version
75
 
        if (version.major, version.minor) < (8, 2):
76
 
            from epsilon.hotfixes import loopbackasync_reentrancy
77
 
            loopbackasync_reentrancy.install()
78
 
    else:
79
 
        raise NoSuchHotfix(packageName, fixName)
80
 
 
81
 
    _alreadyInstalled.add((packageName, fixName))