# HG changeset patch # User Jeff Hammel # Date 1332882085 25200 # Node ID 113e8c2f7cab85ed4e8d555473bcd9f005a51965 # Parent 09fbc09455d41c221a2e954ea86158c153787d1c start to hook up deserializers diff -r 09fbc09455d4 -r 113e8c2f7cab configuration/config.py --- a/configuration/config.py Tue Mar 27 13:00:14 2012 -0700 +++ b/configuration/config.py Tue Mar 27 14:01:25 2012 -0700 @@ -88,6 +88,9 @@ configuration_providers.append(YAML()) +# TODO: add a configuration provider for taking command-line arguments +# from a file + __all__.extend([i.__class__.__name__ for i in configuration_providers]) ### optparse interface @@ -269,9 +272,8 @@ def parser(self, configuration_provider_option=None, dump='--dump', **parser_args): """ return OptionParser for this Configuration instance - - configuration_provider_options : option for configuration files [TODO] - (also TODO: a special value that equates to the first file extension value - for the configuration_providers) + - configuration_provider_options : option for configuration files + (or '-' for taking from the extensions names) - dump : option for dumping configuration - parser_args : arguments to the OptionParser constructor """ @@ -292,7 +294,24 @@ parser.parsed = set() self.optparse_options(parser) - # TODO: add option(s) for configuration_providers + # add option(s) for configuration_providers + if configuration_provider_option: + if configuration_provider_option == '-': + raise NotImplementedError(""" +The arguments will be interspersed. Will need to be more clever to get this +to work properly. +""") + + # take option from configuration_provider extensions + for format in self.formats(): + parser.add_option('--%s' % format, + dest='load_%s' % format, + action='append', + help="load configuration from a %s file" % format) + else: + parser.add_option(configuration_provider_option, + dest='load', action='append', + help="load configuration from a file") # add an option for dumping formats = self.formats() @@ -303,7 +322,11 @@ return parser def parse(self, args=sys.argv[1:], parser=None, configuration_provider_option=None): - """parse configuration including command line options""" + """ + parse configuration including command line options + - args: command line arguments to parse (default: system arguments) + - parser + """ # parse arguments if parser is None: @@ -319,6 +342,15 @@ cli_config = dict([(key, value) for key, value in cli_config.items() if key in parser.parsed]) + # deserialize configuration + configuration_files = getattr(options, 'load', []) + missing = [i for i in configuration_files + if not os.path.exists(i)] + if missing: + parser.error("Missing files: %s" % ', '.join(missing)) + for f in configuration_files: + pass + # generate configuration self(cli_config) @@ -378,6 +410,8 @@ """load configuration from a file""" # TODO: allow file object vs file name + assert os.path.exists(filename) + # get the format if not format: format = self.filename2format(filename)