| OLD | NEW |
| (Empty) |
| 1 # -*- test-case-name: twisted.test.test_application -*- | |
| 2 # Copyright (c) 2006-2007 Twisted Matrix Laboratories. | |
| 3 # See LICENSE for details. | |
| 4 | |
| 5 """ | |
| 6 Plugin-based system for enumerating available reactors and installing one of | |
| 7 them. | |
| 8 """ | |
| 9 | |
| 10 from zope.interface import Interface, Attribute, implements | |
| 11 | |
| 12 from twisted.plugin import IPlugin, getPlugins | |
| 13 from twisted.python.reflect import namedAny | |
| 14 | |
| 15 | |
| 16 class IReactorInstaller(Interface): | |
| 17 """ | |
| 18 Definition of a reactor which can probably be installed. | |
| 19 """ | |
| 20 shortName = Attribute(""" | |
| 21 A brief string giving the user-facing name of this reactor. | |
| 22 """) | |
| 23 | |
| 24 description = Attribute(""" | |
| 25 A longer string giving a user-facing description of this reactor. | |
| 26 """) | |
| 27 | |
| 28 def install(): | |
| 29 """ | |
| 30 Install this reactor. | |
| 31 """ | |
| 32 | |
| 33 # TODO - A method which provides a best-guess as to whether this reactor | |
| 34 # can actually be used in the execution environment. | |
| 35 | |
| 36 | |
| 37 | |
| 38 class NoSuchReactor(KeyError): | |
| 39 """ | |
| 40 Raised when an attempt is made to install a reactor which cannot be found. | |
| 41 """ | |
| 42 | |
| 43 | |
| 44 class Reactor(object): | |
| 45 """ | |
| 46 @ivar moduleName: The fully-qualified Python name of the module of which | |
| 47 the install callable is an attribute. | |
| 48 """ | |
| 49 implements(IPlugin, IReactorInstaller) | |
| 50 | |
| 51 | |
| 52 def __init__(self, shortName, moduleName, description): | |
| 53 self.shortName = shortName | |
| 54 self.moduleName = moduleName | |
| 55 self.description = description | |
| 56 | |
| 57 | |
| 58 def install(self): | |
| 59 namedAny(self.moduleName).install() | |
| 60 | |
| 61 | |
| 62 | |
| 63 def getReactorTypes(): | |
| 64 """ | |
| 65 Return an iterator of L{IReactorInstaller} plugins. | |
| 66 """ | |
| 67 return getPlugins(IReactorInstaller) | |
| 68 | |
| 69 | |
| 70 | |
| 71 def installReactor(shortName): | |
| 72 """ | |
| 73 Install the reactor with the given C{shortName} attribute. | |
| 74 | |
| 75 @raise NoSuchReactor: If no reactor is found with a matching C{shortName}. | |
| 76 | |
| 77 @raise: anything that the specified reactor can raise when installed. | |
| 78 """ | |
| 79 for installer in getReactorTypes(): | |
| 80 if installer.shortName == shortName: | |
| 81 return installer.install() | |
| 82 raise NoSuchReactor(shortName) | |
| 83 | |
| OLD | NEW |