terom@36: """ terom@36: Support for loading config files with twisted.python.usage terom@36: """ terom@36: terom@36: from twisted.python import usage terom@36: terom@36: import traceback terom@36: terom@36: class ConfigMapper (dict) : terom@36: """ terom@36: Provides access to a usage.Options's keys via python names. terom@36: """ terom@36: terom@36: IGNORED_NAMES = ('__doc__', ) terom@36: terom@36: def __init__ (self, opts, defaults=None) : terom@36: """ terom@36: opts - store the values from the config file into the given dict terom@36: defaults - (optional) update any pre-exisitng values from the config file into the given dict terom@36: """ terom@36: terom@36: self.opts = opts terom@36: self.defaults = defaults terom@36: terom@38: # temp. vars terom@38: self.locals = {} terom@38: terom@38: def optname (self, name) : terom@36: return name.replace('_', '-') terom@36: terom@36: def __getitem__ (self, name) : terom@36: """ terom@36: Map from foo_bar -> foo-bar terom@36: """ terom@36: terom@38: # translate terom@38: optname = self.optname(name) terom@38: terom@38: if optname in self.opts : terom@38: # normal long opt terom@38: return self.opts[optname] terom@38: terom@38: elif name in self.locals : terom@38: # temp local terom@38: return self.locals[name] terom@38: terom@38: else : terom@38: # unknown terom@38: raise NameError(name) terom@36: terom@36: def __setitem__ (self, name, value) : terom@36: """ terom@36: Map from foo_bar -> foo-bar terom@36: """ terom@36: terom@36: store = self.opts terom@36: terom@36: # filter out certain keys terom@36: if name in self.IGNORED_NAMES : terom@36: # skip things like __doc__ terom@36: return terom@36: terom@36: # translate name terom@38: optname = self.optname(name) terom@36: terom@38: if optname in self.opts : terom@36: # normal long opt terom@38: name = optname terom@36: terom@36: else : terom@38: # store as a local terom@38: store = self.locals terom@36: terom@36: # store terom@36: store[name] = value terom@36: terom@36: if self.defaults is not None and name in self.defaults : terom@36: self.defaults[name] = value terom@36: terom@36: class ConfigOptions (usage.Options) : terom@36: """ terom@36: Provide a --config param to read in new values/defaults for any defined options from the given config file terom@36: """ terom@36: terom@36: def opt_config (self, path) : terom@36: """ terom@36: Read the given configuration file terom@36: """ terom@36: terom@36: # set up env for the config module terom@36: globals = {} terom@36: locals = ConfigMapper(self.opts, self.defaults) terom@36: terom@36: try : terom@36: # run config terom@36: execfile(path, globals, locals) terom@36: terom@36: except : terom@36: # XXX: raising a usage.error prints out --help terom@36: raise usage.error("Error reading config file: %s\n%s" % (path, traceback.format_exc())) terom@36: terom@36: opt_c = opt_config terom@36: