Changeset 533
- Timestamp:
- 05/04/2008 05:48:57 AM (3 months ago)
- Files:
-
- ape/trunk/ape (added)
- ape/trunk/ape/component.py (moved) (moved from ape/trunk/component.py) (2 diffs)
- ape/trunk/ape/config.py (moved) (moved from ape/trunk/config.py) (2 diffs)
- ape/trunk/ape/engine.py (moved) (moved from ape/trunk/engine.py) (8 diffs)
- ape/trunk/ape/__init__.py (moved) (moved from ape/trunk/__init__.py)
- ape/trunk/ape/tests (added)
- ape/trunk/ape/tests/component.py (added)
- ape/trunk/ape/tests/config.py (added)
- ape/trunk/ape/tests/engine.py (added)
- ape/trunk/ape/tests/__init__.py (added)
- ape/trunk/ape/util.py (moved) (moved from ape/trunk/util.py) (6 diffs)
- ape/trunk/setup.py (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
ape/trunk/ape/component.py
r531 r533 42 42 for the extension point 43 43 """ 44 property.__init__(self, self. Extensions)44 property.__init__(self, self.extensions) 45 45 self.interface = interface 46 46 self.__doc__ = 'List of components that implement `%s`' % \ … … 174 174 if not component: 175 175 if cls not in ComponentMeta._components: 176 raise ComponentError('Component "%s" not registered' % cls.__name__)176 raise Error('Component "%s" not registered' % cls.__name__) 177 177 try: 178 178 component = cls(self) 179 179 except TypeError, e: 180 raise ComponentError('Unable to instantiate component %r (%s)' % 181 (cls, e)) 180 raise Error('Unable to instantiate component %r (%s)' % (cls, e)) 182 181 return component 183 182 ape/trunk/ape/config.py
r531 r533 54 54 55 55 # Public API 56 def options(self): 57 return sorted(self.data.items()) 58 59 def has_option(self, name): 60 return name in self.data 61 56 62 def get(self, name, default=None): 57 return self.data.get(name, default) 63 if name in self.data: 64 value = self.data.get(name, default) 65 else: 66 option = Option.registry.get(name) 67 if option is not None: 68 value = option.default 69 if value is None: 70 value = default 71 else: 72 value = default 73 return value 58 74 59 75 def set(self, name, value, transient=False): … … 104 120 if instance is None: 105 121 return self 106 config = instance.engine.config 107 return self.accessor(config, self.name, self.default) 122 engine = getattr(instance, 'engine', None) 123 if engine is not None: 124 config = instance.engine.config 125 return self.accessor(config, self.name, self.default) 126 else: 127 return self.default 108 128 109 129 def __set__(self, instance, value): ape/trunk/ape/engine.py
r531 r533 20 20 import sys 21 21 from ape.util import URI 22 from ape.component import Component, ComponentManager, Error 23 from ape.config import Configuration, URIOption 22 from ape.component import Component, Interface, ExtensionPoint, \ 23 ComponentManager, Error 24 from ape.config import Configuration, URIOption, IntOption, ListOption 24 25 25 26 … … 28 29 29 30 31 class IEngineLifecycleListener(Interface): 32 """Hooks for engine startup and shutdown.""" 33 34 def engine_startup(self): 35 """Engine has started. 36 37 Config, logging and plugins are available at this stage. 38 """ 39 40 def engine_shutdown(self): 41 """Engine has stopped.""" 42 43 30 44 class Engine(Component, ComponentManager): 31 45 46 lifecycle_listeners = ExtensionPoint(IEngineLifecycleListener) 47 32 48 logging_uri = URIOption('logging', 'stderr://', 'Logging URI') 33 34 def __init__(self, application_name, config_file=None): 49 debug = IntOption('debug', 0, 'Debug level') 50 plugin_paths = ListOption('plugins.paths', [], 'Plugin search paths') 51 52 _active_engine = None 53 54 def __init__(self, application_name='app', config_file=None, 55 defer_startup=False, debug=None): 35 56 Component.__init__(self) 36 57 ComponentManager.__init__(self) 37 58 38 Engine._active_engine = self39 59 self.engine = self 40 60 self.application_name = application_name … … 42 62 self.log = self.initialise_logging(self.logging_uri) 43 63 64 if debug is not None: 65 self.config.set('debug', debug, transient=True) 66 67 if not defer_startup: 68 self.startup() 69 70 def startup(self): 71 """Start the engine.""" 72 self.log.debug('Starting %s', self.application_name) 73 self.load_plugins(plugin_paths=self.plugin_paths) 74 for listener in self.lifecycle_listeners: 75 listener.engine_startup() 76 Engine._active_engine = self 77 78 def shutdown(self): 79 """Shutdown the engine.""" 80 if Engine._active_engine: 81 self.log.debug('Shutting down %s', self.application_name) 82 for listener in self.lifecycle_listeners: 83 listener.engine_shutdown() 84 self.shutdown_logging() 85 self.config = None 86 self.components = None 87 self.engine = None 88 Engine._active_engine = None 44 89 45 90 def load_plugins(self, entry_point_name=None, plugin_paths=None): … … 85 130 log_error(entry, e) 86 131 87 def parse_logger(self, uri):132 def _parse_logger(self, uri): 88 133 """Get logging level and formatter from a URI. 89 134 … … 97 142 level = getattr(logging, level, logging.WARNING) 98 143 99 default_format = '% (asctime)s agate %(levelname)s: %(message)s'144 default_format = '%%(asctime)s %s %%(levelname)s: %%(message)s' % self.application_name 100 145 default_date_format = '%Y-%m-%d %H:%M:%S' 101 146 formatter = logging.Formatter( … … 150 195 handler = logging.handlers.SysLogHandler(uri.path or '/dev/log') 151 196 else: 152 handler = logging.handlers.SysLogHandler((uri.host or 'localhost', 153 uri.port or 514)) 197 handler = logging.handlers.SysLogHandler( 198 (uri.host or 'localhost', uri.port or 514) 199 ) 154 200 elif uri.scheme == 'stderr': 155 201 handler = logging.StreamHandler(sys.stderr) … … 161 207 raise Error('Unsupported logging scheme: %s' % uri) 162 208 163 werkzeug_log = logging.getLogger('werkzeug')164 209 log = logging.getLogger(self.application_name) 165 210 166 level, formatter = self. parse_logger(uri)211 level, formatter = self._parse_logger(uri) 167 212 handler.setFormatter(formatter) 168 213 handler.setLevel(level) 169 #level = ConfigureHandler(db_handler, uri)170 214 171 215 log.addHandler(handler) 172 #log.addHandler(db_handler)173 216 log.setLevel(level) 174 werkzeug_log.addHandler(handler)175 werkzeug_log.setLevel(level)176 217 return log 177 218 178 219 def shutdown_logging(self): 179 """Shutdown logging.""" 180 # XXX This modifies globals in the logging module. 181 log = logging.getLogger(self.application_name) 182 log.handlers = [] 183 logging.shutdown() 220 """Shutdown logging.""" 221 # XXX This modifies globals in the logging module. 222 log = logging.getLogger(self.application_name) 223 logging.shutdown(log.handlers) 224 log.handlers = [] 225 self.log = None 184 226 185 227 def component_activated(self, component): … … 194 236 def get_active_engine(): 195 237 """Return the active Engine.""" 196 try:238 if Engine._active_engine is not None: 197 239 return Engine._active_engine 198 except AttributeError: 199 raise Error('No active engine') 240 raise Error('No active engine') ape/trunk/ape/util.py
r532 r533 21 21 22 22 23 # XXX Appropriated from http://swapoff.org/pyndexter .23 # XXX Appropriated from http://swapoff.org/pyndexter 24 24 class URI(object): 25 25 """Parse a URI into its component parts. The `query` component is passed … … 91 91 (?:(?P<scheme>[^:]+)://)? 92 92 (?:(?P<username>[^:@]*) 93 (?::(?P<password>[^@]*))?@)?93 (?::(?P<password>[^@]*))?@)? 94 94 (?P<host>[^?/#:]*) 95 95 (?::(?P<port>[\d]+))? … … 100 100 101 101 __slots__ = ['scheme', 'username', 'password', 'host', 'port', '_path', 102 'query', 'fragment']102 'query', 'fragment'] 103 103 104 104 def __init__(self, uri=None, scheme=None, username=None, password=None, … … 162 162 >>> u == v 163 163 True 164 >>> v.host = 'www. example.com'164 >>> v.host = 'www.google.com' 165 165 >>> u == v 166 166 False … … 190 190 [u'&'.join([u'%s=%s' % (urllib.quote(k), urllib.quote(str(v))) 191 191 for v in l]) 192 for k, l in sorted(self.query.items())]) 192 for k, l in sorted(self.query.items())] 193 ) 193 194 if self.fragment: 194 195 uri += u'#' + urllib.quote(self.fragment) … … 326 327 delay = random.randint(a,b) 327 328 time.sleep(delay) 328
