Mercurial > rinkhals
diff gamelib/config.py @ 411:03d5cb669298
Add config file and command line parameters.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sat, 21 Nov 2009 11:18:08 +0000 |
parents | |
children | 8897a436a8cb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gamelib/config.py Sat Nov 21 11:18:08 2009 +0000 @@ -0,0 +1,54 @@ +# level.py + +from ConfigParser import RawConfigParser +from optparse import OptionParser + +class Config(object): + """Container for various global configuration knobs and levers.""" + + valid_options = { + 'sound': {'type': 'boolean', 'default': 'true'}, + 'level_name': {'type': 'string', 'default': 'two_weeks'}, + } + + config_filename = 'config.ini' + + def configure(self, params=None): + self._config = RawConfigParser(dict( + [(k, v['default']) for k, v in self.valid_options.items() if 'default' in v] + )) + self._config.add_section('Options') + self._set_up_params(params) + self._config.read(self.config_filename) + self._process_params() + + def _set_up_params(self, params): + parser = OptionParser() + parser.add_option("-c", "--config", metavar="FILE", dest="config_filename", + help="read configuration from FILE") + parser.add_option("-l", "--level", metavar="LEVEL", dest="level_name", + help="select level LEVEL") + parser.add_option("--sound", action="store_const", const="on", dest="sound", + help="enable sound") + parser.add_option("--no-sound", action="store_const", const="off", dest="sound", + help="disable sound") + (self._opts, _) = parser.parse_args(params or []) + self.config_filename = self._opts.config_filename or self.config_filename + + def _process_params(self): + for name in self.valid_options: + opt = getattr(self._opts, name) + if opt is not None: + self._config.set('Options', name, opt) + + def __getattr__(self, name): + if name not in self.valid_options: + raise AttributeError(name) + get_methods = { + 'string': lambda n: self._config.get('Options', n), + 'boolean': lambda n: self._config.getboolean('Options', n), + } + return get_methods[self.valid_options[name].get('type', 'string')](name) + +# Here's a global variable. Don't try this at home, kids! +config = Config()