# HG changeset patch # User Jeff Hammel # Date 1396234400 25200 # Node ID f01d351ccf2b68322e89b2dd6c44f828c315a313 # Parent af5e83a4763be07e673162615bc1235c4c73896b STUB: configuration/configuration.py diff -r af5e83a4763b -r f01d351ccf2b configuration/configuration.py --- a/configuration/configuration.py Sun Mar 30 19:28:09 2014 -0700 +++ b/configuration/configuration.py Sun Mar 30 19:53:20 2014 -0700 @@ -170,21 +170,18 @@ if not flags: args = ['--no-%s' % name] if not help: - kw['help'] = 'disable %s' % name + kw['help'] = 'disable {}'.format(name) else: kw['action'] = 'store_true' if not help: - kw['help'] = 'enable %s' % name + kw['help'] = 'enable {}'.format(name) return args, kw + class ListCLI(BaseCLI): def __call__(self, name, value): args, kw = BaseCLI.__call__(self, name, value) - - # TODO: could use 'extend' - # - http://hg.mozilla.org/build/mozharness/file/5f44ba08f4be/mozharness/base/config.py#l41 - kw['action'] = 'append' return args, kw @@ -221,6 +218,7 @@ raise AssertionError("Each value must be delimited by '%s': %s" % (self.delimeter, value)) return value.split(self.delimeter, 1) +# types of CLI arguments types = {bool: BoolCLI(), int: IntCLI(), float: FloatCLI(), @@ -231,6 +229,7 @@ __all__ += [i.__class__.__name__ for i in types.values()] + class Configuration(optparse.OptionParser): """declarative configuration object""" @@ -251,11 +250,10 @@ # sanity check if isinstance(self.options, dict): self.option_dict = self.options - elif isinstance(self.options, list): - # XXX could also be tuple, etc + elif isinstance(self.options, (list, tuple)): self.option_dict = dict(self.options) else: - raise NotImplementedError + raise NotImplementedError("Configuration: `options` should be castable to a dict") # setup configuration self.config = {} @@ -296,10 +294,12 @@ help="Output configuration file; Formats: %s" % formats)) - ### methods for iteration - ### TODO: make the class a real iterator + ### iteration def items(self): + """items in options""" + # TODO: make the class a real iterator + # allow options to be a list of 2-tuples if isinstance(self.options, dict): return self.options.items() @@ -315,7 +315,7 @@ # ensure options in configuration are in self.options unknown_options = [i for i in config if i not in self.option_dict] if unknown_options: - raise UnknownOptionException("Unknown options: %s" % ', '.join(unknown_options)) + raise UnknownOptionException("Unknown options: {}".format(', '.join(unknown_options))) # ensure options are of the right type (if specified) for key, value in config.items(): @@ -334,7 +334,7 @@ try: config[key] = _type(value) except BaseException, e: - raise TypeCastException("Could not coerce %s, %s, to type %s: %s" % (key, value, _type.__name__, e)) + raise TypeCastException("Could not coerce '%s'=%s, to type %s: %s" % (key, value, _type.__name__, e)) return config @@ -348,11 +348,11 @@ if isinstance(required, basestring): required_message = required else: - required_message = "Parameter %s is required but not present" % key + required_message = "Parameter {} is required but not present".format(key) # TODO: this should probably raise all missing values vs # one by one raise MissingValueException(required_message) - # TODO: configuration should be locked after this is called + ### methods for adding configuration @@ -372,7 +372,6 @@ def __call__(self, *args): """add items to configuration and check it""" - # TODO: configuration should be locked after this is called # start with defaults self.config = self.default_config() @@ -428,7 +427,7 @@ if 'default' in value: default = value['default'] if default is None: - return None + return None # not return type(value['default']) def optparse_options(self, parser): @@ -520,6 +519,7 @@ # TODO: have a way of specifying format other than filename self.serialize(dump) + ### serialization/deserialization def formats(self):